Blog · · 6 min read

How to generate sales proposal PDFs with n8n and AI (no coding)

A step-by-step guide so that when someone fills a form or a Sheets row, n8n builds a personal sales proposal as a Google Doc or PDF, emails it and logs the status. No code needed.

Writing a quote or sales proposal by hand takes time: you copy the template, change the name, the service, the price, export to PDF and send it. When several requests land in one day, either they pile up or mistakes slip in.

In this guide you'll build an n8n workflow that starts from a form or a Google Sheets row with the client's details, lets AI write the proposal body, builds a Google Doc (or PDF) from your template, emails it and updates the status on your sheet. You only check the first few so the tone sounds like you.

If you already qualify leads or chase open quotes, this workflow sits in the middle: qualify leads decides who is worth a reply; this guide prepares the proposal; and quote follow-up chases people who don't answer.

What you'll build

A seven-part workflow:

  1. Trigger: an n8n form or a new Google Sheets row with the client's details.
  2. Edit Fields (Set): tidies name, company, service, scope, price and tax.
  3. Basic LLM Chain: AI writes the proposal body from those details.
  4. Google Drive + Google Docs: copies your template and fills the blanks (or creates a new Doc).
  5. Google Drive (optional): exports the Doc as PDF.
  6. Gmail: sends the link or PDF to the client (or leaves it in drafts).
  7. Google Sheets: Append or Update Row with status "proposal sent".

Step 1: choose where the data comes from

You need name, email, company (if any), what they asked for, a rough scope and the price you'll offer. Two easy options:

  • n8n Form Trigger: n8n gives you a form with a link. Suggested fields: name, email, company, service, scope (free text), price, currency and tax (%). Ideal when you or your team fill it in after a call.
  • Google Sheets Trigger (On Row Added): if you already log requests in a sheet, each new row starts the workflow. Useful when someone on the team types them in, or when another workflow (for example lead qualification) drops "hot" rows there.

To start, the n8n form is the clearest: you can test it yourself in a minute.

Step 2: tidy up the data

Add an Edit Fields (Set) node with fixed fields: name, email, company, service, scope, price, tax, total and date set to {{ $now.toISODate() }}. Calculate the total in this node (price + tax) so you don't mix formulas into the template.

That way, if you switch from a form to a sheet tomorrow, you only change the Set node and the rest of the workflow stays the same.

Step 3: AI writes the proposal body

Add a Basic LLM Chain with your AI model and a prompt like this:

You are [your name] from [your business]. Write the body of a short, professional sales proposal in English. Details: client {{ $json.name }}, company {{ $json.company }}, service {{ $json.service }}, scope {{ $json.scope }}, price {{ $json.price }} + tax {{ $json.tax }}% (total {{ $json.total }}), date {{ $json.date }}. Include: one context paragraph (what you understood they need), 3–5 concrete deliverables, a rough timeline in business days, the price with tax and a validity line (for example, 15 days). Friendly but serious tone. Do not invent services or prices that are not in these details. 280 words max. Return only the body text, no subject or signature.

The key point: you set the price and scope in the form. The AI only writes them up; it does not invent figures. If you want a more formal or more casual tone, say so in the prompt.

Step 4: build the document from your template

The cleanest no-code path is a Google Docs template + copy + replace:

  1. In Drive, create a Doc template with clear placeholders such as {{name}}, {{company}}, {{service}}, {{body}}, {{price}}, {{total}}, {{date}}. Keep your logo, fonts and footer fixed.
  2. In n8n, add Google Drive with the Copy operation on that file. Name the copy something like Proposal {{ $json.name }} {{ $json.date }}.
  3. Add Google Docs (or your text-update node) and replace each placeholder with the Set values and the AI text in {{body}}.

If you'd rather skip a template, create a new Google Doc and paste the AI text plus a fixed header. A template usually looks more professional because the layout is already done.

PDF option

When the Doc is ready:

  • Google Drive → download or export the file as PDF (many nodes offer export / download in PDF format).
  • Keep the binary in the workflow so you can attach it to the email in the next step.

If you don't need a PDF and a Google Docs link is enough (with "anyone with the link can view"), you can skip the export and send only the URL. For more formal clients, a PDF usually lands better.

Another path without a Docs template: have the AI generate simple HTML and use an HTML→PDF converter that works with n8n (for example a Convert to File node or an HTTP service). The Docs template is usually easier to maintain if you don't code.

Step 5: send the email

Add a Gmail node:

  • Recipient: {{ $('Edit Fields').item.json.email }}
  • Subject: something like Proposal: {{ $('Edit Fields').item.json.service }} — {{ $('Edit Fields').item.json.name }}
  • Body: two or three short lines of your own ("Hi [name], here's the proposal we discussed. Happy to answer any questions.") plus the Doc link or the PDF attachment.

For the first few clients, use Create Draft instead of Send: you review the draft, open the PDF and, once it sounds like you, switch to automatic send.

Step 6: log the status on your sheet

Add Google Sheets:

  • If the trigger was the form, use Append Row on a proposals sheet with columns name, email, service, total, date, doc_link, status.
  • If the trigger was a row, use Update Row, set status to "proposal sent" and store the Doc link.

That sheet is the same one the quote follow-up workflow can read at day 3 and day 7. No need to copy data between tools by hand.

Step 7: test it end to end

  1. Fill the form with a dummy client.
  2. Check the Doc or PDF: is the price correct? Did the scope invent anything?
  3. Look at the Gmail draft and the status on Sheets.
  4. When it looks right, switch Create Draft to Send.

If something fails (Drive permissions, a missing placeholder), n8n marks the exact node: fix that step and re-run from there.

Ideas to take it further

  • Only good leads: start this workflow when the AI lead qualifier passes your threshold, not on every public form.
  • Automatic follow-up: once you mark "proposal sent", quote follow-up handles the reminders.
  • When they say yes: chain the new client welcome so onboarding doesn't slip.
  • Several templates: a Switch by service type picks template A (consulting) or B (retainer).
  • Internal alert: a Telegram or Slack message like "Proposal sent to [name] — [total]" so you don't have to watch the sheet.

Cost and limits

  • Cost: the AI writes one short text per proposal, so the spend is usually small. Drive and Gmail use your Google account. Check the current prices of your AI provider and of n8n.
  • Review: AI can soften or pad the wording. That's why drafts at the start help, and prices should always come from you in the Set node.
  • Permissions: the Doc or PDF you send should not include other clients' data. Use one copy per proposal, not the original template.
  • Validity and legal: your template can include fixed terms; don't ask the AI to invent legal clauses.

Start with ready-made templates

If you'd like to skip the basic n8n and AI setup, download the free WhatsApp agent or see the AgentKiosk pack: 8 agents ready to import, with the AI part already set up. You can build this proposal PDF flow on top with the steps above.