All segments

Rebuy Shopify: Offer Placement Rules and Attribution

Rebuy Shopify setup: where the offer sits in checkout, the rule settings that matter, and why the app's own attributed revenue overstates real lift.

  • Published
  • Reading time 14 min read
  • Author Nafiul Hasan
Rebuy Shopify: Offer Placement Rules and Attribution. Diagram: the branch nothing measures. RETAIN Rebuy Shopify: Offer PlacementRules and Attribution TRACKEDINVISIBLE pointerflow.com

Short answer

Rebuy Shopify setup means installing a post-purchase offer app, building rules that trigger on cart value or product history, then placing the offer in the cart drawer, checkout, or thank-you page. The app's own attributed revenue is not the same as revenue you would have lost without it — only a holdout test separates the two.

What is a rebuy Shopify setup, and what does it actually change?

A rebuy Shopify setup means installing an app that builds product recommendations and post-purchase offers from rules you configure, then showing them at specific points in the shopping and checkout experience. On a Shopify Plus store the offer can appear as a checkout-step block; on any Shopify plan it can appear in the cart drawer or on the thank-you and order-status pages after payment.

What it changes for a $3M–$30M brand is not whether you have upsells — most stores at this revenue level already have some — but where the offer sits relative to the moment of intent, and how much of the resulting revenue you can actually claim. This article is written for operators running Shopify Plus or a comparable paid subscription platform at that revenue band. If your store is still below $3M in annual revenue, the setup below still works mechanically, but the measurement section that follows won’t be worth the engineering time yet: you don’t have the order volume to run a holdout with any statistical confidence.

What you need before you turn on a Shopify rebuy offer

Three things need to exist before you configure a single rule. First, a clean product exclusion list — final-sale items, subscription add-ons, gift cards and anything discontinued should never surface in an automated offer, because a customer accepting an offer for a product that can’t be fulfilled is a support ticket the next day. Second, a margin floor per SKU or category, because a rules engine will happily discount a low-margin item into a loss if nobody has told it where the floor is. Third, a way to measure orders that never see the offer at all — a holdout cohort, a feature flag, or a segment your app can exclude by customer ID. Without that third piece, everything downstream in this article is guesswork dressed as a dashboard number.

You also need clarity on who owns the rule set once it’s live. On a catalogue with hundreds of SKUs, offer rules drift: a collection gets renamed, a product goes out of stock, a promotion ends, and nobody updates the exclusion list. Assign the review to a real person on a cadence, not to “whoever notices.”

Where the offer actually sits in your funnel

A rebuy-style offer can occupy four distinct positions, and each one carries a different relationship to the sale that’s already happening.

The cart drawer sits before checkout starts. The customer hasn’t committed to paying yet, so an offer here competes directly with their original intent — every extra second spent evaluating an add-on is a second not spent completing the cart they came to complete. This is the highest-friction, highest-visibility placement.

A checkout-step offer, available on Shopify Plus through the checkout extensibility framework, sits inside the paid funnel itself, after the customer has entered payment details but before the order is placed. This position has the highest conversion pressure on the merchant’s side because payment intent is already confirmed, and the highest risk of introducing friction that drops the primary order, because Shopify’s own checkout is intentionally minimal for a reason.

The thank-you page and order-status page sit after payment has been captured. The original order is safe regardless of what happens next, which makes this the lowest-risk placement operationally — but it’s also furthest from the moment the customer was actively deciding what to buy, so response rates typically differ from a pre-payment placement in ways that vary by catalogue and cannot be assumed without checking your own data.

A fourth position, technically outside “rebuy” proper but worth naming because teams conflate it: a post-purchase email sent hours or days later. It competes for the same intent as an on-site offer but on a completely different timeline, and counting both as if they were the same channel is a common measurement mistake worth keeping separate once you start building offer rules.

How to build a rebuy offer on Shopify, step by step

Step 1: Build the exclusion list first

Before you write a single offer rule, list every SKU, tag and collection that must never appear in a post-purchase widget: final-sale items, gift cards, pre-orders, items the customer already has in the cart, and anything below your margin floor. Build this as a maintained tag or collection in Shopify itself, not as a one-off list inside the app, so it stays in sync when a product’s status changes. Teams that skip this step find out about it when a customer is offered a discontinued product and the fulfilment team has to issue a refund and an apology.

Step 2: Choose the recommendation logic

Pick between a manually curated cross-sell matrix, where you decide what pairs with what, and the app’s own behavioural logic — frequently bought together, browse history, or a blended score across both. Manual is slower to build and easier to audit: you can explain every pairing to a merchandising lead in one sentence. Behavioural logic scales without ongoing merchandising effort, but on a thin catalogue (a few dozen SKUs) it can surface odd pairings simply because the data set is too small to produce a confident signal. On a heavy catalogue, behavioural logic tends to outperform a manually maintained matrix, because nobody can maintain pairing rules for a thousand SKUs by hand.

