{"id":"bumpgrade-checkout-offer-source-data","updatedAt":"2026-05-19","status":"post-purchase-decision-ready","issue":117,"parentIssue":15,"generatedFrom":"src/lib/checkout-offers.ts","routes":["/offers/source-data","/commerce/checkout/success","/api/commerce/post-purchase-decisions","/commerce/post-purchase","/api/admin/products/delivery-gates","/offers/indie-launch-stack"],"stableIds":["checkoutOfferStackId","offerId","orderBumpId","upsellId","downsellId","checkoutRevisionId","postPurchaseDecisionId","productDeliveryGateLinkId","agentActionId"],"sandboxCheckout":{"endpoint":"/api/commerce/checkout","successPage":"/commerce/checkout/success","webhook":"/api/stripe/webhook","confirmationRequired":true,"supportsOrderBumps":true,"supportsReferralAttributionEvidence":true,"allowedOrderBumpPriceIds":["price-launch-checklist-bump-usd"],"rawStripeIdsIncluded":false,"liveModeEnabled":false},"checkoutSuccess":{"issue":133,"route":"/commerce/checkout/success","status":"webhook-gated","reads":"/api/commerce/post-purchase-decisions","opensPostPurchaseOnlyWhenEligible":true,"rawStripeIdsIncluded":false,"privateDataIncluded":false},"postPurchaseDecisions":{"id":"post-purchase-decision-contract","status":"non-billing-decision-ready","issue":117,"parentIssue":15,"relatedIssues":[34,81,99,101,111,113,115],"apiRoute":"/api/commerce/post-purchase-decisions","routePrefix":"/commerce/post-purchase","confirmationText":"Record non-billing post-purchase decision for Bumpgrade checkout","eligibleCheckoutStatuses":["paid","completed"],"allowedDecisions":[{"decisionKind":"accept_upsell_follow_up","presentedOfferId":"offer-upsell-launch-accelerator","billingMutationCreated":false},{"decisionKind":"decline_upsell","presentedOfferId":"offer-upsell-launch-accelerator","billingMutationCreated":false},{"decisionKind":"accept_downsell_follow_up","presentedOfferId":"offer-downsell-launch-review","billingMutationCreated":false},{"decisionKind":"decline_downsell","presentedOfferId":"offer-downsell-launch-review","billingMutationCreated":false}],"publicSafeFields":["decisionId","checkoutIntentId","offerStackId","presentedOfferId","decisionKind","checkoutStatus","checkoutUpdatedAt","aggregateDecisionCounts"],"serverPrivateFields":["idempotency_key","audit_correlation_id","raw Stripe identifiers","buyer email","payment method","private checkout metadata"],"writeBoundary":"Issue #117 can record non-billing post-purchase upsell/downsell decisions for trusted checkout intents. It cannot create Stripe charges, PaymentIntents, subscriptions, fulfillment, entitlement grants, payable commissions, payout state, tax records, partner notifications, or direct agent billing writes."},"writeBoundary":"Issue #99 allows a confirmed sandbox Checkout Session start with the seeded primary offer and constrained order bump. Issue #111 allows eligible referral click IDs to be attached as checkout attribution evidence. Issue #113 allows review-only commission ledger evidence from trusted checkout attribution. Issue #115 allows owner-gated review, hold, and reversal actions for that ledger evidence without payout mutation. Issue #117 allows non-billing post-purchase upsell/downsell decision evidence after trusted checkout state. Issue #409 allows owner-created product test checkout links to be linked to the seeded offer/funnel delivery gates without live billing or fulfillment delivery. Charging post-purchase upsells, changing prices, publishing offer copy, granting fulfillment, live billing, payable commission writes, payout mutation, and direct agent writes require future confirmed-write APIs with actor identity, exact confirmation, idempotency, stale-state checks, audit correlation, redaction, owner review, reversal controls, and webhook evidence.","beforeAfterVisual":{"id":"indie-launch-stack-before-after-safe-offer-path","issue":554,"title":"Indie launch checkout offer stack source notes become a protected checkout path","summary":"A public-safe before-after visual for the offer page showing offer notes and fulfillment cues becoming a protected checkout sequence.","before":{"eyebrow":"Before","title":"Offer notes and buyer path","description":"The source side shows representative launch inputs only, keeping customer, billing, and fulfillment records out of public marketing copy.","artifacts":["Primary promise","Bump idea","Follow-up offer","Access notes"],"visualRows":["Promise","Price cue","Buyer question","Delivery cue"]},"after":{"eyebrow":"After","title":"Protected Bumpgrade offer path","description":"Bumpgrade separates the primary checkout, bump decision, follow-up offer, and fulfillment review before money or access changes.","artifacts":["Bumpgrade launch pass checkout path","Launch checklist bump decision","Launch accelerator upsell follow-up","Launch review downsell fallback"],"visualRows":["Offer","Bump","Follow-up"],"image":{"src":"/marketing/checkout-offer-card.png","alt":"Bumpgrade checkout offer workspace with primary offer, order bump, and follow-up steps."}},"safetyNotes":["Uses public-safe labels, structure, counts, and review states only.","Does not display raw export rows, pasted source copy, credentials, payment data, private subscriber values, or customer identifiers.","Shows Bumpgrade private plan, review, and protected path structure without claiming live transfer or buyer-facing changes."]},"stacks":[{"id":"checkout-stack-indie-launch-sandbox","slug":"indie-launch-stack","title":"Indie launch checkout offer stack","status":"sandbox_checkout_ready","issue":117,"parentIssue":15,"linkedFunnelId":"funnel-indie-launch-sandbox","linkedFunnelRoute":"/funnels/indie-launch-sandbox","sourceDataRoute":"/offers/source-data","previewRoute":"/offers/indie-launch-stack","checkoutContractRoute":"/commerce/source-data","checkoutEndpoint":"/api/commerce/checkout","postPurchaseDecisionEndpoint":"/api/commerce/post-purchase-decisions","postPurchaseRoutePrefix":"/commerce/post-purchase","webhookEndpoint":"/api/stripe/webhook","revisionId":"checkout-offer-revision-indie-launch-stack-2026-05-19-post-purchase-decisions","summary":"A checkout offer stack with a primary product, optional order bump, post-purchase upsell path, referral attribution, and product delivery handoff.","primaryOffer":{"id":"offer-primary-sandbox-launch-pass","kind":"primary","title":"Bumpgrade launch pass","slug":"sandbox-launch-pass","priceLabel":"$9 one-time payment","unitAmountCents":900,"currency":"usd","productId":"product-bumpgrade-sandbox-launch-pass","priceId":"price-bumpgrade-sandbox-launch-pass-usd","customerPromise":"Get the launch pass and move into the launch workspace setup path.","placement":"Primary checkout line item","copyIntent":"Explain what the launch pass gives the buyer before checkout starts.","agentEditable":true},"orderBumps":[{"id":"offer-bump-launch-checklist","kind":"order_bump","title":"Launch checklist bump","slug":"launch-checklist-bump","priceLabel":"$19 bump","unitAmountCents":1900,"currency":"usd","productId":"product-launch-checklist-bump","priceId":"price-launch-checklist-bump-usd","customerPromise":"Add a concise implementation checklist before checkout without changing the primary product.","placement":"Pre-payment order bump beside the primary checkout confirmation.","copyIntent":"Increase basket size with a relevant add-on while keeping the customer in the same checkout decision.","agentEditable":true}],"postPurchasePath":{"id":"post-purchase-path-launch-acceleration","trigger":"checkout.session.completed","startsAfter":"Primary checkout success and webhook evidence","expiresAfterMinutes":30,"offers":[{"id":"offer-upsell-launch-accelerator","kind":"upsell","title":"Launch accelerator upsell","slug":"launch-accelerator-upsell","priceLabel":"$199 upsell","unitAmountCents":19900,"currency":"usd","productId":"product-launch-accelerator-upsell","priceId":"price-launch-accelerator-upsell-usd","customerPromise":"Offer a time-boxed implementation package immediately after the first purchase.","placement":"Post-purchase upsell after completed checkout.","copyIntent":"Present a limited follow-on offer without confusing the first purchase.","agentEditable":true},{"id":"offer-downsell-launch-review","kind":"downsell","title":"Launch review downsell","slug":"launch-review-downsell","priceLabel":"$49 downsell","unitAmountCents":4900,"currency":"usd","productId":"product-launch-review-downsell","priceId":"price-launch-review-downsell-usd","customerPromise":"Offer a lighter review option if the upsell is declined.","placement":"Fallback downsell after the upsell decision.","copyIntent":"Keep the follow-up relevant and lower commitment without hidden recurring billing.","agentEditable":true}]},"confirmation":{"required":true,"checkoutText":"Create checkout for Bumpgrade launch pass at 9.00 USD"},"writeBoundary":"Issue #99 allows a confirmed sandbox Checkout Session start with the seeded primary offer and constrained order bump. Issue #111 allows eligible referral click IDs to be attached as checkout attribution evidence. Issue #113 allows review-only commission ledger evidence from trusted checkout attribution. Issue #115 allows owner-gated review, hold, and reversal actions for that ledger evidence without payout mutation. Issue #117 allows non-billing post-purchase upsell/downsell decision evidence after trusted checkout state. Issue #409 allows owner-created product test checkout links to be linked to the seeded offer/funnel delivery gates without live billing or fulfillment delivery. Charging post-purchase upsells, changing prices, publishing offer copy, granting fulfillment, live billing, payable commission writes, payout mutation, and direct agent writes require future confirmed-write APIs with actor identity, exact confirmation, idempotency, stale-state checks, audit correlation, redaction, owner review, reversal controls, and webhook evidence.","validation":["/offers/source-data returns the seeded primary offer, order bump, upsell, and downsell records.","/offers/indie-launch-stack renders the checkout-offer preview and sandbox checkout start panel.","/api/commerce/checkout accepts the seeded order bump in sandbox/test mode and returns redacted responses.","/api/commerce/checkout accepts eligible referral click IDs and returns public-safe attribution evidence.","/api/affiliates/commission-ledger can create non-payable commission evidence from trusted checkout attribution.","/api/admin/affiliates/commission-ledger/actions can apply owner-gated review/reversal actions without payout mutation.","/commerce/checkout/success polls the redacted post-purchase contract and gates its CTA on trusted webhook state.","/api/commerce/post-purchase-decisions can record non-billing upsell/downsell follow-up decisions from trusted checkout state.","/agent-docs/source-data lists the checkout-offer read contract for future MCP resources."]}],"caveat":"This contract proves offer-stack read semantics, a confirmed sandbox checkout start for the seeded primary offer plus constrained order bump, optional referral-click attribution evidence, review-only commission ledger evidence, owner-gated review/reversal actions, non-billing post-purchase upsell/downsell decision evidence, and aggregate owner-created product delivery-gate links for the seeded offer/funnel path. It does not enable live billing, one-click upsell charging, fulfillment, price mutation, payable commission writes, payout mutation, partner notifications, tax records, or direct confirmed-write agent APIs.","postPurchaseDecisionSummary":{"status":"available","aggregateCounts":[{"offer_stack_id":"checkout-stack-indie-launch-sandbox","presented_offer_id":"offer-upsell-launch-accelerator","decision_kind":"accept_upsell_follow_up","total_decisions":1,"last_created_at":1779177215}],"rawRowsIncluded":false,"privateDataIncluded":false,"billingMutationsIncluded":false,"fulfillmentRowsIncluded":false,"entitlementRowsIncluded":false},"ownerProductDeliveryGates":{"id":"owner-product-delivery-gates","status":"owner-product-delivery-gate-ready","issue":409,"parentIssue":16,"apiRoute":"/api/admin/products/delivery-gates","ownerRoute":"/admin/products","sourceDataRoute":"/products/source-data","offerSourceDataRoute":"/offers/source-data","funnelSourceDataRoute":"/funnels/source-data","offerStackId":"checkout-stack-indie-launch-sandbox","offerId":"offer-primary-sandbox-launch-pass","offerPreviewRoute":"/offers/indie-launch-stack","funnelId":"funnel-indie-launch-sandbox","funnelRoute":"/funnels/indie-launch-sandbox","auth":"Better Auth owner session","confirmation":{"required":true,"text":"Link owner product to offer and delivery gates"},"idempotencyRequired":true,"staleStateChecks":["expectedProductUpdatedAt","expectedLinkRevisionId"],"recordsIncluded":false,"writeBoundary":"Owners can link an owner-created product test checkout link to the seeded offer/funnel delivery gates after exact confirmation, idempotency, a current product updatedAt check, and a current checkout-link revision check. The link records offer/funnel/product delivery intent only; it does not create Stripe products, Stripe prices, Checkout Sessions, live charges, live offer/funnel publishing, arbitrary customer delivery, signed URLs, private R2 keys, or direct unconfirmed agent writes.","deliveryBoundary":"Customer delivery remains gated by the test checkout entitlement and fulfillment task. Seeded fixture delivery can be inspected through existing checkout-intent scoped product routes; arbitrary uploaded asset delivery, live protected course/member delivery, signed URLs, and live fulfillment automation remain blocked.","redaction":{"actorEmailIncluded":false,"actorUserIdIncluded":false,"buyerEmailIncluded":false,"buyerEmailHashIncluded":false,"idempotencyKeysIncluded":false,"checkoutLinkIdsIncluded":false,"publicCheckoutIntentIdsIncluded":false,"publicEntitlementIdsIncluded":false,"rawStripeIdsIncluded":false,"rawR2KeysIncluded":false,"signedUrlsIncluded":false,"liveBillingEnabled":false,"liveFulfillmentDeliveryEnabled":false},"source":"d1","loadError":null,"counts":{"deliveryGateLinks":0,"activeDeliveryGateLinks":0,"liveBillingEnabled":0,"liveFulfillmentDeliveryEnabled":0},"latestLinkedAt":null}}