Post-Purchase Offers: The Complete 2026 Guide for Shopify
The seconds after payment are the one moment the shopper has already said yes. Here is how to build a post-purchase offer on Shopify, from discount type to targeting to reading the conversion rate.
xPostio Team
@ismaylouleThe one moment when the shopper has already said yes
Everything you do before checkout is persuasion. You are asking somebody who has not decided yet to decide.
The moment after checkout is a different kind of moment. The shopper has entered their card details, clicked the button, and watched the payment go through. The decision is behind them. They are still on your site, still carrying the intent that got them all the way through checkout, and for a few seconds there is nothing standing in the way.
On most Shopify stores that moment goes to a thank-you page and nothing else.
A post-purchase offer spends it on a second sale. And because the payment method is already on file, accepting costs the shopper a single click. No second checkout. No new card details. The items are added to the order they have already paid for and charged to the same card.
This guide covers how that works on Shopify, how to build an offer that fits your store, and how to read the numbers afterwards so you know whether it landed.
What a post-purchase offer actually is
Shopify has a page of its own that sits between the payment and the thank-you page. xPostio puts your offer on that page.
From the shopper’s side the whole sequence looks like this:
- They add items to the cart and go to checkout
- They pay. The order is complete and the money has moved
- Shopify hands them to the post-purchase page, and your offer appears
- They pick a product from the offer and accept, or they decline
- On Growth and Pro, depending on each answer, another offer can appear, up to three in a row. On Free they see one offer
- They see a short thank-you screen, and its button takes them to the order status page
Two things about step 3 are worth sitting with, because they shape every decision further down this page.
The offer appears after the purchase is complete. It is not part of the checkout flow. Nothing you put there can cost you the order you already have, which is a very different risk profile from an upsell that interrupts somebody on their way to paying.
Accepting does not create a second order. The products are added to the existing one. The shopper sees one order and gets one confirmation. On your side it is one order to pack and one order to ship. Each accepted offer is charged as a separate payment on that order, so if you capture payments manually, capture every payment on it.
One thing has to be true before any offer appears at all: Shopify shows one post-purchase app per store, and you select it yourself in your Shopify admin under Settings → Checkout → Post-purchase page. Until xPostio is selected there, nothing shows. Shopify also skips the post-purchase page for some orders whatever the app does, including wallets and installment services such as Apple Pay, Google Pay and Klarna, gift cards, orders with duties and multiple currencies, local delivery, and order totals under $0.50.
The trigger, and why there is only one
A workflow in xPostio starts with a trigger, and there is exactly one to start with: Post-purchase, which fires when a customer has just paid.
Every workflow you create arrives with that trigger already in place. There is nothing to choose and nothing to configure. That is deliberate. xPostio does one thing, on one page, at one moment, and the whole app is arranged around getting that moment right rather than around giving you a menu of moments to pick from.
What you build on top of the trigger is a chain of Offer steps. Each Offer step is one offer page.
Choosing the discount type
There are four discount types, and the choice matters more than the exact number you put in the field. The Free plan includes Percentage. Fixed Amount, Buy X Get Y and Free Shipping are on Growth and Pro.
Percentage. A percentage off each product the shopper adds, the plain “add one more, cheaper” offer. This is the one to start with if you have no strong instinct about your catalog, because it reads the same on a twelve dollar product and a two hundred dollar one.
Fixed Amount. A flat amount off the shopper’s whole selection on the offer page, spread across the items. Reach for this when a round number sounds better than a percentage. Ten dollars off a thirty dollar add-on is a stronger sentence than thirty-three percent off, even though they are the same offer. Keep the amount below the price of your cheapest recommended product, so a single item never costs less than zero.
Buy X Get Y. The shopper picks a recommended product and gets a gift product you have chosen, at a Gift discount value you set. Set it to 100 and the gift is free. This is the type for bundles and for the free extra that makes a purchase feel finished. The gift discount unlocks once the shopper has picked at least one recommended product, so keep your gift products in stock.
Free Shipping. The products the shopper adds ship for free, with a free shipping line added alongside them. The products themselves stay full price. If postage is the thing that makes people hesitate over a second item in your store, this is the offer that removes the objection instead of arguing with it.
The discount always applies to what the shopper adds on the offer page, never to what they have already bought.
Setting the discount
Click Configure offer on an Offer card to set it up. The fields are short and each one does exactly what it says.
- Max Products in Offer. How many recommended products the shopper can choose from, 3 by default (1 on Free), within your plan’s limit of 1 on Free, 3 on Growth and 10 on Pro. Keep it low. The point of a post-purchase offer is a fast yes, and a wall of ten products turns a one-second decision into a browsing session.
- Discount type. One of the four above.
- Discount value. The number behind the type: the percentage for a Percentage offer, the flat amount for a Fixed Amount one.
- Discount name. The name of the discount itself. It shows up on the order for Fixed Amount, Buy X Get Y and Free Shipping offers, as the discount or shipping line name. Your reports, such as Best offer on the home page, show the offer’s own name, which you set with the pencil on its card.
- Enable time-based discount and Duration (minutes). Available on Growth and Pro. Turns the offer into a limited-time deal, and the shopper watches the countdown run down on the page. When it reaches zero the offer closes as if the shopper had declined it.
The countdown is the field people underuse, and the one to use most carefully. A post-purchase offer is already a decision made in seconds, and a visible clock is honest about that: this deal exists because you are here right now. Set a duration you are actually willing to honor and leave it alone. The shopper has already paid, and a calm offer usually converts better than a rushed one.
Matching the offer to what they just bought
You do not pick the recommended products one by one. xPostio uses AI to compare what the shopper has just bought against your catalog and shows the products most similar to it, up to your Max Products in Offer number. Somebody who just bought a coffee maker is shown coffee, not a phone case.
This is the part that keeps working when your catalog changes. You are not maintaining a rules table that maps every product to every add-on, and you do not have to revisit the offer every time you add a season’s worth of stock.
Buy X Get Y adds one decision on top. The recommended products are still matched for you, and the gift products are the ones you choose, which is the point of that type: the gift is a specific decision, not a match.
If an offer has an inventory rule, only products whose stock is in range are shown at all.
Targeting: deciding which orders get the offer
Under the discount fields is Show this offer only when. Click Add condition and you can narrow the offer to the orders where it makes sense. Targeting rules are on Growth and Pro; on Free the button is locked. Three condition types are usable today:
- Cart Value, the order total including shipping and taxes, with minimum order total and maximum order total
- Quantity, how many items are in the order, with minimum items and maximum items
- Inventory, the stock of the products the offer would show, with minimum stock and maximum stock
Fill in the minimum, the maximum, or both, where both means “between”. Tick Negate this condition to flip a rule, so a Cart Value minimum of one hundred, negated, means orders under one hundred instead. Add a second condition and an AND / OR choice appears. AND means both have to be true, OR means either one will do, and when you mix them AND is checked first. Each condition type can be used once per offer.
Customer Group and Behavioral are listed in the dropdown marked Coming Soon and cannot be selected yet, so do not plan an offer around them.
Two ways to use targeting well:
Protect your margin at the bottom. A twenty percent discount on top of a small order can leave very little behind. A Cart Value minimum puts the offer only in front of shoppers whose order can carry it.
Stop selling what you are running out of. An Inventory minimum keeps the offer away from products with barely any stock left, which saves you the refund and the apology. Negate it instead and you offer only the products you are trying to clear.
And one warning that saves a support ticket: rules exclude orders on purpose. If an offer never seems to appear, check the rules before you assume something is broken. A Cart Value minimum of one hundred means a shopper who spent sixty does not get that offer, and that is the rule doing its job. An offer whose rules do not match is skipped, and the shopper goes down its Offer declined branch, or straight to the thank-you page if nothing is connected there.
Chaining a second offer off accepted and declined
Every Offer card has two exits rather than one: Offer accepted and Offer declined. Connect a new Offer step to either one and you have a second chance. The declined exit is also where a shopper goes when an offer is skipped because its rules do not match.
There is one hard limit here, set by Shopify rather than by xPostio: a shopper is shown at most three offers in a row, which is Shopify’s limit for post-purchase offers.
A workflow can still hold up to seven offers, because each answer sends the shopper down one branch. Branch instead of stacking:
Post-purchase trigger
└── Offer 1 (20% off a matching product)
├── accepted → Offer 2 (free shipping on the new item)
└── declined → Offer 3 (a smaller discount on a cheaper product)
└── declined → Offer 4 (10% off a small accessory)No shopper ever sees more than three. Which ones they see depends on how they answer each offer. On the Free plan a workflow holds one offer, and an offer step cannot be connected to a second one.
This is where post-purchase offers get interesting, because the two branches want completely different offers. Somebody who accepted has just proven they will buy again, and the follow-up can be confident. Somebody who declined has told you the answer was no at that price, and repeating the same offer harder is not going to change it. Give them a smaller discount on something cheaper, or take the shipping off, and let them leave if they still want to.
Leaving an exit unconnected is a perfectly normal way to end a flow.
One live workflow at a time
This one catches people out, so it gets its own heading.
Only one post-purchase workflow can be on at a time. If you turn on a second one while the first is still live, shoppers see no offer at all.
xPostio stops you when you try: it shows which workflow will be turned off and asks you to confirm. Take the warning seriously. If offers suddenly stop appearing across your store, the first thing to check is how many post-purchase workflows are switched on — the live workflow card on the home page tells you.
A new workflow starts as a Draft, and drafts show nothing to shoppers. The editor saves your changes automatically as you work, and on an active workflow every save goes live at checkout straight away, so turn a workflow off first if you want to prepare changes without showing them.
Designing the page the shopper sees
A workflow decides what is offered. It does not decide what the page looks like. That lives in Settings → Post-purchase, behind the pencil icon, and it applies to every post-purchase offer you run.
It is a drag-and-drop designer for the page itself, with a preview of the page as customers see it. The blocks are the banner, the text block, the product card, the status banner, an image, the buttons, and the thank-you screen. What you can change includes the banner title, description and subtext per discount type, the “Offer 1 of N” progress line (which you can switch off), the product card headline, List or Grid layout, the SAVE badge, the “Picked for you” line, the product descriptions, the status banner and its colour, the charge note under the buttons, and the whole thank-you screen: headline, subtext, the “Added to your order” banner, and the button label.
Text variables let one layout serve every offer. {{offer_value}}, {{offer_type}}, {{offer_product}}, {{offer_getQuantity}}, {{offer_minQuantity}} and {{offer_duration}} are filled in by each offer, so Get {{offer_value}}% off {{offer_product}} reads “Get 20% off The Complete Snowboard” on the page. A text that uses {{offer_duration}} only shows on an offer that has a countdown, so shoppers never see a deadline that is not real.
Some things are fixed, and knowing them up front changes how you write the rest:
- The accept and decline button labels cannot be changed. Shopify’s guidelines ask for a clear “pay now” label with the price, so they read Add to my order · Pay $X and No thanks, complete my order, with the exact total. You can change the charge note under them.
- The page always keeps one banner at the top, the products, and one pair of buttons. Shopify requires all three, so the editor refuses any change that would remove them and tells you why.
Write the copy for the moment it appears in. The shopper has just paid. They are not browsing and they are not reading. Short headline, plain reason, and the offer.
Reading the numbers
The numbers sit in three places. The home page carries your whole store for the last 30 days, the workflows list carries one row per flow since it was created, and a flow’s own page breaks it down to each offer.
On the home page, over the last 30 days:
- Revenue added, the price of the accepted items minus the discounts you gave, before shipping and taxes
- Customers reached, the checkouts that got to the offer page, each counted once however many offers it showed
- Offers accepted, and their share of customers reached
- Best offer, the one that added the most revenue
On the workflows list: Accepted, Declined, Conversion and Revenue, for each workflow since it was created.
On a workflow’s own page:
- Executed, customers who saw this workflow
- Offers accepted and Offers declined
- Conversions, accepted out of accepted plus declined
The number to watch is the conversion rate. What counts as good depends entirely on your products, your discount, and how well the offer matches what the shopper just bought, so the useful comparison is not against somebody else’s store. It is against your own workflow last week.
Run one offer, unchanged, for long enough to gather real orders. Then change one thing. The discount, or the discount type, or the Max Products number. Change two things at once and you learn nothing, because you will not know which one moved the rate.
A few counting rules are worth knowing before you read too much into a number. A shopper who closes the page without answering counts as a customer reached, but not as an accept or a decline. An offer skipped because its rules did not match is not counted anywhere, because nobody saw it. And an accept that Shopify refuses, usually because the item is out of stock, is recorded as a decline.
One thing you will not find on that page is post-purchase revenue reported separately, and that is deliberate rather than missing. An accepted item is added to the order the shopper already paid for, so it shows up in your normal Shopify order and sales reports along with everything else on that order. There is no second set of books to reconcile.
Letting your own AI assistant build it
xPostio has no chatbot of its own. Instead you connect the assistant you already use, such as Claude or ChatGPT, and it builds offer flows in your store on your behalf. Connect AI is included in the Pro plan.
The setup is short. Go to Settings → Connect AI, copy your store’s connection URL, paste it into your AI client’s Connectors or MCP servers settings, and click Allow access on the approval screen that opens in your Shopify admin. After that you can describe what you want in a sentence and let it build the flow.
Three things make this safe to hand over. Everything your assistant builds is saved as a draft, and a draft shows nothing to shoppers, so publishing stays a separate, deliberate step. Your assistant can read your workflows, your product catalogue and your store details, and it cannot read your orders, your customers or your checkout results, or reach another store. And your AI provider bills you separately for your own assistant, at their rates.
A first workflow you can ship today
If you want the shortest path from reading this to having an offer live, build this one.
- Go to Workflows and click Create workflow. The Post-purchase trigger is already in place
- Drag one Offer step onto the canvas and connect it to the trigger
- Click Configure offer on the offer’s card. Set Max Products in Offer to 3 (1 on Free), Discount type to Percentage, and Discount value to something you would genuinely be happy to give away on every order
- Click the pencil on its card and give the offer a name you will recognise in your reports
- Leave both branches unconnected and leave the targeting rules empty
- Click Save changes, then Turn on workflow at the top of the workflow’s page
- Check that no other post-purchase workflow is on
- In your Shopify admin, go to Settings → Checkout → Post-purchase page and select xPostio, then Save
Then place a test order in your own store, because post-purchase offers only appear during a real checkout and a genuine order is the only way to see the page the way a shopper does. On a development store you can turn on Shopify’s test payment gateway and pay with the test card, as long as the order is over the equivalent of $1 USD.
Leave it alone for a couple of weeks and read the conversion rate. Then add the second offer on the declined branch, and start learning what your shoppers say no to and what they will say yes to instead.
The Building offer workflows guide has the full editor reference, and Designing the offer page covers the page designer block by block.
Install xPostio on Shopify and start making the most of the moment after checkout.