Step 3: Set the trigger and the discount depth

Decide what causes the offer to fire: cart value above a threshold, a specific product or collection present in the cart, or a specific step in checkout. Then decide separately whether the offer carries a discount at all. These are two different decisions that get collapsed into one setting too often. A full-price add-on suggested because it pairs with what’s already in the cart is a merchandising decision. A discounted add-on triggered by cart value is a margin decision. Treating them as the same rule makes the resulting revenue number impossible to interpret later, because you can’t tell whether a customer bought because the pairing was relevant or because the price was lower.

Step 4: Set the frequency cap

Limit how often one customer sees an offer, per session and across their order history with you. Without a cap, a repeat buyer sees the same upsell on every visit, and offer fatigue sets in: acceptance rates for the same widget tend to fall over repeated exposures, since the customer either already owns the item or has already decided against it. A frequency cap is a structural setting, not a figure to import from a case study — set it against your own purchase cycle length, and tighten it if you see repeat customers ignoring the widget entirely in your own click data.

Step 5: Decide where the offer sits: drawer, checkout or thank-you page

Cart-drawer offers compete with the customer’s original intent to check out, and are available on any Shopify plan. Checkout-step offers need Shopify Plus and the checkout extensibility framework, and carry the highest friction risk because they sit inside the paid funnel itself — a slow-loading or poorly matched offer block here can measurably drag on your primary conversion rate, not just the offer’s own acceptance rate. Thank-you-page and order-status-page offers sit after payment is already captured, which changes both the psychology (nothing to lose by declining) and the accounting (the base order is unaffected either way). Most $3M–$30M stores get the best return starting with the thank-you page, because it’s the lowest-risk position to learn on before touching anything inside the paid checkout.

The step most teams get wrong: shipping without a holdout

The step almost every team skips is building a holdout before they turn the offer on. It’s easier to install the app, configure a few rules, and watch the dashboard’s “revenue attributed” number climb — and much harder to deliberately withhold the offer from a slice of your own customers to find out what that number actually means.

Without a holdout, you have exactly one number: how much revenue included a suggested item. You do not have a second number to compare it against, which means you cannot answer the only question that matters commercially — how much of that revenue would not have existed without the widget. Setting up a holdout after three months of “successful” results is harder than setting one up on day one, because by then the whole team has anchored on the inflated number and a lower, honest one reads as a failure rather than as the first accurate measurement you’ve had.

A practical holdout doesn’t need custom engineering in most cases: many post-purchase apps support excluding a percentage of sessions or customers from the offer entirely, logged the same way as everyone else. If yours doesn’t, a Shopify Flow or a customer-tag-based segment can approximate it. The point is to have a group that experiences the store identically except for the one variable you’re testing.

How to verify the offer is actually working

Verification happens in three layers, and skipping any one of them means you’re trusting a number you haven’t checked.

First, check that the rule fires where you expect. Place a handful of test orders across your exclusion list, your discount tiers and your frequency cap, and confirm the offer appears, doesn’t appear, or stops appearing exactly as configured. Rule engines fail silently more often than they fail loudly — a mistyped tag or a collection that got renamed produces an offer that quietly stops firing for a whole segment, with no error anywhere.

Second, check that declined offers are logged, not just accepted ones. A dashboard that only counts acceptances gives you a conversion rate with no denominator you can trust, since you don’t know how many customers actually saw the offer versus how many were simply never shown it because a rule excluded them.

Third, and this is the one most teams never get to, compare the holdout group’s baseline conversion rate and average order value against the exposed group over the same date range, controlling for the same traffic sources and promotional calendar. If you’re also running replenishment or reorder campaigns for consumable products, cross-check the timing against a tool like Pointerflow’s replenishment timing calculator — an offer that fires close to when a customer is about to reorder anyway will look far more successful than an offer that fires when nobody was near a repurchase decision, and the two cases need different rules, not the same one.

Why the widget’s own dashboard overstates its revenue

The measurement problem is structural, not a bug in any particular app. A post-purchase widget’s dashboard counts an order as “attributed” if that order contains an item the widget suggested and the customer accepted. It has no way of knowing, and no incentive to report, how many of those customers would have bought that same item anyway — through search, through a collection page, through a second order a week later, or through simply asking a staff member on a phone order.

This is the split the dashboard cannot see:

Orders touched by the offer split into two paths the dashboard cannot tell apart Offer shown Would have bought it anyway (untracked) Genuinely caused by the offer Dashboard counts both as "attributed"

