Skip to main content

How to Auto-Generate Sales Proposals with Claude Code [2026]

· 10 min read
MarketBetter Team
Content Team, marketbetter.ai

Your sales team just had a great discovery call. The prospect is ready for a proposal. Now comes the bottleneck: someone needs to spend 2-4 hours pulling together a customized deck with the right case studies, accurate pricing, and messaging that addresses this specific buyer's pain points.

What if that proposal could write itself?

AI Proposal Generation Workflow

With Claude Code and the right architecture, you can reduce proposal generation from hours to minutes—while actually increasing personalization. This guide shows you how to build an AI proposal generator that pulls context from your CRM, incorporates meeting notes, and produces polished documents ready for review.

Why Manual Proposals Kill Deal Velocity

Proposals are a critical bottleneck in the sales cycle. Here's why:

Time Cost:

  • Average proposal takes 2-4 hours to create
  • Senior AEs spend 6-8 hours/week on proposals
  • At $150K OTE, that's ~$18K/year per AE on document creation

Quality Variance:

  • Junior reps produce weaker proposals than veterans
  • Copy-paste errors creep in (wrong company names, outdated pricing)
  • Generic messaging fails to address specific prospect concerns

Velocity Impact:

  • Deals stall waiting for proposals
  • Prospects go cold while documents are in progress
  • Competitors who respond faster win the deal

Time Savings: Manual vs AI Proposals

The math is simple: faster proposals = higher close rates. Teams that respond to pricing requests within 1 hour are 7x more likely to close than those who wait 24+ hours.

The Anatomy of a Great Proposal

Before automating, understand what makes proposals convert:

1. Personalization That Shows You Listened

  • References to specific pain points from discovery
  • Industry-relevant examples and metrics
  • Prospect's own language reflected back

2. Clear Value Narrative

  • Business impact, not feature lists
  • ROI calculations specific to their situation
  • Timeline to value that feels realistic

3. Social Proof That Resonates

  • Case studies from similar companies (size, industry)
  • Relevant testimonials and metrics
  • Recognizable logos when possible

4. Transparent Pricing

  • Clear breakdown of what's included
  • Options that give them control
  • Investment framed against expected return

5. Easy Next Steps

  • Single clear CTA
  • Low-friction way to move forward
  • Multiple contact options

Building the Proposal Generator with Claude Code

Step 1: Design Your Proposal Schema

First, define the structure Claude will generate:

interface Proposal {
metadata: {
prospectCompany: string;
prospectContact: string;
generatedDate: string;
validUntil: string;
version: string;
};

executiveSummary: {
headline: string;
painPointsSummary: string[];
proposedSolution: string;
expectedOutcomes: string[];
};

situationAnalysis: {
currentState: string;
challenges: Challenge[];
businessImpact: string;
};

solution: {
overview: string;
capabilities: Capability[];
implementation: ImplementationPlan;
};

socialProof: {
caseStudies: CaseStudy[];
testimonials: Testimonial[];
relevantLogos: string[];
};

investment: {
options: PricingOption[];
comparison: string;
roi: ROICalculation;
};

nextSteps: {
cta: string;
timeline: string[];
contacts: Contact[];
};
}

Step 2: Create the Context Gatherer

Claude needs rich context to generate personalized proposals. Build a function that aggregates everything:

async function gatherProposalContext(dealId) {
// Get CRM data
const deal = await hubspot.getDeal(dealId, {
associations: ['contacts', 'companies', 'meetings', 'notes']
});

// Get company info
const company = deal.associations.companies[0];
const companyData = {
name: company.name,
industry: company.industry,
size: company.numberOfEmployees,
revenue: company.annualRevenue,
website: company.website,
description: company.description
};

// Get meeting transcripts/notes
const meetingNotes = deal.associations.meetings.map(m => ({
date: m.meetingDate,
notes: m.notes,
attendees: m.attendees
}));

// Get relevant case studies from our database
const caseStudies = await findRelevantCaseStudies({
industry: company.industry,
companySize: company.numberOfEmployees
});

// Get product/pricing info
const productInfo = await getProductCatalog();
const pricingTiers = await getPricingForDealSize(deal.amount);

// Compile competitors mentioned
const competitorMentions = extractCompetitorMentions(meetingNotes);

return {
deal,
company: companyData,
meetings: meetingNotes,
caseStudies,
products: productInfo,
pricing: pricingTiers,
competitors: competitorMentions
};
}

Step 3: Build the Generation Prompt

The prompt is where the magic happens. Here's a production-tested approach:

