Checkout upsells make sense everywhere on Shopify, but subscription stores have an extra layer of complexity that one-off stores don't. If the upsell is a one-time add-on you're playing the regular Shopify upsell game — same UX patterns, same conversion tactics. But if the upsell is another subscription, suddenly you're stacking selling plans, deciding which renewal anchor wins, disclosing two recurring prices at signup, and praying your checkout extensibility supports it. This guide walks through the three upsell surfaces (cart, checkout, post-purchase), the Shopify Functions and UI extensions that power them, what actually converts in subscription contexts vs one-off stores, and the legal/UX guardrails that most upsell apps blur. If you sell subscriptions and you want to lift AOV without burning your auto-renewal disclosure compliance, this is the practical playbook.
The three upsell surfaces and what each is for
Shopify gives you three places to run an upsell: the cart drawer (before checkout), the checkout itself (one-page checkout via UI extensions and Functions), and the post-purchase page (the thank-you page after the order is placed). Each surface has different conversion characteristics, different technical constraints, and a different legal footprint when the upsell is a subscription.
Cart upsells convert in the 4-8% range for most stores. They're high-volume, low-friction, but they're competing for attention against the checkout button. Checkout upsells (via the new Shopify Checkout Extensibility model, replacing checkout.liquid for Plus stores in 2024) convert in the 2-5% range — the customer is committed to buying, but they've also entered "I just want to finish" mode. Post-purchase upsells, where the customer has already paid and you offer a one-click add-on before the thank-you page, convert in the 8-15% range and have the highest revenue lift per impression — because the payment-method friction is already gone.
- Cart drawer / cart page — best for complementary products, free-shipping threshold nudges, and "upgrade to subscription" prompts on one-time items
- Checkout (Functions + UI extensions) — best for shipping upgrades, gift wrap, and warranty-style add-ons; subscription upsells are restricted and disclosure-heavy here
- Post-purchase page — best for high-margin one-time add-ons, accessories, and "second flavor for next box" sampler offers
Post-purchase has the highest conversion rate, but that doesn't mean every offer belongs there. A subscription upgrade belongs on the cart page where the customer can still see the recurring price next to the subscribe button. A second flavor for a box belongs post-purchase. Match the offer to the surface, not the surface to the headline conversion rate.
Shopify Functions: what they unlock and what they don't
Shopify Functions (introduced 2022, GA 2023) are the WASM-based extensibility that replaced Shopify Scripts. They run server-side at checkout to customize delivery options, payment methods, discounts, and cart validation. For upsells specifically, Functions don't directly "show an upsell" — that's the job of UI extensions — but they do power the discount logic and payment customizations that make subscription-aware upsells possible.
The relevant Function types for a subscription store running upsells: (1) cartTransform — modify line items at checkout (bundle expansion, free-gift attachment), (2) discount — apply conditional discounts based on cart contents (e.g. "add a second subscription, get 15% off both"), (3) deliveryCustomization — hide/rename shipping options based on subscription frequency, (4) paymentCustomization — hide payment methods that don't support stored cards (Klarna, gift cards) when a subscription is in the cart.
Off-the-shelf upsell apps were built for one-off Shopify stores. When you drop them into a subscription store, they often fail in one of two ways: (1) they show a subscription product as a "one-time add" because they don't read the selling-plan allocation, or (2) they try to apply a one-time discount code to a subscription line and the discount doesn't carry to renewals. Always test the upsell app with a subscription product in the cart before going live.
Two things Functions can't do: they can't show a popup or modal (that's UI extensions), and they can't reach external APIs for personalization (they're sandboxed, ~5ms execution budget). If you need "customers who bought X also bought Y" recommendations, that ML happens server-side outside the Function and is passed in as a metafield or cart attribute.
Pre-purchase vs post-purchase: which converts what
The intuition most merchants start with is "post-purchase converts highest, so put everything there." That's wrong for a subscription store because post-purchase upsells require a one-click payment confirmation, and Shopify post-purchase pages have a hard rule: you cannot start a new subscription via post-purchase upsell. Post-purchase one-click is limited to one-time purchases using the already-vaulted card. If your upsell offer is "add a second subscription to this order," that has to happen pre-purchase or it doesn't happen at all.
- One-time add to a subscription order — works post-purchase, highest conversion, cleanest UX
- Upgrade from one-time to subscription — must be pre-purchase (cart or product page); customer needs to choose the recurring commitment before paying
- Add a second subscription — must be pre-purchase; the second selling plan and its disclosure have to be visible before the buy button
- Subscription frequency upgrade (e.g. weekly to biweekly) — better served in the portal post-purchase via email, not at checkout
- Free-gift threshold — works at cart, works post-purchase if the gift is free; if you're offering "add $X more for a free gift," cart is better because the customer can still add another product
A useful rule of thumb: if the upsell would change the recurring price or create a new recurring charge, it belongs pre-purchase. If it's a one-time add that uses the already-stored card, post-purchase wins on conversion every time.
Cart upsell patterns that work for subscription stores
The cart drawer is the highest-volume upsell surface and the easiest to instrument. Three patterns consistently outperform for subscription stores:
- The "upgrade to subscribe" nudge — when a customer adds a subscribable product as one-time, show a banner: "Subscribe & save 10% on this item — same product, cancel anytime." Conversion rates vary 8-15% depending on category. Higher than any cross-sell.
- The "add to your box" cross-sell — when a subscription is already in the cart, offer a complementary one-time SKU at a small discount ("Add coffee filters to your order — $4, only on subscription orders"). Works because the bundle feels coherent.
- Free-shipping or free-gift threshold — "Add $12 more for free shipping" works the same on subscription carts as one-time. Slight wrinkle: the threshold should be calculated on first-order subtotal, not lifetime value.
If your upsell promotes a subscription, the recurring price has to be visible BEFORE the customer can accept the upsell. California's auto-renewal law (AB-390) and the FTC's Click-to-Cancel rule both require it. "Subscribe & save" with a tiny disclaimer underneath isn't enough — the recurring amount and frequency have to be the same visual weight as the offer headline.
Post-purchase upsell mechanics on Shopify
Shopify's native post-purchase extensibility (the "Post-purchase" extension point) gives you a single page between the order-confirmation and the thank-you screen where you can show one or two offers that the customer can accept with one click — no re-entering card details, no new checkout. The card vaulted at checkout is reused.
Constraints to know before you build: only one extension per checkout (you can show 1-2 offers within it, not multiple extensions stacked), no new subscriptions (one-time purchases only, as discussed above), and the page is rendered by Shopify in an iframe so you don't have your storefront's full theme available. Style accordingly — most stores use a stripped-down version of their thank-you-page style guide.
- One-click acceptance — customer clicks accept, the order is amended, card is re-charged for the delta, done in <3 seconds
- No new subscription — even if your offer is a subscription, post-purchase can only do one-time add-ons; surface subscription upgrades pre-purchase
- Single offer recommended — two-step funnels (offer A, then if declined offer B) work but degrade UX; one well-targeted offer outperforms two mediocre ones
- Margin discipline — discount the post-purchase offer no more than you'd discount the cart offer; an 8-15% conversion lift compounds quickly and doesn't need a 50% discount to clear
On the analytics side: track post-purchase offers as a separate revenue stream from the parent order. Shopify's reports lump them in, but for AOV-lift analysis you want to know "X% of orders took the post-purchase, average lift $Y" — that number is what justifies the offer; the combined AOV doesn't.
Auto-renewal disclosure rules that constrain checkout upsells
Any upsell that creates a new recurring charge has to comply with the same auto-renewal disclosure rules as a fresh subscription signup. California AB-390, the FTC Click-to-Cancel rule (2024), and the EU Consumer Rights Directive all require that the recurring price, renewal frequency, and cancellation mechanism are clearly disclosed BEFORE the customer commits — "clear and conspicuous" being the operative phrase the FTC uses.
In practice this means a one-click "Upgrade to subscribe" button without seeing the recurring price next to it is non-compliant. Same goes for a cart upsell that promotes a subscription without showing the "$28 every 4 weeks" amount with equal visual weight to the headline. Apps that bury this disclosure in tooltips or below-the-fold copy have triggered settlements (Hims, Adobe).
- Recurring price visible at the same visual weight as the offer headline
- Renewal frequency stated explicitly ("every 4 weeks" not "recurring")
- Cancellation mechanism mentioned ("cancel anytime in your portal" minimum)
- Confirmation email includes the upsell line item with recurring terms
- One-click cancel available from the customer portal (CA AB-390 mandate)
- If the upsell creates a second subscription, both subscriptions are listed in the order confirmation with separate renewal dates
A/B testing checkout upsells without breaking attribution
Most native Shopify analytics aggregate upsell revenue into the parent order, which makes A/B testing the offer itself hard. Two reliable approaches: instrument your own event tracking (offer impression, offer click, offer accept) and roll up by variant, or use an upsell-specific analytics layer that already separates these events.
The variables worth testing in order of impact: (1) offer SKU — what you upsell matters more than how, (2) discount depth — 10% vs 15% vs free shipping, often surprisingly counterintuitive, (3) copy headline — value framing ("complete your routine") vs urgency ("add now, only $X"), (4) placement — cart vs post-purchase for the same offer, (5) visual presentation — image, text-only, or social-proof framing.
Don't run more than one test at a time on the same surface — interaction effects between concurrent tests inflate or hide real lifts. And give each variant at least 1,000 impressions before reading a result; conversion rate variance is wide at low volumes.
Friction, fraud, and the upsell that costs you the cart
Every upsell adds a decision point. Decision points cost conversions. The honest tradeoff: a well-targeted upsell that accepts at 8% might cost you 0.5-1% of base cart conversion because it adds a step. That math is usually positive (AOV lift > checkout-rate dip), but it's not free, and it gets negative fast if the upsell is poorly targeted.
- Don't upsell on first-order discount carts — the customer is already on a promotional flow; another offer feels predatory
- Don't upsell more than once per surface — cart drawer + checkout + post-purchase is two too many; pick one
- Don't autopopulate accepted state — pre-checked upsell boxes are a dark pattern, banned by the EU CRD and the FTC, will lose chargebacks
- Watch fraud rate on post-purchase — cards that pass checkout sometimes fail on the second charge; if your fraud rate spikes, the post-purchase offer is amplifying a card-testing pattern
Some upsell apps default the upsell to "accepted" with a tiny opt-out checkbox. This is explicitly a dark pattern under the FTC's 2024 Click-to-Cancel rule and the EU CRD. Customers who notice the surprise charge on their statement file chargebacks, and Shopify Payments will side with the customer because the negative-option enrollment is non-compliant. Always make upsells opt-in with a clear button.
Upsell offers that only make sense for subscriptions
Some offers are unique to subscription stores and don't translate to one-off Shopify carts. These tend to convert better than generic cross-sells because they leverage the recurring relationship.
- Frequency upgrade — "Get this every 2 weeks instead of 4 — save 5% more." Best surfaced post-signup in the portal, but works at cart if framed as a choice
- Subscription bundle discount — "Add a second subscription, get 15% off both." Powerful because the per-order economics improve and AOV roughly doubles
- Sample / trial size — "Add a sample of next month's flavor to your first delivery, $2." Drives discovery, low risk, conversions in the 12-18% range
- Annual prepay upsell — "Pay annually upfront, get 1 month free." Works for high-trust subscribers; usually surfaced after the second renewal succeeds
- Gift subscription add-on — "Gift a 3-month subscription to a friend, get $10 credit." Doubles as a referral mechanism
A note on portal upsells: once the subscriber has a few orders under their belt and trusts the brand, in-portal offers ("add a second product to your next box") convert dramatically better than first-order upsells. Don't put all your upsell budget into checkout — the portal is where the real LTV lift lives.
The tooling landscape for subscription-aware upsells
Most checkout-upsell apps on the Shopify App Store were built for one-time-purchase stores. A handful actively support subscription-aware upselling: ReConvert, AfterSell, Zipify OCU, and a few subscription-app-native upsell flows that ship inside the subscription app itself (avoiding the integration tax).
If you're already running a subscription app with built-in upsell flows, that's often the lowest-friction option — no extra app integration, the upsell knows about the selling plan, and the disclosure is generated correctly. If your subscription app doesn't support upsells, a dedicated upsell app works fine as long as you test that it reads selling-plan allocation correctly.
- Subscription-app-native upsell — single tool, single source of truth, no integration tax. Best for stores under 5k MRR.
- Dedicated upsell app + subscription app — more configuration, more flexibility. Best for stores running complex multi-step funnels.
- Custom Functions + UI extensions — requires a developer. Best for Shopify Plus stores with non-standard requirements (B2B subscription, multi-currency).
Common checkout upsell questions
Can I sell a new subscription as a post-purchase upsell?
No. Shopify's post-purchase extension supports one-time products only, using the card already vaulted at checkout. Subscription upsells (any offer that creates a new recurring charge) must be presented pre-purchase — cart drawer, product page, or main checkout — where the customer can see and accept the recurring terms before the order is placed.
What's the difference between Shopify Functions and UI extensions for upsells?
Functions are server-side WASM modules that customize cart logic (discounts, line-item transforms, payment-method visibility) but render no UI. UI extensions are the client-side surface that renders the offer (modal, banner, post-purchase page). You typically need both: a Function to validate the upsell logic and a UI extension to present the offer.
Will an upsell hurt my checkout conversion rate?
It often costs 0.5-1% of base conversion (every decision point does). The math works out positive if the upsell accepts at 5%+ and the AOV lift exceeds the lost-cart revenue. If your upsell takes longer than 3 seconds to render or adds significant visual clutter, the conversion drop can erase the gain entirely.
Are pre-checked upsell boxes allowed?
No. Pre-checked or opt-out-required upsell boxes are explicitly a dark pattern under the FTC's 2024 Click-to-Cancel rule and the EU Consumer Rights Directive. Customers who notice the surprise charge file chargebacks, and Shopify Payments sides with the customer when the negative-option enrollment is non-compliant. Always require an explicit click to accept.
Should I run upsells in the cart, at checkout, or post-purchase?
Match the offer to the surface. Upgrade-to-subscribe goes in the cart. Shipping upgrades and warranty add-ons go at checkout. Complementary one-time add-ons go post-purchase. Don't run the same offer in multiple places — pick the highest-intent surface for each offer type.
Can I A/B test post-purchase upsells?
Yes, and you should — post-purchase offers vary widely in conversion based on SKU and copy. Most modern upsell apps include native A/B testing. If you're rolling your own, instrument impressions and accepts as separate events and roll up by variant; don't rely on Shopify's default reports which lump upsell revenue into the parent order.
Does the auto-renewal disclosure law apply to upsells?
Yes, when the upsell creates a new recurring charge. California AB-390, the FTC Click-to-Cancel rule, and the EU CRD all require recurring price, frequency, and cancellation mechanism to be clearly disclosed BEFORE the customer accepts. "Clear and conspicuous" — equal visual weight to the offer headline, no tooltip-buried disclosures.
What's a realistic post-purchase conversion rate?
8-15% is typical for well-targeted single-offer post-purchase pages with one-click acceptance. Below 5% usually means the offer is poorly matched to the parent order or the discount isn't compelling. Above 20% is unusually high and often a sign that the offer is being marketed too aggressively — watch chargeback rate.
Should I show the same upsell to repeat customers?
No. Repeat customers have already considered (and either taken or declined) your standard upsell. A subscription store benefits most from segmented offers — first-order get the upgrade-to-subscribe, second-order get the bundle discount, sixth-order get the annual prepay. Static one-offer-for-everyone leaves AOV on the table.
Can I use Shopify Functions to hide payment methods that don't support subscriptions?
Yes — that's exactly what paymentCustomization Functions are for. Common pattern: hide Klarna, Afterpay, and gift cards when a subscription is in the cart, because those payment methods don't support stored cards for recurring charges. This avoids the failed-first-renewal pattern that hurts dunning recovery rates.
What's the right discount for a checkout upsell?
Usually 0-10% off the upsell product. The customer already has the parent product in cart — they don't need a 30% discount to add a complementary $4 add-on. Deep discounts on upsells signal desperation and erode the perceived value of the parent product. Keep upsells light on discount, heavy on relevance.
Do checkout upsells work on Shopify (not Plus)?
The new Checkout Extensibility framework (replacing checkout.liquid) ships UI extensions on all Shopify plans, but full checkout customization (Functions for delivery/payment, advanced layout changes) was historically Plus-only. Most upsell apps now support Shopify (non-Plus) for the basic cart/post-purchase patterns. Confirm at install if your app uses Functions or UI extensions and which surfaces are gated by plan.