Systems Library / Sales Automation / How to Build an AI Proposal Generator
Sales Automation proposals documents

How to Build an AI Proposal Generator

Generate customized proposals in minutes using AI and your templates.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

An ai proposal generator saves hours per deal. I use this to turn 3-hour proposal writing sessions into 15-minute review and customize tasks. Feed it your templates and CRM data and it generates customized proposals in automated sales workflows.

What You Need Before Starting

Step 1: Build Your Template Library

Break your best proposal into reusable sections.

TEMPLATE_SECTIONS = {
    "exec_summary": "templates/exec_summary.md",
    "problem": "templates/problem.md",
    "solution": "templates/solution.md",
    "pricing": "templates/pricing.md",
    "case_studies": "templates/case_studies.md",
}

def load_template(section):
    with open(TEMPLATE_SECTIONS[section]) as f:
        return f.read()

Step 2: Gather Prospect Context

Pull everything from the CRM.

def gather_context(crm_client, deal_id):
    deal = crm_client.get_deal(deal_id)
    company = crm_client.get_company(deal["company_id"])
    return {
        "company_name": company["name"],
        "industry": company["industry"],
        "pain_points": deal.get("pain_points", ""),
        "budget": deal.get("budget", ""),
    }

Step 3: Generate with AI

Let Claude customize each section.

import anthropic

def generate_section(template, context, section_name):
    client = anthropic.Anthropic()
    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2000,
        system="You write proposals. Direct tone. Every sentence builds toward closing.",
        messages=[{"role": "user",
            "content": f"Customize this {section_name} for {context['company_name']}.\n\nTemplate:\n{template}\n\nContext:\n{context}"}]
    )
    return message.content[0].text

Step 4: Assemble the Document

Combine all sections with consistent formatting.

def assemble_proposal(sections, context):
    proposal = f"# Proposal for {context['company_name']}\n\n"
    for name in ["exec_summary", "problem", "solution", "case_studies", "pricing"]:
        if name in sections:
            proposal += f"## {name.replace('_', ' ').title()}\n\n{sections[name]}\n\n"
    return proposal

Step 5: Export as PDF

Branded PDF output.

from weasyprint import HTML

def export_pdf(html_content, output_path):
    styled = f"<html><head><style>body {{font-family: Arial; margin: 40px;}}</style></head><body>{html_content}</body></html>"
    HTML(string=styled).write_pdf(output_path)

What to Build Next

Add proposal analytics. Track which sections prospects spend the most time on.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems