← All posts
How-ToSeptember 14, 2026 · 10 min

How to automate client proposals with AI: a workflow blueprint for solo founders

To automate client proposals with AI, you combine web scraping, data enrichment, and dynamic PDF generation into a single workflow. Start by scraping prospect company data (LinkedIn, Crunchbase, or your CRM), enrich it with OpenAI to generate personalized proposal copy, then populate a template and render it as PDF. Make.com and n8n both handle this end-to-end: Make excels at no-code speed; n8n gives you deeper control if you write custom code. The result cuts proposal turnaround from hours to minutes, letting solo founders quote 10+ prospects daily instead of 2-3. This guide walks the exact workflow, tools, and failure points.

What you need

To automate client proposals with AI, you need a web scraper, a data enrichment layer, a document generator, and an orchestration platform. Here's what each component costs and does:

ToolPlan/PriceRole
n8nFree tier (5 workflows); Pro from $20/monthOrchestrates the entire workflow: triggers on prospect data, calls APIs, routes to PDF generation
Make.comFree tier (1,000 ops/month); Pro from $9.99/monthAlternative orchestration platform; simpler UI for non-technical founders
Web scraper (Bright Data, ScrapingBee, or built-in n8n HTTP node)ScrapingBee from $29/month; Bright Data check current pricingExtracts company data (revenue, employee count, industry) from public web pages or LinkedIn
OpenAI API$0.50-$15 per 1M tokens (GPT-4o mini to GPT-4o); pay-as-you-goGenerates personalized proposal copy based on prospect company data and your template
PDF generation (n8n PDF node or Puppeteer)Included in n8n; Puppeteer is open-sourceConverts templated HTML + prospect data into downloadable PDFs
Canva APICheck current pricingOptional: programmatically design proposal visuals if you need branded graphics beyond text
LucidpressCheck current pricingAlternative to Canva API for template-based PDF design with dynamic field insertion

How it works

  1. Prospect data collection. A web scraping tool (Puppeteer, Cheerio, or a no-code equivalent in n8n) extracts company name, industry, employee count, and website content from your prospect list or a public database. Store raw data in a spreadsheet or webhook-triggered database.
  1. Data enrichment with AI. OpenAI's API (GPT-4 or GPT-4o mini at ~$0.15 per 1K input tokens) receives the scraped company data and generates personalized value propositions, pain-point summaries, and custom pricing tiers based on company size. This output feeds into your proposal template variables.
  1. Proposal template population. Make.com or n8n retrieves the enriched data and populates a pre-built proposal template (stored as a Lucidpress document or Canva design) with company name, custom sections, and dynamic pricing. Both platforms support Canva API integration for template rendering.
  1. PDF generation and styling. The populated template is converted to PDF using Canva API's export function or a dedicated PDF generation service (PDFKit, wkhtmltopdf). The output includes your branding, prospect-specific content, and embedded proposal metadata.
  1. Delivery and tracking. The generated PDF is emailed directly to the prospect via Make.com or n8n's email module, with a tracking pixel or unique URL embedded to log opens and engagement. A webhook logs completion status back to your CRM.
  1. Iteration loop. Responses and rejections trigger follow-up workflows: re-enrichment with objection data, proposal version updates, or escalation to manual review for high-value deals.

