# Ninety9 — full site content > Ninety9 builds conversion-rate optimisation apps for Shopify: AI cart drawers, bundles, upsell popups, free shipping progress bars and post-purchase order editing. Trusted by 20,000+ stores. Generated 2026-08-18. Canonical site: https://ninety9.dev --- # Apps ## Addy: AI Cart Drawer & Bundles URL: https://ninety9.dev/apps/addy.html Shopify App Store: https://apps.shopify.com/addy-cart-drawer Category: Cart customization, Product bundles Pricing: Free to install Rating: new listing Built for Shopify: no Launched: 2026-08-10 Addy adds a fully customisable slide cart drawer to your Shopify store with AI in-cart upsells, volume discount bundles, subscriptions, a free shipping bar and shipping protection — then targets it per Market, customer tag or even per block. ### Highlights - AI upsells, bundles and product recommendations that lift average order value - Different carts for different Markets and customer tags, with block-level rules - Volume discounts, free gifts, shipping protection and progress-bar reward goals - Estimated delivery dates, countdown timers, announcement bars and trust badges - A library of FOMO blocks plus custom HTML and CSS for total design control ### Features - **AI-built cart drawer** — Addy reads your catalogue, theme and brand and assembles a complete cart drawer for you. You get a working, on-brand cart in minutes instead of an afternoon of configuration. - **40+ drag-and-drop blocks** — Upsells, bundles, progress bars, announcements, trust badges, order notes, discount fields, gift wrap, countdown timers and more — reorder any of them by dragging. - **In-cart upsells and cross-sells** — Show frequently bought together, related products or AI recommendations right where intent is highest, with one-click add and no page reload. - **Volume discounts and free gifts** — Buy-more-save-more tiers, BOGO, bulk pricing, automatic discounts and free gift thresholds, all resolved natively at checkout. - **Reward progress bars** — Stack goals for free shipping, order discounts and free gifts so shoppers always have a reason to add one more item. - **Market and segment targeting** — Build a different cart for every Market or customer tag, and add conditions to individual blocks so the right offer reaches the right shopper. - **Estimated delivery dates** — Show a real delivery window inside the cart to remove the biggest pre-checkout unknown and reduce abandonment. - **Custom HTML and CSS** — Drop in your own markup and styles when a design needs to go beyond the settings panel. No theme edits, no developer required. ### Works with - Checkout - Shopify Admin - All themes - Discounts & free gift apps - Foxify & GemPages - Judge.me, Loox, Junip, Yotpo - Multi-currency apps - PageFly & EComposer ### FAQ **Does Addy work with my Shopify theme?** Yes. Addy installs as a theme app extension and is compatible with every Online Store 2.0 theme, plus page builders such as PageFly, GemPages, Foxify and EComposer. There are no theme file edits, so uninstalling leaves nothing behind. **Will the cart drawer slow my store down?** Addy loads asynchronously and only renders when the cart is opened, so it stays out of the critical rendering path. It does not block your Largest Contentful Paint and adds no render-blocking scripts. **Can I show different carts in different countries?** Yes. Addy supports Shopify Markets targeting, so you can run a different cart layout, different offers and different free shipping thresholds per Market, and target individual blocks by customer tag as well. **How much does Addy cost?** Addy is free to install from the Shopify App Store. **Does Addy support multiple languages and currencies?** Yes. Every string is translatable and prices render in the shopper’s presentment currency, so international carts read correctly without extra configuration. ## Addly: AI Bundles app & Upsell URL: https://ninety9.dev/apps/addly.html Pricing page: https://ninety9.dev/addly-pricing-subscriptions.html Shopify App Store: https://apps.shopify.com/addly Category: Product bundles, Upsell and cross-sell Pricing: Free plan, then from $9.99/mo Rating: 4.8/5 from 104 reviews Built for Shopify: yes Launched: 2023-04-03 Addly gives you every offer type that lifts basket size — frequently bought together, bundle discounts, cross-sells, quantity breaks, volume discounts, product add-ons and mix-and-match — plus AI offers built from your real purchase history. ### Highlights - Frequently bought together or a slider upsell with a variety of layouts - Volume discounts targetable to specific variants to clear slow-moving stock - Product add-ons and mix-and-match offers with layered discount logic - Translatable into 13 languages with full multi-currency support - Analytics that surface your best performing offers, not just totals ### Features - **Frequently bought together** — Pair the products your customers already buy together and present them as a single, discounted add. Choose from grid, slider or stacked layouts. - **Quantity breaks and volume discounts** — Tiered pricing that rewards bigger orders, targetable down to individual variants so you can clear specific sizes or colours. - **Mix-and-match bundles** — Build-a-box, sample packs, gift boxes and infinite-option bundles with discount logic that can nest conditions inside conditions. - **AI offers from purchase history** — Addly analyses real order data to recommend the pairings that actually convert in your store, instead of guessing from category tags. - **Product add-ons** — Attach warranties, gift wrap, shipping protection or accessories as optional one-click add-ons on the product page. - **Live preview before publishing** — See the exact offer as a shopper will, on your real theme, before it goes live. No publish-and-pray. - **13 languages, every currency** — English, German, Spanish, French, Italian, Japanese, Dutch, Turkish, Simplified Chinese, Korean, Punjabi, Hindi and Swedish out of the box. - **Offer-level analytics** — Click-through rate, conversion rate and revenue per offer, so you can retire the losers and scale the winners. ### Works with - Checkout - Shopify Admin - Addy: Cart drawer & Upsells - Foxify & GemPages - Multi-currency apps - PageFly & EComposer - Review apps - UpCart & One Click Upsell ### Plans - Free forever: $0/forever — For stores exploring the app. No hidden fees. - Starting out: $9.99/month — Covers up to $1,000 in revenue from Addly. Auto upgrade once you reach the next tier. - Getting traction: $13.99/month — Covers up to $2,500 in revenue from Addly. Auto upgrade once you reach the next tier. - Scaling: $24.99/month — Covers up to $5,000 in revenue from Addly. Auto upgrade once you reach the next tier. - Growing: $44.99/month — Covers up to $10,000 in revenue from Addly. Auto upgrade once you reach the next tier. - Unlimited: $49.99/month — Covers unlimited revenue. Auto upgrade once you reach the next tier. ### FAQ **What is the difference between Addly and Addy?** Addly runs offers before the cart — on product and collection pages — with bundles, quantity breaks and frequently bought together. Addy is the cart drawer itself. They are built to run together, and Addly explicitly integrates with Addy. **Do Addly bundles work with Shopify discount codes?** Addly applies its discounts through Shopify’s native discount engine, so pricing is correct in the cart and at checkout. Stacking behaviour with other codes follows your Shopify discount combination settings. **Is there a free plan?** Yes. The free plan includes unlimited upsells, bundles, AI offers, volume discounts, add-ons and mix-and-match offers, up to $500 of attributed revenue per month. **Can I target a volume discount to one variant only?** Yes. Volume discounts can be scoped to specific variants, which makes Addly useful for clearing a single size or colour without discounting the whole product. **Which languages does Addly support?** Thirteen: English, German, Spanish, French, Italian, Japanese, Dutch, Turkish, Simplified Chinese, Korean, Punjabi, Hindi and Swedish. ## Goalify: Free Shipping Bar PRO URL: https://ninety9.dev/apps/goalify.html Shopify App Store: https://apps.shopify.com/goalify Category: Gifts, Upsell and cross-sell Pricing: Free plan, then from $3.99/mo Rating: 5/5 from 42 reviews Built for Shopify: yes Launched: 2024-12-04 Goalify combines progress bars, cart goals, stackable rewards and AI upsells into one experience. Build a free shipping bar, hand out a free gift with purchase, run BOGO and show AI recommendations — set up in under two minutes with no code. ### Highlights - Rules based on cart value, cart quantity or specific products in the cart - Stackable rewards: free gift, free shipping and order discount at once - Unlimited rules and rewards — stack as many goals as your margin allows - Multiple design templates, fully localised with translation and currency conversion - Use it as a top bar and as a widget you can place anywhere in the theme ### Features - **Free shipping progress bar** — The single highest-leverage AOV widget there is. Show shoppers exactly how far they are from free shipping, in their own currency. - **Stackable reward goals** — Chain goals together: free shipping at $50, 10% off at $80, a free gift at $120. Each threshold crossed reveals the next one. - **Free gift with purchase** — Auto-add a gift when conditions are met, with full control over which products qualify and how the gift appears in the cart. - **Condition-based rules** — Trigger on cart subtotal, item count, or the presence of specific products and collections — then combine conditions freely. - **AI upsells from order history** — When a shopper is short of a goal, Goalify suggests the product most likely to close the gap based on your real order data. - **Country-based configuration** — Different thresholds for different countries, because $75 free shipping does not mean the same thing in every market. - **Bar and embeddable widget** — Run it as a sticky announcement bar, drop it into the cart drawer, or place it on the product page. Or all three. - **A/B testing and analytics** — Compare thresholds and copy against each other and see conversion rate, click-through and funnel performance per variant. ### Works with - Checkout - Shopify Admin - All themes - Cart modification apps - Page builders - Translation & currency apps ### Plans - Free: $0/forever — Up to 10 orders / month - Starting out: $3.99/month — Up to 20 orders / month - Getting traction: $7.99/month — Up to 35 orders / month - Scaling: $11.99/month — Unlimited orders ### FAQ **How long does Goalify take to set up?** Under two minutes for a standard free shipping bar. You pick a template, set the threshold, choose where it appears, and publish. No code and no theme edits. **Can I stack more than one reward?** Yes, that is the core idea. You can set unlimited rules and unlimited rewards, and stack both — for example free shipping at one threshold and a free gift at a higher one. **Does the free shipping bar convert currency automatically?** Yes. Goalify is fully localised, so thresholds are shown in the shopper’s presentment currency and can be configured per country. **Where can I place the progress bar?** As a sticky top bar on the storefront, inside the cart drawer, on the cart page, and on product pages. It is available both as a bar and as an embeddable widget. **Is Goalify Built for Shopify?** Yes. Goalify carries the Built for Shopify badge, which means it meets Shopify’s highest standards for performance, design and integration. ## Monet • AI Popup Bundle Addons URL: https://ninety9.dev/apps/monet.html Shopify App Store: https://apps.shopify.com/monet Category: Product bundles, Discounts Pricing: Free to install Rating: 5/5 from 4 reviews Built for Shopify: no Launched: 2026-02-06 Monet shows upsells, cross-sells and bundles as popups triggered by the three moments that matter most: add to cart, checkout initiation and exit intent. Add AI recommendations and you capture revenue that would otherwise walk out the door. ### Highlights - AI product recommendations inside every popup, running on autopilot - Three triggers that cover the whole funnel: add to cart, checkout, exit intent - Popup templates for bundle, cross-sell and add-on offers - Multi-currency and translations so you can lift revenue internationally - Analytics that show exactly which popup converts and which one does not ### Features - **Add-to-cart trigger** — The highest-intent moment in the whole session. Show a complementary product the instant a shopper commits, while their wallet is already open. - **Checkout-initiation trigger** — One last relevant offer before the shopper leaves your storefront for checkout — with no risk to the checkout flow itself. - **Exit-intent trigger** — Detect the leave signal and present a reason to stay. Turns a bounce into a bundle far more often than you would expect. - **AI recommendations** — Monet picks the offer product for you from purchase patterns, so popups stay relevant as your catalogue and season change. - **Bundle, cross-sell and add-on templates** — Three proven popup layouts. Pick the one that fits the offer instead of building a layout from scratch. - **Discount and countdown logic** — Percentage, flat, BOGO, tiered and volume discounts, plus limited-time offers and countdown timers for urgency that is honest. - **Targeting and segmentation** — Geolocation, tagging, segmentation and rule-based triggers so a popup never fires at the wrong shopper. - **Full-funnel analytics** — Views, add-to-cart rate and conversion rate per popup, so optimisation is a measurement exercise rather than a debate. ### Works with - Checkout - Shopify Admin - Cart drawers - Foxify & GemPages - Multi-currency apps - PageFly & EComposer - Review apps - UpCart & One Click Upsell ### FAQ **Will upsell popups hurt my conversion rate?** Not when they are triggered on intent rather than on a timer. Monet fires on add to cart, checkout initiation and exit intent, so the popup appears after the shopper has already committed or is already leaving. It never interrupts browsing. **What is exit intent and how does Monet detect it?** Exit intent is the behavioural signal that a visitor is about to leave — typically the cursor moving rapidly toward the browser chrome on desktop, or a back-navigation gesture on mobile. Monet listens for those signals and shows one targeted offer. **Does Monet cost anything?** No. Monet is free to install from the Shopify App Store. **Can I run Monet alongside a cart drawer app?** Yes. Monet is designed to work with cart drawers including Addy, as well as UpCart and One Click Upsell. **Do popups work on mobile?** Yes. Templates are responsive and the trigger logic adapts to mobile behaviour, including back-navigation as the exit signal. ## Reviso: Order editing & Upsell URL: https://ninety9.dev/apps/reviso.html Shopify App Store: https://apps.shopify.com/reviso-order-editor Category: Order editing, Returns and exchanges Pricing: Free to install Rating: 5/5 from 1 reviews Built for Shopify: no Launched: 2026-06-23 Reviso lets customers edit their orders after checkout — address, products, quantities, variants — before anything ships. Support tickets fall, cancellations fall, returns fall, and AI upsells turn the edit screen into a second revenue moment. ### Highlights - Cancellation deflection flow with incentive discounts or a free gift - Post-purchase AI recommendations and recently viewed products to lift AOV - Fewer returns because shoppers fix mistakes before fulfilment, not after - Smart rules controlling edits by country, customer tag and order conditions - Change address, shipping method, variants or quantities without a support ticket ### Features - **Self-service address change** — The single most common post-purchase support ticket, handled by the customer in seconds — before the label is printed and the cost is locked in. - **Edit items, quantities and variants** — Wrong size, wrong colour, forgot an item. Reviso lets shoppers correct it themselves at any point before fulfilment. - **Cancellation deflection** — When a shopper starts a cancellation, offer an incentive discount or a free gift instead. A saved order beats a refunded one every time. - **Post-purchase AI upsells** — The edit screen is a high-attention page with a warm buyer on it. Reviso fills it with AI recommendations and recently viewed products. - **Rules by country and tag** — Control exactly who can edit what. Restrict address changes in some markets, allow item swaps only for tagged customers, set order-value conditions. - **Native Shopify design** — The edit interface looks like it shipped with Shopify, so customers never feel handed off to a third party. - **Returns and exchange tooling** — Automated approvals, return windows, return reasons, store credit, exchanges and non-returnable items, all in one place. - **Works with customer accounts** — Lives inside Shopify customer accounts, so shoppers find it where they already look for their orders. ### Works with - Customer accounts - Shopify Admin - Cart drawers & Kaching bundles - Foxify & GemPages - Judge.me review apps - Monster, Vitals & Avada - Multi-currency apps - PageFly & EComposer ### FAQ **Can customers edit an order after it has shipped?** No. Reviso only exposes edits before fulfilment, which is exactly the window where a change is still cheap. Once an order is fulfilled the edit options close automatically. **How does Reviso reduce returns?** Most avoidable returns start as a mistake at checkout — wrong variant, wrong address, wrong quantity. Letting the customer fix that before the parcel moves removes the return entirely, along with its shipping cost and restocking work. **Can I stop customers from changing certain things?** Yes. Smart rules let you allow or block each edit type by country, customer tag and order conditions, so you keep control over high-risk changes. **What does the cancellation flow offer?** When a shopper begins to cancel, Reviso can present an incentive — a discount on the current order or a free gift — as an alternative to cancelling outright. **Is Reviso free?** Yes, Reviso is free to install from the Shopify App Store. --- # Blog ## How to Increase Average Order Value on Shopify (The Complete 2026 Playbook) URL: https://ninety9.dev/blog/how-to-increase-average-order-value-shopify.html Published: 2026-08-16 Category: Average Order Value Reading time: 10 minutes A practical, maths-first guide to raising Shopify AOV — the eleven levers that work, where each one belongs in the funnel, and how to tell which is worth your next week. There are exactly three ways to make an ecommerce store bigger. Get more visitors. Convert more of them. Or make each order worth more. The first is a budget question and gets more expensive every year. The second is real work with a hard ceiling — most categories top out somewhere between two and four percent, and getting from 2.1% to 2.4% takes months of testing. The third is the one most stores treat as an afterthought, and it is the only one where the improvement is permanent, applies to every channel simultaneously, and costs nothing per additional order. This guide is the complete version: the eleven levers that reliably work, where each belongs, and how to decide which one deserves your next week. ## The maths that makes this worth reading Take a store doing 1,000 orders a month at a $58 average order value. That is $58,000 in monthly revenue. Now add $9 to the average order. One accessory, one quantity break, one nudge across a free shipping line. Same traffic, same conversion rate, same ad spend. | | Before | After +$9 AOV | After +15% conversion | |---|---|---|---| | Orders / month | 1,000 | 1,000 | 1,150 | | Average order value | $58 | $67 | $58 | | Revenue | $58,000 | $67,000 | $66,700 | | Extra ad spend | — | $0 | ~$4,400 | | Extra gross profit (at 55% margin) | — | **$4,950** | **$400** | Both columns produce roughly the same revenue. Only one of them produces meaningful profit, because a conversion-rate win still carries the acquisition cost of the extra sessions, while an AOV win carries almost no marginal cost at all. That asymmetry is the entire argument. It is also why AOV work is usually the highest return-on-effort project available to a store doing more than a few hundred orders a month. ## Measure three numbers, not one The single most common mistake is optimising AOV in isolation. Every tactic below can be gamed into a higher average order value while making the business worse. Watch all three of these together: 1. **Average order value** — revenue ÷ orders, for a fixed window. 2. **Conversion rate** — sessions that end in an order. If a tactic adds friction before commitment, this drops. 3. **Gross profit per order** — revenue minus COGS minus discount minus shipping cost, ÷ orders. This is the number that pays your rent. A bundle that lifts AOV from $58 to $71 by giving away 30% is often a loss. A free shipping threshold set below your true fulfilment cost raises AOV and destroys margin. Always run the third number. Gross profit per session. It captures conversion rate, order value and margin in one figure, and it is almost impossible to game. ## The four positions Every AOV tactic sits at one of four points in the journey. They behave differently and they compound, because a shopper who adds an accessory on the product page can still cross a shipping threshold in the cart and still accept a post-purchase offer. | Position | Shopper state | What works here | Risk to conversion | |---|---|---|---| | Product page | Still deciding | Bundles, quantity breaks, frequently bought together | Medium — can add friction | | Cart | Committed to buying | Progress bars, in-cart upsells, gift thresholds | Very low | | Exit / checkout start | Leaving or converting | Exit-intent offers, add-to-cart popups | Low if intent-triggered | | Post-purchase | Already paid | Order edits, upsells on the confirmation and edit screens | Zero | Most stores start at the cart, because the risk is lowest and the effect is quickest. That is the right instinct. ## Lever 1: The free shipping threshold The highest-leverage single change most stores can make, and the one most often set by guesswork. Free shipping is not a discount; it is a *goal*. It converts a passive basket into an active one by giving the shopper a number to reach. The mechanic works even when the shipping fee it replaces was small, because the shopper is no longer weighing $6.90 against convenience — they are chasing a finish line. Setting the number properly: - Pull your order value distribution for the last 90 days, not your average. The average hides the shape. - Find the 60th–75th percentile of order value. Your threshold belongs in that band. - Sanity-check against margin: the gross profit on the incremental spend must exceed your average shipping cost. - Set it per country. A €75 threshold in Germany and a €75 threshold in Bulgaria are not the same offer. A threshold set at your median order value is too low — most shoppers cross it without changing behaviour and you have simply given away shipping. A threshold set at twice your median is too high — it reads as unreachable and shoppers disengage from the goal entirely. ## Lever 2: The progress bar The threshold does nothing if the shopper cannot see how close they are. A progress bar turns an abstract policy line into a live, personal, incomplete task — and incomplete tasks are uncomfortable in a way that reliably produces one more item. Three things separate a bar that works from a bar that decorates: - **It must show the remaining amount, in the shopper's currency.** "Spend $23 more for free shipping" beats "Free shipping over $75" by a wide margin, because one is about them and the other is about you. - **It must appear where the decision happens.** The cart drawer first, the cart page second, the product page third. A sticky top bar is useful reinforcement but rarely the primary driver. - **It must celebrate the crossing.** The state change when the goal is met is what makes the next goal credible. ## Lever 3: Stacked goals One threshold captures one behaviour change. A shopper who lands at $76 on a $75 free shipping threshold has no reason to go further, and you have left the entire upper half of your distribution untouched. Stacked goals fix this by revealing the next target the moment the current one is met: - $50 → free shipping - $85 → 10% off the order - $130 → free gift Each threshold is placed at a percentile of your distribution rather than at a round number that felt nice. The result is a mechanic that keeps working across the whole range of basket sizes instead of only at one point on it. The margin discipline here is straightforward: the cost of each reward must be less than the gross profit on the incremental spend required to unlock it. Model each tier separately. ## Lever 4: Quantity breaks The simplest bundle there is: buy two, save 10%; buy three, save 15%. No pairing logic, no catalogue work, no design decisions beyond a table. Quantity breaks work best on consumables, anything with a predictable replenishment cycle, and anything where the shopper's real question is "how many" rather than "which one". They work poorly on considered single purchases — nobody wants two sofas. The maths matters more than the design. A 15% discount on three units is only worth taking if your gross margin comfortably exceeds it *and* the customer would not have bought three units anyway. Cannibalisation is the real cost of a quantity break, and it is invisible in the AOV number. ## Lever 5: Frequently bought together The classic, and still the highest-converting product-page upsell when the pairs are right. The mistake is picking pairs by category. A phone case and a phone are the same category; a phone case and a screen protector are the pair that sells. The only reliable source for good pairs is your own order history — which products actually appear in the same basket, at what frequency, in what order. Rules of thumb that hold up: - Two or three suggestions, never a grid of eight. Choice paralysis is real and it costs conversions. - The suggested item should be meaningfully cheaper than the anchor product. Roughly 15–40% of the anchor price is the comfortable zone. - One-click add, no page reload, no navigating away from the product being considered. ## Lever 6: Cross-sells in the cart drawer The cart is the most under-used surface in ecommerce. The shopper has committed. There is no risk of losing the sale by showing them something else, because the decision to buy has already been made. A good cart drawer does four jobs at once: it shows the contents, it shows progress toward a goal, it offers one or two relevant additions, and it removes uncertainty about delivery. Most default theme carts do only the first. ## Lever 7: Product add-ons Warranties, gift wrap, shipping protection, express handling, engraving, a spare part. Add-ons are unusually profitable because their cost of goods is often near zero and they do not cannibalise anything. The rule is that an add-on must be genuinely optional and genuinely useful. Shipping protection that is pre-ticked is a dark pattern, will generate chargebacks, and in several jurisdictions is now illegal. Shipping protection offered honestly, unticked, with a clear explanation, converts at a rate that will surprise you. ## Lever 8: Intent-triggered popups Popups have a bad reputation because most of them are timed. A popup on a five-second timer interrupts a shopper who is still deciding, which is precisely the wrong moment. Intent triggers invert this: - **Add to cart** — fires after commitment. The wallet is already open and the shopper is in a buying frame of mind. This is the single best upsell slot most stores own. - **Checkout initiation** — one last relevant offer before they leave the storefront. - **Exit intent** — the shopper is leaving anyway. There is no conversion left to lose. None of these interrupt browsing, which is why they do not cost conversion rate the way timed popups do. ## Lever 9: Personalised recommendations Rules-based recommendations ("customers who bought X also bought Y") are a good default. Learned recommendations that read your actual order history beat them once you have enough data, mainly because they keep working when your catalogue and season change and a static rule does not. The honest caveat: below roughly 500 orders of history, a well-chosen manual pairing usually outperforms a model. Personalisation is a scale advantage, not a starting point. ## Lever 10: Post-purchase offers The confirmation page is the highest-intent surface in ecommerce and most stores put a tracking link on it. The shopper has just paid, the friction of entering payment details is behind them, and their disposition toward your brand will never again be as positive as it is in that moment. Anything you can offer that does not require re-entering payment details will convert at rates that look like errors compared to pre-purchase offers. ## Lever 11: Order editing as a revenue surface The most overlooked lever on this list. Between "order placed" and "parcel shipped" there is a window where the customer's needs can still change — and today, most stores handle that window with an email to support. Letting the customer edit the order themselves does three things at once. It removes a support ticket. It prevents a cancellation, because a shopper who cannot fix a mistake will often just cancel the whole thing. And it puts a warm, engaged buyer on a page you control, where a relevant recommendation converts extremely well. ## What to do first Ordered by return on the time it takes: 1. **This week** — put a free shipping progress bar in the cart with a threshold set from your actual distribution. 2. **This month** — add quantity breaks to your top ten SKUs by unit volume, and frequently-bought-together pairs derived from real order data. 3. **This quarter** — replace the default cart drawer with one that does upsells and delivery estimates, and add an add-to-cart popup. 4. **Next quarter** — build the post-purchase surface: order editing, cancellation deflection and a confirmation-page offer. AOV tactics interact. A progress bar and a quantity break launched in the same week cannot be attributed separately, and you will spend the next quarter arguing about which one worked. Two weeks per change at moderate volume is usually enough to see the signal. ## The honest failure modes Things that raise AOV and should not be done: - **Pre-ticked add-ons.** Illegal in the EU under the Consumer Rights Directive, and a reliable source of chargebacks everywhere else. - **Fake countdown timers.** A timer that resets on refresh is a lie, it is enforceable as one, and shoppers notice more often than you think. - **Thresholds you cannot honour.** A free shipping line that quietly excludes half your catalogue produces more support tickets than revenue. - **Six upsells on one page.** Every additional offer dilutes the others and adds cognitive load. One good offer beats four mediocre ones every time. ## Where this leaves you Average order value is not a growth hack; it is a structural property of how your store is built. Stores with high AOV are not lucky — they have deliberately designed four moments in the journey to make spending slightly more the natural thing to do. Pick the moment that leaks the most, fix it properly, measure gross profit per session, and then move to the next one. ### FAQ **What is a good average order value for a Shopify store?** There is no universal benchmark because AOV is a function of your price point. The number that matters is your own trend line and your AOV relative to blended customer acquisition cost. A store with a $40 AOV and a $12 CAC is far healthier than one with a $180 AOV and a $150 CAC. Track the ratio, not the absolute. **How quickly can I increase average order value?** A free shipping progress bar or a quantity break can be live in under an hour and will usually show a measurable effect within two weeks at moderate order volume. Deeper work — bundle architecture, personalised recommendations, post-purchase flows — takes a quarter to tune properly but has a much higher ceiling. **Does increasing AOV hurt conversion rate?** It can, if you add friction. Upsells that interrupt browsing, popups on a timer and aggressive cross-sell grids on the product page all cost conversions. Offers placed after commitment — in the cart, at add-to-cart, or post-purchase — almost never do. Always watch both numbers together. **What is the difference between AOV and average basket size?** Average order value is revenue divided by orders. Average basket size usually means units per order. They move together but not always: a quantity break raises both, while an accessory upsell raises AOV more than units, and a bundle discount can raise units while flattening AOV. **Should I raise prices instead?** Do both, but they are different instruments. A price rise applies to everyone and risks conversion across the board. AOV work is opt-in — only the shoppers who want more spend more — so it carries far less downside risk while producing a similar revenue effect. ## How to Set a Free Shipping Threshold That Increases Profit, Not Just AOV URL: https://ninety9.dev/blog/free-shipping-threshold-calculator.html Published: 2026-08-11 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 5 minutes The percentile method for choosing a threshold, the margin check that stops it losing money, and why per-country thresholds beat one global number. The free shipping threshold is the most common average-order-value tactic in ecommerce and one of the most commonly mis-set. Most stores pick a round number that feels close to their average order value, publish it, and never revisit it. That approach has a specific failure mode: a threshold set at or below your average order value is cleared by roughly half your orders without anyone changing behaviour. You have not created incremental revenue. You have given away shipping on half your orders. Here is the method that avoids that. ## Free shipping is a goal, not a discount The mechanism is worth understanding because it explains why the number matters so much. A shipping fee is a cost the shopper weighs against convenience. A free shipping threshold is a *target* they can hit. Those are different psychological objects. The first invites a comparison; the second invites an action. The effect is well documented and reliably reproducible: shoppers who are shown a specific remaining amount to reach free shipping add items at a materially higher rate than shoppers shown the same policy stated as a rule. It works even when the fee being avoided is small, because the shopper is no longer evaluating $6.90 against convenience — they are completing a task. That reframing only happens if the target is *reachable but not already met*. Which is entirely a function of where you set it. ## Step 1: Get the distribution, not the average Export the last 90 days of orders and their values. Sort them. Then find the percentiles. A typical store might look like this: | Percentile | Order value | |---|---| | 25th | $28 | | 50th (median) | $46 | | 60th | $54 | | 70th | $63 | | 75th | $71 | | 90th | $104 | | Average | $58 | Notice that the average ($58) sits between the 60th and 70th percentile — which is normal, because order value distributions have a long right tail that drags the mean above the median. Setting the threshold at $58 means roughly 38% of orders already clear it. Those customers get free shipping for doing what they were already doing. ## Step 2: Pick from the 60th–75th band Your candidate threshold sits between the 60th and 75th percentile. In the table above, that is $54 to $71. The reasoning: - **Below the 60th** — too many orders already clear it. High subsidy, low behaviour change. - **Above the 75th** — the gap between a typical basket and the threshold is large enough that shoppers disengage from the goal entirely. An unreachable target is not a target. - **Inside the band** — a meaningful group of shoppers sits close but not there. Those are the orders you can move. Within the band, lean lower if your margin is thin or your category is price-sensitive, and higher if your margin is healthy and your products have natural complements. ## Step 3: Run the margin check This is the step that gets skipped, and it is the one that determines whether the threshold makes money. > Gross profit on the incremental spend must exceed your average shipping cost. Say you choose $65 with a median order value of $46. The average shopper you move up spends an extra $19. At a 55% gross margin, that is $10.45 of additional gross profit. If your average shipping cost is $7.20, you net $3.25 per moved order. If your average shipping cost were $12, the same threshold loses $1.55 on every order it moves. You would need a threshold of at least $46 + ($12 ÷ 0.55) ≈ $68 just to break even, and higher to make anything. `threshold ≥ median order value + (average shipping cost ÷ gross margin)` Run this before anything else. If the result lands above your 75th percentile, free shipping thresholds are not the right tactic for your category — a flat reduced shipping rate usually works better. ## Step 4: Round it $68.42 is not a goal, it is an output. $70 is a goal. Round numbers work better because they are easier to hold in mind and easier to calculate against. "I need $14 more" is a manageable thought. "I need $12.42 more" is arithmetic. Round up rather than down when you have the margin room. The gap in behaviour between $65 and $70 is small; the gap in your economics is not. ## Step 5: Split it by market One global threshold is wrong in most markets, because both sides of the margin equation change at the border. Your shipping cost to a neighbouring country is not your domestic cost. Your order value distribution in a market where you are unknown is not the distribution in your home market. A threshold derived from domestic data and converted at the spot rate encodes neither. Do the whole exercise per market for your top three or four, and use a sensible default elsewhere. And set each one as a round number in the local currency rather than converting — €70, not €68.42. ## Step 6: Make it visible A threshold nobody can see their progress against is just a policy on a page. The progress bar is what turns it into a goal, and the specific thing that makes it work is showing the *remaining amount* rather than the target: - **"Free shipping over $70"** — a rule. It is about you. - **"You're $14 away from free shipping"** — a task. It is about them. The second consistently outperforms the first. Show it in the cart drawer first, the cart page second, and consider the product page third. ## Common mistakes **Setting it at the average.** Covered above, and it is the most common error by a distance. **Never revisiting it.** Carrier rates change. Your catalogue prices change. Your order mix changes with every campaign. A threshold set eighteen months ago is a threshold set for a different business. **One threshold across wildly different products.** If you sell both $15 accessories and $400 machines, a single threshold is meaningless for one of them. Consider a collection-scoped threshold. **Excluding half the catalogue without saying so.** A threshold that quietly does not apply to bulky items generates more support tickets than revenue. If there are exclusions, state them in the same sentence as the offer. **Not stacking a second goal.** A shopper who lands at $71 on a $70 threshold has no further reason to add anything. A second tier — an order discount or a free gift at a higher value — keeps the mechanic working across the upper half of your distribution. Does your threshold measure against the pre-discount or post-discount subtotal? Post-discount is the safer default. Pre-discount means a customer with a 30% code can trigger free shipping on a basket whose real value is well below your floor. ## Measuring whether it worked Do not use average order value on its own — a threshold mechanically raises AOV whether or not it made money. Track: - **Share of orders above the threshold**, before and after. This is the behaviour change. - **Median order value**, which is less distorted by outliers than the mean. - **Shipping cost as a percentage of revenue.** The direct cost of the policy. - **Gross profit per order.** The verdict. - **Cart-to-checkout rate.** The guardrail. A threshold that is too high can suppress conversion among shoppers who conclude they will never reach it. Give it four weeks minimum. Compare against the same period rather than the previous month if your category has any seasonality at all. ### FAQ **What should my free shipping threshold be?** Somewhere between the 60th and 75th percentile of your order value distribution over the last ninety days, subject to a margin check. There is no universal number because it depends entirely on the shape of your distribution and your fulfilment cost, both of which are specific to your store. **Is free shipping actually worth offering?** For most consumer categories, yes, because shipping cost is the most commonly cited reason for cart abandonment and a threshold converts that objection into a goal. It stops being worth it when your shipping cost is high relative to your order value and margin, which is common for heavy or bulky goods. **Should the threshold be a round number?** Yes. Round numbers work better as goals because they are easier to hold in mind and easier to calculate against. A threshold produced by currency conversion, such as sixty-eight euros, reads as arbitrary. Round it. **How often should I review the threshold?** Quarterly at minimum, and immediately after any carrier rate change or significant catalogue price change. Both sides of the calculation drift, and a threshold set eighteen months ago is almost certainly no longer optimal. **Does a free shipping threshold work without a progress bar?** Much less well. A threshold nobody can see their progress against is just a policy. The bar is what converts it into an active goal, because it shows the shopper a personal, incomplete task with a specific remaining amount. ## Post-Purchase Order Editing on Shopify — The Complete Guide URL: https://ninety9.dev/blog/shopify-order-editing-guide.html Published: 2026-08-08 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 6 minutes What customers actually want to change after checkout, which edits are safe to allow, the rules you need around them, and why the edit screen is a revenue surface. There is a window in every order between "payment confirmed" and "parcel dispatched". For most stores it lasts somewhere between a few hours and a couple of days, and almost nothing happens in it. It is, in practice, the most operationally expensive window in the whole customer journey. It is where address corrections arrive, where "can I change the size" emails land, where cancellations are requested, and where a customer's minor mistake turns into a return you will pay for twice. It is also, if you build for it, a revenue surface. ## What customers actually want to change The distribution is consistent across categories: | Request | Share of post-purchase contacts | Safe to self-serve? | |---|---|---| | Change shipping address | Largest single category | Yes, before fulfilment | | Change size or variant | Large | Yes, same product | | Change quantity | Moderate | Yes, with rules | | Add an item | Moderate | Yes — and profitable | | Remove an item | Moderate | With rules | | Cancel entirely | Moderate | Deflect first | | Change shipping method | Smaller | With rules | | Update contact details | Smaller | Yes | The top four are the bulk of the volume, and all four are safe to automate before fulfilment. That is the case for building this: a majority of your post-purchase support load is a form. ## Why Shopify does not do this natively Shopify lets a merchant edit orders from the admin. It does not provide a customer-facing self-service interface for the same operations. That is a defensible product decision — order editing touches inventory, payment authorisation, fulfilment status, tax calculation and discount logic all at once, and getting it wrong creates real financial mess. But it means the gap is filled by support staff doing manual admin work, which is the most expensive possible way to handle a high-volume, low-complexity request. A customer emails about an address change. Support reads it, opens the admin, finds the order, checks fulfilment status, edits the address, replies. Call it six to eight minutes end to end, plus the customer waiting hours for a reply and possibly emailing again in the meantime. Multiply by the share of orders that need it. ## Edits ranked by risk ### Low risk — enable by default **Shipping address.** Highest volume, lowest risk before a label is printed. The only real consideration is whether the new address changes the shipping zone or rate; if it does, either recalculate or restrict cross-zone changes. **Variant swap within the same product.** Size or colour changes at the same price are a stock movement and nothing else. Check availability of the target variant, release the original. **Contact details.** No commercial implications at all. **Adding items.** Genuinely profitable, and the reason this whole feature has an ROI beyond cost saving. Requires collecting additional payment, which Shopify supports through order editing. ### Medium risk — enable with rules **Quantity increase.** Straightforward, needs a stock check and additional payment. **Quantity decrease.** Needs a rule for what happens to threshold-based rewards. If the order drops below the free shipping threshold, do you charge shipping retroactively? Usually not worth the friction — but decide it explicitly. **Removing an item.** Same threshold question, plus the bundle question: if the removed item was part of a discounted set, does the discount survive? It should not, and the recalculation needs to be visible to the customer before they confirm. **Shipping method change.** Fine if it is an upgrade the customer pays for. Downgrades after the fact are usually not worth allowing. ### High risk — restrict or handle manually **Cross-product swaps.** Different product entirely, different price, different tax treatment. Effectively a cancel-and-reorder, and cleaner to handle that way. **Currency or market changes.** Do not allow. The order was placed under a specific market's pricing, tax and duty configuration. **Anything after fulfilment.** The window must close. ## The window must close at fulfilment This is the single most important rule. Before fulfilment, an edit is a database change. After fulfilment, it is a warehouse operation — retrieving a picked order, voiding a label, repacking, re-dispatching — or, worse, an intercept request to a carrier. Closing the window automatically at fulfilment is what keeps this feature cheap. It should not be a policy that support enforces; it should be a state the interface reflects. When an order is fulfilled, the edit options simply are not there. For stores with same-day dispatch this window can be very short. That is fine — a two-hour window still catches a large share of the mistakes, because most people notice a wrong address within minutes of receiving the confirmation email. ## Rules worth having Self-service does not mean unrestricted. The controls that matter: - **By fulfilment status.** The hard gate. - **By time since order.** A secondary limit for stores with slow fulfilment, so an order placed three weeks ago is not still editable. - **By country.** Some markets have customs or duty implications that make address changes genuinely risky. - **By customer tag.** Wholesale and B2B accounts often need different rules — or no self-service at all. - **By order value.** High-value orders may warrant a manual review step. - **By edit type.** Allow address changes everywhere, restrict item swaps to domestic orders only, and so on. ## The edit screen as a revenue surface Here is the part that turns a cost-saving feature into a growth one. Think about who is on that page. Someone who has already paid. Someone who is engaged enough to have come back and taken a deliberate action. Someone whose order has not shipped, which means adding an item costs you nothing extra in fulfilment — it goes in the same box. That is a better prospect than almost any visitor on your storefront, and they are on a page you fully control. What works there: - **"Forgot something?"** with recommendations based on what they ordered. The framing is helpful rather than salesy, and it is true. - **Recently viewed items** from before the purchase. They looked and did not buy; this is a second chance with zero friction. - **Free shipping top-up**, if the order is below a threshold and they are now adding items anyway. - **Replenishment suggestions** for consumables they have bought before. The conversion rates on this surface are unusually high, for the simple reason that every friction point normally standing between a shopper and an additional purchase has already been cleared. The upsell must be secondary to the task. A customer who came to fix their address and cannot find the address field because the page leads with product recommendations will write to support anyway - and you will have paid for the feature without getting the benefit. ## Cancellation deflection A specific and valuable case. When a customer starts a cancellation, you have one interaction to understand why and offer an alternative. The sequence that works: 1. **Ask the reason.** A short list — changed my mind, wrong item, found it cheaper, taking too long, ordered by mistake. 2. **Respond to the reason.** Wrong item → offer the edit flow instead. Taking too long → show the actual delivery estimate. Changed my mind → offer an incentive. 3. **Make cancelling easy if they still want to.** A deflection flow that traps people produces chargebacks and reviews, which cost more than the order. A saved order is worth substantially more than a refunded one, and a reason code is worth having regardless of the outcome. Over a few months, the reason distribution is one of the most useful datasets in the business. ## Rollout 1. **Address changes only**, before fulfilment. Measure the drop in support contacts. 2. **Add variant swaps** within the same product. 3. **Add quantity changes** with a threshold rule. 4. **Add the item-adding flow** with recommendations. This is where revenue starts. 5. **Add cancellation deflection** with reason capture. 6. **Layer in rules** by country, tag and order value once the base flows are stable. Do not build all six at once. The first step alone typically removes a large fraction of post-purchase support volume, and it is the one with essentially no downside. ## Measuring it - **Post-purchase support contacts per 100 orders**, before and after. The primary cost metric. - **Self-service edit rate** — orders edited by the customer ÷ orders eligible. - **Cancellation rate**, and the deflection rate within it. - **Return rate for avoidable reasons** — wrong size, wrong item, wrong address. This is the slow one; expect it to move over a quarter rather than a month. - **Revenue per edit session.** The upside metric. - **Fulfilment exceptions caused by edits.** The guardrail. If warehouse errors rise after launch, the window is closing too late. ### FAQ **Can customers edit their Shopify order after checkout?** Not natively in a self-service way. Shopify lets merchants edit orders from the admin, but there is no built-in customer-facing interface for changing an address, swapping a variant or adjusting quantities. That gap is why most stores handle these requests manually through support. **What order edits are safe to allow?** Shipping address, item quantity, variant swap within the same product and adding items are all safe before fulfilment because none of them change the fundamental commercial terms. Removing items and changing shipping method need rules attached because both can affect thresholds and margin. **When should the edit window close?** At fulfilment. Once a label is printed or an item is picked, an edit stops being a database change and becomes a warehouse operation. Closing the window automatically at that point is what keeps the feature cheap to run. **Does order editing reduce support tickets?** Substantially. Address changes and wrong-variant corrections are among the highest-volume post-purchase contacts for most stores, and both are entirely self-serviceable. Stores that enable self-service editing typically see a marked drop in post-purchase contact volume within weeks. **Can order editing reduce returns?** Yes, for the category of returns that begin as a mistake at checkout rather than a problem with the product. A customer who ordered the wrong size and can fix it before dispatch never generates a return, which removes the outbound shipping, the return shipping, the restocking and the refund processing. ## The Shopify Cart Drawer Guide — Design, Speed and Upsells That Convert URL: https://ninety9.dev/blog/shopify-cart-drawer-complete-guide.html Published: 2026-08-04 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 6 minutes What separates a cart drawer that sells from one that just lists items — layout order, the six blocks that matter, performance rules and the upsells worth adding. Most Shopify themes ship with a cart drawer that does exactly one thing: it lists what the shopper added. It is a receipt with a checkout button attached. That is a strange design decision when you consider who is looking at it. Someone who has opened their cart has already decided to buy. They are past every objection that costs you conversions on the product page. They are, in that moment, the most valuable visitor on your site — and you are showing them a list. This guide covers what to put in that space instead, in what order, and where the limits are. ## Why a drawer beats a cart page The argument for a slide-out drawer over a dedicated `/cart` page comes down to a single word: continuity. When a shopper clicks "add to cart" on a product page and the site navigates them to a cart page, three things happen. They lose the product they were looking at. They lose their scroll position in the collection. And they land on a page whose only forward action is "checkout" — which means the natural next move is to leave your catalogue entirely. A drawer keeps all of that context. The product page is still behind the overlay. Closing the drawer returns them exactly where they were. Adding a second item costs one click instead of a full navigation cycle. The exception worth naming: if your carts routinely run to fifteen line items, or your products need per-item configuration, or you sell B2B quantities, a full cart page has room a drawer does not. Everyone else should be using a drawer. ## The six blocks that matter, in order The order is not cosmetic. Each block sets up the one below it. ### 1. The progress bar, at the very top The first thing a shopper should see is not what they have — it is what they are close to getting. A progress bar showing "$18 away from free shipping" reframes the entire drawer from a summary into a task. Put it above the line items. Below them it reads as a footnote; above them it reads as an instruction. ### 2. Line items with variant clarity Image, title, variant, quantity stepper, price, remove. The failure mode here is ambiguity about which variant is in the cart. "Blue / Large" needs to be visible without hovering, because a shopper who is unsure will open a new tab to check, and that tab is where sessions go to die. Quantity should be a stepper, not a text input. Steppers get used; text inputs get ignored. ### 3. One upsell block Not a carousel of twelve. One block, showing one or two products, chosen from what is already in the cart. The single biggest determinant of whether this converts is relevance, and the only reliable source of relevance is your own order history. Category-based suggestions produce the classic failure — recommending a second pair of the same shoes to someone who just added shoes. ### 4. The delivery estimate "Arrives 22–24 August" removes the largest remaining unknown before checkout. It costs you nothing, it is trivially true if your fulfilment is predictable, and it consistently reduces the number of shoppers who close the drawer to go and look for your shipping policy page. ### 5. Trust and reassurance Returns window, secure payment, support availability. Small, quiet, below the fold of the drawer. This block exists to answer objections, not to shout. ### 6. Checkout, sticky The checkout button should be pinned to the bottom of the drawer and visible regardless of scroll position. Show the subtotal on or immediately above it. If you accept express checkout methods, they belong here too — but below the main button, not above it, because express buttons that dominate the drawer cannibalise the shoppers who would have added one more item. Screenshot your cart drawer and remove the product images. If you cannot tell within two seconds what the shopper should do next, the hierarchy is wrong. ## Upsells that work in a cart drawer Not every offer type belongs here. The cart is a *confirmation* surface, and offers that ask the shopper to reconsider their choice will kill momentum. | Offer type | Works in cart? | Why | |---|---|---| | Complementary accessory | Yes | Additive, cheap relative to the anchor, no reconsideration required | | Quantity break on an item already in cart | Yes | Pure upgrade, zero new decisions | | Free gift threshold | Yes | Reward framing, no cost to the shopper | | Shipping protection add-on | Yes, if unticked | Genuinely useful, near-zero COGS | | Alternative to a cart item | No | Forces reconsideration of a decision already made | | Unrelated bestseller | No | Reads as noise, dilutes the relevant offer | | Email capture | No | Wrong moment entirely; you are about to get their email at checkout | The price relationship matters. An accessory priced at 15–40% of the anchor product converts well. At 80% of the anchor it reads as a second purchase decision, and the shopper defers it. ## Personalising by market and segment A single cart drawer for every shopper is a compromise you no longer have to make. The obvious axis is geography. A free shipping threshold of $75 is aggressive in one market and trivially easy in another. A delivery estimate of "2–3 days" is a lie outside your domestic zone. Both should change with Shopify Markets. The less obvious axis is customer segment. A first-time visitor and a customer with four previous orders should not see the same cart: - **First-timers** benefit from trust blocks, returns policy and a lower-friction first goal. - **Repeat customers** already trust you. Give that space to a higher reward tier or a replenishment suggestion instead. - **Wholesale or tagged accounts** should not see consumer discount mechanics at all. The most granular version of this is block-level targeting — the drawer stays the same but individual blocks appear or hide based on conditions. That is usually more maintainable than building five separate carts. ## Performance rules A cart drawer that costs you 300ms of Largest Contentful Paint has to earn that back before it breaks even, and it usually does not. Three rules keep it honest: 1. **Render on open, not on load.** The drawer markup does not need to exist until the shopper asks for it. Nothing in a closed drawer should be in the critical rendering path. 2. **Install as a theme app extension.** No `theme.liquid` injection. This is also what makes uninstalling clean — no orphaned script tags left behind in six months. 3. **Measure before and after.** Run PageSpeed Insights on a product page before install and after. If LCP moved by more than a rounding error, something is loading that should not be. Several popular cart apps load their entire configuration payload — every block, every rule, every translation — on first page load rather than on drawer open. It works fine on your laptop and badly on a mid-range Android phone on 4G, which is most of your traffic. ## A realistic setup order If you are building this from scratch, do it in this sequence and measure between each step: 1. Drawer with clean line items and a sticky checkout button. Baseline. 2. Add the free shipping progress bar with a threshold set from your actual order distribution. 3. Add the delivery estimate. 4. Add one upsell block with pairs drawn from real order history. 5. Add trust blocks and reassurance copy. 6. Only then: market targeting, segment rules and a second reward tier. Steps two and four are where most of the money is. Steps one and three are where most of the conversion-rate protection is. ## What to measure Cart-level metrics are more useful than store-level ones here, because they isolate the surface you changed: - **Cart-to-checkout rate** — did the drawer make it easier or harder to proceed? - **Units per order** — did the upsell block actually add items? - **Average order value** — the headline, but not on its own. - **Gross profit per session** — the honest number, after discounts and shipping cost. - **Upsell take rate** — offers accepted ÷ offers shown, per block. If cart-to-checkout drops while AOV rises, you have added friction and traded conversions for basket size. Sometimes that trade is profitable. Check, do not assume. ### FAQ **Is a cart drawer better than a cart page?** For almost all stores, yes. A drawer keeps the shopper on the page they were already engaged with, so adding one more item does not require a round trip. The exception is high-consideration carts with many line items, configuration options or B2B quantities, where a full page has room the drawer does not. **Will a cart drawer app slow my store down?** It should not. A well-built drawer loads asynchronously, renders only when opened, and never blocks the initial paint. Check that any app you install ships as a theme app extension rather than injecting a script into theme.liquid, and confirm your Largest Contentful Paint is unchanged before and after install. **How many upsells should a cart drawer show?** One or two. Every additional offer dilutes attention and lowers the take rate of the others. If you have more than two things worth suggesting, that is a signal your recommendation logic needs to be better, not that you need more slots. **Should the cart drawer open automatically after add to cart?** Yes, in most cases. Auto-opening confirms the action, removes any doubt that the item was added, and puts your progress bar and upsells in front of a shopper at their highest point of intent. The exception is stores where shoppers routinely add many items in a row from a collection page. **Do I need to edit my theme to add a cart drawer?** Not with a modern app. Theme app extensions install as blocks in the theme editor with no code changes, which means the drawer can be enabled and disabled from the admin and uninstalls cleanly with nothing left behind in your Liquid files. ## Exit-Intent Popups on Shopify — The Honest Guide to What Actually Works URL: https://ninety9.dev/blog/exit-intent-popups-shopify.html Published: 2026-07-28 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 5 minutes How exit detection really works on desktop and mobile, which offers convert on the way out, and why an exit popup is the only popup that cannot cost you a conversion. Popups have earned their reputation. The five-second timer that covers a page you have just started reading is a genuinely bad piece of interface design and everyone involved knows it. Exit intent is a different thing, and the difference is structural rather than cosmetic. A timed popup interrupts someone who is still deciding. An exit popup appears in front of someone who has already decided to leave. There is no conversion left to lose. That single property is why exit intent is worth doing properly while most other popup triggers are worth deleting. ## How exit detection actually works It is worth understanding the mechanism, because the mechanism explains the limits. ### Desktop The browser exposes cursor coordinates continuously. Exit-intent code tracks position over time and looks for a specific pattern: rapid upward movement toward the top edge of the viewport, where the address bar, tab strip, back button and close button all live. When velocity toward that edge crosses a threshold, the code fires. Typical implementations also require the pointer to actually leave the viewport bounds, which reduces false positives from someone reaching for a bookmark. It is a heuristic, not a certainty. Someone reaching for their coffee will occasionally trigger it. That is acceptable, because the cost of a false positive is low and the popup is dismissible. ### Mobile There is no cursor, so there is no equivalent signal. Mobile implementations fall back on: - **Back-navigation intent** — intercepting the history back gesture. The strongest available mobile signal. - **Rapid upward scroll** — weak, because it also describes someone scanning a page. - **Inactivity** — weakest. Someone who stopped scrolling might be reading. The honest position: mobile exit intent is a much blunter instrument. Back-navigation is usable; the other two produce enough false positives that they stop being exit intent and become interruptions with extra steps. Hijacking the back gesture is intrusive and can trap users, which some browsers actively penalise. If you use it, the popup must be immediately and obviously dismissible, and a second back press must always leave. ## Placement decides the offer The most common mistake is running one exit popup site-wide. The visitor's location tells you why they are leaving, and the offer should answer that reason. | Page | Likely reason for leaving | Offer that fits | |---|---|---| | Cart | Shipping cost, total, delivery uncertainty | Free shipping threshold reminder, delivery estimate, small discount | | Checkout start | Price, payment friction, second thoughts | Reassurance, payment options, support access | | Product page | Not convinced, comparison shopping | Related product, size guide, reviews, bundle | | Collection page | Browsing, no intent yet | Usually nothing. Do not fire here | | Blog or content | Reading, not shopping | Content offer at most | The last two rows matter. A visitor leaving a collection page after twenty seconds is not abandoning a purchase — they are browsing. Firing a discount at them costs margin and gains nothing, and it is the behaviour that gave popups their reputation. ## Offers ranked by what they cost you Discounts are the default and the most expensive option. Try the cheaper ones first. ### 1. The threshold reminder (free) "You're $12 from free shipping." If the visitor is leaving a cart that is close to a threshold, telling them so is often enough. Costs nothing and addresses one of the most common abandonment reasons directly. ### 2. The delivery reassurance (free) "Order today, arrives Tuesday 26 August." Answers the question they may have been leaving to go and find. ### 3. The cart save (free) "Save your cart — we'll email you a link." Converts an abandonment into a re-engagement opportunity, and captures an email address as a side effect rather than as the ask. ### 4. The related recommendation (free) Particularly effective on product pages. The visitor may be leaving because this specific item is not right, not because your store is wrong. ### 5. The bundle offer (costs the bundle discount) "Add the matching item and save 15%." Gives a reason to stay that is about value rather than about price. ### 6. The discount (costs the discount) Effective, and the one to use last. Reserve it for high-value carts or first-time visitors where the lifetime value case is strong. If you always offer a discount at exit, returning customers learn to trigger it deliberately. Within a few months you have not built a retention tactic, you have published a permanent price reduction with an extra step. Vary the offer, cap the frequency, and segment by customer history. ## Design rules Exit popups have a short attention window. Every element must earn its place. - **One offer, one action.** Two competing choices measurably reduce conversion. The secondary action should be "no thanks", not a second offer. - **A visible, generously sized close control.** A tiny grey X in a corner is a dark pattern and it will end up in a review. - **No second popup.** If they dismiss it, they leave. Accept that. - **Frequency capping.** Once per session, and no more than once per visitor per week. - **Suppress for converters.** A customer who has purchased in this session should never see an exit offer. - **Keep it fast.** The popup must render immediately. A slow popup fires after the visitor has already gone. - **Make it accessible.** Focus trap while open, `Escape` closes it, focus returns to where it was. This is not optional. ## The legal side Exit popups intersect with a few rules that are worth knowing before you launch. - **Email capture requires consent handling.** If you collect an address, GDPR applies: clear purpose, no pre-ticked boxes, and a real unsubscribe. - **Discount terms must be honest.** A code that expires in ten minutes must actually expire in ten minutes. A countdown that resets on refresh is a false statement about your commercial terms. - **Accessibility is a legal requirement** in a growing number of jurisdictions. A modal that cannot be dismissed with a keyboard is an accessibility failure with legal exposure attached. ## Measuring properly Exit popups have a measurement trap: the denominator is not your traffic, it is your *exiting* traffic. Judging them against site-wide conversion makes them look worse than they are. Track: - **Fire rate** — popups shown ÷ sessions. Unusually high suggests false positives. - **Engagement rate** — interactions ÷ shown. - **Recovery rate** — sessions that converted after seeing the popup ÷ sessions shown. The headline number. - **Discount cost per recovered order**, if you are offering one. - **Repeat trigger rate** — the share of visitors seeing it more than once. Rising means habituation is starting. - **Return visit rate** for shoppers who saw and dismissed it. The brand-damage guardrail. If people who see your exit popup come back less often than those who do not, the popup is costing more than it earns. That last metric is the one nobody measures and the one that decides whether the tactic is sustainable. ## A sensible starting configuration - Cart page and checkout-start only. Nothing on collection or blog pages. - Desktop cursor-velocity trigger; mobile back-navigation only. - First offer: a free shipping gap reminder or a delivery estimate — no discount. - Frequency cap: once per session, once per week per visitor. - Suppressed entirely for anyone who has already purchased in the session. Run that for a month. Only add a discount tier if the free offers are not recovering enough, and only for carts above a value where the discount is clearly worth paying. ### FAQ **How does exit-intent detection work?** On desktop it tracks cursor position and velocity, firing when the pointer moves rapidly toward the top edge of the viewport where the address bar and tab controls sit. On mobile there is no cursor, so implementations fall back on back-button navigation, rapid upward scrolling or a period of inactivity, all of which are weaker signals. **Do exit-intent popups hurt conversion rate?** They are the one popup type that structurally cannot, because they only fire on visitors who have already signalled departure. The risk is not conversion loss but brand damage from a poorly targeted or aggressive popup, and from firing repeatedly at the same visitor. **What offer works best in an exit popup?** It depends on where the visitor is. On a cart page, address the likely reason for leaving - shipping cost, delivery uncertainty or price. On a product page, a related recommendation or a reminder often outperforms a discount. A discount is the most expensive option and should not be the default. **Should exit popups offer a discount every time?** No. Habitual discounting at exit teaches returning visitors to trigger the popup deliberately, which converts a retention tactic into a permanent margin reduction. Reserve discounts for high-value carts or first-time visitors, and use non-discount offers elsewhere. **Do exit-intent popups work on mobile?** Less reliably, because the signals are weaker. Back-navigation intent is the most usable trigger. Scroll-based and inactivity-based triggers produce more false positives, which means interrupting people who were not leaving - exactly the failure mode exit intent is supposed to avoid. ## Partial Refunds vs Order Edits — Fix the Shopify Order Instead of Unwinding It URL: https://ninety9.dev/blog/partial-refunds-vs-order-edits.html Published: 2026-07-25 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 1 minutes When to let a customer add, swap or remove a line after checkout, and when a partial refund is the cleaner (and cheaper) path. A partial refund is an unwind. An order edit is a correction. Customers ask for both using the same words ("I need to change my order"). Your job is to pick the path that matches whether the box still exists. ## Before fulfilment: edit They paid for A and meant B. Swap the line, adjust the payment, keep the order ID. They paid for one and want two. Add the line, capture the difference, one shipment. This is cheaper than refunding and asking them to reorder: they might not reorder, and you have created a second chance to lose them at checkout. ## After fulfilment: refund or return The inventory is in a van. You cannot "edit" it without intercepting a carrier, which you will not do for a $12 SKU. Offer a return, a partial refund if the item is missing from the box, or a new order for what they now want. Language matters. Do not call that a cancel. Do not call it an edit. Call it what the warehouse can do. ## Removal vs refund If they drop a line before pick, restock it and adjust the capture. A refund issued while the line stays on the order will ship unless someone remembers. That is how you pay to send a thing you already refunded. ## One playbook for the team Write three rows: window open / in fulfilment / shipped. For each, the allowed action. If live chat and the self-serve portal disagree, customers will use both and you will double-process. Fixing an order is almost always better than unwinding it. The skill is knowing when the order is still there to fix. ### FAQ **Is an order edit better than a partial refund?** Before fulfilment, usually yes — one order, one payment adjustment, one shipment. After fulfilment, a partial refund or return matches reality. **What if they want a cheaper variant?** Swap the line if stock exists and the window is open; capture or refund the difference. Do not leave both variants on the order and refund by hand. **Can they add a product after paying?** Yes, if you can charge the difference and the warehouse can still add it to the same shipment. If the order is already picked, send a second order instead of pretending it is one box. **Do refunds hurt more than edits in analytics?** Refunds show up as returns and can distort merchandising. Edits keep the sale. That is a reporting reason as well as an ops reason to edit while you still can. ## Put the Order-Edit Link in the Shopify Confirmation Email URL: https://ninety9.dev/blog/post-purchase-email-edit-link.html Published: 2026-07-24 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 1 minutes Where to place a self-serve edit link after checkout, the copy that gets used, and the mistakes that send people to support anyway. You built a portal. Nobody opened it. That is usually because the only door was a sentence in a help centre article. The order confirmation is already in the inbox, already about this order, already trusted. That is where the door goes. ## One button, one job "Need to change your address, add an item, or update the delivery note? Change this order." One URL. The portal can still have separate screens inside. The email should not look like a sitemap. Place it above the fold of the email, after the order summary, before the footer legal. People scan. A link in the footer next to "unsubscribe" is not a feature. ## Order status page too Not everyone opens email on the device they will use to type a new address. The Shopify order status page is the other place they already go. Same link, same cut-off behaviour. ## After cut-off Swap the button for a line: "We've started packing this order, so the details are locked. Questions? Reply to this email." A 500 from an expired token is an engineering bug that presents as a broken store. ## Guest checkout If the portal requires a login and they bought as a guest, you have created a ticket. Use the same customer-access token model Shopify uses for order status. Anything else is friction you will pay for in chat. Transactional email is not a newsletter. Put the operational link in it and get out of the way. ### FAQ **Can I add this without a developer?** If your edit app provides a customer link per order, you can usually drop it into the notification template. Test with a real order, not the Shopify preview dummy, because the URL is order-specific. **Won't this increase edits?** Yes. That is the point. Edits in a portal are cheaper than edits in a ticket. If volume scares you, tighten the rules, do not hide the link. **Should SMS get the same link?** If you send shipping SMS, a short "Need to change something? [link]" is useful. Do not add a second marketing SMS just for the portal. **What about customers who checkout as guest?** The link must work with the order-status token Shopify already emails them. Requiring an account for a guest order sends them to support. ## How to Write a Shopify Cancellation Policy Customers Will Use Instead of Chargebacks URL: https://ninety9.dev/blog/writing-a-cancellation-policy.html Published: 2026-07-23 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 1 minutes Clear cut-offs, what happens to payment, and the in-flow offer that turns a cancel into a keep — without making people feel trapped. People cancel for boring reasons: ordered two by accident, found it cheaper, the gift is no longer needed. A policy that cannot handle boring reasons pushes those people into the card issuer. Chargebacks cost more than a cancelled order. Write the policy for the warehouse you have, then put it where the click happens. ## Match the words to the box If you can stop the order before it is picked, say "You can cancel until we start packing." If you cannot, say "Once we ship, use returns." Do not say "cancel anytime" unless you mean it for every SKU, including custom print. ## Put it in the flow Footer legal pages are for lawyers. The customer needs one paragraph in the confirmation email and the same paragraph at the top of the cancel screen. If the portal and the policy page disagree, the portal wins in their memory and you lose the dispute. ## The keep offer When they start a cancel, you may offer a reason to keep the order: a small discount, a free add-on, a delayed delivery date. One offer, easy decline, then cancel completes. Two extra screens, a survey, and a buried confirm are how you get the 1-star review that says you would not let them leave. ## After it has shipped The button should not say Cancel. It should say Start a return, or Contact us, depending on your setup. Language that promises a cancel on a moving parcel is how you get a refund and a delivery. A good cancellation policy is short, operationally true, and sitting on the button. Everything else is decoration. ### FAQ **Should cancellations be instant?** Before fulfilment, yes — instant and self-serve. After fulfilment, a cancel is a return. Pretending otherwise creates double inventory and carrier chaos. **Is a keep-offer in the cancel flow a dark pattern?** Not if skip is easy and the offer is real. It is a dark pattern if the cancel button is hidden, delayed, or labelled "continue". **Will a stricter policy increase chargebacks?** A stricter policy that you hide will. A clear policy that matches what you can actually do usually reduces them, because people know the rules before they pay. **What about subscriptions?** Say when the next charge stops, whether the current shipment still goes out, and how to skip instead of cancel. Subscription cancel is a different product than one-time order cancel. ## Order Edit Cut-Off Windows — Set a Deadline Before Fulfilment Starts URL: https://ninety9.dev/blog/order-edit-cutoff-windows.html Published: 2026-07-22 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 1 minutes How long to allow self-serve Shopify order edits, how to talk about the window in emails, and what to do when the warehouse has already picked the order. An edit window is an operations contract. Marketing did not invent it; the warehouse did. The stores that get this wrong either close edits too early (tickets) or leave them open too long (boxes that have to be ripped open). ## Bind the window to fulfilment status "You can change this order until we start packing it" is a sentence a warehouse can keep. "You have 24 hours" is a sentence that breaks the first time you offer same-day dispatch. If Shopify (or your 3PL) marks an order as in fulfilment, the self-serve door closes. Everything else is a support conversation. ## Buffer time Pickers need a few minutes of certainty. If the portal allows an address change while someone is walking to the shelf, you will ship to the old address and refund the ticket. A 30–90 minute pre-pick buffer is cheaper than that. ## Tell them once, in the right places Confirmation email: "Need to change the address or add an item? You can do that here until we ship." Order status page: the same link, plus a disabled state after cut-off with a reason ("We've started packing this one — email us if it's urgent"). Silence is how you get "I didn't know I could change it" and "I didn't know I couldn't". ## After the door closes Do not leave a form that submits into a void. Show the closed state and the next best action: a new order, a return once it arrives, or a support email for genuine emergencies. A 404 on the edit link after cut-off is a bug. The window is not a growth hack. It is how self-serve stays true. ### FAQ **How many hours should the window be?** As long as fulfilment has not started, plus a buffer your warehouse actually needs (often 30–90 minutes before pick). A fake "24 hours" that you cannot honour when you ship in two is worse than a short honest window. **What if I use a 3PL?** The cut-off is whenever they pull the order. Integrate with fulfilment status, not with a wall clock, or you will allow edits on orders already in a tote. **Should the customer see a countdown?** A remaining time is useful if it is true. A countdown that ignores "fulfilment started" will unlock edits you then have to reverse. **Can I extend the window for VIP customers?** Yes, with a tag-based rule. Do not extend it globally because one customer asked. The warehouse is the constraint. ## In-Cart Upsells — 9 Offers That Convert and 4 That Annoy Customers URL: https://ninety9.dev/blog/in-cart-upsells-that-convert.html Published: 2026-07-21 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 5 minutes A ranked breakdown of cart upsell offer types with the price ratios, placement rules and take rates that separate the ones worth running from the ones costing you conversions. An in-cart upsell is the easiest offer in ecommerce to get slightly wrong. The shopper has committed, the mechanics are simple, and every app makes it a two-click setup — which is exactly why so many stores end up with a cart full of offers that nobody takes. The difference between an offer that converts and one that gets ignored is almost never the design. It is the relationship between the offer and what is already in the basket. ## The rule underneath everything A shopper looking at their cart has finished deciding. They are in confirmation mode, not evaluation mode. That single fact predicts which offers work: - **Additive offers** — "would you also like…" — cost the shopper nothing cognitively. They can say no in a quarter of a second and lose nothing. - **Substitutive offers** — "actually, consider this instead" — reopen a closed decision. Even when the shopper declines, you have introduced doubt into a cart that had none. Every recommendation in this article follows from that distinction. ## The nine that work ### 1. The complementary accessory The default, and still the best. A case with a device, a filter with a machine, socks with boots. Price ratio is the variable that matters most. Somewhere between 15% and 40% of the anchor product's price is the zone where an accessory reads as "obviously, yes" rather than "let me think about that". At 60%+ you are asking for a second purchase decision, and the shopper defers it — usually forever. ### 2. The quantity upgrade "Add one more and save 10%." The shopper does not evaluate a new product at all; they evaluate a better price on something already chosen. Take rates on this are consistently the highest of any cart offer because the decision cost is close to zero. Works on consumables and anything with a replenishment cycle. Does not work on considered single purchases. ### 3. The threshold gift Not strictly an upsell — a reward. "Spend $22 more and get the travel size free." What makes this work is that the shopper is choosing to *earn* something rather than to *buy* something, which is a materially different psychological transaction. The gift should be genuinely desirable and genuinely small in cost. A gift nobody wants is worse than no gift, because it reveals the mechanic. ### 4. Shipping protection Near-zero cost of goods, real perceived value, and a legitimate service. Take rates are often surprisingly high. The one non-negotiable: it must be unticked by default. Pre-ticked opt-outs are illegal in the EU under the Consumer Rights Directive, generate chargebacks everywhere else, and are the fastest way to end up in a review that mentions the word "sneaky". ### 5. Gift wrap and personalisation Seasonal, high-margin, and it makes the order feel considered. Particularly strong in Q4, and worth turning off in February rather than leaving it running as permanent clutter. ### 6. The replenishment nudge For repeat customers only: "You last ordered this 47 days ago." No discount, no persuasion — just information the shopper actually wants. It converts because it is useful rather than because it is an offer. ### 7. The bundle completion The shopper has two of the three items in a known set. Offering the third at a small discount completes a pattern, and pattern completion is unusually motivating. Requires that the set is real and obvious to the customer. Manufactured sets do not work. ### 8. The sample or trial size Low price, low risk, high information value for the shopper, and an excellent way to seed a future full-size purchase. Effectively a paid product trial that improves your AOV instead of costing you CAC. ### 9. The warranty or service add-on Best on higher-priced items where the shopper is already thinking about protecting the purchase. Margin is usually excellent. Be precise about what it covers — vague warranties generate support load that erases the margin. ## The four that annoy ### 1. The substitute product "Customers also viewed…" belongs on a product page, not in a cart. Showing an alternative to something already in the basket does one of two things: nothing, or it makes the shopper wonder whether they picked the wrong item. Neither outcome is worth the slot. ### 2. The unrelated bestseller Filling the upsell block with your top seller regardless of cart contents is the recommendation equivalent of shrugging. It trains shoppers to ignore that region of the drawer, which then poisons the well for the relevant offers you show later. ### 3. Email capture in the cart You are roughly ninety seconds from getting their email address at checkout. Asking for it here trades a guaranteed acquisition for an interruption. ### 4. The third, fourth and fifth offer Every additional offer reduces the take rate of the ones above it. Two is the practical ceiling in a drawer. If you genuinely have three things worth suggesting, your recommendation logic needs to be more selective — not your cart taller. An upsell block, a gift threshold, a countdown timer, an announcement bar and a discount code field all in the same drawer is not five chances to convert. It is one confused shopper and a checkout button pushed below the fold. ## Picking the pairs Almost all of the performance difference between two stores running the same upsell app comes down to which products get suggested. The method that works: 1. Export the last 90 days of orders with line items. 2. For each product, count how often each other product appears in the same order. 3. Filter to pairs where the co-occurrence is materially above what random chance would produce. 4. Remove anything in the same substitutable category as the anchor. 5. Of what remains, prefer the item closest to 25% of the anchor price. That produces a better pairing list than any category rule, and it takes an afternoon. If your order volume is high enough, a system that recalculates this continuously will beat a static list, because your catalogue and your seasons move and a hand-built list does not. ## Measuring properly Four numbers, in this order of usefulness: | Metric | What it tells you | When to look | |---|---|---| | Take rate (accepts ÷ impressions) | Whether the offer is relevant | Immediately — needs low volume | | Attach revenue per cart | Whether it is worth the slot | After ~200 impressions | | Cart-to-checkout rate | Whether you added friction | Continuously, as a guardrail | | Gross profit per session | Whether the whole thing is profitable | Monthly | Take rate is the fastest signal, because relevance shows up long before revenue does. An offer with a take rate near zero is not underpriced — it is irrelevant, and no discount will fix that. The guardrail metric is cart-to-checkout rate. If it moves down while AOV moves up, you have traded conversions for basket size. Sometimes that is profitable. Run the third number before you decide. ## A sensible starting configuration For a store that has never run cart upsells: - **One** complementary accessory block, pairs from real order data, priced at 15–40% of the anchor. - **One** free shipping progress bar above the line items. - Shipping protection as an unticked add-on, if you can service the claims. - Nothing else, for at least three weeks. Then add the second offer, and measure whether the first one's take rate dropped. If it did by more than a little, you have found your ceiling. ### FAQ **What is a good in-cart upsell take rate?** For a relevant complementary accessory shown to every cart, single-digit percentages are normal and anything consistently above ten percent is strong. Quantity upgrades on an item already in the cart run much higher because they require no new decision. Compare each offer against your own baseline rather than against a published benchmark, since take rate depends heavily on category and price point. **Should cart upsells be discounted?** Not always. A discount helps when the shopper needs a reason to decide now, and hurts when it trains customers to expect the accessory to be cheap. Test the same offer with and without a discount before assuming the discount is what makes it work. **Where should the upsell block sit in the cart drawer?** Below the line items and above the trust and checkout blocks. Placing it above the line items competes with the progress bar for the top slot and makes the cart feel like an ad unit before it feels like a cart. **Do cart upsells hurt conversion rate?** Additive offers placed after commitment rarely do. What hurts is anything that asks the shopper to re-open a settled decision, anything that pushes the checkout button below the fold, and anything that adds a required step. Keep the checkout path a single unobstructed click and the risk is minimal. **How do I choose which product to upsell?** Use your own order data. Find the products that most frequently appear in the same order as the anchor product, filter for ones priced well below it, and exclude anything in the same substitutable category. Category-based logic produces the classic failure of recommending a second pair of the same shoes. ## Self-Serve Order Edits vs Support Tickets — Why Shopify Stores Should Stop Taking Calls for Address Changes URL: https://ninety9.dev/blog/self-serve-order-edits-vs-tickets.html Published: 2026-07-21 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 1 minutes The cost of a "please change my address" ticket, the edit types that should never need a human, and how to keep high-risk changes behind rules. Most "order edit" tickets are not judgement calls. They are a postcode, a second unit, a gift note. A person should not have to be awake for those. Self-serve is not a feature for its own sake. It is how you stop paying a human to type what the customer already knows. ## What should never need a ticket Until fulfilment has started: - Shipping address inside the same country - Delivery instructions - Adding a SKU that is in stock - Swapping a variant of the same product (size, colour) when inventory allows Those four are the volume. If they are still landing in the inbox, you do not have an order-edit product. You have a form letter. ## What should still hit a human - Country or continent changes - High-value orders above a threshold you set - Accounts with fraud signals - Requests after the cut-off you published Rules are not pessimism. They are how self-serve stays available for everyone else. ## Show the door Confirmation email, order status page, account order history: the same link, the same window ("You can change this until we ship"). If the only path is "reply to this email", you will get replies. ## Measure the queue Track volume of address and add-item tickets before and after. If AOV from post-purchase offers is the only number on the dashboard, you will under-invest in the thing that actually changed the team's week. Self-serve order editing is a support product that happens to be able to sell. Lead with the support. ### FAQ **Won't people abuse self-serve edits?** Some will try. Cap what can change (same country, before fulfilment, logged-in customer) and you keep the 95% of honest "I typed the postcode wrong" cases off the queue. **Should every edit type be self-serve?** No. Cancellations with refunds, wholesale orders, and fraud-flagged accounts can stay on tickets. Self-serve is for the repetitive, low-risk majority. **Does this replace your helpdesk?** It replaces the copy-paste macros. You still need humans for the rest. The point is that the rest becomes visible once the noise is gone. **What is a typical ticket cost?** Even a five-minute chat is expensive at support wages, and address tickets often take more because of carrier constraints. Deflecting a few hundred a month is a real line item. ## How to A/B Test Shopify Upsell Popups Without Lying to Yourself URL: https://ninety9.dev/blog/ab-test-shopify-popups.html Published: 2026-07-20 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 1 minutes What to test (offer, trigger, frequency), what not to test (button colour in week one), and the sample size trap that makes popup tests look like winners. Popup tests fail in a particular way: the overlay gets more clicks, AOV ticks up in the test group, checkout initiation quietly drops, and someone ships the winner. Two weeks later revenue is flat and nobody connects it. You have to measure the thing you wanted (they added the SKU) and the thing you cannot afford to lose (they still paid). ## One variable Good tests: - This complementary SKU vs that one, same trigger - Add-to-cart trigger vs exit-intent, same SKU - Session cap of one vs two, same SKU and trigger Bad tests: - New design + new SKU + new trigger vs the old everything - Button colour before the offer is even the right product ## Metrics Must-haves: - Offer impressions - Offer adds (attach) - Checkout initiation rate - Conversion rate to paid order - Revenue per session If attach is up and checkout initiation is down, you did not find a better upsell. You found a speed bump. ## Sample size Overlays fire on a subset of sessions. Your real n is impressions, not store sessions. A week of a small store can be hundreds of impressions, not thousands. Do not declare a 12% lift on 180 views. If you cannot power the test, do not run it. Make a merchandising decision and watch revenue per session for two weeks. ## Guardrails Hard-stop the test if checkout initiation drops beyond a threshold you set in advance. Pre-commitment is the only thing that stops a team from "giving it another day" on a losing overlay. A/B testing is not a personality. It is a way to stop arguing. Use it when you have enough traffic to be wrong in public. Use judgement when you do not. ### FAQ **Should I test popup vs no popup first?** Yes, if you do not already know the overlay is net-positive. Many stores skip this and optimise a thing that should not exist. **Can I use Shopify's reports for this?** Not for overlay-level attach. You need the app's offer analytics or a custom event (offer_shown, offer_added) in your pixel. Order value alone hides whether the popup did the work. **How long should a test run?** Through at least one weekly cycle (weekday vs weekend mix). Stopping on a Tuesday because it "looks good" is how you ship noise. **What if traffic is low?** Run fewer tests. Sequential changes with a long observation window beat a 12-variant experiment you cannot power. ## Upsell Popup Design That Converts — Layout, Type and the Add Button URL: https://ninety9.dev/blog/upsell-popup-design.html Published: 2026-07-19 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 1 minutes The visual rules for a Shopify upsell overlay: one image, one price, one button, and the spacing that keeps it from looking like an ad. People do not read popups. They recognise them. If the overlay looks like the rest of the store, it is a question. If it looks like a template from another brand, it is an interruption. Design is not decoration here. It is whether the shopper classifies the overlay as "part of this purchase" or "an ad". ## Steal the theme, do not restyle it Same typeface, same button, same radius, same primary colour. The add button in the popup should be indistinguishable from add-to-cart on the product page. That continuity is the conversion feature. ## Hierarchy 1. Product image (one, PDP-quality, correct variant if you can) 2. Name and price 3. One line of why 4. Add 5. Dismiss If a review stars row, a countdown, three trust badges and a coupon field are in the overlay, you have built a landing page. Landing pages do not belong in a modal. ## Mobile is a sheet From the bottom, thumb-reach add button, dismiss as text under the button as well as an X. Centred desktop-style modals on a 390px screen cover the cart confirmation and panic people. ## Motion 200–250ms ease. No bounce. No delay on the add button. Delayed CTAs are a dark pattern and they get reported as such. ## The test Screenshot the popup on a product page. Blur the copy. Could a designer from your team tell it belongs to this store from colour and type alone? If not, stop adding offers and fix the skin. ### FAQ **Should popups be full-screen on mobile?** A bottom sheet that leaves a sliver of the page visible is enough. Full-screen feels like a hijack. They just added something — let them still see that they did. **How much copy?** A title, a one-line reason ("Pairs with the mug in your cart"), a price. If you need a paragraph, you picked the wrong product. **Dark overlay behind the popup?** Light dim, not a blackout. They should still recognise the page they were on. Continuity is why they might say yes. **Do animations help?** A short ease-in is fine. Bounce, confetti and delayed buttons are how overlays start to feel like malware. ## Checkout-Initiation Popups on Shopify — The Last Offer Before Payment URL: https://ninety9.dev/blog/checkout-initiation-popups.html Published: 2026-07-18 Category: Cart & Checkout · App: Monet • AI Popup Bundle Addons Reading time: 1 minutes How to run an upsell when the shopper clicks checkout, without delaying Shopify checkout or feeling like a hostage screen. The click on checkout is the most expensive click on the site. Intercepting it is allowed only if you are almost invisible: one relevant product, one add, one obvious skip, no delay. If any of those fail, you are standing in front of the till. ## Instant or not at all When checkout is clicked, the overlay must already know what to show. Fetching an offer at click-time is how you introduce a spinner between "I want to pay" and paying. Prefetch on cart open. Cache it. Fail open: if the offer is missing, go to checkout. ## What to offer Something small, complementary, and easy to evaluate without a PDP: a matching accessory, protection, a consumable refill. Not a new hero product. Not a subscription pitch that needs a paragraph. If the cart is already above your free-shipping threshold, do not offer more cheap items "to help". They are trying to leave. ## Skip must be the easy action A clear "No thanks, continue to checkout" — not a tiny X, not a 5-second lock, not a second overlay. The people who skip were going to pay. Let them. ## Do not repeat a no If this SKU was already shown on add-to-cart or in the drawer, checkout initiation is not a new conversation. Frequency cap across triggers. One offer per session still applies here — especially here. Done well, this is a quiet extra few points of attach rate from people who were already sold. Done poorly, it is the reason your checkout initiation rate dropped last Tuesday and nobody knew why. ### FAQ **Will this slow down checkout?** It will if the popup waits on a slow network request. Prefetch the offer when the cart opens so checkout click can paint immediately. If you cannot be instant, do not intercept checkout. **Is this allowed on Shopify?** You cannot inject into Shopify checkout itself. You can intercept the click that *starts* checkout, on your storefront, then send them on. Do not try to modify checkout.liquid in 2026. **Should I offer a discount to stop them leaving?** Not at this moment. They have clicked pay. A sudden discount teaches them to click checkout to unlock a deal. Offer a complementary SKU or nothing. **What if they have a discount code already?** Still fine to offer a product. Do not stack a second code. The overlay is for a SKU, not for a coupon war. ## The One-Offer Popup Rule for Shopify Upsells URL: https://ninety9.dev/blog/one-offer-popup-rule.html Published: 2026-07-17 Category: Bundles & Upsells · App: Monet • AI Popup Bundle Addons Reading time: 1 minutes Why a popup should sell a single thing, how to choose that thing from the cart, and what happens to conversion when you add a second product to the overlay. A popup has a few seconds and one job. That job is not "present the catalogue". It is "do you want this, yes or no". Two products in the overlay doubles the reading and halves the chance of a yes. Shoppers who would have added the first SKU start comparing. Comparison is browsing. Browsing is how overlays get closed. ## One sentence of why Before you ship an offer, write: "Because the cart contains X, we are offering Y." If X is empty (a generic sitewide popup), you do not have an upsell. You have an ad. Because they added the mug, we are offering the 250g beans. Because they added the running shorts, we are offering the same-brand socks. Because they added a gift-boxed candle, we are offering wrap. Those sentences are offers. "Our bestsellers" is not. ## The button Primary: Add (and, if you must, the price). Secondary: close. No "continue shopping" that opens a collection. No "view product" that dumps them on a PDP and kills the cart they came from. If they need to read a full product page to decide, the popup picked the wrong SKU. Pick a lower-consideration attachment. ## Discount last Try the pair at full price. If attach rate is real, keep it. If it is near zero, a small bundle-style discount can be the difference — but it should be the last lever, not the first, because popup discounts become expected. ## Measure one number Attach rate of *this* SKU from *this* trigger. Not popup CTR. Clicks that do not add are still a no, they just took longer. ### FAQ **Can I show a bundle of two items in one popup?** Yes, if it is one offer — a set with one price and one add button. Two separate products with two add buttons is two offers. **What if I have several good attachments?** Rank them, show the winner, keep the rest for the cart or the product page. The popup is not your merchandising dump. **Should the popup include a discount?** Only if the pair does not attach at full price. Discounts in popups train people to wait for the overlay. Try without first. **Is a carousel of offers okay?** No. Carousels in popups are how take rate dies. If you need a carousel, the offer is not ready. ## Popup Frequency Capping on Shopify — How Often Is Too Often URL: https://ninety9.dev/blog/popup-frequency-capping.html Published: 2026-07-16 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 1 minutes Session caps, cooldown after dismiss, and why showing the same upsell popup twice in one visit costs more than it makes. Popups do not fail because the offer is wrong. They fail because the store asked again. A shopper who closes an overlay has given you an answer. Showing the same overlay on the next collection page is not persistence. It is not listening. ## The default cap One impression per session, per offer. Not per page. Not per trigger. If they saw it after add-to-cart, they have seen it. Exit-intent does not get a second bite in the same visit. ## Honour dismiss Closed means no. Store that for the session immediately, and for a week or two if they are a returning visitor. "Don't show again" checkboxes that do not work are worse than no checkbox. If your popup has no memory, every page view is a new interruption. Interruptions compound into a brand feeling. ## When a second show is allowed Rare cases: - They added a *different* product and you have a *different* offer that still makes sense. - They came back days later and the campaign changed. - They completed a purchase and you are in post-purchase, which is a different surface. A second show of the *same* SKU in the *same* session is not one of the cases. ## After a take If they added the offered product, the popup's job is over. Kill it for the session and for that SKU. Showing "add this" for something already in the cart is how overlays start to look broken. Frequency capping is not a setting you turn on at the end. It is the product. An offer shown once at the right moment will beat an offer shown four times at whatever moment the script fired. ### FAQ **Won't I miss conversions if I only show the popup once?** You will miss some. You will also miss the conversions you lose when shoppers start treating every overlay as an enemy. Net, one well-timed show beats three. **What about returning visitors?** Cap per session, and add a longer cooldown after dismiss (7–14 days is a reasonable start). Returning visitors who already said no are not a new audience. **Should checkout-initiation popups have a different cap?** They can share the session cap. If they already saw an add-to-cart offer, do not also hit them at checkout start. One offer per visit. **How do I test this?** Track take rate, add-to-cart rate after dismiss, and popup-close rate. If close rate climbs while take rate falls, you are showing it too often. ## Cart Goals for Shopify Subscription Products URL: https://ninety9.dev/blog/cart-goals-for-subscriptions.html Published: 2026-07-15 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 1 minutes How to run a free-shipping or free-gift progress bar when the cart contains subscribing items, prepaid plans, or a mix of one-time and recurring SKUs. Subscription carts lie to naive progress bars. A $30/month coffee plan looks like a $30 cart, or like a $360 cart, depending on whether the app reads the selling plan or the product price. Both mistakes produce a remaining amount that does not match checkout. The bar has to follow the money that moves today. ## This shipment, not this relationship Free shipping is about the box leaving today. A 12-month prepaid that ships monthly is not twelve boxes of postage credit. A subscribe-and-save item that charges $28 today is a $28 line, even if the merchant thinks in LTV. If your goal is "free shipping over $50", a subscriber at $28 is $22 away — unless your policy actually ships subscribers free, in which case the bar should say that and stop pretending they need $22. ## Mixed carts One remaining amount. Always. A shopper with a $28 subscription and a $20 one-time bag of beans has a $48 today-total. If the threshold is $50, they are $2 away. Two bars ("subscription goal" and "one-time goal") is how you lose the add. If your policy is "subscribers always ship free", the mixed cart is already unlocked. Offer a gift or a one-time extra as the second goal, or hide the bar. ## Gifts that arrive later "Free mug on your third shipment" is a retention offer. It is not a cart goal. Putting it on the progress bar implies it is in *this* order. When it is not, you get a ticket. If you want a goal that pulls AOV on order one, the reward has to ship with order one. ## Test the ugly cart Before you launch, add: a subscribe item, a prepaid plan, a one-time SKU, a discount code, and a market with a different currency. If the remaining amount still matches the checkout summary, the bar is safe. If not, fix the total — do not launch a pretty bar on a wrong number. ### FAQ **Should the shipping bar include future subscription charges?** No. The shopper is paying for this delivery. Future charges are not in this parcel and should not unlock this parcel's shipping. **What if subscription items already qualify for free shipping?** Then the bar's job on those carts is a second goal — a one-time add-on or gift — or the bar should hide. A bar that says "$0 away" as a permanent state is dead chrome. **Can I require a subscription to unlock free shipping?** You can. Make that rule explicit in the bar ("Subscribe and this order ships free") so a one-time buyer is not staring at a number they cannot reach without changing selling plan. **Do selling plans break progress bars?** They do if the app totals list price instead of current charge, or ignores selling plans entirely. Test a mixed cart before you ship. ## The Free Shipping Progress Bar — Placement, Copy and the Psychology URL: https://ninety9.dev/blog/free-shipping-progress-bar-guide.html Published: 2026-07-14 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 5 minutes Why a progress bar outperforms a static shipping policy, the exact copy patterns that convert, where to place it, and how to handle the moment the goal is met. A free shipping threshold is a number. A progress bar is what turns that number into behaviour. The distinction matters because plenty of stores set a sensible threshold, state it in the footer and on a shipping policy page, and then wonder why it did not move average order value. The threshold was never the active ingredient. Visibility was. ## Why a bar beats a statement Three well-documented effects are doing the work. **The goal-gradient effect.** Motivation to complete a task increases as perceived distance to completion decreases. A shopper at 80% of a threshold is substantially more motivated than one at 30% — and neither is motivated at all if they cannot see where they stand. **The endowed progress effect.** People are more likely to complete a task they have already started. A cart with anything in it has already started; the bar makes that visible. **Loss framing.** "You're $14 away from free shipping" implicitly frames not adding as losing something. That is a stronger motivator than gaining the equivalent amount. None of these operate on a static policy statement, because a policy is information and a bar is feedback. ## The copy that works The pattern is consistent enough to be a rule. | Copy | Why it works or does not | |---|---| | "Free shipping over $70" | Weakest. A rule about you, requiring the shopper to do arithmetic. | | "Spend $70 for free shipping" | Better, still a target rather than a gap. | | "You're $14 away from free shipping" | **Strong.** Second person, specific gap, immediate. | | "Add $14 more to unlock free shipping" | **Strong.** Adds a verb and the word "unlock". | | "Almost there! Free shipping soon" | Weak. No number, so no goal. | | "🎉 You've unlocked free shipping!" | **Correct completion state.** Names the achievement. | Four principles behind those: 1. **Second person.** "You" outperforms passive or store-centric phrasing. 2. **The gap, not the target.** The remaining amount is the number that matters. 3. **The shopper's currency**, converted and rounded properly. A gap expressed in a foreign currency is not a goal. 4. **A verb.** "Add", "unlock", "reach" all outperform a bare statement. Read your bar copy out loud as if speaking to someone standing in front of you. If it sounds like a sign on a wall rather than a sentence you would say, rewrite it. ## Placement, in order of value ### 1. The cart drawer The highest-value position by a wide margin. This is where the shopper evaluates their basket as a whole, and it is the only place where "add one more thing" is a one-click action rather than a navigation. Put it at the very top, above the line items. Below them it reads as a footnote. Above them it reads as an instruction, and it frames everything beneath. ### 2. The cart page Same logic, for stores that use a full cart page or for shoppers who navigate there directly. ### 3. The product page Useful, with a caveat. It works well for stores where shoppers commonly add one item and head straight for checkout, because it introduces the goal before the cart even opens. The caveat: do not show a bar at 0% to a shopper with an empty cart. An empty progress bar communicates distance, not opportunity. Either hide it until the cart has something in it, or show the threshold as a plain statement until there is progress to display. ### 4. A sticky site-wide bar Reinforcement rather than a driver. It keeps the offer present while browsing, which has value, but the conversion moment happens in the cart. Treat it as a reminder, not as the main implementation. ## The completion state Most implementations treat crossing the threshold as an end state — the bar fills, the message changes, done. That is a missed opportunity, for two reasons. **Celebration reinforces credibility.** A visible, slightly emphatic completion state teaches the shopper that goals in your store are real and reachable. That matters if you run more than one. **The next goal should appear immediately.** A shopper who lands at $73 on a $70 threshold has, at that moment, no further reason to add anything. If a second tier exists — an order discount at $110, a free gift at $150 — it should appear the instant the first is met. That is the difference between a threshold that captures one behaviour change and a mechanic that keeps working across the whole upper half of your order distribution. ## Design details that matter - **Animate the fill**, briefly. A bar that jumps instantly is less noticeable than one that visibly moves. Two hundred milliseconds is plenty. - **Announce changes to screen readers.** Use `aria-live="polite"` on the message so the update is spoken. This is a genuine accessibility requirement, not a nicety. - **Respect reduced motion.** Users with `prefers-reduced-motion` set should get the state change without the animation. - **Contrast the fill against the track.** A bar that is hard to read at a glance defeats the purpose. - **Keep it one line on mobile.** Two-line bar copy on a phone eats vertical space in the cart drawer that line items need. - **Never let it push the checkout button below the fold.** The bar supports the primary action; it does not compete with it. A progress bar showing "$70 away from free shipping" to someone with an empty cart is one of the most common implementation mistakes. It frames your shipping policy as a large distance at the exact moment the shopper has invested nothing. Suppress it until there is at least one item. ## Localisation The bar is one of the most-read strings on your site, which makes untranslated bar copy unusually damaging. Three requirements: - **Translated copy** for every language you sell in, not just your top two. - **Converted and rounded amounts** in the shopper's presentment currency. A gap of "€12.83" reads as a machine output; "€13" reads as a goal. - **Per-market thresholds.** The threshold behind the bar should be set from that market's own order distribution and shipping cost, not converted from your domestic number. ## What to measure Not average order value on its own — a threshold raises AOV mechanically. - **Share of orders above the threshold**, before and after. The direct behaviour measure. - **Median order value**, which is more honest than the mean for this purpose. - **Cart-to-checkout rate.** The guardrail. A bar that adds visual clutter without a well-set threshold can cost conversions. - **Distance-at-checkout distribution.** Underused and very informative: how far from the threshold were the orders that did *not* cross it? If most sit just below, your threshold is slightly too high. If most are far below, it is much too high. That last chart is the fastest diagnostic there is for a threshold that needs adjusting, and almost nobody looks at it. ### FAQ **Does a free shipping progress bar actually increase average order value?** Consistently, when the threshold is set correctly. The bar itself does not create the effect - the threshold does - but the bar is what makes the threshold visible and personal, and a threshold nobody can see their progress against behaves like a policy rather than a goal. **Where should the free shipping bar be placed?** The cart drawer produces the most value because that is where the shopper is evaluating their basket as a whole. The cart page is second, the product page third. A sticky site-wide bar is useful reinforcement but rarely the main driver. **What should the progress bar say?** The remaining amount in the shopper's currency, phrased in the second person. "You are $14 away from free shipping" is the base pattern. Avoid stating the threshold on its own, and avoid vague language like "almost there" without a number. **Should the bar show on the product page too?** It can help, particularly for stores where shoppers add a single item and go straight to checkout. Be careful that it does not appear before anything is in the cart, where a bar at zero percent is discouraging rather than motivating. **What happens after the shopper reaches the goal?** Two things should happen. The bar should visibly celebrate the crossing, which reinforces that goals in your store are real. And if you run stacked goals, the next tier should immediately appear so the mechanic keeps working above the first threshold. ## When Not to Offer Free Shipping on Shopify URL: https://ninety9.dev/blog/when-not-to-offer-free-shipping.html Published: 2026-07-14 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 1 minutes The stores, categories and order profiles where a free shipping threshold destroys margin, and what to run instead of "free over $X". The internet treats free shipping as mandatory. Your P&L does not. A threshold that sits under the real cost of the box is not a growth lever. It is a recurring discount you forgot to name. ## When a threshold is the wrong product Skip store-wide free shipping, or set it very high, when: - Average parcel cost is a large share of AOV (heavy goods, bulky packaging, cold chain). - You drop-ship internationally and postage is a surprise until checkout. - Orders are frequently a single low-price item that will never reach a sane threshold. - You already lose money on the first unit and make it up on repeat — then you are stacking two discounts. In those stores a progress bar toward "free" trains people to add junk they will return, which is worse than paid shipping. ## What to run instead **Honest paid rates** plus a delivery date. "Arrives Thursday · $6.50" converts better than a fake free that appears as $8.00 at checkout. **Collection-level free shipping.** The light, high-margin line can carry a bar. The heavy line cannot. Two policies beat one lie. **A gift goal, not a postage goal.** If you want the psychology of a threshold without giving away fulfilment, unlock a sample, wrap, or accessory. You still get the "I'm $9 away" behaviour. You do not pretend DHL is free. ## If you already promised it Do not rip the bar out this afternoon. Raise the threshold toward a number that clears parcel cost plus a margin of safety, grandfather the old number in ads until they expire, and move the bar copy to remaining amount so the new number still feels like a task. Free shipping is a campaign you can choose. It is not a feature of Shopify. ### FAQ **Doesn't everyone expect free shipping?** Many shoppers prefer it, especially in the US. That is not the same as "it is profitable for you". If your category is furniture, food, or international drop-ship, the expectation is weaker than the cost. **Can I offer free shipping only on some products?** Yes, and you should if the rest of the catalogue cannot absorb postage. A collection-level promise is more honest than a store-wide bar that excludes half the SKUs in the small print. **What do I put in the cart instead of a shipping bar?** A delivery estimate, a clear paid rate, and if you still want a goal, a free gift or a quantity break that does not pretend postage is free. **Is "free shipping" in ads a problem if I do not offer it on the store?** Yes. Do not advertise a threshold you do not honour. That is a policy problem, not a cart-app problem. ## Where to Put a Free Shipping Progress Bar on Shopify URL: https://ninety9.dev/blog/where-to-put-a-progress-bar.html Published: 2026-07-13 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 1 minutes Cart drawer, product page, header, or all three — the placements that increase average order value and the ones that just add clutter. A progress bar that the shopper cannot see at the moment they are deciding whether to add one more item is a settings page, not a conversion feature. Start in the cart. Add other surfaces only if they share the same number. ## The cart comes first In a drawer, the bar goes at the very top, above line items. In a cart page, the same: full width, first. This is the moment of highest intent and the moment the remaining amount is real. If you only have engineering time for one placement, this is it. ## Product page as a preview A slim bar on the product page is useful when it answers "if I add this, do I get free shipping?" That requires either: - Showing remaining *without* the current item, clearly labelled, or - Showing remaining *with* the current item, clearly labelled as a preview. An unlabelled number that assumes they have added something they have not is how you get angry emails and a support macro. ## Header bars A header announcement works for a campaign ("Free shipping over $50 this weekend") and poorly as a forever element. Permanent header bars become wallpaper. Wallpaper does not move AOV. If you use one, hide it on cart and checkout so you do not show the same message twice, and hide it on content pages where it has nothing to do. ## The desync problem Two bars with two remaining amounts — because one includes discounts and one does not, or one is cached — will be noticed. Shoppers compare. When they do not match, they believe neither, and they will not add the extra item. One calculator. Many views. That is the whole architecture. ### FAQ **Should the bar be on every page?** No. Cart, product, collection if you must. Not the blog, not the policy pages, not checkout (Shopify owns checkout). **Can the product-page bar include the current item before it is added?** Only if you make that obvious ("If you add this, you'll be $8 away"). A silent hypothetical remaining amount is a lie when they have not added it yet. **Sticky header bars — good or bad?** Good on collection and product during a shipping promotion. Bad as a permanent chrome element. Shoppers learn to ignore chrome. **What if I use a cart page, not a drawer?** Put the bar at the top of the cart page, full width, before line items. The same remaining-amount copy applies. ## Free Shipping Bar Copy — Write the Remaining Amount, Not the Rule URL: https://ninety9.dev/blog/free-shipping-bar-copy.html Published: 2026-07-12 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 1 minutes Why "Free shipping over $70" underperforms "You're $14 away", and the three lines that belong on a Shopify progress bar. A free shipping threshold is a rule. A progress bar is a task. Shoppers complete tasks. They do not memorise rules. That is why "Free shipping over $70" is weak copy even when the maths is perfect. It describes your policy. "You're $14 away from free shipping" describes *their* next move. ## The three states Write three lines, not one: 1. **Empty cart / far from goal.** "Free shipping at $70 — add $70 to get it." (Only here is the target useful, because remaining ≈ target.) 2. **In progress.** "You're $14 away from free shipping." 3. **Unlocked.** "Free shipping unlocked on this order." If you have a second goal, the unlocked state becomes the setup for it: "Free shipping unlocked. $6 away from a free gift." ## One number Do not write "You're 18% away" or "Add 2 more items". Percentages hide the actual spend; item counts break as soon as prices differ. Money remaining is the only number that matches the checkout the shopper is about to see. Match the currency and the rounding of the cart. If Shopify shows €11.40, the bar cannot show €12. ## Markets Every market needs its own threshold *and* its own sentence. Translating "You're $14 away" into a language that does not use that construction, or leaving the dollar sign on a kroner store, is how bars start to look like apps. If you cannot staff translations, keep the structure and swap the currency. Structure travels. Slang does not. ## What not to say - "Spend more to save on shipping" — lecture. - "Hurry, almost there!" without a number — noise. - "Free shipping" when they still have $40 to go — a false unlock. The bar has one job: tell them how much is left. Do that job in the fewest honest words. ### FAQ **Should the bar show the target or the remaining amount?** Remaining amount, always, until the goal is met. After that, a confirmation ("Free shipping unlocked") plus the next goal if you have one. **How precise should the remaining amount be?** To the cent in the shopper's currency, using the same rounding as the cart. A bar that says "$12 away" when the cart says $11.40 left is a small lie with a large cost. **Can I add humour?** A little, if it is on-brand and the number stays first. Humour that hides the remaining amount is decoration, and decoration gets skipped. **Where does the bar go if copy is this important?** Top of the cart, and optionally a slim bar on the product page that uses the same remaining-amount logic. Different copy in two places is how you get two numbers. ## Gift Wrap as a Shopify Cart Goal — A Second Threshold That Does Not Cheapen Shipping URL: https://ninety9.dev/blog/gift-wrap-as-a-cart-goal.html Published: 2026-07-11 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 1 minutes How to add gift wrapping as a progress-bar goal without competing with free shipping, and the copy that makes it feel like a treat instead of a fee. Gift wrap is one of the few add-ons that makes the order feel more expensive in a good way. Used as a cart goal, it can also pull a basket over a small gap without touching your shipping policy. Used badly, it is a second progress bar fighting the first, and the shopper ignores both. ## The stacking rule A progress bar can show more than one goal. It cannot show two incomplete goals of similar size without becoming noise. The clean pattern: 1. Free shipping is the first goal, always. 2. Gift wrap included is the second goal, and it only lights up once shipping is met — or it is a small increment *above* the shipping threshold. " $8 from free shipping, $11 from wrap" is two chores. "Free shipping unlocked — $6 from gift wrap included" is a treat on top of a win. ## Price it like a finishing touch Wrap has to be cheap relative to the basket you want. On a $30 order, $5 wrap is 17%. That is a tax. On a $75 order, $2–3 wrap is a rounding error that feels generous when it is included. If you cannot include wrap at a price that is small, do not make it a goal. Sell it as an optional line and leave the bar for shipping. ## Seasonality is the feature Run wrap as a goal from mid-November through the first week of January, plus the week before Valentine's and Mother's Day if those matter to you. The rest of the year, hide it. A wrap goal in March trains people to ignore the bar. ## Operations veto If the warehouse cannot wrap in peak week, the marketing is a lie. Confirm capacity before you turn the goal on. A progress bar is a promise. Promises that break at fulfilment become tickets, not AOV. ### FAQ **Should gift wrap be a product or a cart goal?** If you want it on every order as an optional line, it can be a simple add-on. If you want it to pull the basket over a threshold, make it a goal on the progress bar — " $6 away from gift wrap included". **Does wrap compete with free shipping?** It does if both are incomplete at once. Stack wrap as a second goal after free shipping is earned, or run wrap only in gift-heavy months when shipping is already free above a low threshold. **What about personalisation notes?** Offer a note field once wrap is in the cart. Do not ask for a message before they have said yes to wrap — that is two commitments instead of one. **Will this slow fulfilment?** Only if operations cannot do it. Do not sell wrap you cannot staff in week 50. A goal you fail in December costs more than it made in November. ## Cross-Sell vs Upsell on the Shopify Product Page URL: https://ninety9.dev/blog/cross-sell-vs-upsell-product-page.html Published: 2026-07-10 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 1 minutes The difference between selling more and selling up, which one belongs next to the buy box, and why mixing them in one widget makes both worse. People use "upsell" to mean anything that makes the basket bigger. That sloppiness shows up on product pages as a single widget trying to sell a larger size, a matching accessory and a totally different product from another collection. That widget is not a strategy. It is a tray. Separate the jobs. ## Upsell: a better version of this The shopper already wants this job done. You are offering a better way to do it: more volume, a longer subscription, a premium material, a warranty that attaches to this item. The UI is a choice *inside* the buy box. Plans, sizes, "upgrade to the kit". Not a second product card. ## Cross-sell: a second job The shopper wants this, and also might want that: the belt with the trousers, the beans with the mug, the case with the phone. The UI is an optional extra *under* add-to-cart. A checkbox or a single card. Not a swap of the thing they came for. ## One widget cannot do both A carousel titled "You may also like" that contains a larger size, a colourway and a random accessory is three strategies colliding. The larger size should have been a variant. The colourway is not an offer. The accessory might be a cross-sell if it is actually complementary. Clean it until each block has one sentence of purpose. If you cannot write the sentence, delete the block. ## If you only have one slot Compute attached revenue × margin for the best upsell and the best cross-sell over the last 90 days. Ship the winner. Curiosity about the loser is how pages get noisy again. The cart can take the other job later. The product page does not have to. ### FAQ **Is a larger pack size an upsell or a quantity break?** It is an upsell if it is a different SKU (500ml vs 250ml). It is a quantity break if it is two of the same SKU. Do not treat them as the same offer. **Should I upsell before the shopper has added to cart?** Yes — that is the point of a buy-box upsell. After add-to-cart, you are in cross-sell territory (the cart, a popup, a post-purchase offer). **Why do mixed widgets convert poorly?** Because they ask two questions at once: "Do you want a better version?" and "Do you want something else?" Shoppers skip widgets that feel like a second catalogue. **Can AI pick between upsell and cross-sell?** It can rank candidates inside one type. The type is a merchandising decision. Do not outsource that. ## Where to Place Bundles on a Shopify Product Page URL: https://ninety9.dev/blog/where-to-place-bundles-on-pdp.html Published: 2026-07-09 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 1 minutes Above the fold, in the buy box, or below the description — the three placements for a bundle offer and the one that consistently gets the add. Placement is not decoration. A bundle the shopper does not see is a bundle you did not offer. Most Shopify product pages bury the offer in a related-products row that starts after the description, the size guide and two app blocks. That row converts like a related-products row. Which is to say: barely, and mostly on sessions that were going to browse anyway. ## Three jobs, three places **The bundle is the product.** The shopper landed here to buy a set. The buy box is a bundle selector: choose the kit, choose the size, add to cart. A single-item option can exist as a secondary link, not as the default. **The bundle is an upgrade.** The shopper landed on a single SKU. Under the add-to-cart button, one block: "Make it a set — save 12%." Still on the first screen on desktop. Still before reviews on mobile. **The bundle is discovery.** Someone might want a different kit entirely. That belongs in a collection or a "complete the look" after the decision is made — never as the only offer. ## What above the fold actually means On a 1440px desktop, the buy box and the first 200px under it. On a phone, whatever is visible before the first scroll. If your bundle widget is in a tab labelled "Bundles" next to "Reviews" and "Shipping", you have hidden it. Apps that inject a block "somewhere in the product template" often land in the somewhere. Open the theme editor and put the block where the job is. ## Do not double-place Showing the same kit in the buy box and again in a carousel under the description does not increase take rate. It increases banner blindness. Pick the slot that matches the job. Delete the other. ## After they add The cart can offer a *different* completion — a complementary SKU, a quantity break, a free-shipping nudge. It should not repeat the kit they just declined or just accepted. Repeating it is how offers start to feel like pop-ups that never close. ### FAQ **Should a bundle have its own product page?** If it is a kit you want to advertise, yes. The product page of a component can still offer the kit as an upgrade, but the kit needs a URL if you want it in ads, search and collections. **Does a bundle selector hurt single-item conversion?** It can, if it replaces the simple add-to-cart. Keep "Buy this item" as the default and "Make it a set" as the second action, not the other way around — unless the set is genuinely the product. **What about mobile?** On mobile, "above the fold" is one screen. Put the offer in the buy box or the first block under it. Anything that requires a scroll past reviews will not be seen before add-to-cart. **Can I put bundles in the cart instead?** Yes, as a second chance. Do not rely on the cart as the first chance. Most shoppers who wanted the kit would have taken it on the product page if they had seen it. ## Variant-Level Volume Discounts — Clear Slow Shopify Stock Without a Sitewide Sale URL: https://ninety9.dev/blog/variant-volume-discounts-clear-stock.html Published: 2026-07-08 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 1 minutes How to put quantity breaks on specific variants so you move the colour that is not selling, without discounting the whole product line. Clearance is usually a blunt instrument. You take 20% off a product because one colour is stuck, and you also take 20% off the colour that was going to sell at full price by Friday. Variant-level volume discounts are the sharp instrument. The stuck SKU gets a reason to buy two. The healthy SKU is left alone. ## When this is the right tool Use it when: - One colourway or size is overstocked and the rest of the product is fine. - The product is a consumable or a multi-buy category (socks, candles, supplements, basics) where taking two is reasonable. - You would rather move units than run a sitewide percentage off. Do not use it when the variant is simply mispriced, or when the product is a single-purchase item (a sofa, a laptop). A quantity break on a sofa is a joke. ## How to present it The shopper selects a variant. If that variant has a break, a short table appears: "Buy 2, save 10%. Buy 4, save 20%." If they switch to a variant without a break, the table disappears. A table that stays on screen for variants it does not apply to is a lie. Lies in the buy box are expensive. ## Margin, not just sell-through Work the break backwards from the landed cost of the stuck variant. If you can give 10% at two units and still sit above your floor, that is the offer. If you cannot, markdown a single unit instead — a quantity break that loses money faster is not merchandising. Do not stack a collection sale on top. The whole point of targeting the variant is to *avoid* a second discount. ## Inventory after it works When a colourway starts moving, turn the break off. A quantity discount that outlives the overstock becomes the new regular price, and you will train your best customers to wait for it. ### FAQ **Will customers get angry that one colour is cheaper?** Rarely, if the cheaper colour is clearly a specific variant and not a secret. Shoppers understand clearance. They do not understand a price that changes for no visible reason. **Should I use a quantity break or a markdown?** A markdown is for "we will never restock this." A quantity break is for "we would like you to take more than one." If the variant is a dead colourway you will not reorder, markdown it. If it is a size curve problem, use a break. **Can I combine this with a collection sale?** You can, and you probably should not. Two discounts on the same line make margin unreadable. Pick one mechanism per variant. **Where do I show the offer?** Under the variant picker, as a small table that updates when the shopper changes colour or size. Not in a banner that applies to the whole product. ## AI Product Offers on Shopify — Use Purchase History, Not a Guessing Engine URL: https://ninety9.dev/blog/ai-offers-from-purchase-history.html Published: 2026-07-07 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 2 minutes Why catalogue-based recommendations stall, how to build offers from real order history, and the guardrails that stop AI from suggesting a second pair of the same shoes. "AI offers" is a vague promise. The useful version is narrow: look at what people actually bought together, then show the next most likely SKU at the moment the shopper is about to buy. The useless version is a generic similarity model pointed at your catalogue. That model will recommend another pair of running shoes to someone who just added running shoes, because they are similar. Similar is not complementary. ## Order history is the feature Co-occurrence is a boring statistic and a very good merchandiser. If 18% of orders that contain the ceramic mug also contain the 250g beans, that pair is an offer. You do not need a foundation model to notice it. You need a query and a place to put the result. A model becomes useful one layer up: ranking which of several historically real pairs to show *this* shopper, given what is already in the cart, the market they are in, and the margin you will accept. Ranking is AI. Inventing pairs you have never sold is improvisation. ## Guardrails that prevent the obvious failures Before any model runs, exclude: - The product already on the page - Other variants of that product - Anything already in the cart - Out-of-stock SKUs - SKUs you have blacklisted (clearance you do not want attached to full-price heroes, or vice versa) If your AI offer still looks stupid, the exclusions are incomplete. Fix those before you tune the model. ## One slot, two products at most The product page can support a single "complete this" block. Two products in that block is plenty. Twelve is a catalogue dump with nicer copy. If the model returns a long tail of weak pairs, you do not need a carousel. You need a higher threshold: only show a pair that has actually occurred, at a rate you would defend to a merchandiser. ## Measure the pair, not the click Clicks on a recommendation are vanity. Attach rate and the margin of the attached SKU are the job. An AI that attaches a low-margin accessory at 8% is worse than a merchandiser who attaches a high-margin one at 5%. ### FAQ **Do I need a lot of orders before AI offers work?** You need enough co-occurrence. For a catalogue of a few hundred SKUs, a few thousand orders with two or more line items is usually enough to beat a manual merchandiser. Below that, curate the pairs yourself and keep the AI off. **Can AI replace a merchandiser?** It can replace the spreadsheet of "what goes with what" once the data exists. It cannot replace a decision about what you are willing to discount, or which products you refuse to attach to which. **Why does my AI keep recommending the same product?** Because the cart already contains something in that category and the model is doing category similarity. Switch the source to order co-occurrence and add an exclusion for the parent and its variants. **Should AI offers be on the product page or in the cart?** Both, with different jobs. On the product page, complete this product. In the cart, complete this order. Do not show the same pair in both places in the same session. ## The Add-to-Cart Moment — Why It Is the Best Upsell Slot You Own URL: https://ninety9.dev/blog/add-to-cart-popup-upsell.html Published: 2026-07-07 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 5 minutes The instant after a shopper commits is the highest-intent moment in the session. Here is how to use it without breaking the flow you just earned. There is one moment in an ecommerce session where the shopper has unambiguously committed and has not yet moved on to the next thing. It lasts about a second and a half, and it starts the instant they click "add to cart". Most stores fill it with a small toast notification in the corner of the screen. ## Why this moment is different Every upsell placement is a trade between attention and risk. The product page has attention but any offer there competes with the buy button. The checkout has commitment but you cannot touch it. The confirmation page has zero risk but the shopper is mentally finished. The add-to-cart moment has an unusual combination: - **Commitment has already happened.** The add is done. You cannot lose it. - **Attention is at its peak.** The shopper just performed a deliberate action and is watching for the result. - **The purchase frame is active.** They are in buying mode, not browsing mode, and the difference in receptiveness is large. - **No friction has been added yet.** They have not entered an address or a card number, so an additional item costs them nothing procedurally. That combination does not exist anywhere else in the session. ## Confirm first, then offer The most important design rule, and the one that separates a popup that works from one that damages the funnel. The shopper clicked a button and is waiting to find out what happened. If the first thing they see is an offer for a different product, their immediate question is "did my item get added?" — and you have replaced certainty with doubt at exactly the wrong instant. The correct sequence: 1. **Confirm.** Show the item added — image, name, variant, quantity. Unambiguous. 2. **Then offer.** One complementary item, clearly secondary to the confirmation. 3. **Then two exits.** Continue shopping, and go to cart / checkout. The confirmation is not a formality. It is what buys you the right to the rest of the modal. Someone glancing at your popup for two seconds should be able to answer "did it work?" without reading. If the answer requires parsing an offer first, the layout is wrong. ## Choosing the offer The same relevance rules that govern any cross-sell apply, with one addition: the offer must require *no new evaluation*. The shopper has just finished deciding. Asking them to start a fresh decision — a different category, an unfamiliar product, a considered purchase — breaks the momentum you were trying to use. What works: - **A direct accessory.** Case, filter, refill, mount, strap. Obvious, cheap relative to the anchor, one-word justification. - **A quantity upgrade on the same item.** "Add a second and save 10%." Zero new evaluation, and consistently the highest take rate of any offer here. - **The completion item.** The third thing in a set where they now have two. - **A consumable that pairs with it.** Coffee with a grinder, blades with a razor. What does not: - **An alternative to what they just added.** Reopens a closed decision. - **Anything more than half the anchor price.** Becomes a second purchase decision, gets deferred. - **A category they have not shown interest in.** The intent signal is about *this* product. - **Multiple options.** Two choices halve the clarity. One offer, take it or leave it. The price ratio is worth restating because it is the most reliable predictor: 15–40% of the anchor product's price is the zone where an accessory reads as obvious. ## Design specifics - **One-click accept.** Accepting must add the item and update the cart with no further steps. Any additional step loses a large share of the people who said yes. - **An obvious decline.** "No thanks" as visible text, not a grey X in a corner. A hidden dismiss control converts a helpful moment into a hostile one. - **Never block the checkout path.** Both exits — continue shopping and go to checkout — must be visible without scrolling, on mobile. - **Show the price and the saving.** If there is a discount for taking it now, state both the price and the amount saved. - **Keep it small.** This is not a landing page. Confirmation, one product, two buttons. - **Auto-dismiss is optional and risky.** A modal that vanishes mid-read is worse than one that waits. ## Frequency Cap it. This is the difference between a tool and an irritation. Reasonable defaults: - **Once per session.** A shopper adding five items should see the offer once, not five times. - **Never twice for the same anchor product.** - **Suppress after a decline.** Someone who said no has answered the question. - **Suppress in checkout.** Once they have started checkout, stop. The failure mode here is well known to anyone who has shopped online: the store where every single add triggers a modal. Shoppers respond by adding fewer items, which is the exact opposite of the goal. ## Popup or cart drawer? Both surfaces can carry this offer, and they behave differently. | | Add-to-cart popup | Cart drawer upsell | |---|---|---| | Attention | Full, undivided | Shared with totals and checkout | | Take rate per impression | Higher | Lower | | Perceived intrusiveness | Higher | Lower | | Risk to checkout flow | Small but real | Minimal | | Best for | One high-value offer | Ongoing, ambient suggestion | Most stores should run one, not both. Running both means the same shopper sees a related-product suggestion twice in ten seconds, which reads as pressure and tends to lower the take rate of each. If you want to combine them, differentiate the jobs: popup for a quantity upgrade on the item just added, drawer for the threshold progress bar and a complementary accessory. Different offers, different purposes. A modal that occupies the full screen on a phone and pushes the "go to cart" button below the fold is the single most common way this pattern goes wrong. Test on a small device with the keyboard closed and the browser chrome visible. ## Measuring it Two fast metrics and two slow ones. **Fast — tells you about relevance, within days:** - **Take rate** — accepts ÷ impressions. If this is near zero, the offer is irrelevant and no amount of design will fix it. - **Dismiss speed.** If most people close within a second, they are not reading it. **Slow — tells you whether the slot is worth using, over weeks:** - **Attach revenue per impression.** The commercial number. - **Cart-to-checkout rate**, before and after. The guardrail. - **Adds per session.** The subtle one. If shoppers add fewer items overall after you launch the popup, it is discouraging the behaviour you want, and the attach revenue is not compensating for the loss. That last metric catches the frequency problem before your reviews do. ## A starting configuration - Fires on add to cart, once per session, desktop and mobile. - Confirmation block first, offer second, two exits third. - Offer: one complementary item at 15–40% of the anchor price, drawn from real order-history pairings. - Small discount for accepting immediately, in the 10–15% range. - Suppressed after a decline, and suppressed entirely in checkout. Then read the take rate after a week. If it is close to zero, the problem is the pairing, not the popup. ### FAQ **Does an add-to-cart popup hurt conversion rate?** It should not, because it appears after the shopper has already added the item. The risk is not losing the add but losing the checkout, which happens when the popup obscures the path forward, requires a decision to dismiss, or makes the shopper doubt whether their item was actually added. **What is the difference between an add-to-cart popup and a cart drawer upsell?** The popup is a single dedicated moment with one offer and the shopper's full attention. The cart drawer upsell sits alongside line items, totals and a checkout button, competing for attention. The popup converts better per impression, the drawer is less intrusive. Many stores run one or the other rather than both. **What should the offer be?** A complementary item priced well below the product just added, ideally between fifteen and forty percent of its price. It should require no new evaluation - an accessory, a consumable that pairs with it, a quantity upgrade on the same item. **Should the popup appear on every add to cart?** No. Cap it to once per session at most. A popup on every add is the fastest way to make a shopper stop adding items, and it converts a helpful moment into an obstacle. **Is a popup better than expanding the cart drawer?** For a single high-value offer, generally yes, because the popup has no competition for attention. For stores that want the offer to feel like part of the cart rather than an interruption, the drawer is safer. Test both against cart-to-checkout rate, not just against attach rate. ## Product Add-ons vs Bundles on Shopify — Pick the Offer That Fits the SKU URL: https://ninety9.dev/blog/product-addons-vs-bundles.html Published: 2026-07-06 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 1 minutes When a product add-on converts better than a bundle, when a bundle is the only honest structure, and how to avoid stacking both on the same product page. A bundle says "this is the product". An add-on says "this product, plus a small yes". Mixing them on one page asks the shopper to solve two different problems at once. Most of them solve neither. ## The test Would you be willing to give the combination its own URL, its own photos and its own inventory? If yes, it is a bundle. If no — if the extra only makes sense attached to something else — it is an add-on. Gift wrap is an add-on. A skincare routine of cleanser, serum and moisturiser is a bundle. A spare charging cable next to a lamp is an add-on. A "desk kit" of lamp, cable and bulb sold as one price is a bundle. ## Why add-ons convert on the product page The shopper has already chosen the parent. The remaining question is small. A checkbox is the right UI: low commitment, high clarity, no new product to evaluate. That is also why add-ons fail when they look like products. A second product card with a price, a review stars row and a "learn more" link is a detour. Detours get skipped. ## Why bundles belong in the catalogue A bundle has a job the add-on does not: it can be found. It can rank. It can be advertised. It can have a margin structure you planned, rather than a last-second checkbox. If 40% of buyers of A also take B, stop hiding B as an add-on and make A+B a product. You will sell it to people who never visited A's page. ## Do not stack The product page can carry one incremental offer besides the buy box. If you already have a bundle selector, do not also drop three add-on checkboxes. If you already have add-ons, do not also run a "frequently bought together" strip that repeats the same SKUs. Pick the structure that matches the SKU. Kill the other one. Average order value goes up when the page asks one extra question, not four. ### FAQ **Is a frequently-bought-together widget a bundle or an add-on?** It behaves like an add-on — the shopper can take or leave the extra SKUs — even if you discount it like a bundle. Treat it as an add-on in the page layout: after the buy box, not instead of it. **Should add-ons be discounted?** Rarely. The shopper already wants the parent product. Discounting the extra trains them to wait for a deal on something they would have added at full price. **Can I turn a popular add-on into a bundle later?** Yes, and you should once a pair starts selling together more often than not. At that point the combination is the product, and a bundle price is honest. **Where do add-ons go on the page?** Directly under the add-to-cart button, as a checklist, not in a related-products carousel at the footer. Footer carousels are for browsing. Add-ons are for this purchase. ## FOMO in the Shopify Cart — Announcement Bars That Help Instead of Nag URL: https://ninety9.dev/blog/fomo-blocks-in-the-cart-drawer.html Published: 2026-07-05 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 2 minutes Which scarcity and urgency blocks belong in a cart drawer, which ones train shoppers to ignore you, and how to write a bar that is actually true. Fear of missing out is not a design style. It is a claim about the world. If the claim is true, it belongs in the cart — the shopper is already committed enough to have added something, and a true constraint can finish the job. If the claim is fake, it belongs in the bin, because this is the last moment of trust before payment. ## The only FOMO that belongs in a cart Three categories earn their pixel: 1. **Real inventory.** Variant-level stock, updated, not a theme setting of "3". 2. **Real promotions.** A sale that actually ends at a timestamp you will not quietly extend. 3. **Real delivery constraints.** Cut-off times for next-day dispatch that your warehouse actually keeps. Everything else — "27 people are looking at this", "in high demand", a timer that restarts at 15:00 every time you open the tab — is theatre. Theatre converts once and then trains your regulars to ignore you. ## One bar, not a stack Announcement bars compound badly. A free-shipping progress bar is a goal. A countdown is a deadline. A stock warning is a constraint. Pick the one that is actually true *for this basket* and silence the others. A useful default: - Progress bar if they are under a threshold you care about. - Delivery cut-off if they are over the threshold and you can still make a same-day dispatch. - Stock only on the line item that is actually scarce, not as a global banner. ## Writing the line Specific and boring beats vague and exciting. - Bad: "Hurry, selling fast!" - Good: "Order in the next 2 hours for dispatch today." - Bad: "Limited stock." - Good: "Only 2 left in Navy / M." If you cannot write the good version because the data is not there, you do not have a FOMO feature. You have a copy box. ## Trust is an AOV feature Shoppers who believe your cart will believe an upsell. Shoppers who have been burned by a fake timer will not. The quietest stores often have the highest take rates on in-cart offers, because nothing in the drawer has given them a reason to doubt the next sentence. ### FAQ **Do countdown timers increase conversions in the cart?** Real ones can, for genuine promotions with a real end time. Timers that reset when you reload the page train shoppers to distrust every other claim in the store, including the ones that are true. **How many FOMO blocks should a cart have?** One. A bar or a single line of stock/sales proof. A drawer that shouts in three places is a drawer shoppers learn to skim. **Is "only 3 left" okay if it is true?** Yes, if it is true at the variant level and updates. Inventory theatre ("only 3 left" on a SKU with 400 units) is worse than silence. **Should FOMO sit above or below the upsell?** Above the line items. It frames the basket. Below the upsell it reads as a caption on an offer, which is a different and weaker job. ## Cart Drawer Performance — Keep Shopify LCP Intact After You Add Upsells URL: https://ninety9.dev/blog/cart-drawer-performance-lcp.html Published: 2026-07-04 Category: CRO & Analytics · App: Addy: AI Cart Drawer & Bundles Reading time: 2 minutes How a slide cart can wreck Largest Contentful Paint, the loading pattern that does not, and the checks to run before and after you install a cart app. A cart drawer that costs you 200ms of Largest Contentful Paint is not a conversion feature. It is a tax on every session, including the ones that never open the cart. The rule is simple: the drawer does not exist until someone needs it. Everything else is implementation detail. ## Where drawers show up in the critical path Three patterns show up in real stores: 1. **The HTML is in the page.** The drawer markup is in the initial response, hidden with CSS. Images inside it still decode. Fonts still swap. LCP still pays. 2. **The JavaScript is in the page.** A 150KB bundle parses on every product page so that a drawer *could* open. Parse time is main-thread time. 3. **The app injects into theme.liquid.** This is the legacy pattern. It is also the one Shopify has spent years trying to kill, for good reason. The pattern that does not show up in LCP: a theme app extension, loaded asynchronously, that fetches drawer UI on first open and caches it for the session. ## What to measure Before you install anything, record on a representative product page: - Largest Contentful Paint - Total blocking time - Transfer size of JS on load Install the app. Repeat the same page, same device, same throttling. If LCP moved by more than a rounding error, the drawer is doing work at the wrong time. Do not trust a homepage test. Homepages often have a hero image that masks a JS regression. Product pages are where carts actually live. ## Images and upsells Every upsell card is an image request. If those requests start on page load, you have built a carousel the shopper did not ask for. Lazy-load thumbs. Decode on open. If the first open takes 200ms to paint, that is acceptable; it is a click later, not a tax on landing. ## The fail-safe If the app is unreachable, the drawer should not render and the theme's native add-to-cart should still work. A conversion widget that can take down add-to-cart is worse than no widget. Fail safe, always. ### FAQ **Will a cart drawer app slow my store down?** It should not. A well-built drawer loads asynchronously, renders only when opened, and never blocks the initial paint. If your Largest Contentful Paint changes after install, the app is in the critical path and you should replace it. **Does Shopify's theme app extension model guarantee speed?** It removes the worst failure mode — a script injected into theme.liquid that runs on every page. It does not stop an app from downloading a large bundle on load. Check the network panel. **Should I preload the drawer?** No. Preloading a UI the shopper has not opened yet is paying for work you may never need. Fetch on first add-to-cart, then keep it warm for the rest of the session. **What about app pixels and analytics in the cart?** Fire them on open or on offer impression, not on page load. Cart-level analytics that run on every product page are a common source of main-thread work that nobody asked for. ## Make Your Shopify Cart Drawer Match the Store — Without a Developer URL: https://ninety9.dev/blog/cart-drawer-brand-design.html Published: 2026-07-03 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 2 minutes How to brand a slide cart so it feels like part of the theme — colour, type, radius, spacing — and the three mistakes that make drawers look like a third-party widget. The fastest way to make a cart drawer convert less is to let it look like software. Shoppers have a well-trained eye for third-party widgets: the slightly wrong radius, the font that is almost Inter but not the one the rest of the site uses, the checkout button in a blue the brand never uses. A drawer is supposed to feel like a continuation of the page. If it does not, the shopper treats it as a detour. ## Four tokens, in order Match these before you touch anything else: 1. **Background.** Same as the page, or one step sunken. Not a new colour. 2. **Typeface and size.** The heading in the drawer should be the same family and roughly the same scale as a section heading on the product page. 3. **Radius.** If your buttons are pills, the drawer corners and the checkout button are pills. If your theme is 4px, do not ship 16px. 4. **Primary button colour.** The checkout button is the brand's primary CTA, not the app's default. Get those four right and the drawer disappears into the store. Get them wrong and no amount of upsell logic will make it feel native. ## The checkout button is the design Everything in the drawer exists to support one action. Progress bars, upsells and trust badges are useful; they are not the hero. If the checkout button does not win the visual hierarchy, you have decorated a form. A useful check: screenshot the open drawer and blur it. You should still be able to point to the checkout button. If you cannot, increase contrast, size or isolation — not the number of badges around it. ## What not to customise Do not add a second logo in the drawer header. Do not add a decorative illustration. Do not change the overlay into a branded colour wash. These are the tells that someone "designed the app" instead of continuing the store. Custom CSS is for the last 5%: a one-pixel border, a font-feature setting, a focus ring. If you are writing a stylesheet, the settings model failed. ## Markets and multiple carts If you run Shopify Markets, the drawer has to survive more than one theme accent. The durable approach is to inherit tokens per market rather than hard-coding a single brand colour. A US storefront on a warm palette and a JP storefront on a cooler one should not share a hex code just because they share an app. ### FAQ **Do I need to edit theme.liquid to brand the cart?** Not with a theme app extension. Colours, fonts and radii should be settings in the app, mapped to your theme's existing tokens. If an app requires a Liquid edit to change a button colour, it is the wrong app. **Should the drawer be light or dark?** Match the storefront. A dark drawer on a light store looks like a takeover, not a continuation. The one exception is a store that already uses a dark header or a dark product page. **How close does the match need to be?** Close enough that a screenshot of the open drawer could be mistaken for a native theme section. If a designer on your team can spot the app in under two seconds, shoppers can too. **What about the overlay behind the drawer?** Keep it quiet. A heavy dim or a blur that kills the product page behind it undoes the continuity that made you choose a drawer in the first place. ## How to Reduce Order Cancellations Without Losing the Customer URL: https://ninety9.dev/blog/reduce-order-cancellations.html Published: 2026-07-02 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 6 minutes The five reasons customers cancel, which of them are actually solvable, and how to build a deflection flow that saves orders instead of trapping people. A cancellation looks like a lost sale, which is why most stores treat it as a customer service problem to be minimised rather than a signal to be read. That framing misses the interesting part. Very few cancellations are a rejection of the product. Most are the correction of a mistake, or a reaction to something the store told them after checkout that it should have told them before. Both are addressable, and reading the reasons tells you where. ## The five reasons, and what each one means ### 1. "I made a mistake" Wrong size, wrong colour, wrong quantity, wrong address, duplicate order. Almost always the largest single category. **What it means:** the customer still wants to buy from you. They just want a different version of what they ordered. **The fix:** an edit flow. Cancelling is a workaround for the absence of one. Offer the edit and most of these disappear entirely. ### 2. "It's taking too long" The customer has not received a dispatch notification within the timeframe they imagined, and their imagination was calibrated by a marketplace that ships same day. **What it means:** an expectation was never explicitly set, so the customer invented one. **The fix:** show the actual delivery estimate — in the cart before purchase, on the confirmation, and again in the cancellation flow. A large share of "taking too long" cancellations arrive before the promised window has even passed. ### 3. "I found it cheaper" Price comparison after purchase, which is more common than most merchants assume. **What it means:** the purchase was price-led rather than brand-led. That is worth knowing. **The fix:** a price match, or an incentive to keep the order. This is one of the few cases where a discount is genuinely the right instrument. Whether it is worth it depends on your margin and whether this customer has repeat potential. ### 4. "I changed my mind" Genuine reconsideration. Buyer's remorse, budget change, or the purchase was impulsive. **What it means:** usually nothing actionable at the individual level, but a rising share here can indicate that a promotion is driving low-quality demand. **The fix:** limited. A modest incentive recovers some. Do not fight hard for these. ### 5. "Something unexpected" Payment issue, duplicate charge, a family member already bought it, an address that turned out to be wrong. **The fix:** make the process painless and make sure the refund is fast. The goal here is that the customer comes back, not that they stay. Every deflection flow should ask why before offering anything. An offer that ignores the reason converts poorly and reads as tone-deaf. Offering ten percent off to someone whose parcel is going to the wrong address is worse than offering nothing. ## Designing the deflection flow The sequence that works, in four steps. ### Step 1: Make the intent easy to express The cancellation link should be findable in the order confirmation email and in the customer account. Hiding it does not prevent cancellations; it converts them into support tickets and chargebacks. ### Step 2: Ask why, with a short list Five or six options, plus a free-text field. Keep it to one screen. The list should map to the categories above, in your customers' language rather than yours. This step alone is worth building even if you never offer a deflection, because the data is genuinely valuable. ### Step 3: Respond to the specific reason | Reason | Best response | Why | |---|---|---| | Wrong item or size | Open the edit flow | Fixes the actual problem | | Wrong address | Open the address edit | Same | | Taking too long | Show the real delivery estimate | Usually resolves it outright | | Found it cheaper | Price match or incentive | Only case where discount is first choice | | Changed my mind | Small incentive, or let go | Limited upside | | Ordered by mistake | Cancel immediately, no friction | Fighting this damages the relationship | Note how few rows call for a discount. The reflex is to offer money; the better answer is usually to fix the thing. ### Step 4: If they still want to cancel, let them One offer, then the cancel button works. A flow that requires three dismissals produces chargebacks and reviews, both of which cost multiples of the order value. A hidden cancel link, a required phone call, or a confirmation dialogue that repeats itself will occasionally save an order. It will also reliably generate a chargeback - which costs the order value plus a fee plus a mark against your account - and a public review that costs more than either. The maths does not work. ## What to offer, and what it should cost If an incentive is the right response, size it against the true value of the saved order — not the order total. The value of a saved order is roughly: ``` gross profit on the order + avoided refund processing cost + avoided restocking cost (if fulfilled) + probability-weighted lifetime value of the retained customer ``` For a first-time customer on a $70 order at 55% margin, gross profit alone is $38.50. Spending $7 to save it is clearly worthwhile. Spending $25 probably is not, unless your repeat rate is high enough that the lifetime value term dominates. Options ranked by cost to you: 1. **Fix the problem** (free) — edit the order, correct the address, swap the variant. 2. **Provide information** (free) — the real delivery date, the returns policy, stock status. 3. **Add value** (low cost) — a free gift, expedited shipping, an extended returns window. 4. **Discount the current order** (direct cost) — a partial refund or credit. 5. **Store credit** (deferred cost) — often better received than a discount and it keeps the customer. Start at the top. Most stores start at four. ## Cancellations before fulfilment vs after Two different problems. **Before fulfilment**, a cancellation is a database change. It should be self-service, immediate, and free of friction. There is no operational reason to involve a human. **After fulfilment**, it is a return in disguise. The parcel exists. Handle it as a return, be explicit that the item needs to come back, and consider whether a carrier intercept is cheaper than a return journey. Blurring these two is a common source of customer frustration, because a customer told "cancelled" who then receives a parcel has been given wrong information at the worst moment. ## Reading the reason data After a few months, the reason distribution becomes one of the more useful reports in the business. - **Rising "wrong size"** → your size guide or product photography is unclear. Fix the product page, not the cancellation flow. - **Rising "taking too long"** → either fulfilment has slowed or your pre-purchase delivery messaging is absent. Check which. - **Rising "found it cheaper"** → you are competing on price in a channel where you should not be, or a competitor has moved. - **Rising "changed my mind"** → often correlates with a promotion driving low-intent traffic. Check the source. - **Clustering by product** → that product page is over-promising. - **Clustering by country** → that market's delivery expectations or duty treatment is not being communicated. Each of those points at a fix somewhere earlier in the funnel, which is where cancellations are actually prevented. The deflection flow catches what leaks through; the product page and the delivery promise are what stop the leak. ## Measuring it - **Cancellation rate** as a percentage of orders, tracked weekly. - **Reason distribution**, and its trend. - **Deflection rate** — cancellations started but not completed ÷ cancellations started. - **Deflection cost per saved order.** Total incentive value ÷ orders saved. - **Chargeback rate.** The guardrail. If deflection rate rises and chargebacks rise with it, the flow has become too aggressive. - **Repeat purchase rate of customers who cancelled.** The long guardrail — a customer who cancelled easily and came back is a better outcome than one who was talked out of it and never returned. ### FAQ **What is a normal order cancellation rate?** It varies widely by category and fulfilment speed, but for most direct-to-consumer stores it sits in the low single digits as a percentage of orders. What matters more than the absolute figure is the reason distribution, because that tells you which cancellations were preventable. **Should I make cancelling difficult?** No. A difficult cancellation converts into a chargeback, a negative review, or a customer who never returns - each of which costs more than the order. Make cancelling easy, and put a genuinely useful alternative in front of it. **What is the best cancellation deflection offer?** It depends on the reason. For a wrong item or wrong address, offer the edit rather than an incentive. For delivery concerns, show the real delivery estimate. Discounts are the most expensive option and should be reserved for reasons that have no operational fix. **When should customers be able to cancel themselves?** Up to fulfilment. Before a label is printed a cancellation is a database change; after it, it becomes a warehouse operation and often a carrier intercept. Automatic self-service cancellation before fulfilment and a support route after is the right split. **Does capturing a cancellation reason actually help?** It is one of the highest-value datasets a store can collect. Over a few months the reason distribution shows you exactly where the funnel is over-promising, which product pages are unclear, and which fulfilment lanes are too slow. ## Shipping Protection in the Shopify Cart — When It Helps and When It Annoys URL: https://ninety9.dev/blog/shipping-protection-in-the-cart.html Published: 2026-07-02 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 2 minutes How to offer shipping protection without looking like a dark pattern, where to place it in the cart, and the pricing that shoppers will actually accept. Shipping protection is one of the few cart add-ons that can raise average order value without asking the shopper to want another product. That is the appeal. It is also why it is so often implemented badly. The failure mode is familiar: a pre-ticked box, a $2.49 line the shopper did not notice, and a support ticket three days later. You made two dollars and spent twenty in goodwill. ## What shoppers think they are buying They are not buying "peace of mind". They are buying a specific promise: if the parcel is lost, stolen or damaged, they will not have to fight a carrier. If your copy cannot name those three outcomes, do not sell the add-on. Specific cover converts. "Package protection" does not, because it sounds like a fee with a slogan attached. ## Where it belongs in the cart Below the line items, above the checkout button, never inside a nested accordion. The shopper should see: 1. What it is. 2. What it costs. 3. A toggle that is off by default. A cart drawer is the right surface. The shopper is looking at the order they are about to pay for; an add-on that attaches to *this* shipment is easier to evaluate than one on a product page they have already left. ## Pricing that does not feel like a tax A useful starting range is 1.5% to 3% of subtotal, with a floor around $0.99 so a $12 order is not paying a 10% "protection" fee, and a ceiling so a $400 order is not paying $12 for a sticker. Round numbers beat $1.37. If you cannot explain the price in one sentence ("covers loss, theft and damage on this shipment"), the price is wrong or the product is. ## The trust test Ask one question before you turn it on: if a parcel goes missing this week, will you actually make this shopper whole without a fifteen-email thread? If the answer is no, shipping protection is a conversion trick, and conversion tricks get refunded in reviews. Used honestly, it is a small AOV lift and a quieter support queue. Used as a pre-ticked fee, it is a tax. Shopify shoppers have learned to tell the difference. ### FAQ **Is shipping protection a dark pattern?** Pre-checking it is. Offering it, clearly, with an opt-in, is not. The test is whether a reasonable shopper notices they added it and could remove it in one tap. **Should protection be a percentage or a flat fee?** A percentage tracks the risk; a flat fee is easier to understand. Many stores do better with a small flat fee on low AOVs and a capped percentage above a threshold. **Will it hurt conversion?** A forced add-on will. A clearly optional line with a short benefit statement usually does not, and the shoppers who take it are the ones most anxious about delivery — exactly the group you want to reassure before checkout. **Do I need a third-party insurer?** If you are going to pay claims, yes, or you are self-insuring. Do not sell cover you cannot honour. That is both a legal problem and a review-bomb waiting to happen. ## Cart Drawer vs Cart Page — Which Shopify Cart Converts More URL: https://ninety9.dev/blog/cart-drawer-vs-cart-page.html Published: 2026-07-01 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 2 minutes When a slide-out cart drawer beats a dedicated cart page, when it does not, and the hybrid pattern that keeps high-intent shoppers from bouncing. The cart is not a page type. It is a moment. Someone has decided to buy and has not yet paid. Everything you put in that moment either moves them toward checkout or gives them a reason to leave. Shopify stores still split into two camps: a dedicated `/cart` page, and a slide-out drawer that opens on top of whatever the shopper was already looking at. The right answer is usually the drawer. The interesting part is the exceptions. ## What a cart page actually costs A cart page is a full navigation. The product disappears. Scroll position is lost. The only prominent forward action is checkout, which means the natural next move after "I might want one more thing" is to leave your catalogue entirely and start again from the collection. That cost is invisible in most analytics, because it does not show up as a bounce from `/cart`. It shows up as a shopper who added one item, opened the cart, closed it, and never added the second. ## Why the drawer wins for most stores A drawer keeps the product page behind it. Closing it returns the shopper to the exact pixel they left. Adding a second item is one click, not a round trip. That is the whole thesis. Continuity is the conversion feature. Upsells, progress bars and delivery estimates are what you *do* with the continuity once you have it. ## When a cart page is still the right tool Use a full page, or at least offer one, when any of these are true: - Carts routinely run to eight or more line items. - Products need per-item configuration (engravings, subscriptions, custom options). - You sell B2B quantities where a drawer cannot show unit prices, breaks and notes without becoming a spreadsheet. - Your shoppers compare several variants in the cart before committing — common in furniture, bikes and technical apparel. In those cases a drawer feels cramped, and cramped carts get abandoned. ## The hybrid that actually ships Keep the drawer as the default after add-to-cart. Pin a quiet "View full cart" link under the line items for the sessions that need it. Do not make the full cart the primary path. Auto-open the drawer on add-to-cart. A drawer that only appears when someone clicks the bag icon is a cart page with extra animation — you have paid the engineering cost and captured none of the continuity. ## What to measure Do not A/B test "drawer vs page" on the homepage. Test it on add-to-cart. The numbers that move are items per order, add-to-cart-to-checkout rate, and time from first add to checkout start. If those three do not improve, the drawer is not doing its job — usually because it is slow, it is empty of offers, or it does not open by itself. ### FAQ **Should I hide the cart page entirely if I use a drawer?** No. Keep /cart as a fallback for shoppers who bookmark it, for themes and apps that still link there, and for the minority of sessions with large or complex baskets. Route add-to-cart through the drawer; leave the page in place. **Does a cart drawer work on mobile?** It should. Mobile is where the continuity argument is strongest, because a full cart page costs a whole viewport of context. Test the drawer at 390px width with three line items, an upsell and a progress bar before you ship. **Will a drawer reduce checkout clicks?** It should not add any. Checkout from the drawer should go straight to Shopify checkout, the same destination as the cart page. The win is fewer people abandoning before they get there. **What if my theme already has a cart drawer?** Replace it rather than stacking. Two drawers fighting for the same add-to-cart event is a common source of double-open bugs and duplicate upsells. ## How to Run a Different Cart for Every Shopify Market URL: https://ninety9.dev/blog/shopify-markets-cart-personalization.html Published: 2026-06-30 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 5 minutes Free shipping thresholds, delivery promises and offers that make sense in one country are wrong in another. A practical guide to per-market cart personalisation on Shopify. Most stores that sell internationally are running one cart in every country. The currency changes, and nothing else does. That is a bigger problem than it looks, because almost every number in a cart is a claim about logistics — and logistics are the thing that varies most across borders. A free shipping threshold encodes your domestic shipping cost. A delivery estimate encodes your domestic carrier's transit time. A returns promise encodes your domestic returns address. Show all three unchanged to a shopper two thousand kilometres away and at least one of them is wrong. ## What actually differs between markets Before deciding what to personalise, it helps to be precise about what varies. | Variable | Varies by market? | Consequence if ignored | |---|---|---| | Shipping cost to fulfil | Heavily | Free shipping threshold is unprofitable or uncompetitive | | Transit time | Heavily | Delivery estimates become false promises | | Average order value | Moderately | Thresholds sit at the wrong percentile of the distribution | | Price sensitivity | Moderately | Discount depth is over- or under-calibrated | | Duties and taxes | Heavily | Cart total surprises the shopper at checkout | | Payment expectations | Moderately | Express checkout options are irrelevant or missing | | Language | Absolutely | Trust collapses at the worst possible moment | | Returns logistics | Heavily | You promise something you cannot deliver cheaply | Only two of those are solved by currency conversion. The rest need a decision. ## Start with the delivery estimate If you change one thing, change this. An estimated delivery date in the cart is one of the highest-value pieces of information you can show, because it answers the question shoppers most often leave to go and look up. It also has the highest cost when it is wrong, because a missed date is a support ticket, a refund request and a review. The rule is simple: the estimate shown must be the estimate for the shopper's actual destination, based on the actual carrier and lane you will use. If you cannot compute that reliably for a market, show a range wide enough to be true, or show nothing. A vague honest range beats a precise false one. ## Then the free shipping threshold A threshold is a profit decision disguised as a marketing one. The maths behind it: > The gross profit on the incremental spend required to reach the threshold must exceed your average shipping cost to that market. Which means the threshold must move when either side of that inequality moves — and both sides move across borders. Setting it properly per market: 1. Pull the order value distribution **for that market only**, last 90 days. 2. Find the 60th–75th percentile. 3. Compute your average fulfilment cost to that market, including duties if you absorb them. 4. Check that gross margin on the gap between median order value and the threshold covers that cost. 5. Round to a number that reads naturally in the local currency. That last step matters more than it sounds. A threshold of "€68" produced by converting $75 looks like an algorithm ran. "€70" looks like a decision. Shoppers respond to round numbers as goals in a way they do not respond to arbitrary ones. Setting a threshold at your average order value is the most common mistake. Roughly half your orders already clear it, so you are paying for shipping you would not otherwise have paid for and changing nobody's behaviour. Sit it above the median, in the band where a meaningful group of shoppers is close but not there. ## Localise the copy, not just the currency Cart copy is short, high-stakes and frequently the last untranslated surface on an otherwise localised store. The strings that matter most: - The progress bar sentence, which is the one shoppers actually read. - The delivery estimate, including the date format. `08/09` means two different months on two sides of the Atlantic — use a spelled-out month. - Trust and returns text. - The checkout button, and any express payment labels. - Error states, which are the most-neglected and the most damaging. ## Segment beyond geography Market tells you about logistics. Customer tag tells you about relationship, and the two together produce a much better cart than either alone. Useful segments: - **First-time visitor.** Needs trust blocks, a visible returns policy and an achievable first goal. Does not need your highest reward tier — they will not reach it. - **Repeat customer.** Already trusts you. Reclaim the trust-block space for a replenishment suggestion or a higher-tier reward. - **High-value / VIP.** A threshold calibrated to the general population is meaningless here. Give them a tier that is actually a stretch. - **Wholesale or B2B tagged.** Should not see consumer discount mechanics at all. Different cart, not a different block. - **Discount-code arrivals.** Already have a discount. Stacking a second one on top is margin you did not need to spend. ## Separate carts vs conditional blocks The instinct when you first get per-market capability is to build a cart per market. Resist it. Five separate carts means five places to update when you change your returns policy, five layouts drifting apart over a year, and five things to test after every theme update. It is the CMS equivalent of copy-pasting a component. The better default is one base cart with conditional blocks: - Progress bar block → threshold value conditional on market. - Delivery estimate block → shown only where you can compute it. - Duties notice block → shown only in markets where you do not absorb duties. - Trust block → shown only to first-time visitors. - Wholesale notice → shown only to tagged accounts. Reserve a genuinely separate cart for markets that differ *structurally* — a region where a promotion is legally restricted, or a wholesale channel with entirely different mechanics. Some markets restrict specific promotional mechanics. Countdown timers, "was/now" pricing and automatic add-ons all have jurisdiction-specific rules, particularly in the EU. Those are compliance conditions, not personalisation, and they should be enforced at the block level rather than left to whoever edits the cart next. ## A rollout that will not break anything 1. **Audit.** List every number and every claim currently in your cart. Mark which are true in all markets. Most stores find three or four that are not. 2. **Fix the falsehoods first.** Delivery estimates and returns claims before optimisation. This is a trust repair, not a growth project. 3. **Split the threshold** for your two largest non-domestic markets only. Measure for a month. 4. **Translate** the cart strings for every language you sell in. 5. **Add segment conditions** — first-time versus repeat — once the geographic layer is stable. 6. **Review quarterly.** Shipping rates and order distributions both drift. A threshold set eighteen months ago is almost certainly wrong now. ## What to measure, per market The mistake is looking at blended numbers. A change that lifts revenue in your largest market and quietly kills conversion in a smaller one will look like a win in aggregate. Track per market: - Cart-to-checkout rate - Average order value - Percentage of orders above the free shipping threshold - Gross profit per order after shipping and duties - Support tickets mentioning delivery or shipping cost That last one is the leading indicator. A rise in delivery-related tickets in a specific market almost always means the cart is promising something the fulfilment chain cannot deliver. ### FAQ **What is the difference between Shopify Markets and multi-currency?** Multi-currency converts prices at checkout. Shopify Markets is the broader configuration layer that lets you control catalogue, pricing, domains, languages and duties per region. Cart personalisation should key off Markets, because currency alone tells you nothing about shipping cost, delivery time or local expectations. **Should free shipping thresholds be converted or set independently?** Set independently. A converted threshold produces numbers like 68.42 that read as arbitrary, and more importantly it ignores the fact that your shipping cost and your average order value are different in every market. Set each threshold from that market's own order distribution and shipping economics. **How many different carts should I actually build?** As few as possible. Most stores need one base cart plus conditional blocks, not five separate carts. Separate carts should be reserved for markets that differ structurally, such as a wholesale region or a country where a promotion is legally restricted. **Do I need translated cart text for every market?** You need it for every language you sell in, which is usually fewer than the number of markets. Untranslated cart copy is one of the most visible trust failures in international ecommerce because it appears at the exact moment the shopper is deciding to hand over money. **Can I target the cart by customer tag as well as market?** Yes, and the two together are more useful than either alone. Market determines shipping and delivery reality; customer tag determines what kind of relationship you have. A repeat customer in Germany and a first-time visitor in Germany should see different reassurance and different reward tiers. ## Popup Triggers Ranked — Timed, Scroll, Add-to-Cart, Checkout and Exit URL: https://ninety9.dev/blog/popup-triggers-ranked.html Published: 2026-06-23 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 5 minutes Not all popup triggers are equal. A ranked comparison of the six common triggers by intent quality, conversion risk and the offers that suit each one. Every popup discussion focuses on the offer. The offer matters much less than the trigger, because the trigger determines who sees it — and showing a good offer to the wrong person at the wrong moment is worse than showing nothing. Here are the six common triggers, ranked by the quality of the intent signal they read. ## The ranking | Rank | Trigger | Intent signal | Conversion risk | Best use | |---|---|---|---|---| | 1 | Add to cart | Very strong — explicit commitment | Very low | Upsell, cross-sell | | 2 | Checkout initiation | Very strong — about to pay | Low | Last relevant offer, reassurance | | 3 | Exit intent | Strong — leaving anyway | None | Recovery, retention | | 4 | Cart value threshold | Moderate — engaged shopper | Low | Goal reminder, gift unlock | | 5 | Scroll depth | Weak — engagement, not intent | Medium | Content offers only | | 6 | Time on page | None | High | Almost nothing | The gap between rank 3 and rank 4 is the important one. The top three read a *decision*. The bottom three read a *behaviour* that may or may not indicate anything. ## 1. Add to cart The strongest trigger available. The visitor has performed the single most explicit intent action on your site short of paying. **What makes it good:** commitment already happened, so nothing is at risk. Attention is peaked because the shopper is watching for the result of their click. The purchase frame is active. **What it suits:** a complementary accessory, a quantity upgrade, a bundle completion. Priced at 15–40% of the item just added. **How it fails:** firing on every single add, obscuring the checkout path on mobile, or leading with the offer instead of confirming the add. Confirm first, always. **Cap:** once per session. ## 2. Checkout initiation The shopper has clicked through to checkout. Intent is essentially maximal. **What makes it good:** the last moment you control before the shopper leaves your storefront for Shopify's checkout. Anything you want to say has to be said now. **What it suits:** one final relevant offer, a threshold reminder ("you're $9 from free shipping"), or a reassurance block for high-value carts. **How it fails:** anything that feels like an obstacle between the shopper and payment. This trigger has the smallest error budget of the three good ones. Keep the popup light, make the continue action dominant, and never require an interaction to proceed. **Cap:** once per session, and never twice in the same checkout attempt. ## 3. Exit intent The visitor is leaving. There is, structurally, no conversion left to lose. **What makes it good:** the only trigger with zero conversion downside. Whatever it recovers is incremental. **What it suits:** cart recovery, a threshold reminder, a save-my-cart email, a related recommendation, and — as a last resort — a discount. **How it fails:** mobile detection is much weaker than desktop, so mobile exit popups produce false positives that interrupt people who were not leaving. And habitual discounting at exit trains returning visitors to trigger it deliberately. **Cap:** once per session, once per week per visitor. ## 4. Cart value threshold Fires when the cart crosses or approaches a value. A weaker signal than the top three, but a real one: the shopper has built a basket. **What it suits:** goal reminders, gift unlocks, "add $12 more for free shipping". **Important caveat:** most of the time this should not be a popup at all. A progress bar in the cart drawer does the same job persistently, without interrupting anything. Reserve the modal for a genuinely notable moment — unlocking a significant tier, for instance. ## 5. Scroll depth Fires at a percentage of page scroll. Reads engagement, not intent. Scroll depth tells you someone kept reading. That correlates loosely with interest and not at all with purchase intent. Someone who scrolled 70% of a blog post is engaged with the post, which is a reason to offer them more content and not a reason to interrupt them with a product. **What it suits:** content offers on editorial pages. Little else. **How it fails:** on product pages, where it fires at people who were reading the specifications — which is exactly what someone about to buy does. ## 6. Time on page The worst common trigger, and the most widely deployed. Time measures nothing about the visitor. Five seconds in, a person might be about to add to cart, about to leave, reading carefully, or distracted by something else entirely. Firing at all of them equally means interrupting the ones who were converting in order to reach the ones who were not. This is the trigger responsible for the general reputation of popups, and there is almost no case where a better trigger is not available. If you must use it — for a genuine site-wide announcement, say — pair it with conditions: not on the first pageview, not for returning customers, not on product pages, and with a long delay rather than a short one. Popups that cover the main content immediately on arrival from search can affect mobile search performance. Triggers that respond to user action - add to cart, checkout, exit - are not affected, because they are responses to interaction rather than barriers to content. Timed popups on landing pages are the ones at risk. ## Rules that apply to every trigger **One popup per session.** Set this globally. Multiple modals competing on the same visitor is the fastest way to make all of them perform worse. **Suppress after conversion.** Anyone who has purchased in this session should see nothing. **Suppress after dismissal.** A no is an answer. **Segment first-time and returning visitors.** They have different information needs and different discount economics. A returning customer rarely needs the reassurance a first-timer does, and rarely needs the discount either. **Respect device context.** A modal that works on a 27-inch monitor may cover the entire viewport on a phone. Test the small-screen version with the browser chrome visible. **Make everything dismissible with the keyboard.** `Escape` must close it, focus must be trapped while open and returned on close. This is an accessibility requirement with legal weight in a growing number of jurisdictions. ## A configuration worth copying For a typical Shopify store: | Trigger | Where | Offer | Cap | |---|---|---|---| | Add to cart | Product pages | One complementary accessory | 1 / session | | Checkout initiation | Cart | Threshold reminder, no discount | 1 / session | | Exit intent | Cart and checkout only | Save-cart or delivery reassurance | 1 / week | | Nothing | Collection, blog, home | — | — | Three triggers, three purposes, no overlap, and nothing that fires at someone who has not shown intent. ## Measuring by trigger, not in aggregate Blended popup metrics hide everything. A timed popup with a terrible take rate and an add-to-cart popup with a good one average out to something meaningless. Per trigger, track: - **Fire rate** — impressions ÷ eligible sessions. Unexpectedly high means your conditions are too loose. - **Engagement rate** — interactions ÷ impressions. - **Conversion contribution** — sessions that converted after seeing it ÷ sessions shown. - **Guardrail metric**, which differs by trigger: cart-to-checkout for add-to-cart popups, checkout completion for checkout-initiation popups, return-visit rate for exit popups. The guardrail is the number that tells you whether the trigger is earning its place. Take rate alone will always make a popup look successful, because it only counts the people who said yes. ### FAQ **What is the best popup trigger for a Shopify store?** Add to cart, for upsells, because it fires immediately after a commitment signal. Exit intent is the best trigger for retention offers because there is no conversion left to risk. Checkout initiation sits between them. Timed and scroll triggers are much weaker because neither measures purchase intent. **Why are timed popups bad?** Because time on page measures nothing useful. A visitor five seconds in might be about to buy, about to leave, or reading. Firing at everyone equally means interrupting the people who were converting in order to reach the ones who were not, which is a bad trade at any conversion rate. **How many popups should a store run at once?** One active at a time per visitor, with a global frequency cap. Multiple popups competing on the same session produce a hostile experience and degrade the performance of each. Set a site-wide rule that only one modal can appear per session. **Should popups fire on mobile?** Some triggers translate and some do not. Add to cart and checkout initiation work identically. Exit intent is much weaker because there is no cursor. Timed and scroll popups are worse on mobile than desktop because the viewport is smaller and a modal covers everything. **Do popups affect SEO?** Intrusive interstitials that cover the main content immediately on arrival from search can affect mobile rankings. Popups triggered by user action - add to cart, checkout, exit - are not affected, because they are responses to interaction rather than barriers to content. ## Free Gift With Purchase — Choosing a Gift That Pays for Itself URL: https://ninety9.dev/blog/free-gift-with-purchase-strategy.html Published: 2026-06-16 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 5 minutes How to pick a gift with real perceived value and low landed cost, where to set the threshold, and the operational traps that turn a good GWP into a support queue. A free gift with purchase is one of the more powerful average-order-value mechanics available, and one of the easiest to run at a loss without noticing. The reason is that the cost side is visible — you know what the gift costs — while the value side is not. A gift with a $2 landed cost that nobody wants produces nothing. A gift with a $6 landed cost that customers genuinely value can move a meaningful share of your order distribution. The whole exercise is picking the second kind. ## Perceived value and landed cost are different variables Most stores optimise only for cost, which is how you end up giving away branded stickers. The number that matters is the ratio: > **Gift efficiency** = perceived value to the customer ÷ landed cost to you Landed cost includes the unit cost, the additional pick-and-pack time, and any change to shipping weight or box size. A gift that pushes a parcel into the next weight bracket is far more expensive than its unit cost suggests. Perceived value is what the customer believes they got. It is heavily influenced by whether the item has a visible price elsewhere on your site — which is why "worth $18" is credible for a product you actually sell and meaningless for a promotional item that has never had a price. | Gift type | Perceived value | Landed cost | Efficiency | |---|---|---|---| | Travel/sample size of your bestseller | High | Low | **Excellent** | | Full-size product you also sell | Very high | High | Poor — and cannibalising | | Exclusive item not sold separately | Medium–high | Low–medium | Good | | End-of-line stock | Medium | Very low (sunk) | **Excellent** | | Branded merchandise | Low | Medium | Poor | | Digital guide or content | Low–medium | Near zero | Situational | | Consumable accessory | Medium | Low | Good | ## Why sample and travel sizes win They score well on every axis at once. - **Perceived value is anchored** to a product with a known price. Customers understand what a 30ml version of a 200ml product is worth. - **Landed cost is genuinely low**, often a fraction of the full-size margin. - **They do not cannibalise**, because a sample is not a substitute for the full size — it is an advertisement for it. - **They seed future purchases.** A customer who tries a new product from your range because it arrived free has been introduced to a second line at zero acquisition cost. That last effect is the one that makes samples pay for themselves twice, and it is why beauty and supplements categories have used the mechanic for decades. ## Avoid full-size giveaways of active products Giving away the full-size version of something you actively sell creates two problems. **Direct cannibalisation.** Customers who would have bought it now get it free. That is not a promotion, that is a discount with extra logistics. **Price anchoring damage.** A product routinely given away develops a perceived value close to zero. Once customers learn that item X comes free above $120, buying item X at full price starts to feel like a mistake. The exception is deliberate: giving away a product you are discontinuing or overstocked on. There the sunk cost is real and the anchoring damage does not matter because you are exiting the line anyway. ## Threshold placement A gift threshold works best as the **second rung of a ladder**, not as a standalone offer. A typical structure derived from an order value distribution: - **Free shipping** at the 60th–75th percentile — the entry goal, reached by many. - **Free gift** at roughly the 85th percentile — the stretch goal, reached by fewer. That shape works because the second goal appears at the moment the first is met, which is exactly when a shopper would otherwise stop adding. It also means the gift is only given to genuinely larger orders, where the margin comfortably absorbs it. Setting the gift threshold *below* free shipping inverts the logic — the cheaper reward sits above the more valuable one — and setting them at the same value wastes one of them. ## Letting the customer choose A choice of two or three gifts consistently outperforms a single fixed gift. The reasons are straightforward: choice raises perceived value, it increases the chance that at least one option appeals, and it produces genuinely useful preference data about your catalogue. Keep it to three. Beyond that you add decision cost, multiply your inventory exposure across several SKUs, and make the picker interface something that needs designing rather than something that fits in the cart. ## The operational traps This is where free gift promotions actually fail. ### Stockouts The most common and the most damaging. The gift is not a product the customer bought, so a stockout feels like a broken promise rather than a supply issue. Requirements: - Reserve stock specifically for the promotion, separate from sellable inventory. - Suppress the offer automatically the moment stock hits your reserve floor. - Handle in-flight carts explicitly. A gift that silently disappears between cart and confirmation is worse than one that was never offered. ### Returns If a customer returns enough of the order to fall below the gift threshold, what happens to the gift? Most policies do not say, which means the default is that the customer keeps it. Usually that is the right answer — chasing a $4 sample is not worth the support interaction — but decide it deliberately and write it down, because at scale it is a real cost line. ### Shipping weight and packaging A gift that changes the parcel dimensions or pushes it into the next weight bracket can cost more in freight than in goods. Check the actual packed configuration before launching, not the unit cost in a spreadsheet. ### Multiple gifts in one order Does a $400 order get one gift or three? Almost always one. Make sure the rule is enforced in the cart logic rather than assumed. Free items still have a customs value on international shipments and may still attract VAT depending on jurisdiction. A gift declared at zero value on a commercial invoice can cause customs delays. Check the treatment for your main export markets before rolling out internationally. ## Copy that works The gift needs framing, not just listing. - **Name the item and its value.** "Free 30ml travel size (worth $18)" beats "free gift" substantially, because "free gift" could be anything and the shopper assumes the worst. - **Show it.** A product image in the progress bar or cart converts better than text alone. - **State the gap.** "Add $23 more for a free travel size" — same pattern as the shipping bar. - **Make the earned state obvious.** When it is unlocked, show it in the cart as a line item at $0.00 so the customer can see they have it. ## Measuring it - **Take rate** — orders above the gift threshold as a share of all orders, before and after launch. - **Incremental orders crossing the threshold**, not just the total above it. Some were always going to be there. - **Gift cost as a percentage of revenue.** The direct cost. - **Gross profit per order** above the threshold versus below it. The verdict. - **Repeat purchase rate of the gifted product's full-size version.** This is the sampling payoff, and it usually takes a full purchase cycle to appear — often 60 to 120 days. That last one is why sample-based gifts are frequently undervalued in a monthly report. The revenue shows up a quarter later and in a different line item, so the promotion looks more expensive than it was. ### FAQ **What makes a good free gift with purchase?** High perceived value relative to landed cost, genuine relevance to what the customer is already buying, and small physical size so it does not disrupt packing or shipping weight. Travel and sample sizes of your own products usually score best on all three. **What threshold should a free gift be set at?** Above your free shipping threshold, so the two form a ladder rather than competing. A common structure is free shipping at the sixtieth to seventy-fifth percentile of order values and a gift somewhere around the eighty-fifth, which gives shoppers who clear the first goal a reason to keep going. **Should customers choose their gift?** A choice of two or three increases perceived value and take rate, and gives you useful preference data. More than three adds decision cost without adding much appeal, and it multiplies your inventory exposure. **Does a free gift cannibalise sales of that product?** It can, which is why full-size versions of products you actively sell are usually a poor choice. Sample sizes, travel sizes, exclusive items and end-of-line stock avoid the problem because there is no full-price version competing with the giveaway. **What happens if the gift runs out of stock?** The offer must be suppressed the instant stock hits your reserve level, and any cart already showing the gift needs a clear message rather than a silent removal. A promised gift that fails to arrive generates more damage than the promotion generated value. ## Estimated Delivery Dates — The Most Underrated Conversion Lever in the Cart URL: https://ninety9.dev/blog/estimated-delivery-date-shopify.html Published: 2026-06-09 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 6 minutes Why showing an arrival date beats showing a shipping speed, how to calculate one you can actually honour, and where in the funnel it earns the most. Ask a shopper what they want to know before they check out and delivery timing will be in the first three answers. Look at what most Shopify stores show them and you will find either a shipping speed, a policy link, or nothing at all. That gap is unusual in ecommerce, because closing it is cheap, technically straightforward and produces a measurable effect on both conversion and support load. It just does not look like a growth lever, so it stays on the backlog behind things that do. ## Why a date beats a speed "Ships in 1–2 business days, delivery 3–5 business days" is a sentence that asks the reader to do work. To turn it into an answer they need to know: what time your cut-off is, whether today counts, whether Saturday counts, whether the two ranges are additive, and what your carrier does over a public holiday. Most people will not do that calculation. They will approximate it, get it wrong, and either accept a vague sense of "about a week" or go and look for a clearer answer somewhere else. "Arrives Tuesday 26 August" removes all of it. There is no arithmetic, no assumption and no ambiguity. It is also, importantly, a *commitment*, which is a different psychological object from an estimate — and commitments are what shoppers use to decide. The gap widens on mobile, where the shopper is more likely to be doing something else at the same time and much less likely to sit and work out what "3–5 business days from Thursday" means. ## What uncertainty costs you The mechanism is specific and worth naming, because it explains where the value comes from. A shopper in your cart who is unsure about delivery has three options. Guess and continue. Leave the cart to find your shipping policy. Or abandon. The middle option is the expensive one, and it is the most common. It requires navigating away from the cart, finding a policy page written for legal completeness rather than for answering this question, parsing a table, and then finding their way back. Every step in that sequence is a place to lose them, and the policy page is a particularly good place to lose them because it usually does not answer the question either. Putting the date in the cart removes the reason to leave. "Where is my order" is consistently the largest single category of ecommerce support contact. A significant share of those tickets arrive *before* the expected delivery window has passed, from customers who never had a clear window in the first place. Setting the expectation up front removes the ticket before it is written. ## Calculating a date you can honour The estimate is the sum of four components. Getting it right is mostly about not forgetting any of them. 1. **Order cut-off.** Orders after your daily cut-off do not start processing until the next working day. This is the component most often omitted, and it is why so many estimates are systematically one day optimistic. 2. **Processing time.** From paid to handed to the carrier. Be honest about this. If your warehouse takes two days during peak, the peak estimate is two days. 3. **Transit time.** Per carrier, per service level, per destination lane. Not one global number. 4. **Non-working days.** Weekends, and the public holidays of both the origin and destination country. Then apply a confidence policy. You have two reasonable choices: - **A range** — "26–30 August". Honest, easy to hit, slightly less persuasive. - **A single date at a high percentile** — the date you hit 90% of the time, not the date you hit on a good week. Persuasive, and safe if you actually use the percentile rather than the median. What you must not do is show the best-case date. A promise you keep two thirds of the time is worse than no promise at all, because the third of customers you miss are now customers with a specific grievance rather than a vague disappointment. Transit times in late November are not transit times in April, and neither are warehouse processing times. An estimate engine that does not widen during peak will generate its largest volume of missed promises during the period when a missed promise costs you the most. ## Where to show it Three surfaces, in descending order of value. ### The cart Highest value, because this is where uncertainty converts directly into abandonment. The shopper has committed to the products and is now evaluating the transaction as a whole, and delivery timing is the largest remaining unknown. Place it near the subtotal, in the same visual group as the shipping line. It should read as part of the transaction summary, not as a marketing message. ### The product page Second, and it does a different job. In the cart the date removes an objection; on the product page it influences the add-to-cart decision itself, particularly for gift purchases and anything with a deadline. "Order within 4 hours for delivery Tuesday" is the strongest legitimate form of urgency available to an ecommerce store, because it is simply true. ### The order confirmation Third, and mostly a support-cost play rather than a revenue one. Repeating the date after purchase reinforces the expectation and removes the reason for the customer to write in on day three. ## Localisation is not optional here Of everything in a cart, the delivery estimate is the element that varies most by destination — and therefore the element most damaged by showing one global value. Three rules: - **Compute per destination lane.** Domestic transit time shown to an international shopper is not an estimate, it is a false claim. - **Use the destination's calendar.** Public holidays at the destination affect final-mile delivery. So do the origin country's holidays for dispatch. - **Format the date unambiguously.** `08/09` is 8 September in most of Europe and 9 August in the US. Spell the month. If you cannot compute a defensible estimate for a market, show nothing there. An absent estimate is neutral. A wrong one is a liability. ## The honest limits Delivery dates are not a magic lever and it is worth being clear about where they do not help. - **If your delivery is genuinely slow**, showing the date will reduce conversion on those orders. That is the estimate working correctly — you are filtering out customers who would have been disappointed and become refund requests. It is a short-term loss and a long-term gain, but it is a real short-term loss. - **If your fulfilment is unpredictable**, an estimate makes the unpredictability visible and quantifiable, which will generate complaints you were previously absorbing invisibly. Fix fulfilment first. - **If you dropship from multiple origins**, a single order can have several arrival dates. Showing one date for a multi-origin order is worse than showing per-item dates, even though per-item dates look messier. ## What to measure - **Cart-to-checkout rate**, before and after. This is where the effect should show up first. - **Add-to-cart rate** on product pages that gained the estimate. - **"Where is my order" ticket volume** as a share of orders. Expect a meaningful decline. - **On-time delivery rate against the shown estimate.** This is the guardrail. If it drops below your target percentile, widen the estimate rather than hoping. - **Refund and cancellation rate** for late orders specifically. The last two are what keep this honest. An estimate engine is only as valuable as the promise it makes is reliable, and the only way to know that is to score yourself against the date you displayed rather than the date you hoped for. ### FAQ **Should I show a delivery date or a shipping speed?** A date. "2-4 business days" requires the shopper to know your cut-off time, your processing time and which days count as business days, and to do that arithmetic in their head. "Arrives Tuesday 26 August" answers the question they actually have. Every study of this comparison finds the date wins, and it wins by more on mobile. **What if I cannot predict delivery reliably?** Show a range wide enough to be honest, or show nothing for that lane. A range like "26-30 August" is far better than a single date you miss a third of the time. The cost of an unmet promise is much higher than the benefit of a tighter one. **Does an estimated delivery date reduce support tickets?** Substantially, yes. "Where is my order" is the single most common support contact in ecommerce, and a large share of it is generated before the expected window has even passed, by customers who never had a clear expectation set in the first place. **Where should the delivery estimate appear?** The cart has the highest value because that is where uncertainty causes abandonment. The product page is second because it influences the add-to-cart decision. The order confirmation is third and mostly reduces support load rather than driving revenue. **Do delivery dates need to change per country?** Yes, and this is the most common way stores get it wrong. A domestic transit time shown to an international shopper is not an estimate, it is a false claim. If you cannot compute the estimate for a market, do not show one there. ## Letting Customers Change Their Shipping Address After Checkout URL: https://ninety9.dev/blog/change-shipping-address-after-checkout.html Published: 2026-06-02 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 5 minutes The most common post-purchase support request, why manual handling is expensive, and how to automate it safely including zone changes, fraud checks and the fulfilment cutoff. Ask any ecommerce support team what they answer most often after "where is my order" and the answer will be some version of "I put the wrong address". It is the most common post-purchase request, it is almost entirely mechanical, and in most stores it is handled by a person reading an email, opening the admin, checking the fulfilment status and typing an address into a form. Six to eight minutes of skilled labour for something that is, technically, a database update. ## Why it happens so often Address errors are not carelessness. They are structural. - **Autofill inserts a stale address.** The browser remembers where someone lived two years ago. - **The customer is buying a gift** and enters their own address by reflex. - **They moved recently** and typed the old one from muscle memory. - **A unit or apartment number is missing**, which is the single most common cause of a failed delivery. - **They meant to ship to work** and did not switch. - **Express checkout used a saved address** they had forgotten about. None of these are preventable at checkout, because in every case the customer believed the address was right at the time. The error is discovered afterwards, when the confirmation email arrives and they actually read it. Which means the confirmation email is the moment of highest detection — and it is also, conveniently, before you have printed anything. Most address errors are noticed within minutes of the confirmation email. Most orders are not fulfilled for hours. That overlap is the entire opportunity, and it is wide enough that even a short self-service window catches the large majority of cases. ## What a failed delivery actually costs Worth quantifying, because it is the number that justifies building this. A parcel sent to a wrong or incomplete address will typically: 1. Attempt delivery and fail. 2. Sit at a depot, then return to sender — a second shipping leg, often charged at a premium. 3. Arrive back and need inspecting and restocking. 4. Trigger a refund or a reship, plus the support conversation around it. So the direct cost is roughly outbound shipping plus return shipping plus restocking labour. On top of that, a meaningful share of customers who experience a failed delivery simply do not reorder — so a portion of the time you also lose the order and the customer. Set against that: the cost of letting the customer fix their own address in the four hours before you print a label is essentially zero. ## The rules you need Self-service address editing is safe, but not unconditionally. Five rules cover almost everything. ### 1. Close the window at fulfilment Non-negotiable. Once a label exists, the destination is fixed. Changing it means a carrier intercept, which is slow, frequently chargeable, sometimes impossible, and never a good customer experience. The interface should reflect the order state rather than relying on a policy. When the order is fulfilled, the address edit option is not there. ### 2. Validate the new address Run the replacement through the same validation as checkout. An unvalidated correction can easily be worse than the original error — someone fixing a typo can introduce a different one. Where you have address autocomplete at checkout, use it here too. ### 3. Handle zone changes explicitly If the new address falls in a different shipping zone, three options: - **Recalculate and collect the difference.** Correct, and adds friction. - **Restrict to the same zone.** Simplest, and covers the majority of genuine corrections since most are a typo in the same city. - **Absorb the difference.** Fine at low volume, an unmanaged cost line at scale. For international orders this matters more than the shipping cost, because a country change alters duty treatment, tax and sometimes whether you can legally ship the product at all. Cross-border address changes should generally be blocked and routed to support. ### 4. Add fraud controls There is a known pattern: place an order with a verified billing address to pass fraud screening, then redirect the parcel elsewhere after the fact. Reasonable mitigations without punishing legitimate customers: - Restrict changes to the same country. - Block changes above an order value threshold, and route them to manual review. - Require an authenticated session rather than accepting a link from an email alone. - Log every change with a timestamp and IP address. - Flag any order where the address changes more than once. ### 5. Notify everyone involved An address change must propagate. The customer gets a confirmation showing the new address in full. Your fulfilment system gets the update before picking. If a 3PL or warehouse management system is involved, confirm that the change reaches it — a change that updates Shopify but not the WMS is worse than no change at all, because now two systems disagree and the wrong one is holding the parcel. This is the most common way self-service address editing goes wrong. Shopify shows the new address, the warehouse has already downloaded the old one, and the parcel ships to the original destination with a confirmation email saying otherwise. Verify the integration handles updates, not just creations, before enabling this. ## Where to put it Three surfaces, all worth having. **The order confirmation email.** The highest-value placement by a wide margin, because it coincides with the moment of detection. A visible "Need to change your address?" link, not buried in the footer. **The customer account order page.** Where people look when they think about their order later. **The order status page.** Shopify's post-purchase page is where customers land from tracking links, and it is a natural home for edit actions. ## The upside beyond cost saving A customer on your address-edit screen is a customer who has just come back to your site, deliberately, with their order in mind, before it has shipped. Two things follow from that: **Adding an item costs you nothing in fulfilment.** The parcel has not been packed. An extra item goes in the same box, on the same label, with the same handling. The marginal fulfilment cost of an add-on at this moment is close to zero, which is not true anywhere else in the journey. **The friction is already cleared.** They are authenticated, their payment method is on file, and the shipping decision is made. An additional purchase is fewer clicks here than on any storefront page. Keep the offer secondary — the customer came to fix an address and the address field must be the first thing they see — but the slot below it is one of the highest-converting placements you own. ## Rollout 1. **Same-country address changes only**, before fulfilment, validated. This alone handles the majority of requests. 2. **Add the link to the confirmation email**, which is where the detection happens. 3. **Verify the fulfilment integration** propagates updates. Test with a real order. 4. **Add fraud rules** — value threshold, authentication requirement, change logging. 5. **Add the recommendation block** below the address form. 6. **Then consider** zone-change handling with rate recalculation, if the restriction is generating support volume. ## Measuring it - **Address-change support tickets per 100 orders**, before and after. The primary metric, and it should move within two weeks. - **Self-service address change rate** — changes made ÷ orders eligible. - **Failed delivery rate.** The slower, more valuable metric. - **Return-to-sender volume and cost.** - **Revenue from items added during an address edit.** The upside. - **Fraud rate on orders with a changed address**, compared with baseline. The guardrail — if it rises, tighten the rules. ### FAQ **Can a customer change their shipping address on a Shopify order?** Not through any native self-service interface. A merchant can edit the shipping address from the Shopify admin, but the customer has no built-in way to do it themselves, which is why this request dominates post-purchase support queues. **How late can a shipping address be changed?** Safely, up to the moment the order is fulfilled and a label is generated. After that the address on the label is fixed and changing the destination requires a carrier intercept, which is slow, often chargeable, and not always successful. **What if the new address is in a different shipping zone?** Either recalculate and collect the difference, or restrict the change to addresses within the same zone. Silently absorbing a zone change works at low volume and becomes an unmanaged cost at scale, particularly on international orders where duty treatment also changes. **Is allowing address changes a fraud risk?** There is a known pattern where a fraudulent order is placed with a verified billing address and then redirected. Mitigate it with rules - restrict changes to the same country, block changes on high-value orders, and require the account to be logged in rather than accepting a link alone. **How much does a failed delivery actually cost?** The outbound shipping, the return leg, the restocking labour, and frequently the entire order because a meaningful share of customers do not reorder after a failed delivery. Against that, the cost of letting the customer correct their own address before dispatch is close to zero. ## BOGO on Shopify — When Buy One Get One Works and When It Destroys Margin URL: https://ninety9.dev/blog/bogo-offers-shopify.html Published: 2026-05-26 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 5 minutes The four BOGO variants, the margin floor each one requires, why BOGO free is usually the wrong choice, and the categories where it genuinely outperforms a discount. Buy one get one free is arithmetically a 50% discount on two units. It does not feel like one, which is exactly why it is used, and exactly why it is dangerous. The perception gap is real and well documented: shoppers rate "buy one get one free" more favourably than "50% off two", despite the identical outcome. That gap is worth money. It is also worth exactly nothing if your gross margin cannot absorb the arithmetic. ## The four variants and what each costs | Variant | Effective discount on the pair | Minimum gross margin to break even | |---|---|---| | Buy 1 get 1 free (same item) | 50% | ~50% | | Buy 1 get 1 half price | 25% | ~25% | | Buy 2 get 1 free | 33% | ~33% | | Buy X get Y free (cheaper item) | Depends on price ratio | Typically 25–35% | "Break even" here means the gross profit on the promoted pair matches the gross profit on a single unit sold at full price. It is a floor, not a target — and it assumes zero cannibalisation, which is never true. ## Why BOGO free is usually the wrong choice At a 55% gross margin, a $40 product yields $22 of gross profit. Give one away free and you have sold two units for $40. Your cost of goods is now $36, so your gross profit on the pair is $4 — against $22 for a single full-price sale. That is only worthwhile if the promotion creates a large number of buyers who would otherwise have bought nothing at all. In most categories it does not. It creates buyers who would have bought one. Run the comparison properly, per 100 promotion buyers, at a 55% margin on a $40 product: | Scenario | Would have bought 1 | Would have bought 0 | Gross profit | Baseline (no promo) | Net | |---|---|---|---|---|---| | Pessimistic | 80 | 20 | $400 | $1,760 | **−$1,360** | | Realistic | 60 | 40 | $400 | $1,320 | **−$920** | | Optimistic | 30 | 70 | $400 | $660 | **−$260** | At 55% margin, BOGO free loses money even in the optimistic case. You need margin well above 60% before the arithmetic works — which is why BOGO free is common in categories like fashion accessories, cosmetics and supplements, and rare in electronics or food. The single question is: what is my gross margin on the promoted item? If the answer is below sixty percent, BOGO free is almost certainly the wrong instrument, and buy one get one half price will produce a similar perception at half the cost. ## Buy one get one half price: the workhorse The variant that works for most stores. Effective discount on the pair is 25%, which most healthy consumer margins absorb comfortably. It still reads as a two-for-one style offer rather than as a percentage discount, so it keeps a good share of the perception advantage. At the same $40 product with 55% margin: two units sell for $60, cost of goods $36, gross profit $24 — *higher* than the $22 from a single full-price sale. The promotion is profitable from the first cannibalised customer onward, which is a completely different risk profile. ## Cross-category BOGO is usually better "Buy any jacket, get a beanie free" beats "buy one jacket get one free" on nearly every dimension. - **Lower cost**, because the free item is cheaper than the anchor. - **No cannibalisation of the anchor**, since you are not giving away a second unit of something the customer wanted one of. - **Introduces a second product line**, which has downstream value the same way a sample does. - **No price anchoring damage** to your hero product. The main design constraint is relevance. The free item must be something the customer plausibly wants, or the offer reads as clearing out dead stock — which, if that is what it is, will be obvious. ## Where BOGO genuinely works The format performs where **consumption scales with supply** — where having two means using two, rather than using one and storing the other. Good fits: - **Consumables with flexible usage.** Skincare, supplements, cleaning products, snacks. Having more leads to using more. - **Items that wear out or get lost.** Socks, phone cables, hair ties. - **Gifting categories**, where the second unit has an obvious separate recipient. - **Seasonal items with short windows**, where clearing stock has its own value. - **Trial-driving cross-category offers**, where the free item introduces a new line. Poor fits: - **Durables.** Nobody needs two kettles. - **Slow consumables with a fixed cycle.** If a bottle lasts three months, two bottles last six, and you have discounted a sale you were going to make at full price anyway. - **High-consideration purchases** where the decision is about which, not how many. - **Low-margin categories**, for the arithmetic above. Ask: if this customer takes the second unit, when will they next buy from me? If the answer is "later than they otherwise would have", the promotion has moved revenue in time rather than created it — and you paid a discount for the privilege. ## Operational details **Which item is free?** The cheaper one. State it explicitly in the offer terms; customers who expect the more expensive one to be free will feel misled, and support will spend their week on it. **Mixed variants.** Can they combine a small and a large? Usually yes, and usually the lower-priced variant is the free one. Decide it and enforce it in the rules. **Stacking.** BOGO plus a site-wide code plus a free shipping threshold produces an effective discount well beyond what you modelled. Either exclude BOGO items from code stacking or raise the free shipping threshold for orders containing one. **Returns.** If a customer returns the paid item and keeps the free one, what is the refund? The standard answer is to refund the paid amount minus the value of the retained free item. Write the rule down before it happens. **Inventory.** BOGO consumes stock at twice the rate of a normal promotion. A BOGO that sells out in a day is a marketing cost with no revenue attached. ## Presentation - **Show the saving as currency, not percentage.** "Save $40" is the point of BOGO. Converting it to a percentage discards the reason you chose the format. - **Show the second item as a $0.00 line** in the cart, so the customer can see it landed. - **Auto-add where you can.** Requiring the customer to manually add the second item to qualify loses a share of the take rate to confusion. - **State the terms in one line.** "Add 2 items, cheapest is free. Discount applied at checkout." - **Give it an end date.** An indefinite BOGO becomes the price. The perception advantage evaporates once it is permanent. ## Measuring it - **Units per order** on promoted products, versus baseline. - **Effective discount rate** — total discount ÷ promoted revenue, including any stacking. - **Gross profit per order** during the promotion versus the comparable period before. - **Post-promotion dip.** The critical one. Track sales of the promoted product for the four weeks *after* the promotion ends. A deep trough means you pulled demand forward rather than creating it, and the promotion's true cost includes that trough. - **New customer share** of promotion buyers. If it is high, the promotion is doing acquisition work and deserves to be judged partly on lifetime value rather than on first-order margin. ### FAQ **Is BOGO the same as a fifty percent discount?** Buy one get one free is arithmetically identical to fifty percent off two units, but it does not read that way to shoppers, who consistently rate it as a better deal. That perception gap is the entire reason to use the format, and it is also why it is easy to run at a loss without noticing. **What margin do I need to run BOGO free?** Above fifty percent gross margin just to break even on the pair, and realistically above sixty percent to make it worthwhile once shipping and returns are included. Below that threshold, use buy one get one half price or a percentage discount instead. **Does BOGO work better than a percentage discount?** It depends on the category. BOGO performs well where a second unit is genuinely useful - consumables, socks, seasonal items, gifting. It performs poorly where the second unit simply postpones the next purchase, because you have discounted a sale you would have made anyway at full price. **Should the free item be the cheaper or the more expensive one?** The cheaper one, almost always. "Get the lower-priced item free" is standard, it protects margin, and shoppers expect it. Discounting the more expensive item makes the offer significantly more costly with only a marginal increase in appeal. **Can BOGO cannibalise full-price sales?** Yes, and this is the main hidden cost. Customers who would have bought one unit at full price now buy two at an effective discount. If your baseline repeat-purchase cycle is short, you may simply be pulling forward a sale you were going to make anyway. ## The Shopify Cart Abandonment Checklist — 21 Fixes Ranked by Effort URL: https://ninety9.dev/blog/shopify-cart-abandonment-checklist.html Published: 2026-05-19 Category: Cart & Checkout · App: Addy: AI Cart Drawer & Bundles Reading time: 5 minutes Every common cause of cart abandonment, what each one actually costs, and how long it takes to fix — ordered so you can start at the top and work down. Cart abandonment is usually discussed as a single number, which makes it feel like a single problem. It is not. It is twenty or so separate problems that happen to share an outcome, and they have wildly different costs and wildly different fix times. This is the full list, ordered so you can start at the top. ## First, measure the right thing Before fixing anything, make sure you are measuring the stage that is actually leaking. - **Cart-to-checkout rate** — shoppers who created a cart and reached the checkout page. Leakage here is about cost, delivery, trust and cart design. - **Checkout completion rate** — shoppers who reached checkout and paid. Leakage here is about form friction, payment methods and account requirements. They have almost no overlap in causes. Fixing checkout forms when your problem is an unexpected shipping fee is a quarter spent on the wrong thing. ## Tier 1 — under an hour, no developer ### 1. Show shipping cost before checkout The largest single cause of abandonment, and the cheapest to fix. Put an estimate in the cart, or a flat rate on the product page, or a free shipping threshold. Anything except a surprise at step four. ### 2. Add a free shipping progress bar Turns the shipping conversation from a cost into a goal. Set the threshold from the 60th–75th percentile of your order value distribution, not from your average. ### 3. Show an estimated delivery date A date, not a speed. Removes the most common reason a committed shopper leaves the cart to go and look something up. ### 4. Make the variant obvious in the cart "Blue / Large" visible without hovering. Ambiguity here sends shoppers to a second tab to double-check, and second tabs are where sessions die. ### 5. Put returns policy in the cart One line, not a link. "Free 30-day returns" as text beats a link to a policy page, because the link requires leaving. ### 6. Remove the discount code field, or hide it An empty discount code box tells every shopper that a code exists and they do not have it. Many will leave to search for one. Collapse it behind a small "Have a code?" toggle, or remove it entirely and use automatic discounts. A shopper who leaves to search for a discount code lands on a coupon aggregator full of ads for your competitors. This is a self-inflicted wound and it is fixed with a CSS change. ## Tier 2 — an afternoon ### 7. Enable express checkout Shop Pay, Apple Pay, Google Pay, PayPal. On mobile these convert dramatically better than a form because they skip data entry entirely. Place them below your primary checkout button, not above it. ### 8. Turn off required account creation Guest checkout should be the default path. Offer account creation after the order, on the confirmation page, where it costs nothing. ### 9. Add trust signals to the cart Payment security, support availability, returns window. Small and quiet. This matters most for first-time visitors and can be conditioned to show only for them. ### 10. Fix the mobile cart Open your cart on a real mid-range Android phone. Check that the checkout button is reachable with a thumb, that nothing overlaps the home indicator, and that the drawer scrolls without trapping the page behind it. ### 11. Add a cart drawer instead of a cart page Keeps the shopper in context. Removes a full navigation cycle from the add-more-items path. ### 12. Localise the cart Currency, language, delivery estimate and threshold per market. A domestic promise shown internationally is a broken promise. ## Tier 3 — a week ### 13. Audit checkout field count Every optional field you can remove is a small conversion gain. Company name, address line 2 and phone number are the usual suspects. Phone in particular should be optional unless your carrier genuinely requires it. ### 14. Add relevant in-cart upsells Counter-intuitively this can *improve* cart-to-checkout rate, not just AOV, because a well-chosen accessory makes the purchase feel more complete. It can also hurt it if you add too many. Two offers maximum, measured against a guardrail. ### 15. Fix your page speed Cart interactions that take more than a moment to respond feel broken. Measure the time from add-to-cart click to drawer visible on a throttled connection. Anything over a second is a problem. ### 16. Handle out-of-stock gracefully An item going out of stock between add and checkout should produce a clear message and a suggested alternative, not a generic error at the payment step. ### 17. Add duties and tax clarity for international orders Delivered-duty-unpaid orders that surprise the customer with a customs bill generate refusals, returns and one-star reviews. State the position in the cart. ### 18. Offer more payment methods where they matter iDEAL in the Netherlands, Klarna in the Nordics, Bancontact in Belgium. A missing local payment method is close to a hard block, not a preference. ## Tier 4 — ongoing ### 19. Recover with email and SMS Worth running, and worth being honest about: recovery is a safety net. Every cart it saves is one you paid to acquire twice. First message within an hour, second at 24 hours, stop at three. ### 20. Add exit-intent offers at the cart stage For shoppers who are leaving anyway, there is no conversion left to lose. One relevant offer, triggered on the leave signal rather than on a timer. ### 21. Run a post-purchase survey Ask the customers who *did* buy what nearly stopped them. It is the cheapest qualitative research available and it consistently surfaces causes that analytics cannot see. ## The ranked summary | # | Fix | Effort | Typical impact | |---|---|---|---| | 1 | Show shipping cost before checkout | Minutes | Very high | | 2 | Free shipping progress bar | Minutes | High | | 3 | Estimated delivery date | Hour | High | | 7 | Express checkout methods | Hour | High on mobile | | 8 | Remove forced account creation | Minutes | High | | 6 | Hide the discount code field | Minutes | Medium | | 11 | Cart drawer instead of cart page | Hours | Medium | | 12 | Localise the cart | Day | High if international | | 13 | Reduce checkout fields | Day | Medium | | 18 | Local payment methods | Days | Very high in affected markets | | 19 | Recovery email flow | Day | Medium | ## What not to do Three tactics that appear on most abandonment listicles and should not be on yours: - **Fake countdown timers.** A timer that resets on refresh is a false statement about your commercial terms. It is enforceable as one in several jurisdictions and shoppers notice more often than you expect. - **Fabricated stock scarcity.** "Only 2 left" when there are two hundred is the same problem with a different label. - **Exit popups on every page.** Exit intent belongs at the cart and checkout stage, where the shopper has demonstrated purchase intent. On a collection page it is just an interruption. The pattern is consistent: tactics that lie work briefly and then stop working, and they take your review score with them. Everything in the twenty-one above works because it removes a real obstacle, which means it keeps working. ### FAQ **What is a normal cart abandonment rate?** Around seventy percent is the widely cited figure across ecommerce, and it has been stubbornly stable for a decade. Your own rate matters more than the benchmark, and the useful version of the metric is measured from cart creation to order rather than from session start, because the latter mixes in browsing that was never going to convert. **What causes most cart abandonment?** Unexpected cost at checkout, consistently. Shipping fees, taxes and duties revealed at the final step account for a larger share than any other single cause. The rest is spread across account creation requirements, slow or confusing checkout, payment method gaps, delivery uncertainty and simple comparison shopping. **Do abandoned cart emails work?** They recover a meaningful minority of carts and are worth running. They are not a substitute for fixing the cart, because every cart the email recovers is one you also paid to acquire twice and delayed by hours. Treat recovery as a safety net rather than a plan. **Should I show shipping costs before checkout?** Yes. Hiding shipping until the final step reliably produces the largest abandonment spike in the funnel. Either display an estimate in the cart, offer a threshold that makes it free, or state the flat rate on the product page. Any of the three beats a surprise. **How do I know which fix to do first?** Look at where in the funnel the drop happens. A large gap between cart and checkout points at cost, delivery uncertainty or trust. A large gap inside checkout points at form friction, payment options or account requirements. Fix the stage that leaks, not the one that is easiest to change. ## Shopify Product Bundles — Every Type, the Pricing Maths, and What Converts URL: https://ninety9.dev/blog/shopify-product-bundles-guide.html Published: 2026-05-05 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 6 minutes The eight bundle types that work on Shopify, how to price each one without eroding margin, and how to tell which of them fits your catalogue. Most bundle advice starts with layout. Grid or slider, two columns or three, badge in the corner or across the image. None of that is why bundles succeed or fail. Bundles succeed or fail on two things: whether the combination answers a question the customer is actually asking, and whether the maths underneath is profitable. Everything else is decoration on top of those two decisions. ## Match the bundle to the question Every shopper looking at a product page is asking one of three questions. The bundle type that works is the one that answers the question they are asking. | Their question | Bundle type | Why it fits | |---|---|---| | "Which one should I get?" | Curated fixed bundle | You have made the decision for them | | "How many should I get?" | Quantity break | Reframes the choice from *whether* to *how many* | | "What else do I need?" | Cross-sell / frequently bought together | Completes a set they already understand | | "Can I make this mine?" | Mix-and-match, build-a-box | Control is the value, discount is secondary | | "Is this worth trying?" | Sample pack | Reduces the risk of an unfamiliar category | Selling a build-a-box to someone asking "which one should I get?" gives them more decisions when they wanted fewer. Selling a curated set to someone who wants control feels restrictive. The mismatch, not the offer, is usually what kills the take rate. ## The eight types that work on Shopify ### Fixed bundle A defined set at a defined price. Highest margin control, lowest flexibility. Best when your expertise is the value — a starter kit, a routine, a complete setup. The failure mode is including one item nobody wants. A fixed bundle is only as attractive as its weakest component, because the shopper mentally subtracts the item they will not use from the value. ### Quantity break Buy 2 save 10%, buy 3 save 15%. The simplest bundle to run and often the most profitable, because it requires no pairing logic and no new product decisions. Works on consumables, replenishables, and anything where the real question is *how many*. Does not work on considered single purchases. ### Mix-and-match Pick any three from this collection, get a discount. Combines choice with a reason to buy more, and it works particularly well when your catalogue has genuine variety within a category — flavours, scents, colours. ### Build-a-box A structured version of mix-and-match with slots: pick one base, two add-ons, one extra. The structure is what makes it work; unlimited choice produces abandonment, constrained choice produces engagement. ### Multipack The same product in a larger unit. Effectively a quantity break presented as a product. Useful when the multipack has its own logic — a case, a family size, a travel set. ### Gift box Seasonal, curated, and presentation-led. The discount matters much less here than the packaging and the framing, because the buyer is not the user. ### Sample pack Low price, low risk, high information value. A paid product trial that improves AOV rather than costing acquisition budget. Excellent for categories where the customer cannot judge fit before trying. ### Frequently bought together Not strictly a bundle — a data-driven cross-sell presented as one. The most reliably converting of the lot when the pairs come from real order history rather than category tags. ## The maths that decides profitability Here is the calculation almost nobody runs before launching a bundle. A bundle is profitable when the gross profit from **incremental** units exceeds the discount given to **cannibalised** units. Concretely. You sell product A at $40 with a 55% margin ($22 gross profit) and product B at $25 with a 55% margin ($13.75). You bundle them at 15% off, so the pair sells for $55.25 instead of $65, giving away $9.75. Of 100 people who buy the bundle: - Some number would have bought both anyway. Every one of these costs you $9.75. - Some number would have bought only A. Each of these gains you B's gross profit minus the discount: $13.75 − $9.75 = $4. - Some number would have bought nothing. Each gains you the full bundle profit: $35.75 − $9.75 = $26. | Split | Cannibalised | A-only upgraders | New buyers | Net effect per 100 | |---|---|---|---|---| | Pessimistic | 60 | 35 | 5 | −$585 + $140 + $130 = **−$315** | | Realistic | 30 | 55 | 15 | −$292 + $220 + $390 = **+$318** | | Optimistic | 15 | 60 | 25 | −$146 + $240 + $650 = **+$744** | The same bundle, the same discount, three completely different outcomes — driven entirely by cannibalisation rate. Cannibalisation rate is the share of bundle buyers who would have bought everything in the bundle anyway. You can estimate it from your baseline attach rate: if 45% of people who buy A already buy B before you launch any bundle, your floor for cannibalisation is roughly 45%. ## Setting the discount Three principles, in order of importance. **Deep enough to be visible, shallow enough not to be the reason.** If your bundle only moves at 30% off, the combination is not solving a problem and you are just running a sale with extra steps. **Never below your incremental margin floor.** The discount must leave more gross profit than you would have made selling the anchor item alone. This is the hard constraint. **Show the saving both ways.** "$9.75 off" and "Save 15%" are the same fact, but shoppers anchor on whichever number is larger. On a $65 bundle, the percentage looks better. On a $400 bundle, the currency amount does. Show both and let them pick. ## Dynamic bundles, not bundle SKUs Two ways to build a bundle on Shopify, and only one of them is maintainable. **As a separate product.** You create a new SKU, set a price, and manage its inventory. This immediately breaks: stock levels for the component products no longer reflect reality, reporting double-counts, and a customer who buys the bundle and returns one item creates a mess. **As a dynamic offer.** The real products go in the cart and a discount applies at cart or checkout level. Inventory stays truthful, reporting works, partial returns are trivial, and you can change the bundle composition without creating a new SKU. Use dynamic bundles unless you are physically packing and shipping a distinct product, in which case it genuinely is a separate SKU. Dynamic bundle discounts interact with your other Shopify discounts according to your discount combination settings. Test the worst case: a bundle plus a site-wide promo code plus free shipping, on your lowest-margin product. Some stores discover their true floor only after a bad weekend. ## Placement **Product page** for curated bundles and quantity breaks. The shopper is still deciding, which is when a better option can change the outcome. **Cart** for accessories and completion offers. The decision is made, so additive offers cost nothing. **Both** is usually worse than either. Running the same offer on the product page and in the cart tends to lower the take rate of both, because the second showing reads as pressure rather than as a suggestion. ## Measuring bundle performance Per bundle, not in aggregate: - **Take rate** — bundle purchases ÷ views of the offer. Tells you about relevance. - **Incremental units** — units sold in bundles minus your pre-bundle baseline attach rate. Tells you whether it created anything. - **Effective discount rate** — total discount given ÷ total bundle revenue. Tells you what it actually cost, which is usually higher than the headline number once stacking is included. - **Gross profit per bundle order** compared with your non-bundle average. The only number that decides whether to keep it. Retire bundles that fail the last one, even when the take rate looks flattering. A popular bundle that loses money loses money faster the more popular it becomes. ### FAQ **What is the best type of bundle for a Shopify store?** It depends on the question your customer is asking. If they know what they want and are deciding how many, use quantity breaks. If they are unsure what goes together, use a curated fixed bundle. If they want control, use mix-and-match or build-a-box. If they have already chosen and just need accessories, use a cross-sell rather than a bundle. **How much should I discount a bundle?** Enough to be visible, not enough to be the reason. A discount in the ten to twenty percent range is usually sufficient to make a bundle feel like a deal without becoming the primary driver. If your bundle only sells at thirty percent off, the bundle is not solving a problem and the discount is doing all the work. **Do bundles hurt margin?** They hurt margin whenever they are bought by customers who would have purchased every item anyway. That is cannibalisation, and it is the real cost of a bundle. A bundle is profitable when the incremental units it creates outweigh the discount given to customers who needed no persuasion. **Should bundles be separate products or dynamic offers?** Dynamic offers in almost all cases. Creating a bundle as a separate SKU duplicates inventory management, breaks stock tracking on the component items and makes reporting harder. Dynamic bundles apply a discount to the real products at cart level and keep your inventory truthful. **Where should bundle offers appear?** The product page for curated and quantity offers, because that is where the shopper is still deciding. The cart for accessories and completion offers, because the decision is already made. Running the same offer in both places usually reduces the take rate of both. ## Post-Purchase Upsells — Why the Best Offer Comes After the Sale URL: https://ninety9.dev/blog/post-purchase-upsell-strategies.html Published: 2026-05-04 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 5 minutes The thank-you page, the order edit screen and the pre-dispatch window are the least contested upsell surfaces in ecommerce. Here is how to use each without touching conversion rate. Every upsell before checkout is a trade. You are asking for attention at a moment when attention is the scarce resource, and every additional element on the path to payment carries some risk of losing the order entirely. After checkout that trade disappears. The money is banked. The offer can fail completely and you are no worse off than if you had never made it. This is not a small structural advantage. It is the reason post-purchase deserves more attention than it usually gets, and it applies to three distinct surfaces with quite different properties. ## The three surfaces ### 1. The thank-you page Highest traffic — every single customer passes through it. Attention is genuinely high for the first few seconds because people want to confirm the order went through. **Strengths:** universal reach, high initial attention, natural place for a one-click add. **Weaknesses:** the customer's primary goal is confirmation, and the window is short. Many leave within seconds of seeing the order number. **What works:** a single, obviously-related offer with a one-click accept. Order details visible first, offer second. ### 2. The order confirmation email Reaches everyone, gets opened at extremely high rates — confirmation emails are among the most-read messages any store sends. **Strengths:** near-universal open rate, arrives at the moment people are re-engaging with the purchase, easy to include an edit link alongside. **Weaknesses:** an email cannot complete a transaction. Every offer here is a click away from the site, and email clients mangle complex layouts. **What works:** a simple "forgot something? add to your order before it ships" link, and a low number of visually simple recommendations. ### 3. The order edit screen, before dispatch The strongest surface, and the one most stores do not have. **Strengths:** - The customer arrived deliberately. Nobody is being interrupted. - The order has not shipped, so an added item goes in the same box on the same label. The marginal fulfilment cost is essentially zero. - Payment details are already on file. - They are, by definition, thinking about the order right now. **Weaknesses:** only reaches customers who come back to manage their order, which is a subset. **What works:** contextual recommendations below the primary task, framed as convenience rather than promotion. On a pre-checkout upsell you gain revenue and margin. On a pre-dispatch add-on you gain revenue, margin and the shipping economics, because the incremental item costs nothing extra to deliver. That is the highest-margin incremental sale available anywhere in the business. ## What to offer Ranked by how reliably it works. **1. Accessories for what they just bought.** The phone case, the extra filter, the matching strap. The relevance is self-evident and the customer does not have to think. **2. Quantity top-ups on consumables.** "Add a second one and save." No new decision — they have already decided they want this thing. **3. Items they viewed and did not buy.** You know what they considered. The friction that stopped them the first time is now largely gone. **4. Free shipping top-up.** Only if they are below a threshold and now adding items anyway. Works well on the edit screen, poorly on the thank-you page. **5. Subscription conversion.** For consumables, the post-purchase moment is a natural place to offer recurring delivery — they have just demonstrated the need. **6. Warranty or protection.** Higher-margin, and genuinely useful on considered purchases. Note the ordering. Discounted unrelated products do not appear, because they do not work. Relevance is doing the heavy lifting on every one of these. ## What to avoid **Delaying the confirmation.** If the customer cannot see their order number until they have dismissed an offer, you have made the single most important post-purchase job harder in exchange for a small conversion rate on the offer. The support cost exceeds the revenue. **Sequences.** Two offers is the practical ceiling, and the second should be an upgrade of the first rather than a new pitch. Three or more converts the confirmation into a funnel, and customers notice. **Countdown timers on the confirmation page.** Manufacturing urgency immediately after taking someone's money reads as manipulative in a way it does not pre-purchase. **Offers that require re-entering payment details.** If the customer has to type a card number again, the offer will not convert. Use the stored payment method through Shopify's post-purchase capabilities. **Discounts that undercut the order just placed.** Offering a code that would have made their completed order cheaper produces a support ticket, not a second sale. The most common post-purchase support question is where the order is. Any design that pushes tracking or order details below promotional content will increase that volume. Keep the informational content first and the offer clearly secondary - the revenue is not worth the queue. ## Sizing the incentive A useful frame: on a pre-dispatch add-on, your incremental cost is the cost of goods and nothing else. No additional shipping, no additional handling, no additional payment processing beyond the marginal fee. That means you can afford a deeper incentive than you could on the same item sold standalone — but usually should not, because the data consistently shows relevance outperforming depth on this surface. A reasonable default is a small incentive, in the range of five to ten percent, framed as a convenience of adding to an existing order rather than as a discount. The offer is doing its work through relevance and zero-friction checkout, not through price. ## The cannibalisation question A fair objection: are you selling something the customer would have bought at full price later? Sometimes, yes. The mitigation is the same as anywhere else — check whether total revenue per customer over a period rises, not just whether the offer converts. Two things work in your favour here specifically: - The alternative for many of these items is that the customer buys the accessory elsewhere, or not at all. Accessory attachment rates on separate visits are low. - Consolidating two purchases into one shipment saves you a full fulfilment cycle, which often covers the incentive by itself. Measure it properly, but the balance on this surface is unusually favourable. ## Rollout 1. **A single accessory recommendation on the thank-you page**, below the order details, with one-click add. 2. **An "add to your order" link in the confirmation email**, pointing at the edit screen. 3. **Recommendations on the edit screen**, below the primary edit form. 4. **Viewed-not-purchased items** as a second recommendation source once the first is working. 5. **Subscription or replenishment offers** for the consumable subset of the catalogue. Do not start with a multi-step post-purchase funnel. Start with one relevant item on one surface and read the numbers. ## Measuring it - **Attach rate** per surface — offers accepted ÷ offers shown. Expect the edit screen to lead comfortably. - **Incremental revenue per order**, which is the number that matters more than attach rate. - **Total revenue per customer over 60 days**, versus a holdout. This is the cannibalisation check. - **Support contacts about the confirmation or tracking.** The guardrail. If this rises, the offer has crowded out the information. - **Fulfilment exceptions.** Items added late must reach the warehouse before picking. If they do not, this shows up as short-shipped parcels. - **Refund rate on added items**, compared with the same items sold normally. A materially higher rate suggests the offer is persuading rather than helping. ### FAQ **What is a post-purchase upsell?** An offer shown after the customer has completed checkout - on the thank-you page, in the order confirmation, or on an order management screen before dispatch. The defining characteristic is that the original order is already secured, so the offer cannot reduce conversion rate. **Do post-purchase upsells hurt conversion rate?** No, and that is the central argument for them. The transaction has completed before the offer is displayed. The only risk is to customer experience, and that is a design problem rather than a structural one. **Which post-purchase surface performs best?** The pre-dispatch order edit screen, because the added item ships in the same parcel at no additional fulfilment cost and the customer arrived deliberately rather than being interrupted. The thank-you page has the highest traffic; the edit screen has the highest intent. **Should post-purchase offers be discounted?** A modest incentive helps, but relevance matters far more than depth. An accessory that obviously belongs with the item just purchased will outperform a heavily discounted unrelated product, and it protects your margin. **How many post-purchase offers should I show?** One, or at most two if the second is a direct upgrade of the first. Sequences of three or more read as a funnel rather than a service, and the incremental revenue does not cover the damage to the confirmation experience. ## Stacked Cart Goals — The Multi-Threshold Model That Beats a Single Bar URL: https://ninety9.dev/blog/stacked-cart-goals.html Published: 2026-04-28 Category: Shipping & Fulfilment · App: Goalify: Free Shipping Bar PRO Reading time: 5 minutes One free shipping threshold captures one behaviour change. Here is how to build a three-tier reward ladder that keeps working across your whole order distribution. A free shipping threshold at $70 does one job: it influences shoppers whose basket lands somewhere between about $45 and $70. Everybody below that range is too far away for the goal to feel reachable. Everybody above it has already won and has no remaining reason to add anything. You have installed a mechanic that operates on a slice of your order distribution and does nothing to the rest of it. Stacked goals fix that by giving every part of the curve a next step. ## What a single threshold leaves behind Take a store with this distribution: | Percentile | Order value | |---|---| | 25th | $28 | | 50th | $46 | | 65th | $58 | | 75th | $71 | | 85th | $92 | | 95th | $138 | With a single $70 threshold: - Orders below roughly $40 — the gap is too large to feel achievable. No effect. - Orders between $40 and $70 — the target zone. This is where the mechanic works. - Orders above $70 — goal already met. No further incentive. That is meaningful influence over maybe a third of orders, and no influence at all over the top quartile, which is where your best customers are. ## The three-tier shape The fix is a ladder, with each rung placed higher in the distribution: - **Tier 1 — Free shipping at $58** (65th percentile). The entry goal, reached by a large share of shoppers. - **Tier 2 — 10% off the order at $92** (85th percentile). The stretch goal. - **Tier 3 — Free gift at $138** (95th percentile). The aspiration. Now every basket has a next step. A shopper at $50 is chasing free shipping. A shopper at $62 has just won and immediately sees a new target thirty dollars away. A shopper at $100 is looking at the gift. The reason this works is the same reason the single bar works — the goal-gradient effect — applied repeatedly instead of once. ## Reveal, do not display The most important implementation detail, and the one most often got wrong. **Do not show all three tiers at once.** Showing "$58 free shipping · $92 for 10% off · $138 for a gift" to a shopper with $20 in their cart anchors them on $138. The first tier stops reading as an achievement and starts reading as the least of three things they will not get. **Show the active goal, then reveal the next.** One goal at a time, prominent and specific. When it is met, celebrate the crossing and immediately surface the next one. That sequencing produces a repeating loop of near-completion, which is exactly the state the mechanic depends on. The single highest-value instant in this whole system is when a shopper crosses tier one. They have just experienced a small win, they are feeling good about the transaction, and they are one click from the cart. That is the moment to introduce tier two — not before. ## Choosing rewards for each rung The rewards should escalate in perceived value and change in *kind*, not just in size. **Tier 1 — Free shipping.** Almost always the right first reward, because it removes a cost the shopper already resents rather than adding a benefit they did not ask for. It also has the cleanest margin story. **Tier 2 — An order discount or a free gift.** A percentage discount is simple and universally understood. A gift usually has better economics, because a $6 landed cost can carry $18 of perceived value while a 10% discount on a $92 order costs a flat $9.20. **Tier 3 — Something with high perceived value and controlled cost.** An exclusive item, expedited shipping, an extended warranty, early access. Avoid deep percentage discounts here — on a large order, a percentage becomes expensive fast. ## The margin check, per tier This is where stacked goals go wrong. Each tier is set by intuition, the total is checked afterwards, and by then the ladder is live. Every tier must independently satisfy: > Gross profit on the incremental spend required to reach this tier > cost of this tier's reward Worked through, at 55% gross margin: | Tier | Threshold | Reached from | Incremental spend | Gross profit on it | Reward cost | Net | |---|---|---|---|---|---|---| | 1 — Free shipping | $58 | $46 median | $12 | $6.60 | $7.20 shipping | **−$0.60** | | 2 — 10% off | $92 | $58 | $34 | $18.70 | $9.20 | **+$9.50** | | 3 — Free gift | $138 | $92 | $46 | $25.30 | $6.00 landed | **+$19.30** | Tier 1 is marginally negative as configured — which is common, and tolerable, because free shipping also improves conversion rate in a way the other tiers do not. But it is worth knowing rather than discovering. Raising tier 1 to $62 would fix it. Note the shape: tiers become *more* profitable as you climb, because the incremental spend grows faster than the reward cost does. That is the property you want. A ladder where the top tier is the least profitable is upside down. Decide explicitly whether a shopper reaching tier 3 also keeps tiers 1 and 2. Usually yes - cumulative rewards are what make the ladder feel generous. But that means your $138 order carries free shipping plus 10% off plus a gift, which is $22.40 of cost against $75.90 of gross profit. Still positive, but model it before you find out. ## Copy for a ladder Each state needs its own line, and the transitions matter as much as the states. - **Below tier 1:** "You're $12 away from free shipping" - **At tier 1:** "Free shipping unlocked. Add $34 more for 10% off" - **At tier 2:** "10% off applied. Add $46 more for a free travel size" - **At tier 3:** "You've unlocked everything. Nice work." Three principles: name the reward just earned before pointing at the next one; always give the remaining amount as a number; and give the final state a genuine end rather than an open-ended prompt, because a ladder with no top feels manipulative. ## When not to stack Stacked goals are not universally right. - **Low average order value with narrow distribution.** If almost every order is between $20 and $35, there is no room for three tiers. One threshold is correct. - **Thin margins.** Three rewards need three margin checks to pass. If tier 1 is already borderline, adding two more is not the fix. - **Limited catalogue.** If there is nothing sensible for a shopper to add between $58 and $92, tier 2 is an unreachable goal regardless of where you set it. - **Complex existing promotions.** A ladder on top of a BOGO on top of a site-wide code produces an effective discount nobody has modelled and a cart nobody can read. ## Measuring a ladder Per tier, not in aggregate: - **Share of orders reaching each tier**, before and after. The behaviour change. - **Distance-at-checkout distribution** for orders that did not cross each tier. If a cluster sits just below a threshold, that threshold is slightly too high. - **Gross profit per order** in each band between tiers. - **Total reward cost** as a percentage of revenue. - **Cart-to-checkout rate.** The guardrail — a cart cluttered with three competing goals can suppress conversion. The distance-at-checkout chart is the most actionable and the least used. If you find a pile of orders finishing at $54 against a $58 tier one, moving that threshold to $52 will convert most of them, and the arithmetic on that change is trivially favourable. ### FAQ **How many cart goal tiers should I run?** Three is the practical maximum for most stores. Two works and leaves value on the table above the second threshold. Four or more turns the cart into a puzzle, and the incremental revenue from the top tier rarely justifies the added complexity and inventory exposure. **Should all the tiers be visible at once?** No. Show the current goal prominently and reveal the next one when the current is met. Displaying all three simultaneously anchors the shopper on the largest number, which makes the first tier feel like a consolation prize rather than an achievement. **What rewards work best at each tier?** Free shipping at the first tier because it removes a cost the shopper already resents. An order discount or a free gift at the second. Something with high perceived value and controlled cost at the third, such as an exclusive item or expedited shipping. **Where should each threshold sit?** At rising percentiles of your order value distribution. A common shape is the sixty-fifth percentile for tier one, the eighty-fifth for tier two and the ninety-fifth for tier three, adjusted so each reward passes its own margin check. **Do stacked goals hurt margin?** They do if the rewards are not individually modelled. Each tier must satisfy the same test - the gross profit on the incremental spend required to reach it must exceed the cost of the reward. Stacked goals fail when stores set tiers by intuition and only check the total afterwards. ## Quantity Breaks vs Volume Discounts — Pricing Tiers Without Killing Margin URL: https://ninety9.dev/blog/quantity-breaks-vs-volume-discounts.html Published: 2026-04-14 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 6 minutes How to structure discount tiers that create incremental units instead of subsidising the customers who were already buying three, with worked numbers. Quantity breaks look like the easiest offer in ecommerce. Pick a discount, pick a quantity, publish. They are also one of the easiest ways to quietly lose money, because the customers most likely to take a quantity break are the ones who were already going to buy that quantity. You can run a tier ladder for a year, watch your average order value rise, and end up with less gross profit than you started with. The fix is not complicated, but it does require doing the arithmetic before rather than after. ## The two things a tier ladder does Every quantity discount does two things simultaneously, and they pull in opposite directions. 1. **It creates incremental units.** Some customers buy three who would have bought one. This is the reason to run it. 2. **It subsidises existing behaviour.** Some customers who were always buying three now pay less for three. This is the cost. The whole design problem is maximising the first while minimising the second. Everything below follows from that. ## Start by measuring your baseline Before setting any tier, pull your current units-per-order distribution for the product in question. You need to know what share of customers already buy 1, 2, 3, 4+ units without any encouragement. That distribution tells you two things: - **Where the natural break is.** If 70% of orders are a single unit and 20% are two, your first tier belongs at two — that is where the marginal customer already sits. - **Your cannibalisation floor.** If 12% of customers already buy three units unprompted, then a three-unit tier is subsidising at least 12% of buyers from day one. Setting a tier below your existing modal quantity is the classic mistake. If most people already buy two, a "buy 2 save 10%" tier changes nobody's behaviour and costs you 10% of a large share of your revenue. ## Three tiers, and why not four Two tiers is a binary — buy one, or take the deal. It leaves the entire upper half of the demand curve untouched. Four or more tiers spreads attention. Every additional option lowers the salience of the others, and the tier you actually wanted people to pick loses share to indecision. There is also a practical limit to how much information a shopper will read in a pricing table on a phone. Three works because it produces a shape people recognise instantly: an entry point, an obvious middle, and a ceiling that makes the middle look reasonable. ## Design the middle tier first This is the part most stores do backwards. They start with tier one and work up. Start instead with the tier you want most people to choose. That is your target — usually one unit above your current modal quantity, at a discount your margin can absorb comfortably. Design that tier to be genuinely attractive. Then build the other two around it: - **Tier 1** is the entry point. Small discount, low commitment. Its job is to establish that a ladder exists. - **Tier 3** is the anchor. It should offer a visibly better rate, at a quantity most customers will not choose. Its job is to make tier 2 look like the sensible option rather than the greedy one. On a $30 product with 55% margin, where 65% of orders are one unit and 22% are two: - **Buy 1** — $30, no discount - **Buy 2** — $54, save 10% ← entry - **Buy 3** — $75.60, save 16% ← target - **Buy 5** — $120, save 20% ← anchor Note the shape: the discount grows, but each additional step grows less. From 10% to 16% to 20%, not 10% to 20% to 30%. ## Why the ladder should flatten A linear ladder — 10%, 20%, 30% — feels fair and is expensive. The reason is that the behaviour change you are buying gets smaller as you go up. Convincing a one-unit buyer to take two is a real change and worth paying for. Convincing a four-unit buyer to take five is a marginal change, and the customers buying four were probably going to buy five occasionally anyway. A flattening ladder pays the most where the behaviour change is largest, and progressively less where you are mostly subsidising existing demand. ## The margin floor The hard constraint. For any tier: > Gross profit at the discounted price × quantity must exceed gross profit at full price × the quantity that customer would otherwise have bought. On the $30 product above with 55% margin ($16.50 gross profit per unit): | Tier | Revenue | Gross profit | Beats 1 unit? | Beats 2 units? | |---|---|---|---|---| | 1 unit | $30.00 | $16.50 | — | — | | 2 @ 10% off | $54.00 | $27.00 | Yes | — | | 3 @ 16% off | $75.60 | $35.10 | Yes | Yes | | 5 @ 20% off | $120.00 | $52.50 | Yes | Yes | | 5 @ 40% off | $90.00 | $22.50 | Yes | **No** | That last row is the trap. A 40% discount at five units still looks profitable against a single-unit baseline, but it makes you *less* money than the customer who would have bought two at full price. If a meaningful share of your five-unit buyers came from the two-unit group, the tier is a loss. Your quantity ladder plus a site-wide promo code plus a free shipping threshold can compound into a total discount you never modelled. Test the worst case on your lowest-margin SKU before a sale weekend, not during one. ## Variant-level targeting The most underused feature in quantity discounting, and the one that turns it from a pricing instrument into an inventory tool. A product-wide discount treats every variant the same, which is almost never what you want. You are rarely overstocked on everything. Scoping tiers to specific variants lets you: - Clear the sizes that always end the season in the warehouse, without discounting the ones that sell out. - Push the colourway that arrived in the wrong quantity. - Protect a variant with a supply constraint from being discounted at all. - Run a deeper ladder on last season's colours while this season's stay at full price. This is a much more precise tool than a markdown, and it is invisible to customers who are not looking at the variant you are clearing. ## Presentation The maths decides profitability; the presentation decides take rate. A few things reliably help: - **Show per-unit price at every tier.** "$25.20 each" makes the comparison concrete in a way "16% off" does not. - **Show total saving in currency.** For low-priced items the percentage looks better; for expensive ones the currency amount does. Show both. - **Pre-select the target tier.** Defaults matter enormously. If tier 2 is where you want people, select it by default rather than starting at one. - **Label the target, not the top.** "Most popular" on the middle tier. Putting "best value" on the top tier pushes people to a tier you make less money on. - **Keep the table short.** Four rows maximum, readable on a phone without horizontal scroll. ## Measuring the right thing Average order value will go up. That is not evidence of anything — a discount ladder mechanically raises AOV by construction. The numbers that matter: - **Units per order**, compared against your pre-launch baseline distribution. - **Effective discount rate** — total discount ÷ total revenue on that product. - **Gross profit per order** for the product, before and after. - **Tier distribution** — what share of buyers landed on each tier. If almost everyone takes tier 3, your ladder is too generous. If almost nobody does, it is too steep. Give it at least four weeks at moderate volume, and compare against the same period rather than the previous month if your category is seasonal. ### FAQ **What is the difference between quantity breaks and volume discounts?** In practice the terms are used interchangeably. Where a distinction is drawn, quantity breaks usually means discrete tiers on a single product (buy 2 save 10 percent) while volume discounts can also mean a sliding scale across a collection or an entire order. The pricing logic and the margin risk are the same in both cases. **How many discount tiers should I offer?** Three. Two tiers is a binary choice that leaves the upper range untouched, and four or more spreads attention so thinly that the take rate of your target tier falls. Three gives you a clear entry point, a designed target and an aspirational ceiling. **Should the discount increase proportionally with quantity?** No. Discount depth should increase, but at a decreasing rate. Ten percent at two units, sixteen at three, twenty at five is a healthy shape. A linear ladder gives away margin at the top to customers whose behaviour you were not going to change anyway. **Do quantity breaks work on non-consumable products?** Rarely on the same product, because nobody needs two of a considered single purchase. They can work across variants, where the customer is buying different colours or sizes of the same item, and they work well on anything gifted in multiples. **Can I run quantity breaks on specific variants only?** Yes, and it is one of the more useful applications. Scoping a discount to particular variants lets you clear overstocked sizes or colours without discounting the ones that already sell at full price, which is far more precise than a product-wide markdown. ## Upsell Popup Benchmarks — What Good View, Click and Conversion Rates Look Like URL: https://ninety9.dev/blog/upsell-popup-benchmarks.html Published: 2026-04-07 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 5 minutes How to read popup analytics without fooling yourself: which denominator to use, what each metric actually measures, and the diagnostic patterns behind bad numbers. Popup analytics are unusually easy to misread, because the same offer can be reported as a 2% conversion rate or a 28% conversion rate depending on which denominator you pick — and both numbers are technically correct. This is a guide to reading them honestly. ## The denominator problem Consider a single add-to-cart upsell over one month: - 100,000 sessions - 12,000 add-to-cart events - 9,400 popups shown (frequency capping suppressed the rest) - 1,880 offers accepted | Denominator | Rate | What it is really telling you | |---|---|---| | Accepts ÷ sessions | 1.9% | How much this contributes to the site overall | | Accepts ÷ add-to-carts | 15.7% | How well it works among eligible shoppers | | Accepts ÷ impressions | **20.0%** | How good the offer itself is | All three are useful and they answer different questions. The mistake is quoting the third and implying the first. **Use impressions** when judging the offer, because it isolates the decision you are testing. **Use sessions** when judging whether the popup deserves to exist, because it captures how often it actually fires. If a report does not state the denominator, the number means nothing. ## The metrics that matter, in order ### 1. Take rate (accepts ÷ impressions) The fastest and most diagnostic metric. It measures one thing: relevance. A take rate near zero is not a pricing problem or a design problem. It is a relevance problem — the offer is wrong for the person seeing it, and no discount will fix that. Take rate also needs the least data. A few hundred impressions is often enough to tell the difference between "this resonates" and "this does not", which makes it the right metric for early iteration. ### 2. Revenue per impression The commercial number. Take rate can be high on a cheap item and still contribute almost nothing. ``` revenue per impression = (accepts × average accepted value) ÷ impressions ``` This is what you use to compare two different offers with different price points. A 25% take rate on an $8 accessory produces $2.00 per impression. An 8% take rate on a $40 add-on produces $3.20. The second offer is better despite looking worse. ### 3. Gross profit per impression Revenue per impression, minus discount and cost of goods. The only metric that decides whether to keep an offer running. An upsell with strong revenue and a 30% discount on a low-margin item can be net negative. This happens more often than people expect, particularly with discount-led offers. ### 4. The guardrail Every popup needs one metric from the surrounding funnel that would reveal harm the primary metrics cannot see. | Popup type | Guardrail | What it catches | |---|---|---| | Add to cart | Cart-to-checkout rate | Popup obstructing the path forward | | Checkout initiation | Checkout completion rate | Friction added at the worst moment | | Exit intent | Return visit rate | Brand damage from over-firing | | Any | Adds per session | Shoppers adding less to avoid the popup | Without a guardrail you can optimise a popup into a conversion problem and see nothing but good numbers. Decide the guardrail metric and its acceptable movement *before* launching. "We will keep this if take rate exceeds 8% and cart-to-checkout does not fall by more than half a point" is a decision. Looking at the numbers afterwards and deciding what they mean is not. ## Why published benchmarks are close to useless Search for popup benchmarks and you will find figures ranging from under 1% to over 40%. They are not contradicting each other; they are measuring different things. The variance comes from four sources: **Trigger.** An add-to-cart upsell and a timed email capture have almost nothing in common. Intent quality differs by an order of magnitude. **Offer type.** A quantity upgrade requires no new decision. A cross-sell to a different category requires a full evaluation. Take rates differ accordingly. **Category and price point.** A $6 accessory on a $40 anchor behaves nothing like a $200 add-on on a $900 anchor. **Denominator.** Covered above, and rarely stated. A benchmark that does not specify all four is not a benchmark. It is a number. ## Build your own baseline instead Four weeks, minimum, before you change anything. 1. **Week 1** — launch a single offer with no discount. This is your control. 2. **Weeks 2–4** — leave it alone. Resist the urge to iterate on a week of data. 3. **End of week 4** — record take rate, revenue per impression, gross profit per impression and the guardrail. That set is your baseline. 4. **From week 5** — change exactly one variable at a time and compare against the baseline. Everything after that is a comparison against yourself, which is the only comparison that means anything. ## How much data before you decide The honest answer depends on the effect size you care about and the variance in your data, but two rules of thumb hold up: - **Take rate** stabilises quickly. Several hundred impressions is often enough to distinguish a good offer from a bad one, because the outcome is binary and the base rate is usually well away from zero. - **Revenue per impression** stabilises slowly, because order values have a long tail. A handful of unusually large accepted offers can swing a weekly figure substantially. Thousands of impressions is a more realistic threshold. The practical implication: iterate on relevance using take rate, then validate value using revenue once relevance is settled. Doing it the other way round means waiting weeks to learn something take rate would have told you in days. Ecommerce data is seasonal at every timescale - day of week, week of month, month of year. A popup launched on the first of the month and reviewed on the tenth is being judged against a period that is not comparable. Use whole weeks, and compare against the same weeks last period where you can. ## Diagnostic patterns Some common shapes and what they usually mean. **High impressions, near-zero take rate.** Relevance failure. The offer does not match the anchor product. Fix the pairing before touching anything else. **Good take rate, flat average order value.** Cannibalisation. The upsell is capturing items shoppers would have added anyway. Compare against your baseline attach rate for that pair. **Good take rate, falling cart-to-checkout rate.** The popup is obstructing the path forward. Usually a mobile layout problem where the continue action falls below the fold. **Take rate declining over weeks with stable traffic.** Habituation. Returning visitors have learned to dismiss it. Rotate the offer or tighten the frequency cap. **High engagement, low accepts.** People are reading it and saying no. The offer is relevant but the price or the terms are wrong. This is the one case where a discount is the right lever. **Everything good, gross profit flat.** The discount is eating the gain. Reduce the discount and watch whether take rate holds. ## A reporting template One table, reviewed monthly, one row per active offer: | Field | Why it is there | |---|---| | Trigger and placement | Context for everything else | | Impressions | Reach | | Take rate | Relevance | | Average accepted value | Offer quality | | Revenue per impression | Commercial contribution | | Effective discount rate | What it cost | | Gross profit per impression | The verdict | | Guardrail metric and movement | The safety check | | Decision | Keep, change, or retire | The last column is the one that matters. A report without a decision attached is a dashboard, and dashboards do not improve anything on their own. ### FAQ **What is a good conversion rate for an upsell popup?** There is no single answer because it depends entirely on the trigger and the offer. A quantity upgrade shown after add to cart converts far higher than a cross-sell shown at exit, and both vary enormously by category and price point. Establish your own baseline in the first four weeks and measure changes against it. **Should I measure popup performance against sessions or impressions?** Impressions, for judging the offer, because that isolates the decision you are testing. Sessions, for judging whether the popup is worth running at all, because that captures how often it actually fires. Reporting one and calling it the other is the most common way popup performance gets misrepresented. **How much data do I need before drawing a conclusion?** Enough that a plausible change would be visible above noise. For take rate that is often a few hundred impressions. For revenue per impression it is usually thousands, because the variance in order values is wide. Resist calling a result after a good week. **What is a guardrail metric?** A metric from the surrounding funnel that would reveal harm your primary metric cannot see. For an add-to-cart popup the guardrail is cart-to-checkout rate. For an exit popup it is return visit rate. Without one you can optimise a popup into a conversion problem and see only good numbers. **Why do published popup benchmarks vary so much?** Because they blend different triggers, offers, categories and denominators. A study reporting a three percent popup conversion rate may be measuring a timed email capture against all sessions, which has nothing in common with an add-to-cart upsell measured against impressions. ## How to Reduce Ecommerce Returns Before They Start URL: https://ninety9.dev/blog/reduce-ecommerce-returns.html Published: 2026-04-06 Category: Retention & Post-Purchase · App: Reviso: Order editing & Upsell Reading time: 5 minutes Most returns are decided before the parcel ships. A breakdown of return causes, which are preventable at which stage, and why the pre-dispatch window is the cheapest place to intervene. A return is a sale that reverses, plus two shipping legs, plus labour, plus a customer who may not come back. It is one of the few metrics in ecommerce where the cost of the event substantially exceeds the value of the transaction that caused it. The instinct is to optimise the returns process — faster labels, better portals, quicker refunds. Worth doing, but it is treating the symptom. The interesting question is which returns did not have to happen, and where the cheapest place to intervene is. ## Avoidable versus unavoidable Split your return reasons into two lists. **Unavoidable at the point of sale:** - Product defect - Damage in transit - Genuine dissatisfaction with quality - Gift recipient did not want it These are real problems and worth fixing — but they are fixed in sourcing, QA and packaging, not in the checkout flow. **Avoidable:** - Wrong size or fit - Wrong colour or variant ordered - Wrong item ordered entirely - Duplicate order - Wrong address, resulting in a failed delivery - Changed mind before the parcel shipped - Did not match expectations set by the product page In most stores the avoidable list is a substantial share of total volume, and in apparel it dominates. That list is where the leverage is. ## What a return costs Worth building the number for your own store, because it is usually larger than people assume. ``` outbound shipping (already spent) + return shipping (usually yours to pay) + inspection and restocking (labour, minutes per unit) + repackaging (if resold as new) + payment processing (often not fully refunded) + writedown (if the item cannot be resold at full price) = cost of the return ``` Then add the opportunity side: the margin you booked and gave back, and the probability that the customer does not return. On lower-priced items the total frequently exceeds the gross profit on the original order, meaning the return does not just erase the sale — it costs you money to have made it. If a return costs you roughly the value of the order, then preventing one is worth roughly a full order of profit. That is a much bigger budget than most stores allocate to prevention, and most of the effective interventions are close to free. ## Where to intervene, cheapest first ### Before the order: set expectations accurately The highest-leverage work, and the slowest. - **Sizing.** Real measurements, not just S/M/L. Model height and worn size. Fit notes ("runs small", "size up if between sizes") drawn from actual return reasons. - **Photography.** Colour accuracy, scale reference, the product in use rather than only on white. - **Materials and dimensions** stated explicitly rather than implied. - **Reviews with attributes.** Reviews that record the reviewer's size and the fit outcome do more for return rate than any other single addition to a product page. ### At checkout: prevent the mechanical errors - **Address validation and autocomplete.** Catches the missing unit number, which is the leading cause of failed delivery. - **Clear variant selection.** A variant selector that does not make the current choice obvious produces wrong-variant orders at a surprising rate. - **Order summary that shows variants in words**, not just a thumbnail. "Blue / Large", not a colour swatch the customer has to interpret. ### Before dispatch: the cheapest fix of all This is the window most stores ignore, and it is the one where a correction costs nothing. A customer who realises within an hour of ordering that they picked the wrong size has three possible paths: 1. **They email support.** Support may or may not catch it before dispatch. Costs staff time; sometimes works. 2. **They do nothing and return it.** Costs both shipping legs, restocking, refund and the margin. 3. **They fix it themselves in an edit flow.** Costs a database write and a stock movement. Path three is available for essentially every mistake in the avoidable list, and it is the difference between a return and a non-event. This only works before fulfilment. Once the item is picked and labelled, an edit becomes a warehouse operation and the economics collapse. The value of the pre-dispatch window is entirely dependent on it being genuinely pre-dispatch, which means the edit interface must be tied to fulfilment status rather than to a time limit someone guessed at. ### After dispatch: exchange before refund Once the parcel is out, the goal shifts from prevention to preserving the sale. An exchange keeps the revenue; a refund does not. Offering the exchange path first — with the correct size pre-selected based on the stated return reason — converts a meaningful share of what would have been refunds. Store credit sits between the two: better than a refund for you, and often acceptable to the customer if there is a small bonus attached. ## Return reasons as a diagnostic Requiring a reason on every return produces one of the most useful datasets in the business, provided the categories are specific enough to be actionable. Bad categories: "not as expected", "other", "changed my mind". Useful categories: "too small", "too large", "colour different from photos", "material felt different", "arrived damaged", "wrong item sent", "ordered wrong item", "arrived too late", "found better price". Read them by product: - **One product with a high "too small" rate** → a sizing note on that product page fixes it, not a policy change. - **One product with a high "colour different" rate** → reshoot it. - **A category with a high "material" rate** → the description is under-specifying. - **"Ordered wrong item" across the catalogue** → a variant selection UI problem, not a product problem. - **"Arrived too late"** → a fulfilment or expectation-setting problem that will also be showing up in your cancellation reasons. Almost every clustered return reason points at a fix that is cheap and permanent. Unclustered reasons spread evenly across the catalogue usually point at a checkout or expectation problem instead. ## The policy question Restricting returns to lower the return rate is almost always a false economy. A restrictive policy lowers return rate and conversion rate together, and the conversion loss is generally larger. The better levers: - **Free returns, but exchanges are faster.** Steer to exchange through convenience rather than penalty. - **A longer window than the industry norm.** Counter-intuitively, longer windows tend to reduce return rate, because the urgency to decide disappears and endowment sets in. - **Instant exchange.** Ship the replacement before the original comes back, for customers who pass a trust check. - **Charge for returns only on repeat offenders.** A small share of customers generate a disproportionate share of returns. Rules targeting them do not damage everyone else's experience. ## Rollout 1. **Add return reason capture** with specific categories, if you do not have it. Everything else depends on this data. 2. **Fix the top three products** by avoidable return volume — sizing notes, photography, description. 3. **Enable pre-dispatch self-service editing** for variant swaps and addresses. This is the fastest-acting intervention. 4. **Add address validation** at checkout if it is not there. 5. **Make exchange the default path** in the returns flow, with refund available but secondary. 6. **Review reason clustering monthly** and treat it as a product page backlog. ## Measuring it - **Return rate overall**, and split by avoidable versus unavoidable. The split matters more than the total. - **Return reason distribution**, tracked by product and by category. - **Pre-dispatch edit rate** — the leading indicator that prevention is working. - **Exchange-to-refund ratio** in the returns flow. - **Cost per return**, calculated properly and reviewed quarterly. - **Repeat purchase rate of customers who returned.** A well-handled return can produce a more loyal customer than a smooth first order; a badly handled one ends the relationship. ### FAQ **What is a normal ecommerce return rate?** It varies enormously by category. Apparel and footwear run far higher than most other categories because of sizing, while consumables and electronics accessories run much lower. The useful comparison is against your own trend and against the avoidable portion, not against a cross-industry average. **What does a return actually cost?** Outbound shipping, return shipping, inspection and restocking labour, payment processing that is often not fully refunded, and the lost margin. For lower-priced items the total frequently exceeds the profit on the original sale, which is why prevention beats process. **Which returns are actually preventable?** Wrong size, wrong variant, wrong address, duplicate orders and changed-mind returns caught before dispatch. Product defects, damage in transit and genuine dissatisfaction are not preventable through the checkout and post-purchase flow, though they are worth fixing at source. **Does a generous returns policy increase returns?** It increases return rate modestly and increases conversion rate and repeat purchase substantially. For most stores the trade is favourable. Restricting returns to lower the rate usually costs more in lost sales than it saves in logistics. **How does order editing reduce returns?** It converts a return into an edit. A customer who ordered the wrong size and can change it before dispatch never generates a return, which removes both shipping legs, the restocking cost and the refund - and keeps the sale. ## Frequently Bought Together on Shopify — Picking Pairs That Actually Sell URL: https://ninety9.dev/blog/frequently-bought-together-shopify.html Published: 2026-03-24 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 5 minutes How to derive product pairings from your own order data instead of category tags, the price ratio that converts, and why three suggestions beat eight. The frequently-bought-together widget is one of the oldest patterns in ecommerce and one of the most reliably profitable, which is exactly why it is worth doing properly rather than switching on with default settings. Almost all of the performance difference between two stores running the identical widget comes from one decision: which products get suggested. Layout, badge colour and button copy are rounding errors next to it. ## Complements, not substitutes The single most common failure is suggesting an alternative rather than an addition. A shopper looking at a pair of running shoes does not want a second pair of running shoes. They want socks, insoles, a gel pack, a reflective band. The shoes are a *substitute* for each other; the accessories are *complements*. This distinction is obvious when stated and constantly violated in practice, because the default logic in most systems is "other products in the same collection" — which is a substitute generator by definition. | Anchor product | Substitute (wrong) | Complement (right) | |---|---|---| | Espresso machine | Another espresso machine | Descaler, tamper, milk jug | | Running shoes | Another running shoe | Socks, insoles, laces | | Serum | Another serum | Cleanser, SPF, applicator | | Desk lamp | Another desk lamp | Bulbs, dimmer, cable clip | Substitutes have a place — on collection pages, in search results, in out-of-stock states. They do not belong next to a buy button, where their effect is to reopen a decision the shopper had already made. ## Deriving pairs from your own data The reliable method takes an afternoon and beats every heuristic. ### Step 1: Export order line items Last 90 days minimum, longer if your order volume is modest or your category is seasonal. ### Step 2: Count co-occurrence For each product A, count how many orders containing A also contain product B, for every B. ### Step 3: Convert to lift This is the step most people skip, and it is what separates a useful pairing list from a list of your bestsellers. > **Lift** = P(B in order | A in order) ÷ P(B in order) In words: how much more likely is B to appear when A is present, compared to how often B appears generally? Raw co-occurrence will always rank your bestseller first, because your bestseller appears in a large share of *all* orders. Lift corrects for that. A lift of 1.0 means no relationship at all. A lift of 3.0 means B is three times more likely to appear when A does — that is a real pattern. ### Step 4: Filter - Drop anything with a lift below roughly 1.5. That is noise. - Drop anything in the same substitutable category as the anchor. - Drop anything out of stock or on the way out of the catalogue. - Drop anything priced above 50% of the anchor. ### Step 5: Rank by price fit Of what survives, prefer the item closest to 25% of the anchor price. An accessory at 15–40% of the anchor price reads as "of course, add it". At 60% or more, the shopper stops treating it as an accessory and starts treating it as a second purchase — which means a second deliberation, which means "later", which means never. ## When to override the data Data-derived pairs are the right default, not the right answer in every case. Override when: - **The product is new.** No history exists. Use the closest analogue product's pairs, or your own product knowledge. - **The pairing is an artefact.** Two products bought together during one promotion where they were both discounted are not a real pattern. - **Margin says otherwise.** A pair with strong lift but terrible margin on the suggested item may not be worth the slot. The best-converting suggestion is not always the most profitable one. - **Inventory says otherwise.** Never promote your way into a stockout on a component you need for other bundles. ## How many to show Two or three. Not eight. Every additional option reduces the take rate of the ones already present. This is well documented in choice research and matches what happens in practice: a widget with three suggestions produces a higher attach rate than one with eight, and a much higher one than a scrolling carousel where most items are never seen. If you genuinely have five good complements, that is a signal to rotate them or to segment by customer, not to show all five. ## Presentation that helps - **Show the anchor product in the set.** "This item + socks + insoles" makes the addition concrete. A bare list of two other products loses the connection to what the shopper is looking at. - **Let each item be deselected.** Forcing all-or-nothing lowers the take rate. Most shoppers who decline the full set will still take one item. - **Show the total for the selected combination**, updating live. Making the shopper do the arithmetic loses them. - **One-click add, no navigation.** If accepting the suggestion navigates away from the product page, you have introduced the exact friction the widget exists to remove. - **Place it below the buy button.** Above it competes with the primary action; at the bottom of a long description it is never seen on mobile. Running the same frequently-bought-together set on the product page and again in the cart usually lowers the take rate of both. The product page version reads as a suggestion; the second showing reads as pressure. Pick one surface per offer. ## Rules vs learned recommendations Once you have enough volume, a system that recalculates pairings continuously will outperform a static list — not because the algorithm is smarter on any given day, but because your catalogue and your seasons move and a hand-built list does not. The honest threshold: below a few hundred orders per product, a well-chosen manual pairing usually wins. Personalisation is a scale advantage, and pretending otherwise leads to widgets that recommend confidently from six data points. A reasonable progression: 1. **Start manual.** Pick complements using product knowledge. Two per anchor. 2. **Move to data-derived static pairs** once you have 90 days of meaningful volume. Refresh quarterly. 3. **Move to continuously learned recommendations** when refreshing quarterly starts to feel like it is always out of date — which is the signal that your catalogue is moving faster than your process. ## Measuring it - **Attach rate** — orders containing a suggested item ÷ orders where the widget was shown. The primary metric. - **Incremental attach** — attach rate minus your pre-widget baseline co-occurrence. This is the honest version, and it is always lower than the headline. - **Revenue per product page view.** Catches the case where the widget lifts attach rate but suppresses the main add-to-cart. - **Add-to-cart rate on the anchor product.** The guardrail. If it drops, the widget is competing with the buy button rather than supporting it. The incremental number is the one to defend in a meeting. A widget showing a 30% attach rate on a pair that already co-occurred in 24% of orders has added six points, not thirty. ### FAQ **How does frequently bought together work on Shopify?** The widget shows products that commonly appear in the same order as the product being viewed, usually with a small discount for taking the set. The quality depends entirely on how the pairs are selected. Order-history-derived pairs consistently outperform pairs chosen by category or by manual guesswork. **How many orders do I need before recommendations are reliable?** A few hundred orders on a given product is usually enough to see a real signal for its top pairing. Below that, a manually chosen complement based on product knowledge will beat anything derived from data, because the sample is too small to distinguish a pattern from noise. **Should I discount the frequently bought together bundle?** A small discount helps because it gives the shopper a reason to decide now rather than later. Ten to fifteen percent on the added item is usually plenty. Deeper discounts start to cannibalise customers who would have bought both anyway. **Where should the widget go on the product page?** Below the add-to-cart button and above the long-form description. Placing it above the buy button competes with the primary action, and placing it at the very bottom means most mobile visitors never see it. **What is the difference between frequently bought together and related products?** Related products are usually substitutes - other items in the same category that the shopper might prefer. Frequently bought together are complements - items that go with the one being viewed. Substitutes belong on collection pages and in empty-state recommendations. Complements belong next to the buy button. ## AI Product Recommendations on Shopify — How They Work and When Rules Win URL: https://ninety9.dev/blog/ai-product-recommendations-shopify.html Published: 2026-03-17 Category: CRO & Analytics · App: Monet • AI Popup Bundle Addons Reading time: 5 minutes What sits behind "AI recommendations", the data volume you actually need, where learned models beat hand-built rules, and where they measurably do not. "AI-powered recommendations" is now standard copy on almost every merchandising app, which makes it close to meaningless as a differentiator. Underneath the label there are two or three distinct techniques with genuinely different behaviour, and knowing which one you are running tells you a lot about what to expect. ## What is actually running ### Collaborative filtering The workhorse, and the technique behind the large majority of ecommerce recommendation systems. The idea is simple: find products that co-occur in orders more often than chance predicts. If customers who buy A disproportionately also buy B, then B is a good recommendation for A. The key statistic is **lift**: > lift = P(B | A) ÷ P(B) A lift of 1.0 means no relationship. A lift of 3.0 means B is three times more likely to appear when A is present. Raw co-occurrence would rank your bestseller first for everything, because your bestseller appears in a large share of all orders; lift corrects for that. **Strengths:** captures relationships nobody would think to encode. Improves automatically with volume. Requires no product metadata. **Weaknesses:** cold start on new products. Reinforces existing patterns, so it under-promotes items nobody has discovered yet. Vulnerable to artefacts from past promotions. ### Content-based filtering Recommends products similar to the anchor based on attributes — category, tags, title, price band, sometimes image embeddings. **Strengths:** works from day one with no order history. Handles new products. **Weaknesses:** produces *substitutes* by construction. Similar things are alternatives, not complements. Used alone on a product page, this is the system that recommends a second pair of the same shoes. ### Hybrid Most good systems combine the two: collaborative filtering where there is enough data, content-based as a fallback for new or low-volume products, with rules layered on top. ### Large language models Rare for the selection step and usually the wrong tool for it. LLMs are excellent at generating descriptions, normalising messy product data and interpreting natural-language queries. They are not a natural fit for ranking products by purchase likelihood, which is a well-solved statistical problem. If an app claims LLM-powered recommendations, it is worth asking which part of the pipeline the model is in. Collaborative filtering finds what goes together. Content-based filtering finds what is similar. On a product page you almost always want the first, because similar means substitute. ## When rules beat models Worth being direct about this, because it is the opposite of how these systems are marketed. **Below a few hundred orders per product.** With thirty orders containing product A, any pattern you find is noise. A human who knows the catalogue will pick a better complement than a model working from a sample that small. **For brand-new products.** No history exists. Use the closest analogue product's pairings, or your own judgement. **Where margin varies wildly.** An unconstrained model optimising for conversion will recommend whatever converts, which is often your cheapest, lowest-margin item. **Where relationships are obvious and stable.** If your printer takes exactly one cartridge model, that is a rule. It does not need a model, and a model can only get it wrong. **Where inventory is constrained.** Never let a model promote its way into a stockout on a component you need elsewhere. ## Where models genuinely win **Maintenance at scale.** A human can pick excellent pairs for fifty products. Nobody maintains accurate pairings for two thousand products through a season change. This is the real argument and it has nothing to do with per-product accuracy. **Non-obvious relationships.** Every catalogue has pairs that make no categorical sense and convert extremely well. Only the data finds those. **Seasonal drift.** The right complement in December is not the right one in June. A learned system tracks this; a static list requires someone to remember. **Per-visitor personalisation.** Adjusting recommendations based on what this specific visitor has browsed is not something a static list can do at all. ## The guardrails you have to add A recommendation model optimises the objective it was given, which is almost never your actual objective. These constraints are configuration, not emergent behaviour. **Margin floor.** Exclude anything below a minimum contribution margin from recommendation slots. The best-converting suggestion is frequently not the most profitable one. **Stock availability.** Never recommend out-of-stock or low-stock items. Obvious, and violated constantly. **Category exclusion.** Prevent substitutes from appearing next to the buy button. This single rule fixes the most visible failure mode of an unconstrained system. **Already-owned suppression.** Do not recommend something the customer bought last week. For repeat-purchase consumables, this needs a replenishment-cycle exception rather than a blanket rule. **Price band.** Cap the recommendation at a percentage of the anchor price — 15–40% is the working range for accessories. **Manual overrides.** Always keep a way to pin or block a specific pairing. Merchandising judgement should be able to beat the model when it needs to. If two products were heavily discounted together last Black Friday, they will show strong co-occurrence for months afterwards. The model reads a promotion as a preference. Either exclude promotional periods from training data or weight them down, or you will spend next spring recommending last November. ## Placement matters as much as the algorithm The same recommendation engine performs completely differently depending on where its output appears. | Placement | Recommendation type | Why | |---|---|---| | Product page, below buy button | Complements | Shopper is deciding; additions help, alternatives distract | | Collection page | Similar / popular | Shopper is browsing; substitutes are useful here | | Cart drawer | Complements, low price ratio | Decision made; only additive offers work | | Add-to-cart popup | Single strong complement | One offer, maximum attention | | Exit intent | Alternatives or reminders | They are leaving; a substitute might be why | | Order confirmation | Complements or replenishment | Warm buyer, zero risk | | Empty search results | Similar / popular | Anything relevant beats nothing | Note that substitutes are genuinely correct in two of those rows. The rule is not "never show substitutes" — it is "never show substitutes next to a buy button". ## Measuring recommendation quality The trap here is measuring click-through rate, which rewards clickbait pairings that do not convert. Better metrics: - **Attach rate** — orders containing a recommended item ÷ sessions where recommendations were shown. - **Incremental attach** — attach rate minus the baseline co-occurrence rate for that pair before recommendations existed. This is the honest number and it is always lower than the headline. - **Revenue per recommendation impression.** - **Gross profit per recommendation impression**, which catches the margin problem. - **Anchor add-to-cart rate.** The guardrail. If recommendations are pulling attention from the main product, this drops. The incremental figure is the one to defend. A widget showing a 30% attach rate on a pair that already co-occurred in 24% of orders has produced six points of value, not thirty. ## A sensible adoption path 1. **Start manual.** Two hand-picked complements per top product. Establish a baseline. 2. **Move to data-derived static pairs** once you have 90 days of meaningful volume. Compute lift, filter substitutes, refresh quarterly. 3. **Add a learned system** when refreshing quarterly always feels out of date — that is the signal your catalogue is moving faster than your process. 4. **Layer guardrails immediately**, not later. Margin floor, stock check, category exclusion, price band. 5. **Keep the manual override.** There will always be a pairing the model gets wrong and you can see is wrong. The order matters. Stores that start at step 3 usually cannot tell whether the system is working, because they never established what "working" looked like without it. ### FAQ **What does AI actually mean in a product recommendation app?** In most cases, collaborative filtering or a similar statistical model trained on order history - finding which products co-occur more often than chance would predict. Some systems add content-based signals from titles, tags and images. Very few use large language models, and where they do it is usually for describing products rather than for choosing them. **How much data do I need for AI recommendations to work?** Enough that co-occurrence patterns rise above noise. A few hundred orders containing a given product is a reasonable floor for that product to receive sensible recommendations. Below that, a manually chosen complement based on product knowledge will usually outperform the model. **Are AI recommendations better than manual ones?** Not necessarily better on any single product, but far better at scale and over time. A human can pick an excellent complement for one product. A human cannot maintain accurate pairings for two thousand products through a season change, and that is where a learned system earns its place. **Do AI recommendations respect margin?** Only if you tell them to. A model trained to maximise clicks or conversions will happily recommend your lowest-margin product. Margin floors, stock availability checks and category exclusions are configuration you have to supply, not behaviour that emerges from the model. **Can recommendations hurt the customer experience?** Yes, in two specific ways. Recommending substitutes rather than complements reopens a decision the shopper had already made. And recommending something they have just bought or already own is the most common visible failure of an unconstrained system. ## Build-a-Box and Mix-and-Match Bundles — A Practical Setup Guide URL: https://ninety9.dev/blog/build-a-box-mix-and-match-bundles.html Published: 2026-03-03 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 5 minutes How to design a customisable bundle that converts: slot structure, how much choice is too much, pricing models, and the inventory traps nobody warns you about. A build-a-box is the most engaging bundle format there is and the one most likely to be launched half-finished. It looks simple — let the customer pick a few things and give them a discount — and it hides a surprising amount of design and operational work. Done well it produces genuinely higher order values, better first-purchase experiences and useful data about what your customers actually want together. Done carelessly it produces long, abandoned pickers and a support queue full of stockout emails. ## Why structure beats freedom The instinct is that more choice is more appealing. In practice the opposite happens: an open "pick any six from our catalogue" is a blank page, and blank pages produce abandonment. Structure converts better because it does the hard part for the shopper. Compare: **Unstructured:** *Pick any 6 items, save 15%.* The shopper has to decide what a good box even looks like, then execute it. **Structured:** *Choose 1 base · 3 flavours · 1 topping · 1 extra.* The shopper only makes the fun decisions. You have already made the hard one. The second version consistently completes at a higher rate and produces boxes with a better composition, because the slots encode your product knowledge about what actually goes together. ## Designing the slots Four principles. **Three to five slots.** Below three it is not really a box. Above five, completion rate falls and mobile becomes painful. **Each slot should feel different.** Slots that are functionally identical ("pick 3 flavours, then pick 3 more flavours") add steps without adding meaning. Merge them. **Order the slots by decisiveness.** Put the easy, high-conviction choice first — usually the base or size. Early momentum matters; a shopper who makes one confident pick is much more likely to finish. **Six to twelve options per slot.** Fewer feels restrictive; more stalls the shopper. If you have thirty eligible items, curate rather than dump the collection. For a coffee subscription box: - **Slot 1 — Grind** (4 options): the fast, confident first choice - **Slot 2 — Beans, pick 3** (10 options): the fun part, where the time is spent - **Slot 3 — Add a treat** (6 options): optional, and where the margin is - **Flat box price**, shown from the start Four decisions total, one of them optional, and the shopper knows the price before they begin. ## Pricing models Three approaches, in descending order of how well they work. ### Flat box price "Build your box — $45." Simplest to understand and the strongest conversion driver, because the shopper's remaining decisions are purely about preference rather than cost. It also produces a predictable, defensible margin. Requires that your eligible items have reasonably similar costs, or that you accept variance. Most stores solve this by tiering: a standard box and a premium box with a different eligible pool. ### Percentage off the running total "Pick any 6, save 15%." Easy to implement and flexible across price ranges, but it asks the shopper to track a moving number while choosing. Works, converts less well than flat pricing. ### Tiered by count "Any 3 save 10%, any 6 save 18%, any 9 save 25%." Combines the box format with a quantity ladder. Powerful, but it is two mechanics at once and the interface has to be very clear or it becomes confusing. Whichever you pick: show the price prominently from the first screen. A shopper who spends three minutes building a box and then discovers the price is a shopper who abandons and remembers it. ## The interface Build-a-box lives or dies on the picker. - **Persistent progress indicator.** "2 of 4 slots complete" or a filled-slot visual. The shopper must always know how far along they are. - **Live running total**, even with flat pricing, so any extras are transparent. - **Editable choices.** Going back to change slot 2 without losing slots 3 and 4 is essential. Forcing a restart is fatal. - **Mobile-first layout.** Most boxes are built on phones. A grid that requires horizontal scrolling or pinch-zoom will not be completed. - **A completion state that is clearly a completion.** The moment the box is valid, the primary action should change from "next" to "add to cart" and become visually dominant. - **Save and resume**, if your average box takes more than a minute or two to build. Slots stacked vertically on mobile mean a shopper must scroll past everything they have already chosen to reach the next decision. Use collapsible sections that close on completion, so the active slot is always at the top of the viewport. ## Inventory, which is where this actually gets hard The operational side is the part that gets underestimated, and it is the part that generates support tickets. **A component goes out of stock mid-session.** It must vanish from the picker immediately, and any in-progress box containing it needs a visible swap prompt with a suggested alternative. The failure state — completing a box and hitting an error at checkout — wastes several minutes of the customer's deliberate effort and is remembered. **Inventory must decrement on the components, not on a box SKU.** This is the strongest argument for dynamic bundles over separate bundle products. If your box is a distinct SKU, your component stock levels are fiction the moment a box sells. **Partial returns.** A customer returning one item from a six-item discounted box creates a refund calculation nobody has specified. Decide the policy up front: refund the discounted per-item price, not the full retail price, and make sure your team knows the rule. **Popular-component starvation.** Boxes concentrate demand. One flavour will end up in 70% of boxes and will run out first, and its stockout degrades every box on the site simultaneously. Forecast component demand from box composition data, not from historical standalone sales. ## When not to build one Build-a-box is not universally right. - **Small catalogue.** Below roughly eight suitable products there is not enough variety for the format to feel like a choice. A curated fixed bundle communicates value better and takes an hour instead of a week. - **High-consideration single purchases.** Nobody builds a box of laptops. - **Products with wildly different costs.** Flat pricing breaks, and the workarounds get complicated fast. - **Thin operational capacity.** If you cannot reliably keep twelve components in stock, the format will generate more disappointment than revenue. ## Measuring it The important metric is not conversion — it is **completion**. - **Picker start rate** — visitors who begin a box ÷ visitors to the box page. - **Completion rate** — boxes completed ÷ boxes started. This is the health metric. Anything below roughly half suggests too many slots, too many options, or an unclear price. - **Drop-off by slot.** Tells you exactly which decision is too hard. A cliff at slot 3 means slot 3 has too many options or an unclear purpose. - **Average box value** compared with your standard AOV. - **Component distribution** — which items appear in what share of boxes. This is your demand forecast and your merchandising insight in one table. That last number is the quiet benefit of running a box at all. It tells you what your customers actually want together, which is more honest than any survey and more useful than any category report. ### FAQ **What is the difference between build-a-box and mix-and-match?** Mix-and-match usually means picking any qualifying number of items from a collection for a discount. Build-a-box adds structure - defined slots with different eligible products for each, such as one base, two flavours and one extra. Build-a-box generally converts better because the structure guides the shopper rather than leaving them with an open field. **How many products should be available to choose from?** Six to twelve per slot works well. Fewer than six feels restrictive enough that shoppers question whether the box is worth it. More than twelve and completion rate drops as the shopper stalls, particularly on mobile where scanning a long grid is slow. **Should I price per box or per item?** Per box wherever your margins allow. A flat price is instantly comprehensible and makes the value obvious. Per-item pricing with a running discount requires the shopper to track arithmetic while choosing, which is exactly the cognitive load a box is supposed to remove. **What happens when a component goes out of stock?** It must disappear from the picker immediately, and any box in progress that contains it needs a clear swap prompt. The failure mode - a customer completing a box and hitting an error at checkout - is one of the worst experiences in ecommerce because it wastes several minutes of deliberate effort. **Are build-a-box bundles worth it for small catalogues?** Usually not. A box needs genuine variety to feel like a choice. With fewer than about eight suitable products, a curated fixed bundle communicates value more clearly and takes a fraction of the setup effort. ## Bundle Discount Maths — How Deep You Can Go Before You Lose Money URL: https://ninety9.dev/blog/bundle-discount-margin-maths.html Published: 2026-02-10 Category: Bundles & Upsells · App: Addly: AI Bundles app & Upsell Reading time: 5 minutes A worked model for bundle profitability including cannibalisation, discount stacking, shipping cost and returns — with the break-even formula most stores never run. Most bundle decisions are made with a rule of thumb. "Fifteen percent feels about right." "Competitors are doing twenty." Neither of those is a calculation, and bundles are one of the few merchandising decisions where the arithmetic is both tractable and decisive. You can know, before launching, roughly what a given discount depth will do to your gross profit. It takes about twenty minutes. ## The core question A bundle discount is paid to two groups of people: - Customers who bought more **because** of the bundle. These are the reason the bundle exists. - Customers who would have bought everything anyway. These are pure cost. The whole model is the ratio between them. ## Estimating cannibalisation before you launch The good news is that you do not have to guess. Your existing data contains a reasonable floor estimate. Pull the last 90 days of orders. For products A and B that you intend to bundle: > **Baseline attach rate** = orders containing both A and B ÷ orders containing A If 38% of customers who buy A already buy B, then at least 38% of your bundle buyers were going to buy both regardless. In practice the real number is a little higher, because a bundle also attracts the people who were *nearly* going to. A workable planning assumption is baseline attach rate plus about ten points. If your baseline attach is 38%, plan for roughly 48% cannibalisation. A bundle at 25% off with 20% cannibalisation is usually profitable. The same bundle at 10% off with 70% cannibalisation is usually not. The discount is the number you control; cannibalisation is the number that decides. ## The break-even formula Set up the variables: - `P` = combined full price of the bundle - `M` = blended gross margin on the bundle contents (as a decimal) - `d` = discount depth (as a decimal) - `c` = cannibalisation rate (as a decimal) - `u` = share of bundle buyers who upgraded from buying just the anchor - `n` = share who bought nothing before (`c + u + n = 1`) Gross profit per 100 bundle buyers, compared with what those 100 people would have produced without the bundle: ``` Cannibalised group: -100 × c × P × d Upgrader group: +100 × u × (P_added × M - P × d) New buyers: +100 × n × (P × M - P × d) ``` That looks heavier than it is. In practice you only need one question answered: **at what discount depth does the total go negative for my realistic cannibalisation rate?** ## A worked example Product A: $60, 55% margin. Product B: $30, 50% margin. Bundle full price $90. Blended margin ≈ 53%. Baseline attach rate between A and B is 30%, so plan for ~40% cannibalisation. Assume 45% upgraders (bought A only before) and 15% new buyers. | Discount | Price | Cost of cannibalisation (per 100) | Gain from upgraders | Gain from new | Net | |---|---|---|---|---|---| | 5% | $85.50 | −$180 | +$473 | +$648 | **+$941** | | 10% | $81.00 | −$360 | +$270 | +$581 | **+$491** | | 15% | $76.50 | −$540 | +$68 | +$513 | **+$41** | | 20% | $72.00 | −$720 | −$135 | +$446 | **−$409** | | 25% | $67.50 | −$900 | −$338 | +$378 | **−$860** | Break-even sits just above 15%. Anything deeper destroys value at this cannibalisation rate. Now change one input. If cannibalisation were 20% instead of 40% — a genuinely novel pairing customers had not thought of — break-even moves out past 25%. Same products, same margins, completely different answer. That is the whole argument for measuring rather than guessing. ## The three costs people forget The table above is still optimistic, because three real costs are missing. ### 1. Discount stacking Your bundle discount rarely applies alone. Add a site-wide promo code, a free shipping threshold the bundle now clears, and a loyalty discount, and the *effective* discount on a bundle order is routinely five to ten points deeper than the headline. Model the worst realistic case: your deepest bundle, plus your most generous active code, plus free shipping, on your lowest-margin components. If that combination is unprofitable, either exclude bundles from code stacking or raise the free shipping threshold for bundle orders. ### 2. Shipping economics This one usually helps. Two items in one parcel cost meaningfully less to fulfil than the same two items in two parcels, and bundles consolidate orders that might otherwise have been split. If a bundle converts two separate future orders into one, you save an entire pick, pack and shipment. On low-value items that saving can be a large share of the discount you gave away. Include it — it is real money and it moves the break-even point outward. ### 3. Returns Bundles change the returns picture in two ways. Return *rate* often falls slightly, because curated sets have better fit than individually chosen items. But return *complexity* rises sharply, because a partial return on a discounted set raises a question most refund policies do not answer. If a customer returns one $30 item from a $76.50 bundle, do you refund $30 or the effective discounted price of $25.50? If you refund full retail, the customer has effectively bought the remaining item at a deeper discount than you ever offered — and a small number of customers will work this out and do it deliberately. Set the rule explicitly: refund the effective per-item price after the bundle discount. Write it into the policy and make sure support knows it. A generous partial-return policy on discounted bundles is exploitable. It rarely becomes a large problem, but it is worth closing before it does rather than after. ## Sanity checks before you publish Five questions. If you cannot answer all five, do not launch it yet. 1. **What is the baseline attach rate** between these products today? 2. **What is my break-even discount** at that cannibalisation rate? 3. **What is the deepest possible stack** — bundle plus code plus shipping — and is it still above break-even? 4. **What is the partial-return rule**, and does support know it? 5. **Which component runs out first**, and what happens to the bundle when it does? ## Reviewing a live bundle Four numbers, monthly: - **Effective discount rate** — total discount given ÷ total bundle revenue. Compare with the headline discount. The gap is your stacking leakage. - **Incremental units** — units sold in bundles minus what the baseline attach rate predicts. This is your real output. - **Gross profit per bundle order** versus your non-bundle average. The verdict. - **Component stockout frequency.** A bundle that is unavailable half the month is not really running. ## The uncomfortable conclusion Most stores are running at least one bundle that loses money, and it is usually the popular one — because popularity in a bundle often means it was an obvious combination, and obvious combinations have high cannibalisation. The bundles that make money are frequently the less popular ones: the pairing customers had not thought of, the sample pack that introduces a new category, the accessory nobody knew existed. Those have low cannibalisation because there was no existing behaviour to cannibalise. Which means the correct response to "this bundle sells brilliantly" is not to promote it harder. It is to check the attach rate it had before you launched it. ### FAQ **How do I calculate whether a bundle is profitable?** Compare the gross profit from incremental units the bundle creates against the discount given to customers who would have bought everything anyway. If the first number exceeds the second, the bundle is profitable. The hard part is estimating the second, which is your cannibalisation rate. **What is cannibalisation in bundle pricing?** The share of bundle buyers who would have purchased every item in the bundle regardless. Every one of them costs you the full discount for no behaviour change. Your existing attach rate between the products gives you a reasonable floor estimate before launch. **What discount depth is safe for a bundle?** There is no universal number because it depends on your gross margin and your cannibalisation rate. On a fifty-five percent margin product with moderate cannibalisation, discounts in the ten to eighteen percent range are usually comfortable. The formula in this article gives you your own figure rather than a rule of thumb. **Should shipping cost be included in bundle margin calculations?** Yes, and it usually improves the picture rather than hurting it. Shipping two items in one parcel costs meaningfully less than shipping them in two, so a bundle that consolidates orders recovers some of its discount in fulfilment savings. **How do returns affect bundle profitability?** More than most stores account for. A partial return on a discounted set raises a question your refund policy probably does not answer, and unresolved it defaults to refunding full retail on an item sold at a discount. Set the rule explicitly - refund the effective discounted price.