An offer test gives each group a different offer — a percentage off, an amount off, free shipping, or nothing — and tells you which one made the most money. Not which converted best. An offer that lifts conversion and gives away more than it earns is a loss that looks like a win on every other chart.
The figures below are live. Put your own store’s numbers in the first one before you set anything up: it tells you how big a lift an offer needs before it is worth testing at all.
It is the cheapest of the two pricing tests to set up and the safest to run, because nothing on your page changes. There is no rewriting, no flicker risk, and no selector to break.
Offer tests are on the Growth plan and above, and in the 14-day trial. They are in beta: they change what shoppers pay, so check the first few orders after you start one.
The arithmetic, before the test
An offer is paid for out of margin. 10% off a £60 basket costs £6 on every order, including the orders you would have got anyway. Free shipping costs the shipping the shopper would otherwise have paid. So each offer has a break-even: the lift in conversion it needs just to make the same profit as no offer.
Neither offer pays at these lifts.
10% off pays only if conversion rises at least 20% (2.50% to 3.00% or more). Free shipping over £50 (67% of orders qualify) pays only if conversion rises at least 13% (2.50% to 2.81% or more). Revenue per visitor crowns 10% off, profit per visitor does not: this is the case revenue gets wrong.
↳ Revenue can rise while profit falls
At the defaults — a £60 basket, 50% margin, £6 shipping, 2.5% conversion — 10% off needs conversion to rise at least 20% just to break even. Assume it rises 15% and it wins on revenue per visitor (£1.73 against £1.65) while losing on profit per visitor (£0.86 against £0.90). Free shipping over £50 needs about 13%. Drop the margin to 30% and the 10% offer needs a third more orders.
The figure counts money the way the results page does: revenue is goods plus shipping charged, less discounts, and profit is that revenue less product cost.
An offer that only wins on revenue is a loss with a good chart.
How it actually works
The discount is applied by a Shopify Function at the cart, not by JavaScript in the shopper’s browser. Your group is written onto the cart, Shopify reads it, and the offer is applied server-side.
- It cannot be tampered with or blocked by an ad blocker.
- It works on every Shopify plan, Basic included. An offer is a discount, and Shopify does not restrict discounts by plan.
- It works on headless stores, as long as the site passes our cart attributes to the cart. There is nothing to draw on the page, so nothing else is needed. See the price test guide for the part of headless that does need work.
One consequence: there is nothing to preview. A preview deliberately never writes your group onto a cart — that is what keeps your own browsing out of your results. Run Check setup on the Preview tab to confirm the store side is ready, then start the test and look at a real order.
Setting one up
Approve the pricing permissions on Settings, Store connection. We create one automatic discount for the test and remove it when the test ends.
Then, per group:
- No offer
- A real arm, not an unfinished one. Usually the control — though it does not have to be: 10% off against free shipping, with nobody getting nothing, is a perfectly good test.
- Percentage off
- Between 0 and 100. Works in every currency, unchanged.
- Amount off
- Set in your store currency, and converted into each shopper’s currency at Shopify’s rate — the way Shopify converts its own discounts. So is a minimum order value.
- Free shipping
- Every delivery option, not just the cheapest.
Each offer can carry a minimum order value. Below it the offer does not apply, which is how “spend £50 to save” is expressed.
Subscriptions. Offers apply to subscription orders as well. By default a subscriber gets the offer on their first order only; you can choose to keep it on every renewal instead.
What the shopper reads at checkout
You choose the wording. Keep it plain: a shopper settling up should not read the name of a testing tool. Left empty it says “Discount”.
The wording is deliberately not part of what makes two groups different. Two arms both giving 10% off under different names are the same offer, and counting them as two would split your traffic between identical treatments. If the wording is what you want to test, that is a content test on the copy.
What reaches the cart, and what counts
An offer test does not run alone. Your own discounts, your other tests and the way an order was placed all decide what a shopper in the 10%-off arm actually pays, and whether their order is in the result.
Clean: the shopper gets the arm's offer, and the order counts.
This is the case the result is about.
↳ Only one setting here is clean
By default it is the clean case: a retail shopper on the online store pays £72.00 on an £80 cart, and the order counts. Every switch you turn on from there changes one of the two.
- Business buyers
- A customer buying for a company is never put in an offer test. They pay their company’s catalog price, and the Functions skip a B2B cart regardless.
- In-store and draft orders
- POS sales and orders completed from Draft orders in the admin never count. Nobody in them saw your storefront.
- Your automatic discounts
- Shopify applies one automatic discount unless the combination is allowed on both sides. Ours already allows yours; yours has to allow ours. Open each active automatic discount in Shopify and tick, under Combinations, the discount types this test uses — or pause it for the length of the test. Otherwise Shopify picks, and not based on what you were trying to measure.
Reading the result
Profit per visitor is the primary metric, falling back to revenue per visitor where product costs are not set. It is the question the test asks. But it is a ratio with no spread recorded, so the results page gives no statistical verdict on it.
- Profit per visitor
- No verdict · The question the test asks. Read it for direction and size.
- Revenue per visitor
- Verdict · Modelled. Read it for whether a difference is real.
- Conversion rate
- Verdict · Modelled. A cheaper arm converting better is arithmetic, not a finding.
- Average order value
- No verdict · Context: did the offer change basket size?
- Avg discount per order
- No verdict · Shown with no direction for an offer test: the arm took what it was offered.
No verdict on profit per visitor.
What the results page says: pick conversion rate or revenue per visitor below, or make one the primary metric.
↳ Two metrics carry a verdict
With profit per visitor as the primary, the page reads “No verdict on profit per visitor” and points you at the two metrics it can judge. So read it in two steps:
- Profit per visitor for which arm made more money, and by how much.
- Revenue per visitor or conversion rate for whether the difference is real. An offer will almost always lift conversion — that is arithmetic, not a finding — so revenue per visitor is usually the better of the two.
Average discount per order is promoted onto the front page for this kind of test, and deliberately shown with no direction — not green for down, not green for up. The group that took the discount it was offered is not losing for having taken it.
Watch abandoned checkout rate too. An offer that appears only at the cart changes the shape of the funnel rather than the top of it.
When it wins
End the test first, then create the winning offer as a normal automatic discount in Shopify. The other way round, a shopper checking out in between gets your offer and ours on the same order.
Ours is removed when the test ends, so making it permanent is a deliberate step rather than something that happens by forgetting — which is the behaviour you want from anything that gives money away.