Post-purchase upsell#
Show a one-click product offer after payment and before the Thank you page. The buyer can accept with the payment method already on file — no second checkout. You decide what is offered, to whom, and when, with upsell flows in the Karla app.
Recommended for: Marketing, E-commerce managers
Want to show offers before payment, inside the checkout itself? See Checkout upsell.
What you get#
- A one-click upsell on Shopify's post-purchase page
- Upsell flows — offer different products depending on what the buyer bought, who they are, and how much they spent
- A two-step tree per flow: Upsell 1, then Upsell 2 when the buyer accepts or Downsell 1 when they decline
- Featured products, bundles, products from a collection, or each product's own paired product as the offer
- Per-offer discounts and quantities
- Advertorial pages — your own text and images around the offer
- Offer page texts in your own words, per language
- A preview of each flow before it goes live
- A Performance tab with revenue by offer type
Prerequisites#
- Install the Karla Shopify app and complete onboarding.
- Pick at least one offer in the Karla app — or keep an active manual product promotion in the Karla portal, which the default flow uses when you have not picked a product. Offers you pick yourself serve without any promotion.
- Buyers must pay with a method that supports post-purchase offers (card / Shopify Payments). Shopify skips the post-purchase page for some methods, such as cash on delivery and certain wallets. See also PayPal below.
- Upsells must be enabled for your shop. If the Upsells page in the Karla app says to reach out to your customer success manager, ask them to enable Upsells for you. Shops connected before 17 October 2026 keep upsells enabled.
Setup overview#
| Step | Where | What you do |
|---|---|---|
| 1 | Karla app → Upsells | Build your flows and settings |
| 2 | Shopify admin → Checkout | Set the post-purchase page to Karla and save |
Configuration lives in the Karla app. Activation is a one-time choice in Shopify checkout settings. After that, you can change offers yourself — no Karla implementation work required.
The Upsells page#
Open Shopify admin → Apps → Karla and click Upsells in the app navigation. The page has three tabs:
| Tab | What you do there |
|---|---|
| Upsell flows | See the activation status, build and order your flows, edit the default flow |
| Settings | Product exclusions, offer page texts, deal and countdown, paired product field |
| Performance | See how each offer converts and what it earns |
The Settings tab also holds the pre-purchase checkout upsell.
Activation status#
The top of the Upsell flows tab tells you whether your upsell is live:
| Status | Means |
|---|---|
| Live | Karla served a post-purchase offer to a buyer within the last 7 days |
| Not live yet | Offers are configured, but no buyer has seen one in the last 7 days — check that Karla is selected in Shopify checkout settings |
| Off | Nothing is configured yet |
Open Shopify checkout settings takes you straight to Step 2.
Step 1: Build your flows#
How flows work#
The Flows list shows your flows in the order Karla checks them. For each order, Karla walks the list from the top and uses the first flow that matches — its conditions, audience, and order value all fit. Use Move up / Move down in a flow's ⋯ menu to change priority.
The Default flow is pinned at the bottom. It runs when no flow above it matches, and it cannot be switched off, renamed, or deleted.
From the list you can:
- Filter by All, Active, or Inactive
- Switch a flow on or off with its toggle
- Duplicate or Delete a flow from its ⋯ menu (deleting a saved flow asks you to confirm; buyers it matched get the default flow instead)
- Click Create new flow — up to 10 flows
A new flow is saved off. It only reaches buyers once you switch it on, so a half-built flow never goes live by accident. Flows that are off show an Off badge.
Build a flow#
Click Create new flow (or the edit icon on a flow) to open the builder. Give the flow a name, then set up each card from top to bottom.
Audience#
Who this flow is for:
- Buyer type — All customers, First-time customers, or Returning customers. A buyer Shopify passes without a customer ID counts as a first-time customer. If Karla can't look up a buyer in time, flows with a buyer type are skipped.
- More audiences (shown when your shop has CRM segments) — pick
segments from your Klaviyo segments, Klaviyo lists, and Shopify
tags:
- Only customers in — the flow runs only for buyers in at least one of these segments
- Exclude customers in — the flow is skipped for buyers in any of these segments. It is also skipped when a buyer's segments can't be checked, so an excluded buyer never sees it by mistake.
- Product exclusions — click Edit product exclusions to pick products that stop this flow: when the order contains one of them, Karla skips this flow and checks the next one.
All audience settings apply together with the trigger conditions below.
Trigger conditions#
What the order must contain for the flow to run. A flow needs at least one product or collection condition, a buyer type or segment in its audience, or an order-value condition — to reach every order, use the default flow instead.
- Each condition is a list of products, specific variants, or collections — click Edit and then Select products or Select collections. The condition is met when the order contains any of them.
- Minimum quantity (optional) — set a whole number from 1 to 999 to turn the condition into At least N items from its products and collections. Quantities of all matching items in the order count together, e.g. 3 for three bags from one collection. Leave it empty to match any quantity. To build quantity tiers, put the flow with the higher minimum above the flow with the lower one — the first matching flow wins.
- Click Add another condition → Add product condition or Add collection condition to add more. With more than one condition, choose whether the order must match Any or All of them.
- When order value is more than… / When order value is less than… — limit the flow to an order total band. The total includes shipping and tax, in your shop currency; totals in other currencies are not converted. Tip: set the minimum to your free-shipping threshold to skip buyers who already paid for shipping, because an upsell does not refund it.
The offer tree#
Each flow has up to three offers:
flowchart TD U1[Upsell 1] -->|Upsell 1 accepted| U2[Upsell 2] U1 -->|Upsell 1 declined| D1[Downsell 1]
- Upsell 1 — the first offer the buyer sees. Required.
- Upsell 2 — shown after the buyer accepts Upsell 1.
- Downsell 1 — shown after the buyer declines Upsell 1, for example a cheaper product or a deeper discount.
Leave Upsell 2 or Downsell 1 empty and the buyer gets the default flow's second offer at that point instead.
To fill a node, click Add product and choose a source:
| Source | What the buyer is offered |
|---|---|
| Featured product | A product you pick. Select the whole product to let buyers choose their size or variant, or pick specific variants — with several, one of them is chosen per buyer. Picking several products creates a bundle. |
| Bundle product | Two to four products sold together as one offer, each with its own quantity (1–10), plus an optional Bundle title and Bundle description |
| Products from a collection | A product from the collection you pick |
| Paired product | Upsell 1 only. The product that each purchased product names in its own paired-product field in Shopify — see Paired product source |
A branch offer cannot repeat an offer the flow already makes on the same path (different variants of one product are fine) — only Downsell 1 may offer Upsell 1's product again, for example at a deeper discount.
Discount and quantity. Each node has a quantity field (1–10 units added in one click; a bundle sets a quantity per product instead) and Add discount: choose Percentage discount (1–100 %) or Value discount (an amount in your shop currency). For a percentage, Discount applies to sets the base: Current price (default) or Original compare-at price. With the compare-at base, the buyer pays the compare-at price minus the percentage. If the product is already on sale below that, the current price stays and no extra discount is added; a product without a compare-at price above its current price is discounted from the current price. Without a discount, the product is offered at its regular price — or at your promotion's discount if it is part of your active product promotion. A bundle in Upsell 2 or Downsell 1 without its own discount uses Upsell 1's.
Advertorials#
Each node (except a paired product) can have its own advertorial: a page of text and image blocks around your offer. Click the advertorial (pencil) icon on a node to open Create an advertorial, then Add text (a Custom Headline and Custom Paragraph Text, with text size and alignment) or Add image (with Alt text for screen readers), and click Save advertorial. Nodes with one show an Advertorial enabled chip. Without an advertorial, the standard offer layout is used.
The default flow's Upsell 1 advertorial also appears on any flow whose first offer has no advertorial of its own.
Save and switch on#
Click Save flow (or Create new flow on a new one). The save bar at the top of the page also saves your changes. Then switch the flow on with the toggle next to the save button, or from the flow list.
Preview a flow#
Click Preview flow to see a simulation of the post-purchase page with the flow's real products, prices, and texts. Switch between Desktop and Mobile, click through accept and decline, and use Restart preview to start over.
- Save the flow first — the preview reflects the saved version.
- Buttons and fonts differ from the live page, which uses your store's checkout branding.
- Flows that offer a paired product can't be previewed, because the offer depends on a real order.
The default flow#
Click the edit icon on the Default flow row to open it:
- Audience — All customers (default), First-time customers, or Returning customers. This setting is shop-wide: Karla checks it before any flow, so a buyer outside it sees no offer at all. A buyer Shopify passes without a customer ID counts as a first-time customer, so Returning customers skips them. When Karla can't look up a buyer that has a customer ID in time, they still see the offer.
- Trigger conditions — fixed: Any order — this flow runs when no other flow matches.
- Upsell 1 — Featured product, Bundle product, or Paired product (when the paired product field is set). With nothing picked, it offers the first product of your active promotion. You can also upload an Offer image (PNG, JPEG, WebP, or GIF up to 2 MB) to show instead of the product image.
- Upsell 2 — the default second offer, shown after Upsell 1 is
accepted or declined. Click Add a second offer, then choose:
- Select second offer product — a product you pick; without one, it offers the next product of your active promotion
- Bundle product — a bundle, with one deal on the bundle total
- Select second offer collection — a product from a collection
- Use the same collection as the first offer — another product from the collections the buyer's purchased products belong to, skipping what they already bought and what the first offer showed
- Number of products (1–3) — with two or more, buyers see a small product grid
The default second offer is also what any flow's empty Upsell 2 or Downsell 1 falls back to.
Settings tab#
Most post-purchase settings here apply to every flow — the exception is the Deal discount and quantity, which belong to the default flow. The checkout upsell section at the bottom saves on its own; everything else is saved with the save bar at the top.
PayPal#
If you accept PayPal, a PayPal setup required card may appear at the top of the tab. Shopify skips the post-purchase page for PayPal orders until PayPal approves Reference Transactions for your account — buyers paying by card are unaffected. Use To payment settings and How to enable PayPal Reference Transactions to request it. While PayPal is still reviewing, the card says so and no action is needed.
Product exclusions#
- Add products to exclude — these products are never offered in any upsell. Excluding a product covers all of its variants, including ones you add later. Up to 50 products.
- Skip items if already in the order — don't show an offer when the offered variant is already in the buyer's order. Karla removes those offers before the page renders: if Upsell 1 is removed, buyers may land directly on the next step; if every offer is removed, the page is skipped. Leave it off if you are happy selling extra units of something already in the cart at a discount — that often converts well.
Customise offer page#
Write the offer page in your own words:
| Field | Where it appears |
|---|---|
| Headline | Main heading of the offer page |
| Subheading | Supporting line under the headline |
| Urgency line | The countdown sentence — use {time} where the ticking clock should go |
| Badge | Short label above the product title (e.g. "Bestseller"); empty = no badge |
The Default tab holds your main texts. Click Add new language to add a translation for another buyer language; empty fields in a language tab use the text from the Default tab, and empty fields on the Default tab use Karla's built-in text in the buyer's language. Advertorial blocks and bundle titles are not translated yet.
Deal#
The discount and quantity for the default flow's Upsell 1 — the same values you see on that node:
| Setting | Options |
|---|---|
| Discount | Promotion discount (default), Percentage, or Fixed amount |
| Discount value | Percent (1–100) or fixed amount in your shop currency |
| Discount applies to | Percentage only: Current price (default) or Original compare-at price |
| Quantity | Units added in one click (1–10; default 1) |
A discount set here replaces the promotion discount on the post-purchase page. Flows use the discounts set on their own nodes.
The same card holds:
- Countdown — an urgency countdown on the offer page (1–60 minutes, 10 by default). One clock runs across all offer steps; when it runs out, the page closes and the buyer continues without the offer.
- Progress bar — a checkout progress bar on the offer page, so it reads as a checkout step.
Paired product source#
Name the Shopify product metafield that stores each product's paired upsell
product — Paired product metafield namespace (for example custom) and
Paired product metafield key (for example upsell_product). Find both on
the metafield definition in Shopify admin → Settings → Custom data →
Products. Use the key, not the field's display name — a wrong key finds
nothing and no offer is shown.
Once set, the Paired product source becomes available on Upsell 1. Each buyer is then offered the product that their purchased product points to. When the purchased product's field is empty, there is no paired product to offer.
Performance tab#
The Performance tab shows how your post-purchase offers do over the last 7, 30, or 90 days:
- Total revenue — upsell revenue for the period, compared with the previous period of the same length
- Revenue breakdown by offer type — Featured product, Bundles, Paired product, and Collection
- A table per offer with Shown, Accepted, Accept rate, Confirmed, Confirmed rate, Merchandise value, Apply failures, and Abandoned
- A hint when your most-shown offer is not your best-converting one
Merchandise value is counted at the offer price, before shipping and tax, so
it reads lower than the amount you collected. For the collected amount,
filter your orders by the tag karla-post-purchase-upsell.
Step 2: Activate on the Shopify post-purchase page#
Configuration alone does not show the page. You must assign Karla as the post-purchase app:
- In Shopify admin, go to Settings → Checkout.
- Scroll to the Post-purchase page section.
- Select Karla / Karla Post-Purchase Upsell (the label Shopify shows once the Karla app is installed).
- Click Save.
Shopify shows an unsaved-changes banner after you select the app. The extension does not go live until you press Save.
If another app or custom code already owns the post-purchase page, switching to Karla replaces it for that slot. Only one post-purchase app can be active at a time.
What buyers see#
On the post-purchase page, buyers typically get:
- A short personalized greeting when their first name is known
- The offer product (image, price, discount badges when applicable), or your advertorial around it
- For a bundle, an image of every product in it and an Includes: list
- A Choose an option selector when the offered product has several variants — buyers pick their size or color before accepting
- Star ratings / review count when your catalog has standard
reviews.rating/reviews.rating_countmetafields (e.g. Judge.me, Loox) - The optional countdown and progress bar
- A price summary with subtotal, discount, shipping, and taxes — when the buyer paid shipping on the original order, it states up front that already-paid shipping costs will not be refunded (accepting the offer never recalculates the original shipping line, even across a free-shipping threshold)
- Add to my order (charges the payment method on file) or No thanks, continue
Accepting or declining Upsell 1 moves the buyer to the next step of the flow (single product or grid). A sold-out variant is swapped for an in-stock variant of the same product, or left out.
How offers are chosen#
flowchart TD
A[Buyer completes payment] --> B{Post-purchase page = Karla?}
B -->|No| Z[Thank you page]
B -->|Yes| C{Default flow audience allows buyer?}
C -->|No| Z
C -->|Yes| D{First active flow that matches?}
D -->|Found| E1[That flow's Upsell 1]
D -->|None| E2[Default flow's Upsell 1]
E1 --> F{Accepted or declined?}
F -->|Accepted| G1[Upsell 2]
F -->|Declined| G2[Downsell 1]
E2 --> H[Default second offer, if set]
G1 --> Z
G2 --> Z
H --> Z- A flow matches when its trigger conditions, audience, order value, and product exclusions all fit the order. The first match wins.
- An empty Upsell 2 or Downsell 1 falls back to the default second offer.
- Excluded products and — with Skip items if already in the order — products already in the order are removed before the page renders.
- If nothing is left to offer, the post-purchase page is skipped.
How accepted offers appear in Shopify#
Accepting the offer edits the buyer's original order — there is no second order and no second checkout:
- The offered product is added to the order as an extra line item, and the payment method on file is charged for the difference.
- Karla counts the conversion only after Shopify confirms the order edit was actually committed, so reported upsell numbers reflect real order changes.
- Orders with an accepted offer are tagged
karla-post-purchase-upsell— filter your Orders list by that tag to see every upsell conversion.
Like any order tag, karla-post-purchase-upsell also becomes a
Karla segment
(Shopify.tag.karla-post-purchase-upsell), so you can target upsell buyers
in campaigns and A/B tests.
When the upsell charge does not go through#
The offer edits the order and charges the card on file as two separate steps. Shopify can edit the order successfully and still fail the charge — not enough funds, or a card that needs the buyer to confirm. The added line item is on the order either way, so a system that reads only the line items will ship and invoice an item nobody paid for yet.
Karla marks those orders:
| Tag | Means |
|---|---|
karla-post-purchase-upsell | The upsell was accepted and the order was edited. Always applied. |
karla-post-purchase-upsell-unpaid | The upsell was added to the order but the order was not fully paid. Check the order's financial status for the outcome. |
The second tag is added in addition to the first, never instead of it, so your existing filters and segments keep working.
Karla decides it by reading the order's financial status from Shopify, not
by trusting what the buyer's browser reported — anything other than Paid or a
refunded state counts as unpaid.
It is a snapshot of the moment the order was tagged, not a verdict: Shopify may still collect the charge afterwards, for example once the buyer confirms the payment on the order status page. The tag is never removed, so for the settled answer always read the order's current financial status — the tag only tells you which orders to look at.
Flow recipe: hold an unpaid upsell#
Use Shopify Flow to stop an unpaid upsell reaching fulfilment or your ERP:
- Trigger — Order tags added.
- Condition — tag is equal to
karla-post-purchase-upsell-unpaid. - Condition — order financial status is not
Paid. - Actions — pick what fits your setup:
- Send internal email to your fulfilment or finance team.
- Add order tag with whatever value your ERP filters on (for example
do-not-fulfill), so the order is skipped on the next pull. - Add order note recording why the order is on hold.
Add a second Flow on the Order paid trigger that removes the hold tag again, so an order settles back into your normal process once the charge clears.
Flow can read order financial status directly, without any Karla tag. If you would rather gate every partially paid order — upsell or not — build on that instead, and use the Karla tag only to tell upsell-caused cases apart.
Test before going live#
- Use Preview flow to check each flow's products, prices, and texts.
- Place a test order paid with a card (or Shopify Payments test mode) that matches the flow you want to test.
- Confirm the post-purchase page appears with the right product, price, and discount.
- Accept the offer and verify the order is updated with the extra line item
and tagged
karla-post-purchase-upsell. - Repeat and decline, to check the Downsell 1 step.
- Repeat with a first-time vs returning customer if you use audience targeting.
Changing the offer later#
You can self-serve without Karla involvement:
| Change | Where |
|---|---|
| Offer a product based on cart contents | Upsells → Upsell flows → create or edit a flow |
| Change which flow wins | Upsells → Upsell flows → ⋯ → Move up / Move down |
| Pause a flow | Upsells → Upsell flows → the flow's toggle |
| Change the fallback offer | Upsells → Upsell flows → Default flow |
| Change who can see any offer | Upsells → Upsell flows → Default flow → Audience |
| Never offer certain products | Upsells → Settings → Product exclusions |
| Rewrite or translate the page texts | Upsells → Settings → Customise offer page |
| Change the countdown or progress bar | Upsells → Settings → Deal |
| Update the promotion products | Portal → edit the active product promotion |
| Turn the surface off | Shopify → Settings → Checkout → Post-purchase page → None |
Troubleshooting#
Post-purchase page never appears
- Confirm Post-purchase page is set to Karla and saved under Settings → Checkout.
- Pay with a supported method (card / Shopify Payments). COD and some wallets skip the page, and so does PayPal until Reference Transactions are approved.
- Make sure there is something to offer: a picked product in a flow or the default flow, or an active manual product promotion for the default flow to fall back on (dynamic product promotions are never used here).
- The default flow's Audience may exclude the test customer (try All customers while testing).
- Product exclusions or Skip items if already in the order may have removed every offer.
- Orders under Shopify's minimum for post-purchase offers may skip the page.
A flow doesn't show
- Check that the flow is switched on (no Off badge).
- Check that no flow above it matches the same order — the first match wins.
- Check its audience, order-value band, and product exclusions against your test order.
Wrong product or discount
- Open the flow in the builder and check each node's product and discount.
- For the default flow, confirm which product promotion is live in the portal.
Offer shows a product already in the cart
- Enable Skip items if already in the order, or offer a complementary product instead.
Related#
- Checkout upsell — offers inside the checkout, before payment
- Shopify integration — install the app and tracking setup
- Product promotions — source of the default flow's products when you haven't picked one
- Thank you survey — collect feedback on the Thank you page after the upsell