Client proposal writer AI agent

Describe the client and their problem; the agent writes a proposal from your services and case studies, then drafts the email.

AI agentAdvanced Saves ~12 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Chat — you describe the client
  1. You describe the client, their goal, budget and deadline.
  2. The agent picks the right services and relevant case studies.
  3. It writes the proposal for your review.
  4. After approval, it saves it and drafts the email to the client.

What it can do

Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.

  • Writes proposals in Arabic or English
  • Uses your real prices and past results
  • Saves every proposal for tracking
  • Drafts the client email

System prompt

The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.

System prompt
You write client proposals for YOUR_COMPANY. Today is {{ $now.toFormat('d LLLL yyyy') }}.

Tools:
- "Services": what we offer (service, description, price or price range, typical timeline).
- "Case studies": past projects (client type, problem, what we did, result). Use only these as proof.
- "Save proposal": saves the approved proposal to the Proposals sheet.
- "Draft email": creates a Gmail draft to the client with the proposal (never sends).

Process:
1. Ask for: the client, their problem and goal, budget if known, and deadline.
2. Write the proposal: the client's situation in their words, our approach, scope and deliverables, timeline, price (from Services), 1–2 relevant case studies, and next steps.
3. Show it and ask for changes. Save and draft the email only after approval.

Rules:
- Never invent results, clients, prices or guarantees.
- Write in the client's language (Arabic or English) and keep it under 600 words.
- Flag anything outside our services instead of promising it.

Safety rules

Built into the prompt and the tools:

  • Never invents results, clients or guarantees
  • Flags work outside your services
  • Drafts emails, never sends them

Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.

Diagram

Proposal chatChat TriggerProposal agentAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGServicesGoogle Sheets ToolGCase studiesGoogle Sheets ToolGSave proposalGoogle Sheets ToolGDraft emailGmail Tool
Trigger AI Agent tool

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (282 lines)
{
  "name": "Client proposal writer AI agent (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Client proposal writer AI agent\nDescribe the client and their problem; the agent writes a proposal from your services and case studies, then drafts the email.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "public": true,
        "mode": "hostedChat",
        "initialMessages": "Who is the proposal for, and what do they need?",
        "options": {
          "responseMode": "lastNode"
        }
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Proposal chat",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        0,
        0
      ],
      "webhookId": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9"
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "=You write client proposals for YOUR_COMPANY. Today is {{ $now.toFormat('d LLLL yyyy') }}.\n\nTools:\n- \"Services\": what we offer (service, description, price or price range, typical timeline).\n- \"Case studies\": past projects (client type, problem, what we did, result). Use only these as proof.\n- \"Save proposal\": saves the approved proposal to the Proposals sheet.\n- \"Draft email\": creates a Gmail draft to the client with the proposal (never sends).\n\nProcess:\n1. Ask for: the client, their problem and goal, budget if known, and deadline.\n2. Write the proposal: the client's situation in their words, our approach, scope and deliverables, timeline, price (from Services), 1–2 relevant case studies, and next steps.\n3. Show it and ask for changes. Save and draft the email only after approval.\n\nRules:\n- Never invent results, clients, prices or guarantees.\n- Write in the client's language (Arabic or English) and keep it under 600 words.\n- Flag anything outside our services instead of promising it."
        }
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Proposal agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        -125,
        220
      ]
    },
    {
      "parameters": {
        "contextWindowLength": 10
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        45,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns our services with descriptions, prices and timelines.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Services",
          "mode": "name"
        },
        "options": {}
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Services",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        215,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns our past projects and their results.",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Case studies",
          "mode": "name"
        },
        "options": {}
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Case studies",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        385,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Saves an approved proposal.",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Proposals",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "date": "={{ $now.toISODate() }}",
            "company": "={{ $fromAI('company', \"Client company\", 'string') }}",
            "contact": "={{ $fromAI('contact', \"Contact person's name\", 'string') }}",
            "email": "={{ $fromAI('email', \"Contact's email\", 'string') }}",
            "value": "={{ $fromAI('value', \"Total proposal value\", 'number') }}",
            "proposal": "={{ $fromAI('proposal', \"The full proposal text\", 'string') }}"
          }
        },
        "options": {}
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Save proposal",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        555,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Creates a Gmail draft to the client with the proposal (never sends).",
        "resource": "draft",
        "operation": "create",
        "subject": "={{ $fromAI('subject', \"Email subject\", 'string') }}",
        "message": "={{ $fromAI('body', \"Short email with the proposal below it\", 'string') }}",
        "options": {
          "sendTo": "={{ $fromAI('to', \"The recipient's email address\", 'string') }}"
        }
      },
      "id": "43ef6e94-927f-48e4-a5b5-81b75a70b2b9",
      "name": "Draft email",
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        725,
        220
      ]
    }
  ],
  "connections": {
    "Proposal chat": {
      "main": [
        [
          {
            "node": "Proposal agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Services": {
      "ai_tool": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Case studies": {
      "ai_tool": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Save proposal": {
      "ai_tool": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Draft email": {
      "ai_tool": [
        [
          {
            "node": "Proposal agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Pair it with the proposal follow-up flow: both use the Proposals sheet.

Related flows