const PROPOSAL_SYSTEM_PROMPT = `
You are an expert B2B sales proposal writer. Your proposals have an
exceptional win rate because you:

1. Lead with the prospect's specific pain points, using their exact language
2. Connect each capability to measurable business outcomes
3. Include relevant social proof (similar company size, industry)
4. Present pricing as an investment with clear ROI
5. Make next steps frictionless

STYLE GUIDELINES:
- Write in confident but not arrogant tone
- Use "you" and "your" heavily (prospect-focused)
- Avoid jargon unless the prospect used it first
- Keep sentences punchy—average 15 words
- Use numbers and specifics over generalities

FORMATTING:
- Output as JSON matching the Proposal interface
- Include 2-3 case studies maximum
- Provide 2-3 pricing options (good/better/best)
- Keep executive summary under 200 words
`;

async function generateProposal(context) {
const response = await claude.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 8000,
system: PROPOSAL_SYSTEM_PROMPT,
messages: [{
role: 'user',
content: `Generate a proposal for the following opportunity:

PROSPECT COMPANY:
${JSON.stringify(context.company, null, 2)}

DEAL CONTEXT:
- Deal Size: $${context.deal.amount}
- Stage: ${context.deal.stage}
- Products of Interest: ${context.deal.products?.join(', ')}

MEETING NOTES (Discovery Insights):
${context.meetings.map(m => `
[${m.date}]
${m.notes}
`).join('\n---\n')}

AVAILABLE CASE STUDIES:
${JSON.stringify(context.caseStudies, null, 2)}

PRICING TIERS:
${JSON.stringify(context.pricing, null, 2)}

${context.competitors.length > 0 ? `
COMPETITORS MENTIONED:
${context.competitors.join(', ')}
(Address differentiators tactfully)
` : ''}

Generate a complete, personalized proposal.`
}],
response_format: { type: 'json_object' }
});

return JSON.parse(response.content[0].text);
}

Step 4: Transform to Final Format

Claude outputs structured JSON. Now transform it to your preferred format:

async function renderProposal(proposalData, outputFormat = 'docx') {
switch (outputFormat) {
case 'docx':
return await renderToWord(proposalData);
case 'pdf':
return await renderToPDF(proposalData);
case 'slides':
return await renderToSlides(proposalData);
case 'notion':
return await renderToNotion(proposalData);
default:
return proposalData; // Return raw JSON
}
}

async function renderToWord(proposal) {
const doc = new Document({
sections: [{
properties: {},
children: [
// Cover page
new Paragraph({
children: [
new TextRun({
text: `Proposal for ${proposal.metadata.prospectCompany}`,
bold: true,
size: 48
})
],
alignment: 'center'
}),

// Executive Summary
new Paragraph({
children: [
new TextRun({ text: 'Executive Summary', bold: true, size: 32 })
]
}),
new Paragraph({
children: [
new TextRun({ text: proposal.executiveSummary.headline, bold: true })
]
}),
...proposal.executiveSummary.painPointsSummary.map(point =>
new Paragraph({ children: [new TextRun(`${point}`)] })
),

// ... continue for all sections
]
}]
});

return await Packer.toBuffer(doc);
}

Generated Proposal Mockup

Real-World Example: SaaS Proposal Generation

Let's walk through a complete example:

Input Context:

  • Company: Acme Corp (500 employees, Manufacturing, $80M revenue)
  • Deal: $45,000/year platform subscription
  • Discovery Notes: "SDR team of 12, currently using spreadsheets to track prospects. Manager complained they're 'flying blind' on pipeline. Asked about Salesforce integration."

Generated Proposal (excerpts):

{
"executiveSummary": {
"headline": "From Flying Blind to Crystal Clear: Transforming Acme's SDR Performance",
"painPointsSummary": [
"Your 12-person SDR team currently operates without centralized visibility—you described this as 'flying blind' on pipeline",
"Spreadsheet-based tracking creates data silos and makes it impossible to spot trends or coach effectively",
"Without integrated systems, reps waste hours on manual data entry instead of selling"
],
"proposedSolution": "MarketBetter's AI-powered SDR platform consolidates your prospecting, outreach, and pipeline management into a single source of truth—with native Salesforce integration you specifically asked about.",
"expectedOutcomes": [
"50% reduction in time spent on manual data entry",
"Real-time pipeline visibility for managers",
"15-20% increase in meetings booked per rep"
]
},

"socialProof": {
"caseStudies": [
{
"company": "Precision Manufacturing Co",
"industry": "Manufacturing",
"size": "450 employees",
"challenge": "SDR team working off disconnected spreadsheets",
"result": "67% increase in pipeline visibility, 23% more meetings in first quarter",
"quote": "Finally, I can see what my team is actually doing without asking for status updates."
}
]
},

"investment": {
"options": [
{
"name": "Growth",
"seats": 12,
"annual": 36000,
"features": ["Core platform", "Basic automation", "Standard integrations"],
"recommendation": false
},
{
"name": "Scale",
"seats": 12,
"annual": 45000,
"features": ["Core platform", "Advanced automation", "Salesforce integration", "Priority support"],
"recommendation": true,
"whyRecommended": "Includes the Salesforce integration you specifically need"
},
{
"name": "Enterprise",
"seats": 12,
"annual": 60000,
"features": ["Everything in Scale", "Dedicated CSM", "Custom reporting", "API access"],
"recommendation": false
}
],
"roi": {
"currentCostOfInefficiency": "$15,000/month in lost productivity",
"expectedSavings": "$8,000/month",
"paybackPeriod": "6 months"
}
}
}