Both paths land in the same “attributed revenue” figure, because the app measures whether a suggested item was purchased, not whether the purchase was caused by the suggestion. The top path — orders that would have happened regardless — dilutes the bottom path, and the dilution is invisible from inside the app itself. There is no setting that fixes this; it’s a property of measuring at the point of purchase rather than measuring against a comparison group that never saw the offer.

This matters most at the top of your catalogue. If your best-selling accessory is already what most customers add to a hero product anyway, an offer suggesting exactly that pairing will show a high acceptance rate and a large attributed-revenue figure, most of which reflects buying behaviour that was already going to happen. The offer’s real contribution is likely to be larger on your less obvious, lower-velocity pairings — the item a customer would not have found or thought to add without the prompt — even though those show smaller totals in the dashboard.

What a holdout actually tells you

A holdout doesn’t tell you whether the offer “works” in the abstract; it tells you the difference in outcome between two groups that were identical except for one variable. That’s a narrower, more useful claim than “the widget generated $X,” and it’s the only claim that survives being checked.

Here is an illustrative example, with invented numbers to show the arithmetic, not a real result: a store runs 10,000 orders in a month, 9,000 exposed to a thank-you-page offer and 1,000 held out. The exposed group’s illustrative average order value is $92 and the holdout group’s is $89 — that illustrative $3 gap is the closest thing to a true incremental effect you have, because it’s the only comparison where nothing else changed. The app’s own “attributed revenue” figure, calculated by summing every order that included a suggested item, would show a much larger number, because it includes orders from customers who were always going to buy that add-on.

The honest caveat: a single month’s holdout comparison carries noise, especially if your order volume is on the lower end of the $3M–$30M range. Seasonality, a concurrent email campaign, or a shift in paid traffic mix can move the exposed and holdout groups’ numbers independently of the offer itself. Running the comparison across a longer window, and checking that traffic sources and promotional calendar were consistent across both groups, is what turns a plausible number into a defensible one.

Is the revenue Rebuy reports on Shopify incremental?

No, not in full, and there’s no way to know how much of it is without running a comparison against a group that never saw the offer. The dashboard’s attributed-revenue figure counts every order containing a suggested item, regardless of whether that customer would have bought it anyway through search, a collection page or a repeat order. Treat the dashboard number as an upper bound on the offer’s contribution, not as the contribution itself.

How does a Shopify rebuy setup differ from a manual cross-sell app?

A rebuy-style app typically combines rule-based triggers with behavioural recommendation logic and can place offers across the cart, checkout and post-purchase surfaces from one rule set. A manual cross-sell app usually only handles a fixed “customers also bought” block on the product page, with no post-purchase placement and no automated logic beyond what you configure by hand. The practical difference for a $3M–$30M operator is maintenance: a manual system is fully explainable but needs a person updating pairings as the catalogue changes, while a rules-and-behaviour system scales with less manual upkeep but needs a maintained exclusion list and a clear margin floor to stay disciplined, or it will surface pairings nobody would have approved.

What breaks at volume

A few failure modes only show up once order volume and catalogue size grow past what a small test could reveal.

Exclusion lists rot. A product marked final-sale six months ago gets restocked at full price, but the tag never gets removed, so a perfectly sellable item stays excluded from every offer indefinitely. On a catalogue with hundreds of SKUs, nobody notices until someone asks why a popular item never appears in the widget.

Recommendation logic trained on aggregate behaviour starts recommending your best-sellers to everyone, regardless of what’s actually in their cart, because the aggregate signal is stronger than any one session’s context. This flattens the personalisation the whole system was meant to provide, and it happens gradually enough that a team can miss it for months.

Checkout-step offers add render time to the one part of the funnel where render time has the most measurable cost. On a heavy catalogue with large product images already loading at checkout, an additional offer block that queries a recommendation service in real time can add latency that shows up as a small but real drop in the base checkout completion rate — a cost that never appears anywhere in the offer app’s own dashboard, because the app only measures what happens to people who reach the offer, not the people who abandoned before it loaded.

Frequency caps that were reasonable at launch stop being reasonable once purchase cycles shorten during a promotional period. A cap set for a typical six-week repurchase cycle will show the same offer to a customer twice within a single flash-sale week, and acceptance rates on the second exposure tend to fall, dragging the average down in a way that looks like the offer “stopped working” when what actually changed was the cadence of the customers seeing it.

Personalising and pricing an offer widget correctly is one part of a wider post-purchase and average-order-value problem: the offer only ever addresses the moment right around a single transaction, not the customer’s full path back to a second order. Pointerflow’s post-purchase and AOV work covers that wider problem, including how a widget like this fits against replenishment timing, subscription cadence and the rest of the post-purchase surface, rather than treating the offer as the whole strategy.

