CPPO Proposal Generator¶
Capability Slug:
cppo_proposal_generatorPlan Tier: Command Credit Cost: 10 / 15 / 20 / 25 credits per run (varies by proposal type) Category: Co-Sell Default proposal type:generate_proposalSimulation: Supported (3 / 8 / 15 credits for quick / standard / deep)
Overview¶
A Channel Partner Private Offer (CPPO) is the AWS Marketplace transaction model for ISV-to-partner-to-customer resale. The mechanics involve ISV pricing, partner margins, an AWS Marketplace fee, contract terms, and a chain of acceptance steps that span deal desk, legal, channel ops, and the partner's own sales motion. Doing this manually is a multi-day spreadsheet exercise.
CPPO Proposal Generator turns those inputs into structured output: a full proposal, a pricing breakdown with AI-generated justification, partner agreement clauses, or an executive summary — depending on which mode you run. The pricing math is deterministic. The AI handles narrative framing, agreement language, and discount defense.
The four proposal types¶
Pick the mode that matches your workflow stage. Each runs independently and returns its own credit cost.
| Proposal type | Credits | Output | When to use |
|---|---|---|---|
generate_proposal (default) |
25 | Full eight-section CPPO proposal: executive summary, partner details, solution details, pricing structure, CPPO terms, compliance & requirements, implementation plan, next steps | First proposal pass for a new deal — get the complete package in one run |
pricing_structure |
15 | Deterministic pricing tiers + AI narrative justification + margin analysis + discount justification + payment terms | Refining pricing on an in-flight deal without regenerating the whole proposal |
partner_agreement |
20 | Nine clause types from AI + key clauses extracted + partner / ISV / AWS-program obligations | Legal review pass — generate clauses that match your CPPO arrangement |
deal_summary |
10 | One-page exec summary + deal metrics + stakeholders + risk register + success criteria | Internal go/no-go review at deal desk |
Models used vary by mode for cost efficiency: generate_proposal and partner_agreement use Claude 3 Sonnet; pricing_structure and deal_summary use Claude 3 Haiku.
Required and optional parameters¶
| Parameter | Required | Description |
|---|---|---|
proposal_type |
Yes | One of generate_proposal, pricing_structure, partner_agreement, deal_summary |
deal_data |
Required for most modes | Object with total_value, contract_months, discount_percentage, payment_model, deal_name, etc. |
partner_data |
Required for most modes | Object with partner_name, partner_tier, partner_specializations, primary_contact |
customer_data |
Required for proposal & summary | Object with customer_name, buyer_name, economic_buyer |
isv_list_price |
Pricing mode only | Numeric ISV list price per period (typically per month) |
partner_margin |
Pricing mode only | Decimal (e.g. 0.15 for 15%). Defaults to 0.15 |
discount_requested |
Pricing mode only | Decimal (e.g. 0.20 for 20%). Defaults to 0 |
agreement_type |
Agreement mode only | standard (default) or other custom labels |
How the pricing math works¶
The pricing engine in calculateCppoPricing() is deterministic — no AI involvement on the numbers themselves:
customer_price = isv_list_price × (1 - discount_requested)
partner_buy_price = customer_price × (1 - partner_margin)
aws_marketplace_fee = customer_price × 0.03 ← 3% (ISV Accelerate rate)
isv_net_price = partner_buy_price - aws_marketplace_fee
total_contract_value = customer_price × contract_months
isv_tcv_net = isv_net_price × contract_months
Verify the AWS Marketplace fee for your enrollment
The pricing engine uses 0.03 (3%) — the reduced rate for ISVs enrolled in AWS Marketplace ISV Accelerate. If you're not in that program, the standard listing-fee rate applies. The fee shows up as aws_marketplace_fee and aws_marketplace_fee_percentage on every pricing output so you can sanity-check before generating CPPO docs.
The pricing block also returns:
discount_percentage,partner_margin_percentage— surfaced as percentages for reviewannual_customer_valueandannual_isv_net— month → year conversions- All values rounded to 2 decimal places
The accompanying analyzeMargins() helper adds:
gross_margin_percentage— ISV net as a percentage of customer pricepartner_take,aws_take,isv_take— absolute dollar splitsmargin_health—Healthyif ISV net ≥ 50% of customer price, otherwiseNeeds Review
Discount justification rules¶
The deterministic justifyDiscount() validator runs alongside the pricing math:
| Discount | Auto-attached justifications |
|---|---|
| ≥ 20% | Strategic account acquisition · Multi-year commitment · Expansion potential |
| ≥ 10% | Competitive displacement · Reference customer value |
| < 10% | Standard partner pricing |
Plus contextual additions:
- Contract ≥ 24 months → "Long-term commitment premium"
- Total value ≥ $100K → "Volume discount tier"
approval_required is set to true when the discount is 20% or higher. Treat that as a hard gate in your deal desk flow.
Payment terms¶
Pass deal_data.payment_model and the capability returns the matching terms object:
| Model | Schedule | Terms | Renewal |
|---|---|---|---|
annual_upfront (default) |
Annual upfront payment | Net 30 from invoice date | Auto-renewal with 30-day notice |
monthly |
Monthly in arrears | Net 15 from invoice date | Month-to-month after initial term |
quarterly |
Quarterly upfront | Net 30 from invoice date | Auto-renewal with 60-day notice |
| anything else | As agreed | Net 30 | Per contract terms |
What generate_proposal returns¶
The full proposal mode is the heavyweight default. AI-generated sections (eight of them) plus deterministic helpers:
{
"success": true,
"proposal_type": "generate_proposal",
"credits_used": 25,
"proposal": {
"executive_summary": { "deal_overview": "...", "total_contract_value": "...",
"contract_duration": "...", "key_value_drivers": [...] },
"partner_details": { "partner_name": "...", "partner_tier": "...",
"partner_specializations": [...], "partner_capabilities": [...] },
"solution_details": { "isv_product_name": "...", "marketplace_listing_id": "...",
"pricing_model": "...", "aws_services_included": [...] },
"pricing_structure": { "list_price": ..., "partner_discount": ...,
"customer_price": ..., "margin_breakdown": {...},
"payment_schedule": "..." },
"cppo_terms": { "offer_duration": "...", "contract_terms": "...",
"renewal_terms": "...", "support_terms": "..." },
"compliance": { "marketplace_compliance": [...], "data_residency": "...",
"security_requirements": [...], "regulatory_compliance": [...] },
"implementation": { "deployment_timeline": "...", "onboarding_process": "...",
"training_included": [...], "success_milestones": [...] },
"next_steps": { "approval_process": [...], "cppo_submission_steps": [...],
"timeline_to_close": "..." }
},
"cppo_ready": true,
"marketplace_requirements": { /* AWS-program requirements, see below */ },
"next_steps": [ /* 5-step deterministic checklist with owners + timelines */ ],
"estimated_timeline": { "proposal_creation": "1-2 days", "internal_approval": "2-3 days",
"partner_negotiation": "3-5 days", "cppo_generation": "1 day",
"customer_acceptance": "Variable",
"total_estimated": "7-14 days (excluding customer)" }
}
cppo_ready is a deterministic boolean — true when all four required sections (executive summary, partner details, solution details, pricing structure) are populated.
Five-step submission checklist¶
Every generate_proposal run returns the same five-step sequence with explicit owners and timelines:
| Step | Action | Owner | Timeline |
|---|---|---|---|
| 1 | Finalize pricing with partner | ISV Sales | 1-2 days |
| 2 | Generate CPPO in AWS Marketplace | ISV Marketplace Admin | 1 day |
| 3 | Partner accepts CPPO | Channel Partner | 1-2 days |
| 4 | Partner creates customer private offer | Channel Partner | 1 day |
| 5 | Customer accepts offer | End Customer | Per sales cycle |
This is a deterministic checklist, not AI output — it's the AWS-defined CPPO acceptance flow.
What partner_agreement returns¶
Nine AI-generated clauses plus three deterministic obligation lists:
AI clauses:
term_duration— contract length and renewalpricing_terms— discount and margin termspayment_terms— when and how partner pays ISVterritory_rights— geographic restrictionsexclusivity— exclusivity terms if applicablemarketing_rights— co-marketing permissionssupport_responsibilities— who handles what supporttermination_clauses— how the agreement can endconfidentiality— NDA terms
Deterministic boilerplate:
| List | Items |
|---|---|
| Partner obligations | Maintain active AWS Partner status · Provide first-line support · Meet sales commitments · Comply with branding · Report sales activity · Maintain CSAT |
| ISV obligations | Maintain Marketplace listing · Provide enablement · Escalation support · Roadmap sharing · Co-marketing · Timely CPPO processing |
| AWS CPPO requirements | ISV enrolled in CPPO program · Partner is authorized reseller · Both parties accepted Marketplace terms · Offer complies with AWS pricing policies |
AWS Marketplace requirements (returned with every proposal)¶
| Category | Requirements |
|---|---|
| Partner | Registered AWS Partner · Marketplace seller account · Accepted Marketplace terms · Reseller authorization from ISV |
| Listing | Active public listing · Pricing model supports private offers · EULA allows resale |
| Transaction | Minimum transaction value may apply · Customer has AWS account · Billing through AWS |
Simulation (dry-run) mode¶
CPPO Proposal Generator implements SimulatableCapabilityInterface, so you can dry-run a proposal against persona reviewers before paying full credits. Useful when a deal is high-discount, strategic, or going through deal desk.
| Quality | Credits | Time | Depth |
|---|---|---|---|
quick |
3 | ~10 seconds | Basic validation |
standard |
8 | ~20 seconds | Comprehensive review |
deep |
15 | ~45 seconds | Exhaustive analysis |
Simulation runs against the personas registered in CapabilityPersonaRegistry::getCppoPersonas() (deal desk, channel manager, partner sales) and surfaces concerns before you commit to the full 25-credit generation.
getSimulationPreview() returns a context summary (proposal type, deal value, customer, partner, discount, duration) along with available personas and quality options — call it client-side to render a confirmation modal before launching the simulation.
When to use it¶
| Scenario | Recommended mode |
|---|---|
| Brand-new CPPO deal, partner identified | generate_proposal |
| Pricing renegotiation on an in-flight deal | pricing_structure |
| Legal pass on agreement clauses | partner_agreement |
| Deal desk go/no-go review | deal_summary |
| Pre-flight check on a high-discount or strategic deal | simulate() (quick / standard / deep) |
| Partner discovery and matching (before there's a deal) | Co-Sell Partner Discovery & Matching (cosell_partner_matching) |
It is not:
- A CPPO submission tool. The AWS-side CPPO creation still happens in the AWS Marketplace seller console — see step 2 of the submission checklist.
- A substitute for legal review. Generated clauses are starting drafts, not signed contracts.
- A pricing source of truth for non-CPPO deals. For direct private offers (no channel partner), the math doesn't apply.
API access¶
The capability is exposed through the agent runtime as cppo_proposal_generator. Partner API keys scoped with manage_cosell_plans plus the agent capability slug can generate proposals programmatically through the agent execution endpoint. The simulation interface is available on the same key. See Partner API Capabilities and Authentication & API Keys.
See also¶
- Co-Sell Partner Discovery & Matching — find the partner before generating the proposal (
cosell_partner_matching) - Joint GTM Campaign Planner — execute a co-branded campaign to drive demand into the CPPO motion
- ACE Brief Template — submit the deal to AWS Partner Central ACE for co-sell credit
- Partner API Capabilities — full capability and scope reference
Capability slug: cppo_proposal_generator · Handler: CppoProposalGeneratorCapability · Pricing model: 3% AWS Marketplace fee (ISV Accelerate) · Simulator: CppoProposalSimulator · Personas: CapabilityPersonaRegistry::getCppoPersonas()