Handling Edge Cases

Multiple Stakeholders

When proposals need to address different personas:

async function generateMultiStakeholderProposal(context) {
const stakeholders = context.meetings
.flatMap(m => m.attendees)
.filter(a => a.role !== 'our_team');

// Identify personas
const personas = await claude.analyze({
messages: [{
role: 'user',
content: `Categorize these stakeholders:
${JSON.stringify(stakeholders)}

Categories: Executive, Finance, Technical, End-User`
}]
});

// Generate proposal with persona-specific sections
return generateProposal({
...context,
stakeholderPersonas: personas,
additionalInstructions: `
Include these targeted sections:
- Executive Summary (for ${personas.executive?.name})
- Technical Specifications (for ${personas.technical?.name})
- ROI Analysis (for ${personas.finance?.name})
`
});
}

Competitive Situations

When prospects mention competitors, address it tactfully:

if (context.competitors.includes('competitor-x')) {
context.additionalInstructions += `
The prospect mentioned evaluating Competitor X. Include:
- A brief, factual comparison (no FUD)
- Differentiation on the specific pain points they mentioned
- A case study of a customer who switched from Competitor X

Keep comparison professional—never bash the competitor.
`;
}

Custom Pricing Requests

When standard tiers don't fit:

if (context.deal.customPricingRequested) {
const customPricing = await calculateCustomPricing({
baseSeats: context.deal.seatCount,
addOns: context.deal.requestedAddOns,
term: context.deal.contractTerm,
volume: context.company.numberOfEmployees
});

context.pricing = {
custom: true,
breakdown: customPricing,
flexibility: 'Pricing reflects your specific requirements. Let\'s discuss if anything needs adjustment.'
};
}

Integration with Your Workflow

Trigger: CRM Stage Change

// HubSpot workflow trigger
app.post('/webhooks/hubspot/deal-stage-change', async (req, res) => {
const { dealId, newStage } = req.body;

if (newStage === 'proposal_requested') {
// Gather context
const context = await gatherProposalContext(dealId);

// Generate proposal
const proposal = await generateProposal(context);

// Render to PDF
const pdf = await renderProposal(proposal, 'pdf');

// Save to deal
await hubspot.uploadFile(dealId, pdf, 'proposal.pdf');

// Notify rep
await slack.notify(context.deal.owner, {
text: `📄 Proposal generated for ${context.company.name}`,
actions: [
{ text: 'Review', url: `https://app.hubspot.com/deals/${dealId}` },
{ text: 'Send to Prospect', callback: 'send_proposal' }
]
});
}

res.sendStatus(200);
});

Human-in-the-Loop Review

Always allow reps to review before sending:

async function queueForReview(proposal, dealId) {
// Create review task
await hubspot.createTask({
dealId,
subject: 'Review Generated Proposal',
priority: 'HIGH',
notes: `AI-generated proposal is ready for review.

Check:
- [ ] Pain points accurately captured
- [ ] Pricing correct
- [ ] Case studies relevant
- [ ] No copy/paste errors

Make edits directly in the attached document.`,
dueDate: addHours(new Date(), 4)
});
}

Measuring Success

Track these metrics to quantify proposal automation ROI:

MetricBeforeAfterImpact
Time to proposal3 hours15 min-92%
Proposals/week/rep28+300%
Win rate25%31%+24%
Response time2 days4 hours-83%
Copy errors12/month0/month-100%

The compounding effect is significant. If faster proposals increase close rates by just 6%, and your reps can produce 4x more proposals, the revenue impact is dramatic.

Getting Started with MarketBetter

Building your own proposal generator is powerful, but it takes time. MarketBetter offers proposal automation as part of the complete AI SDR platform:

  • One-click proposals from any deal in HubSpot or Salesforce
  • Smart case study matching based on prospect industry and size
  • Dynamic pricing that pulls from your CPQ configuration
  • Brand-compliant templates that match your company guidelines
  • Version tracking so you know what was sent when

Combined with AI lead research, automated follow-ups, and pipeline monitoring, it creates a system where proposals are generated in the flow of work—not a bottleneck that delays them.

Book a Demo →

Key Takeaways

  1. Manual proposals waste senior AE time — $18K/year per rep on document creation
  2. Speed wins deals — Responding in 1 hour vs 24 hours increases close rate 7x
  3. Claude Code enables intelligent generation — Pull CRM data + meeting context + case studies
  4. Structure matters — Define schemas so output is consistent and renderable
  5. Always human-in-the-loop — AI generates, humans approve and send

Your proposals are often the first professional deliverable a prospect sees. Make sure they're personalized, polished, and prompt. With AI, you can have all three.