Sales Automation
proposals documents
How to Build an AI Proposal Generator
Generate customized proposals in minutes using AI and your templates.
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
- Python 3.8+
- Claude or GPT API key
- Jinja2 for templating
- weasyprint for PDF generation
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
- Building Automated Sales Enablement Content - automated sales enablement content guide
- Creating Automated Proposal Generation - automated proposal generation guide
- AI for Sales Pipeline Management - ai sales pipeline management
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