How to build it

  1. Set up web scraping to collect prospect company data. Use n8n's HTTP Request node to pull prospect details from a public company database (LinkedIn Sales Navigator exports, Crunchbase API, or a simple CSV upload). Store the prospect name, company, industry, revenue range, and pain points in a structured format. If using Make.com, the HTTP module performs the same function. Test with a single prospect first to validate the data structure before scaling.
  1. Enrich prospect data with OpenAI. Add an OpenAI node (or Make's AI module) to generate a 2-3 sentence company context and identify 3 specific pain points relevant to your service. Use a prompt that references the industry and revenue tier. Store the enriched data in a variable for the next step. This takes ~2 seconds per prospect and costs roughly $0.001-0.003 per call depending on token usage.
  1. Build a proposal template in Lucidpress or Canva. Create a master proposal design with placeholder fields: {{PROSPECT_NAME}}, {{COMPANY_NAME}}, {{PAIN_POINTS}}, {{SOLUTION_OVERVIEW}}, {{PRICING_TIER}}, {{TIMELINE}}. Export as a fillable template. If using Canva API, design the template in Canva, note the element IDs for text layers, and prepare to update them via API calls. Lucidpress (now Marq) integrates directly with Zapier and Make via webhooks.
  1. Connect your proposal template to dynamic population. In n8n, use the Canva API node to fetch your template, then use a Function node or Code node to map prospect data to template placeholders. Alternatively, use Lucidpress's merge-field feature: pass prospect data as JSON to a Lucidpress webhook, and the template auto-populates. Test with one prospect; verify that names, company details, and pain points appear correctly in the output.
  1. Generate the PDF and store it. After template population, use n8n's PDF node or a third-party PDF generation service (e.g., PDFKit via HTTP) to convert the populated template to a PDF. Store the file in Google Drive, Dropbox, or AWS S3 using n8n's built-in storage nodes. Name the file {PROSPECT_NAME}_{DATE}.pdf for easy retrieval.
  1. Send the proposal via email. Use n8n's Gmail or Sendgrid node to email the PDF to the prospect. Include a personalized subject line: Your Custom Proposal: [Company Name] - [Service Type]. Add a one-line call-to-action referencing the enriched pain points. Log the send timestamp and prospect email in a Google Sheet for tracking.
  1. Track proposal opens and engagement (optional). Integrate Mailgun or Sendgrid's tracking webhooks into n8n to log open events, link clicks, and download attempts. Store these signals in a CRM or Airtable base to prioritize follow-ups.
  1. Set up error handling and logging. Add a Catch node in n8n after each major step (scraping, enrichment, PDF generation, email send) to log failures to a Slack channel or Google Sheet. This prevents silent failures and lets you debug data mismatches.
  1. Schedule the workflow. Use n8n's Cron trigger or Make's Scheduler to run the workflow daily or on-demand. For solo founders, a daily 9 AM trigger works well; adjust based on your sales cadence.

Example n8n workflow snippet (JSON excerpt for steps 1-3):

json
{
 "nodes": [
 {
 "name": "Fetch Prospect CSV",
 "type": "n8n-nodes-base.httpRequest",
 "typeVersion": 4.1,
 "parameters": {
 "url": "https://your-crm.com/api/prospects",
 "method": "GET",
 "headers": {
 "Authorization": "Bearer YOUR_API_KEY"
 }
 }
 },
 {
 "name": "Enrich with OpenAI",
 "type": "n8n-nodes-base.openAi",
 "typeVersion": 1,
 "parameters": {
 "model": "gpt-4",
 "prompt": "Company: {{$json.company_name}}, Industry: {{$json.industry}}, Revenue: {{$json.revenue}}. Generate 3 specific business pain points this company likely faces and a 2-sentence context. Return as JSON with keys: pain_points (array), context (string).",
 "temperature": 0.7
 }
 },
 {
 "name": "Merge Prospect + Enrichment",
 "type": "n8n-nodes-base.set",
 "parameters": {
 "assignments": {
 "prospect_data": "={{merge($json, $('Enrich with OpenAI').json)}}"
 }
 }
 }
 ]
}

System prompt for OpenAI enrichment:

You are a B2B sales analyst. Given a prospect company's name, industry, and revenue tier, generate:
1. Three specific, high-value pain points this company likely faces.
2. A 2-sentence business context explaining why your service solves their problem.

Return valid JSON only:
{
 "pain_points": ["pain 1", "pain 2", "pain 3"],
 "context": "sentence 1. Sentence 2."
}

Do not include markdown, explanations, or preamble.

Real timeline: From prospect data to PDF in inbox takes 30-90 seconds per prospect once the workflow is live. A solo founder can generate 50 proposals per day with zero manual effort, compressing a typical 5-7 day sales cycle to 24 hours.

What it costs to run

Component100 proposals/mo1,000 proposals/mo10,000 proposals/mo
Make.com$0-10$10-20$20-99
n8n (self-hosted)$0$0$0
OpenAI API$2-5$15-40$150-400
PDF generation$0-5$5-15$15-50
Web scraping$0-10$10-30$30-100
Total$2-30$40-105$215-649

Assumptions: - Make.com pricing assumes standard tier ($10-99/mo) with task overage; n8n self-hosted on your own server eliminates per-execution costs. - OpenAI API uses GPT-4 mini at ~$0.015-0.04 per proposal for enrichment and personalization; check current pricing. - PDF generation (Lucidpress API or Canva API) costs $0-50/mo depending on tier; hedge this based on your provider's plan. - Web scraping assumes 10-50 data points per prospect via Make or n8n built-in HTTP modules; external scraping services (Bright Data, ScraperAPI) add $20-200/mo. - Costs scale linearly; volume discounts available on OpenAI and scraping platforms.

Where this breaks

Scraped data is stale or incomplete. You pull prospect company info on Monday, but their website updates Tuesday - your proposal references outdated headcount, revenue, or product offerings. Fix: run the scraper 24 hours before proposal generation, not days ahead. Store timestamps in your Make.com or n8n workflow and flag records older than 48 hours for manual review before sending.

PDF generation fails on special characters or long text blocks. A prospect's company name contains an ampersand or accented letter, or their product description is 500 words - Lucidpress or your PDF API chokes, returns a blank file, or truncates content mid-sentence. Fix: sanitize all text fields in OpenAI's response before passing to the PDF generator; use UTF-8 encoding explicitly in your Canva API or Lucidpress request headers. Test with real prospect data (not just clean CSV samples) in staging before production.

Personalization breaks when data is missing. Web scraping returns no LinkedIn employee count, no funding info, or no industry classification - your template has a blank field or the AI generates a generic fallback that sounds robotic. Fix: set conditional logic in n8n or Make.com: if a field is null, either skip that sentence entirely or use a pre-written fallback ("We serve companies across your sector"). Never let the template render an empty variable.

Proposal lands in spam or looks unprofessional. The PDF renders with misaligned logos, broken fonts, or the email attachment is flagged as malware because you're generating unsigned PDFs at scale. Fix: use a template-first approach (design once in Canva, export as a reusable template) rather than dynamic layout. Sign PDFs with a certificate if your email volume is high. Test the final PDF in Gmail, Outlook, and mobile before automating delivery.

How do I handle proposals for different service tiers or product bundles?

Store your service definitions in a structured table (Google Sheets, Airtable, or a JSON file in n8n) keyed by tier name or product SKU. When the workflow fetches prospect data, have OpenAI classify the prospect's company size or use case, then pull the matching tier template and pricing from your table before populating the PDF. This way one workflow handles unlimited variations without rebuilding the automation.

What if the prospect's website is behind a paywall or doesn't have public financials?

Use a data enrichment API like Hunter.io or Apollo.io (integrated via Make.com or n8n's HTTP module) to fill gaps - they return company size, funding stage, and employee count from public records. If enrichment still returns blanks, set fallback values in your template (e.g., "Based on industry benchmarks for [Company Size]") or flag the record for manual review before sending.

Can I A/B test different proposal layouts or pricing frames automatically?

Yes. Create two proposal templates in Lucidpress or Canva API, then have your workflow randomly assign each prospect to template A or B, generate both PDFs, and log which variant was sent in your CRM. Track which template correlates with higher acceptance rates over 20-30 proposals, then promote the winner to 100% of new sends.

How do I ensure the PDF doesn't look broken if company data is missing or too long?

Test your Lucidpress or Canva API template with edge cases: longest company names, shortest, missing logos, and multi-line addresses. Set character limits in your OpenAI prompt (e.g., "Summarize the prospect's business in 40 words max") and validate field length before passing data to the PDF generator. If a field exceeds the limit, truncate with "..." rather than letting text overflow the template.

For a deeper technical reference, see n8n's documentation.

Get the full toolkit

Grab the free guide with the node-by-node build for all 10 automations.

No spam. Unsubscribe anytime. Just the good stuff.