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.
How it works
- You describe the client, their goal, budget and deadline.
- The agent picks the right services and relevant case studies.
- It writes the proposal for your review.
- 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.
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
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.
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": []
}In Make, create a new scenario and add these modules in order:
- Webhooks › Custom webhook — called by your website's chat widget
- Make AI Agents › Run an agent — give it these tools: “Services” (Google Sheets), “Case studies” (Google Sheets), “Save proposal” (Google Sheets), “Draft email” (Gmail); paste the system prompt as the agent's instructions
- Every module run uses Make operations — the free plan includes a monthly quota.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Zapier Chatbots, or Webhooks by Zapier — Catch Hook from your chat widget
- Zapier Agents — create an agent (or AI by Zapier for a single step) — give it these tools: “Services” (Google Sheets), “Case studies” (Google Sheets), “Save proposal” (Google Sheets), “Draft email” (Gmail); paste the system prompt as the agent's instructions
- Zaps with more than two steps need a paid Zapier plan.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Pair it with the proposal follow-up flow: both use the Proposals sheet.
Related flows
Customer support AI agent
A chat agent that answers from your FAQ, looks up orders, and hands tricky cases to a human.
Bookkeeping AI agent
Tell it about income and expenses in plain words; ask questions like "how much did we spend on ads this month?"
Unpaid invoices collections AI agent
Every morning, the agent reviews overdue invoices, drafts polite reminders in the right tone, and flags the ones that need a call.