Sources

  • No external figures are quoted in this article. It’s written from how Shopify’s checkout extensibility framework and post-purchase app category are documented to work, and from the structural logic of attribution measurement; readers should confirm current app-specific settings, placements and pricing against the vendor’s own documentation before implementation.

Frequently asked

What does Rebuy actually do on a Shopify store?

Rebuy is a Shopify app that builds personalised product recommendations and post-purchase offers, showing them in the cart, at checkout (on Shopify Plus) or on the order confirmation page. It runs on rules you configure — cart value, product tags, purchase history — not a single fixed widget.

How much does Rebuy cost for a Shopify store?

Pricing is not something to quote from memory here, since app pricing tiers change. Check Rebuy's own pricing page directly before you budget; most post-purchase apps in this category scale their fee with order volume or store revenue rather than charging a flat rate.

Does Rebuy work with Shopify Plus checkout extensibility?

Checkout-step offers require Shopify Plus and the checkout extensibility framework, which replaced checkout.liquid customisation. Cart-drawer and thank-you-page offers do not require Plus. Confirm current requirements against Shopify's own checkout extensibility documentation before you scope a checkout-step build.

Where does a rebuy offer sit in the Shopify checkout flow?

It can sit in three places: the cart drawer before checkout starts, a checkout-step block on Shopify Plus, or the thank-you and order-status pages after payment. Each position has different traffic, different intent, and a different attribution problem, since revenue captured after payment is already accounted for differently than revenue captured before it.

What is a holdout group in ecommerce offer testing?

A holdout is a slice of customers or sessions who never see the offer, held constant while everyone else does. Comparing their conversion rate and order value to the exposed group is the only way to separate revenue the offer caused from revenue that would have happened anyway.

How do you know if a post-purchase offer is cannibalising full-price sales?

Watch average order value and full-price unit mix in the holdout group against the exposed group over the same weeks. If the exposed group's discounted add-ons are replacing items customers would have bought at full price in a separate order, total margin can fall even as the app reports revenue.

What's the difference between a Rebuy offer and a Klaviyo post-purchase flow?

A Rebuy-style widget fires on-site, inside the session, before or right after payment. A Klaviyo flow fires by email, hours or days later, once the customer has left the site. They compete for the same purchase intent and should not both be measured as if they were independent.

How many products should a post-purchase offer recommend at once?

There's no fixed correct count to quote without your own catalogue data. Structurally, more choices raise decision cost and lower the chance any one item converts; fewer, better-matched options with a clear reason for the pairing generally outperform a long scrollable list — verify this against your own funnel report, not a benchmark.

Should a post-purchase offer always include a discount?

No. A discount speeds the decision but also compresses margin on an order that might have converted at full price without it. Test full-price bundling logic (buy X, we suggest Y because it pairs with X) before defaulting every offer to a discount.

What happens if a customer declines the post-purchase offer?

The order proceeds as originally placed; nothing about the customer's confirmed purchase is affected. What matters operationally is that a declined offer is logged the same way an accepted one is, so your funnel report shows exposure, not just conversions.

How do you exclude out-of-stock items from a rebuy recommendation?

Sync the offer app's product feed to Shopify inventory levels and set the rule to respect the inventory_quantity field, or exclude any product tagged out-of-stock at the collection level. An offer for an item that's unavailable at fulfilment is a support ticket, not a sale.

Is the revenue Rebuy reports for a Shopify store actually incremental?

Not entirely, and the app's own dashboard cannot tell you how much of it is. Attributed revenue counts any order containing a suggested item as caused by the offer, including orders the customer would have placed anyway. Only a holdout comparison isolates the incremental share.

How long should a holdout test run before you trust the result?

Long enough to cover your normal order-value cycle including at least one full week and any recurring promotional day, since a short window mixes ordinary variance with the effect you're measuring. There's no universal day count to quote; check your own weekly order volume against a basic sample-size calculation before you call a result.

Can a post-purchase app replace a full personalisation engine?

No. A post-purchase offer widget solves one moment: the decision right before or after checkout. A personalisation engine also touches browsing, search results and email content. Treating the offer widget as your whole personalisation strategy leaves the rest of the site running generic defaults.

What's the difference between shopify rebuy and rebuy online in search terms?

Both point to the same product: 'shopify rebuy' specifies the platform, 'rebuy online' is a looser variant some searchers use for the same app category. Neither implies a different product; treat them as the same intent when you're researching or briefing an implementation.

Next step

Is this your post-purchase & aov problem, or a symptom of another one?

Bring your numbers — the churn split, the decline rate, whatever your flows are earning — and we will tell you which of them is the expensive one.

Book a call →