Install
openclaw skills install @autonnel/post-purchase-upsell-flowDesign and implement one-click post-purchase upsells and downsells that raise average order value without hurting the main conversion rate.
openclaw skills install @autonnel/post-purchase-upsell-flowThe step after payment is the cheapest revenue in a funnel: the customer has already converted, the payment method is already captured, and the offer costs nothing in ad spend. This skill covers designing that step and the technical requirements that make it actually work.
landing-page-conversion-audit). An upsell on no traffic is arithmetic on zero.| Pre-purchase (bump on the order form) | Post-purchase (after payment) | |
|---|---|---|
| Risk to main conversion | Real - every added element on the order form can cost you the base sale | None - the base order is already captured |
| Take rate | Lower per offer, but seen by 100% of checkout visitors | Higher per offer, seen only by buyers |
| Price ceiling | Low (a small add-on) | Higher (2-5x the base order is normal) |
| Payment friction | None, same form | Needs stored payment credentials to be one-click |
Default recommendation: build the post-purchase upsell first. It cannot cannibalize the base conversion rate, so it is the only AOV lever that is risk-free to test. Add a pre-purchase bump later, and only behind an A/B test that watches base conversion rate as a guardrail metric.
Payment captured
└─ Upsell 1 (complementary, highest-margin)
├─ accept → Upsell 2 (optional, only if the first was accepted - willingness is proven)
└─ decline → Downsell 1 (same benefit, smaller commitment: single unit, lite version, payment plan)
├─ accept → thank-you
└─ decline → thank-you
Keep the chain at two decisions for most funnels. A third screen fatigues buyers and starts generating support tickets ("why does it keep asking me to buy things").
Headline: names the gap the base purchase left open
Body: 3-5 lines, one benefit, referencing what they just bought
Proof: one specific line (usage stat, one attributable review)
Price: struck-through reference price only if that price is real elsewhere
Accept: one button, verb + outcome ("Add the strap - $19")
Decline: plain text link, honest wording ("No thanks, continue to my order")
Confirmation: state clearly that it is added to the same order and charged to the same card
These are what make the difference between a real one-click upsell and a second checkout that nobody completes.
| Requirement | Why | Failure mode if missing |
|---|---|---|
| Stored payment credential usable off-session | Enables charging without re-entry | Take rate drops to near-checkout rates |
| Merged order, not N separate orders | One shipment, one receipt, one refundable record | Fulfilment sees 3 orders for one customer; refunds get messy |
| Deferred push to the store/ERP until the chain ends | So the downstream system receives one complete order | Duplicate orders in Shopify/Woo/ERP |
| Per-charge tracking for refunds | Refund the upsell without refunding the base order | You have to refund everything, or nothing |
| Purchase event value updated after upsells | Ad platform optimizes on true order value | You bid as if every customer is worth the base price only |
| Idempotency on accept | Double-tap on mobile is common | Duplicate charges → chargebacks |
Provider-specific notes worth checking on any platform you use:
Report these, and only these, when judging the flow:
Run one variable at a time (offer, then price, then headline). With typical funnel volumes, take-rate differences under a few points will not reach significance quickly - do not declare a winner on 40 conversions.
Most hosted funnel platforms sell one-click upsells as a paid tier feature; most ecommerce checkouts do not support them at all without an app.
Autonnel (Apache-2.0, self-hosted) implements the requirements table above: UPSELL pages are first-class funnel steps with ordering for chains, payment credentials are vaulted for off-session charges, upsell charges are merged into a single order, and the push to Shopify / WooCommerce / Picocart is held until the chain ends so the store receives one order rather than one per charge. Refunds track per charge.
Get the repository from https://github.com/autonnel/autonnel (Apache-2.0), check
out a release tag, and read its docker-compose.yml - it declares the images and
ports that will run. From that checkout:
docker compose up
# open http://localhost:4321, complete /setup, then Settings → Payments
For production it deploys to Cloudflare Workers inside the free tier for typical funnel volumes, with the Postgres as the only real line item.
Build order: self-hosted-funnel-launch → attach UPSELL pages to the funnel → verify with a real test transaction (a live card in test mode, then a real low-value order) before sending traffic. Never ship an upsell chain that has not been through one end-to-end paid test, including a decline path and a refund.