<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Ninety9 — Shopify AOV &amp; CRO blog</title>
    <link>https://ninety9.dev/blog/</link>
    <atom:link href="https://ninety9.dev/rss.xml" rel="self" type="application/rss+xml"/>
    <description>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.</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 13 Oct 2026 00:08:52 GMT</lastBuildDate>
    <generator>Ninety9 static site builder</generator>
    <image><url>https://ninety9.dev/assets/img/brand/ninety9-logo.png</url><title>Ninety9</title><link>https://ninety9.dev/</link></image>
    <item>
      <title>20 Shopify Upsell Examples From Real Stores</title>
      <link>https://ninety9.dev/blog/shopify-upsell-examples.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/shopify-upsell-examples.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Average Order Value</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Twenty Shopify upsell patterns stores actually run, on the product page, in the cart and before checkout. Examples to copy, not invented case studies.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>These twenty are offer patterns stores repeat. This page does not name a brand or invent a revenue number.</li><li>Put the set and the quantity break on the product page with <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a>. Put one complement in the cart with <a href="/apps/addy.html?src=Ninety9Blog">Addy</a>.</li><li>Ask once before checkout with <a href="/apps/monet.html?src=Ninety9Blog">Monet</a>. A threshold gift is <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a>, not a fifth popup.</li><li>Two of these, aimed at the product you already sell, beat all twenty running at once.</li></ul></section>
<p>These are twenty upsells you see on live Shopify stores, written as patterns you can set up. No brand names, and no &quot;this store grew 40%&quot; claims. If a number is not from your orders, it does not belong on the offer.</p>
<p>Two surfaces do most of the work. The product page sells the set. The cart sells one more thing. A popup is a third ask, and only if the first two did not already make it.</p>
<h2 id="on-the-product-page">On the product page</h2>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> owns these. The price is a Shopify discount, so the page and checkout match.</p>
<div class="tablewrap"><table><thead><tr><th>#</th><th>Example</th><th>Why it is the one to copy</th></tr></thead><tbody>
<tr><td>1</td><td>A fixed kit: device, case, cable</td><td>One price, one decision, three SKUs you already stock</td></tr>
<tr><td>2</td><td>A pair taken from real orders, cleanser and moisturiser</td><td>The second item comes from what people bought, not from a hunch</td></tr>
<tr><td>3</td><td>A quantity break on the hero SKU</td><td>The second and third unit are the whole upsell</td></tr>
<tr><td>4</td><td>Mix and match, three for a set price</td><td>Choice stays. The discount is still one rule</td></tr>
<tr><td>5</td><td>A paid add-on under the buy button</td><td>A pouch, a sample, engraving. Optional and visible</td></tr>
<tr><td>6</td><td>The refill pouch next to the bottle</td><td>Same product, lower price per use, still a choice</td></tr>
<tr><td>7</td><td>Good, better, best as three sets</td><td>One selected. Not seven cards</td></tr>
<tr><td>8</td><td>The quantity break on the variant they picked</td><td>The size in the cart is the size that is discounted</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="in-the-cart">In the cart</h2>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> shows one of these. One click, no reload.</p>
<div class="tablewrap"><table><thead><tr><th>#</th><th>Example</th><th>Why it is the one to copy</th></tr></thead><tbody>
<tr><td>9</td><td>The case for the item just added</td><td>Completes the product they already chose</td></tr>
<tr><td>10</td><td>A second unit at the quantity price</td><td>The break they skipped on the page, asked once</td></tr>
<tr><td>11</td><td>Gift wrap as a line they add</td><td>A fee with a yes, not a fee that appears</td></tr>
<tr><td>12</td><td>Shipping protection, off until they tick it</td><td>Optional. Pre-ticked is a dark pattern</td></tr>
<tr><td>13</td><td>One product that crosses the free-shipping line</td><td>The bar named the gap. The offer fills it</td></tr>
<tr><td>14</td><td>A delivery date under the lines</td><td>Not an upsell. It stops the bounce that kills the upsell</td></tr>
</tbody></table></div>
<h2 id="before-they-pay-and-as-a-goal">Before they pay, and as a goal</h2>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> asks at add to cart, when checkout starts, or on exit. One product. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is the goal on the bar.</p>
<div class="tablewrap"><table><thead><tr><th>#</th><th>Example</th><th>Where</th></tr></thead><tbody>
<tr><td>15</td><td>A travel size after they add the full size</td><td>Add to cart, <a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a></td></tr>
<tr><td>16</td><td>The matching shade as checkout starts</td><td>Monet, then stop</td></tr>
<tr><td>17</td><td>The cheaper format when they move to leave</td><td>Exit, once</td></tr>
<tr><td>18</td><td>Free shipping, then 10% off, then a gift</td><td><a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a>, three thresholds, one bar</td></tr>
<tr><td>19</td><td>A gift that adds itself when the cart qualifies</td><td>Goalify. The bar warned them</td></tr>
<tr><td>20</td><td>The add-on they removed, offered once</td><td>Exit or the cart. Not both</td></tr>
</tbody></table></div>
<p>Do not run 15 and 9 as the same SKU. Do not run 13 and a popup that also tries to close the shipping gap. One gap, one offer.</p>
<p>A recommendation after they have paid belongs on the edit screen in <a href="/apps/reviso.html?src=Ninety9Blog">Reviso</a>, if they came back to change the order. It does not replace 1 through 14.</p>
<h2 id="six-of-them-built-with-numbers">Six of them, built with numbers</h2>
<p>These are setups. The prices are examples so the arithmetic is visible. Use your cost.</p>
<p><strong>1. The kit.</strong> Device $80, case $18, cable $12. Sold separately that is $110. A set at $99 is $11 off, about 10%. If the three cost you $48 landed, the set still has $51 before ads and the label. Show one price under the buy button. <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> creates that as a Shopify discount, so the page and checkout match. A widget price checkout ignores is not a kit.</p>
<p><strong>3. The quantity break.</strong> One jar $28, two $48, three $66. The second jar is $20, the third is $18. Put the tiers on the product page, on the variant they selected. A break that applies to a size they did not pick is a surprise at checkout. The margin check is the same worksheet as any other product discount. Two product discounts on that jar, the break plus a sitewide sale, are usually one cut too many. That is in <a href="/blog/shopify-discount-stacking-explained.html?src=Ninety9Blog">discount stacking</a>.</p>
<p><strong>9. The case in the cart.</strong> They added the device. <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> shows the case once, one click, no reload. If the product page already sold the kit, the drawer does not sell the case again.</p>
<p><strong>13. The shipping closer.</strong> The bar says $16 to go. One product they have a reason to want costs $18. Offer that product, not a grid. If you have no honest $18 add, change the threshold. Do not invent a cheap add-on to force the bar to complete.</p>
<p><strong>18. Three goals.</strong> Free shipping at $75, 10% off at $100, a pouch at $120. One bar, in order. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> reveals the next goal when the current one completes, and it can add the pouch when the cart qualifies. Publishing all three sentences at once, with no progress, is a poster. The sequence is the offer.</p>
<p><strong>19. The gift.</strong> The pouch costs you $2.10. It appears at $0 when the cart crosses $120, and it leaves if the cart drops back. The bar said it was coming. A gift that appears for the first time on the order status page feels like a mistake, even when the price is zero.</p>
<h2 id="how-to-choose-the-two-you-will-actually-run">How to choose the two you will actually run</h2>
<p>Pull the last ninety days of orders. For the hero product, list the other SKUs that show up in the same order. The pair with a real count is example 2. The hero&#39;s own quantity break is example 3, if a second unit is something people can use. Those two are the product page.</p>
<p>Then look at carts that stalled under the shipping threshold. If one SKU would have closed the gap often, that is example 13, and it lives in the drawer. If the stalled carts have nothing sensible to add, the threshold is wrong. Fix the number before you design an upsell to paper over it. The method is in <a href="/blog/how-to-set-up-free-shipping-over-x-shopify.html?src=Ninety9Blog">how to set free shipping over $X</a>.</p>
<p>Leave the popup for a gap the page and the drawer are not already covering. <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> asks at add to cart, at checkout, or on exit. One product. If example 9 and example 15 are the same SKU, delete 15.</p>
<div class="tablewrap"><table><thead><tr><th>Live this week</th><th>Holds</th></tr></thead><tbody>
<tr><td>A set or a pair on the hero</td><td><a href="https://apps.shopify.com/addly?src=Ninety9Blog">Addly</a></td></tr>
<tr><td>One complement, or the item that closes shipping</td><td><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a></td></tr>
<tr><td>A goal the bar can explain</td><td>Goalify</td></tr>
<tr><td>One ask, if the first two did not already make it</td><td>Monet</td></tr>
<tr><td>A recommendation if they come back to edit</td><td><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a></td></tr>
</tbody></table></div>
<h2 id="what-to-count-after-a-week">What to count after a week</h2>
<p>You do not need a published benchmark. From your own orders, count:</p>
<ul>
<li>Orders that contain the set, versus orders of the hero alone.</li>
<li>Drawer adds of the complement that are still in the order at payment.</li>
<li>Carts that crossed the threshold after the closer was shown.</li>
<li>Popups closed with no add. A high close rate means the moment or the product is wrong.</li>
</ul>
<p>Stop at two offers if those counts are still noisy. Twenty live offers is how the same shopper sees the case three times and trusts the price less.</p>
<p>Variant matters on the break and on the pair. A two-pack price that applies to a size they did not select will look like a stacking error at checkout. Set the break on the variant in the cart. Addly can do that. A pair that ignores the shade they picked will recommend the wrong bottle. Pin the shade when the campaign is about one shade. Use purchase patterns when any shade is a fair suggestion.</p>
<p>Install <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> for the product page. The cart version of this list is in <a href="/blog/in-cart-upsells-that-convert.html?src=Ninety9Blog">in-cart upsells that convert</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Are these from specific Shopify stores?</summary><div class="faq__a"><p>They are the offers working stores repeat, written so you can set them up. This page does not name those stores or attach a lift percentage. Copy the pattern, then check it against your own orders.</p></div></details>
<details><summary>Which example should I ship first?</summary><div class="faq__a"><p>The pair or the quantity break on the product you already sell most, in Addly. Then one cart complement in Addy. Stop there for a week.</p></div></details>
<details><summary>Can I run a popup and a cart upsell for the same item?</summary><div class="faq__a"><p>You can. You should not. The shopper sees the same product twice and trusts the price less.</p></div></details>
<details><summary>Where do free gifts fit?</summary><div class="faq__a"><p>As a goal on the bar, added when the cart qualifies. Goalify. Not as a surprise line with no remaining amount.</p></div></details>
<details><summary>What about an upsell after they pay?</summary><div class="faq__a"><p>That is a new order, or an edit-screen recommendation in <a href="/apps/reviso.html?src=Ninety9Blog">Reviso</a>. It is not a substitute for the offer they should have seen before checkout.</p></div></details>
<details><summary>How do I know a pair is real?</summary><div class="faq__a"><p>Count orders in the last ninety days that contain both products. If that pair is rare, it is a hunch. Put a hunch on a campaign, not on every product page.</p></div></details>
<details><summary>How many of the twenty should be live?</summary><div class="faq__a"><p>Two. The product-page offer and one cart offer. Add a popup only if those two are not already asking for the same item.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify add to cart popup apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-add-to-cart-popup-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-add-to-cart-popup-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify add to cart popup apps. Features, pricing and where Monet, BA, EA, Kaching and Uplift fit after the click.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Shopify add to cart popup should sell one product at the moment the shopper commits, not after a timer on a collection page.</li><li>Email capture, sitewide promos and view caps are a different app. They do not belong in the add-to-cart frame.</li><li>Monet opens on add to cart, checkout start or exit, with bundle, cross-sell and add-on layouts, and it is free to install.</li><li>One product, one price, one button, one way out.</li></ul></section>
<p>A Shopify add to cart popup is the overlay that appears after the shopper adds a product. Merchants search &quot;add to cart popup&quot; when that click is the last moment a second SKU can ride along, and &quot;Shopify <a href="https://apps.shopify.com/monet?src=Ninety9Blog">upsell popup</a> app&quot; when a timer popup has already trained people to close overlays. The useful version sells one product. The rest interrupt browsing.</p>
<p>This comparison looks at five Shopify add to cart popup apps from the 2026 App Store. The ranking favours a product offer at the add, at checkout start, or on exit. A simpler popup that also asks for an email, or fires on a timer, is a different job.</p>
<figure><img src="/assets/img/blog/best-shopify-add-to-cart-popup-apps-2026-inline.jpg" alt="One product, one price, one add button and a skip link" loading="lazy" decoding="async"><figcaption>A popup is a yes or no. A grid is a catalogue.</figcaption></figure>
<h2 id="how-these-add-to-cart-popup-apps-were-ranked">How these add to cart popup apps were ranked</h2>
<p><a href="/blog/add-to-cart-popup-upsell.html?src=Ninety9Blog">Add-to-cart popup upsells</a> is the job. The list weights:</p>
<ol>
<li><strong>Whether add to cart is a real trigger</strong>, not a timer that happens to mention the cart.</li>
<li><strong>Whether the frame sells a product</strong>, with a picture, a price and one add.</li>
<li><strong>Whether the app stays free when that offer is the whole product.</strong></li>
<li><strong>Whether email and weekend banners live somewhere else.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> is first because a Shopify add to cart popup app that also collects email usually gets a close.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Add to cart</th><th>Also in the frame</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a></td><td>5.0 / 4</td><td>Free to install</td><td>Yes, plus checkout start and exit</td><td>Bundle, cross-sell, add-on, BOGO</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/not-another-popup-upsell" target="_blank" rel="noopener">BA Popup Upsell</a></td><td>5.0 / 25</td><td>Dev stores free, then $7.99</td><td>Yes, plus exit and a timer</td><td>Bundles, quantity breaks, A/B</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/ea-upsell-popups-cross-sell" target="_blank" rel="noopener">EA Bundles &amp; Upsell Popups</a></td><td>4.9 / 24</td><td>Free plan, all features at $9.99</td><td>Popup cross-sell</td><td>Bundles, BOGO, quantity breaks</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/popup-upsell" target="_blank" rel="noopener">Kaching Upsell &amp; Email Popup</a></td><td>5.0 / 137</td><td>Dev stores free, then $4.99</td><td>Targeted popups</td><td>Email capture</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/uplift-1" target="_blank" rel="noopener">Uplift</a></td><td>0.0 / 0</td><td>Free plan, or about $9.99</td><td>Add to cart</td><td>Pre-purchase popups, no public reviews</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/monet/icon.png" alt="Monet • AI Popup Bundle Addons app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Monet • AI Popup Bundle Addons</p>
<p class="appcta__text">AI upsell popups triggered on add to cart, checkout initiation and exit intent.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-monet-the-add-happens-then-one-product">1. Monet — the add happens, then one product</h2>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a> is a Shopify add to cart popup app. It opens when the shopper adds, when checkout starts, or on exit. It does not open because ten seconds passed. The layouts are a bundle, a cross-sell or an add-on. You choose the product, or it can follow purchase patterns. Discounts can be percent, flat, BOGO, tiered or volume, with a countdown only when the deadline is real. Country and customer-tag rules decide who sees it.</p>
<p>It is free to install. It does not collect email. It is not a thank-you-page upsell. It has four public reviews. That is the record. The trigger is the product.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Add to cart, checkout start and exit, without a browse timer</li>
<li>Bundle, cross-sell and add-on layouts</li>
<li>Free, with no view cap on the listing</li>
<li>Email stays out of the frame</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Four public reviews</li>
<li>No A/B test inside the app</li>
<li>Wrong tool for a sitewide weekend banner</li>
</ul>
<p>The add-to-cart version can be the set. The exit version should be smaller. <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can own the shipping maths. Monet owns the product ask.</p>
<h2 id="2-ba-popup-upsell">2. BA Popup Upsell</h2>
<p><a href="https://apps.shopify.com/not-another-popup-upsell" target="_blank" rel="noopener">BA</a> adds a timer next to add to cart and exit. 5.0 from 25 reviews. Built for Shopify. Paid plans from $7.99 are billed on added revenue. Bundles, quantity breaks and A/B testing sit on the paid plans.</p>
<p>The timer is the feature most likely to fire on a collection page. A collection page should not have a popup. An A/B test does not repair a trigger you should leave off. You also start paying on attributed revenue once you leave a development store.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Add to cart and exit in one app</li>
<li>A/B testing on the paid listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Timer trigger is easy to misuse</li>
<li>You pay on attributed revenue</li>
<li>A narrower free story than a free install</li>
</ul>
<h2 id="3-ea-bundles-upsell-popups">3. EA Bundles &amp; Upsell Popups</h2>
<p><a href="https://apps.shopify.com/ea-upsell-popups-cross-sell" target="_blank" rel="noopener">EA</a> is a cross-sell popup with bundles attached. 4.9 from 24 reviews. A free plan is on the listing. All features are listed at $9.99, including bundles, BOGO and quantity breaks.</p>
<p>A popup plus a quantity-break builder is two products. The add-to-cart moment needs one product and one button. Quantity breaks belong on the product page, in a bundles app, not inside an overlay the shopper did not ask to configure.</p>
<p><strong>Pros</strong></p>
<ul>
<li>A free plan</li>
<li>Cross-sell is on the listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>The popup is bundled with a wider offer builder</li>
<li>Twenty-four reviews</li>
<li>$9.99 to unlock the full feature list</li>
</ul>
<h2 id="4-kaching-upsell-email-popup">4. Kaching Upsell &amp; Email Popup</h2>
<p><a href="https://apps.shopify.com/popup-upsell" target="_blank" rel="noopener">Kaching</a> is a suite popup. 5.0 from 137 reviews. Built for Shopify. Free on development stores, then $4.99, $12.99 and $24.99. The listing includes email.</p>
<p>Email and an add-to-cart product are different successes. Mixing them in one overlay usually gets a close. Use a list tool for the list. Use a product popup for the pouch.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Low paid entry</li>
<li>Familiar if you already run Kaching</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Email capture in the same product</li>
<li>Paid once you leave a development store</li>
<li>Easy to publish a promotion instead of an offer</li>
</ul>
<h2 id="5-uplift">5. Uplift</h2>
<p><a href="https://apps.shopify.com/uplift-1" target="_blank" rel="noopener">Uplift</a> says it displays a popup when customers add to cart. The listing shows a free plan and a paid option around $9.99. Public reviews: none. The rating on the listing is 0.0.</p>
<p>An add-to-cart trigger with no public record is a simpler experiment than a popup you can already describe. Confirm the triggers on the plan screen before you promise checkout start and exit as well. Monet publishes those three moments, and it is free.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Add to cart is the named trigger</li>
<li>A free plan on the listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>No public reviews</li>
<li>A paid tier for unlimited pre-purchase popups</li>
<li>A thin listing next to a finished offer</li>
</ul>
<h2 id="which-shopify-add-to-cart-popup-app-should-you-install">Which Shopify add to cart popup app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>A product at add to cart, checkout start, or exit, free</td><td>Monet</td></tr>
<tr><td>The same click, plus a timer you have to keep off</td><td>BA</td></tr>
<tr><td>A popup mixed with a bundle builder</td><td>EA</td></tr>
<tr><td>An overlay that also asks for email</td><td>Kaching</td></tr>
<tr><td>An add-to-cart popup with no public reviews</td><td>Uplift</td></tr>
</tbody></table></div>
<aside class="callout callout--warn">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 9v4M12 17h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>One product in the frame</p>
<p>A popup with four products is a second storefront. The shopper answers yes or no. The <a href="/blog/one-offer-popup-rule.html?src=Ninety9Blog">one-offer popup rule</a> is the design pass.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a>. Design the add-to-cart version first. Make the exit version smaller. Leave email and the weekend banner where they already live.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify add to cart popup app in 2026?</summary><div class="faq__a"><p>Monet. The popup adds a product when the shopper adds to cart, starts checkout, or leaves, and it is free. A timer, an email field or a view cap is a more limited overlay.</p></div></details>
<details><summary>Will an add to cart popup hurt conversion?</summary><div class="faq__a"><p>It can, if it fires while someone is still reading. Monet does not open on a browse timer. It waits for the add, checkout start, or exit. Watch the hero add-to-cart rate.</p></div></details>
<details><summary>Should the add to cart popup also collect emails?</summary><div class="faq__a"><p>No. Monet does not collect email. A shopper who just added a product does not owe you an address. Keep the list in the tool you already use.</p></div></details>
<details><summary>Can the same popup run on add to cart and on exit?</summary><div class="faq__a"><p>The trigger can. The offer should not be a copy-paste. The add-to-cart version can be the set. The exit version should be smaller. Trigger notes are in <a href="/blog/popup-triggers-ranked.html?src=Ninety9Blog">popup triggers ranked</a>.</p></div></details>
<details><summary>Is an add to cart popup the same as a thank-you page upsell?</summary><div class="faq__a"><p>No. Monet is not a thank-you-page upsell. The offer happens before checkout finishes. The wider popup shortlist is in <a href="/blog/best-shopify-upsell-popup-apps-2026.html?src=Ninety9Blog">upsell popup apps</a>.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify bundles apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-bundles-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-bundles-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify bundles apps. Features, pricing and where Addly, Kaching, Fast Bundle, Pumper and Shopify Bundles fit on a product page.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Shopify bundles app earns its place when the product page can sell a set, a pair, a quantity break and a mix-and-match box without a second discount tool.</li><li>Fixed-pack apps are a simpler install. They stop being enough the week the same SKU needs a ladder or a box the shopper builds.</li><li>Addly keeps frequently bought together, quantity breaks, mix and match and add-ons on every plan, including free under 15 orders a month.</li><li>Revenue caps bill you for a bundle that works. Order bands bill you for the store you already have.</li></ul></section>
<p>A <a href="https://apps.shopify.com/addly?src=Ninety9Blog">Shopify bundles app</a> puts more than one product, or more than one unit, into a single decision on the product page. Merchants search &quot;Shopify bundles&quot; when the catalogue already has a set people should buy together, and &quot;Shopify bundles app&quot; when the theme cannot build that set on its own. The widget is not the strategy. The strategy is which shapes the app will still sell six months later.</p>
<p>This comparison looks at five Shopify bundles apps from the 2026 App Store. The ranking favours one discount that can hold a fixed set, a pair from real orders, a quantity break and a box the shopper builds. A simpler pack builder is a real listing. It is also the app you replace.</p>
<figure><img src="/assets/img/blog/best-shopify-bundles-apps-2026-inline.jpg" alt="Bundle choices with a highlighted pack, a live total and one add button" loading="lazy" decoding="async"><figcaption>One decision, one total, one button. A wall of bundle types is how the page stalls.</figcaption></figure>
<h2 id="how-these-shopify-bundles-apps-were-ranked">How these Shopify bundles apps were ranked</h2>
<p>The <a href="/blog/shopify-product-bundles-guide.html?src=Ninety9Blog">Shopify product bundles guide</a> is the brief. The list weights:</p>
<ol>
<li><strong>How many offer shapes live in the app</strong> — fixed sets, pairs, quantity breaks, mix and match, add-ons.</li>
<li><strong>Whether the cheap plan still includes those shapes.</strong></li>
<li><strong>Whether the bill follows store orders</strong>, not a cap on &quot;extra revenue&quot; the app attributes.</li>
<li><strong>Whether the pair can come from orders</strong>, not only from a collection you tagged by hand.</li>
</ol>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> is first because a Shopify bundles app that locks the next offer behind a higher plan is a starter widget with a second contract attached.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Offer shapes on the cheap plan</th><th>How you pay later</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a></td><td>4.9 / 111</td><td>Free under 15 orders, then $9.99</td><td>Sets, pairs, quantity breaks, mix and match, add-ons</td><td>Orders, no revenue cap</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/bundle-deals" target="_blank" rel="noopener">Kaching Bundles</a></td><td>5.0 / 6,271</td><td>Free to install, paid from $14.99</td><td>Bundle deals, with a revenue ceiling on paid plans</td><td>Attributed revenue, capped</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/fast-bundle-product-bundles" target="_blank" rel="noopener">Fast Bundle</a></td><td>5.0 / 3,541</td><td>Free on development stores, then $19</td><td>Bundles, with AI pairs starting on paid</td><td>Bundle-sales caps at $19, $49, $139</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/pumper-quantity-breaks-product-bundles-discounts" target="_blank" rel="noopener">Pumper</a></td><td>4.9 / 3,557</td><td>Free until $300 extra revenue</td><td>Quantity breaks and bundles, then a cap</td><td>$9.99, $29.99, $49.99 on extra revenue</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/shopify-bundles" target="_blank" rel="noopener">Shopify Bundles</a></td><td>2.9 / 568</td><td>Free</td><td>Fixed bundles and multipacks</td><td>Stays a pack builder</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-addly-a-shopify-bundles-app-that-keeps-the-next-offer">1. Addly — a Shopify bundles app that keeps the next offer</h2>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog">Addly</a> is a Shopify bundles app for the product page and the offers that show up after the first set is live. Frequently bought together can be drafted from purchase history, or picked by you on a new shop. The same install runs a <a href="/blog/quantity-breaks-vs-volume-discounts.html?src=Ninety9Blog">quantity break</a> per variant, a <a href="/blog/build-a-box-mix-and-match-bundles.html?src=Ninety9Blog">mix and match</a> box, and add-ons. Offers go through Shopify&#39;s own discounts, so the widget price is the checkout price.</p>
<p>Thirteen languages and Shopify Markets are on every plan. Live preview and offer analytics are too. Forever Free covers stores under 15 orders a month. Then $9.99, $24.99 and $49.99. The band is orders. The offer list does not shrink. Built for Shopify, 4.9 from 111 reviews.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Sets, pairs, quantity breaks, mix and match and add-ons in one Shopify bundles app</li>
<li>Same offers on the free plan and on $49.99</li>
<li>Pairs from real orders, or chosen by you</li>
<li>No cap on attributed revenue</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>111 reviews, not several thousand. The plan does not hide the next offer to make up for that.</li>
</ul>
<p>The same offer can show in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer. Do not publish it twice. Pick the surface.</p>
<h2 id="2-kaching-bundles">2. Kaching Bundles</h2>
<p><a href="https://apps.shopify.com/bundle-deals" target="_blank" rel="noopener">Kaching</a> is the high-review quantity-break suite. 5.0 from 6,271 reviews. The listing is free to install. Paid plans at $14.99, $29.99 and $59.99 cap additional revenue at $1,000, $5,000 and $10,000.</p>
<p>A ladder widget with that many reviews is a known pattern. It is still a revenue meter. When the bundle works, the cap is the bill. When the same product also needs a pair from orders and a box, you are reading which plan unlocked which shape.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Very large review base</li>
<li>Familiar quantity-break widget</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Paid plans cap additional revenue</li>
<li>The next offer shape is a plan question, not a default</li>
<li>$14.99 is the start of the paid ladder, not the whole product</li>
</ul>
<h2 id="3-fast-bundle">3. Fast Bundle</h2>
<p><a href="https://apps.shopify.com/fast-bundle-product-bundles" target="_blank" rel="noopener">Fast Bundle</a> is named for pace. 5.0 from 3,541 reviews. Free on development stores. Paid plans at $19, $49 and $139 follow monthly bundle sales, with caps around $1,000, $3,000 and $10,000. AI frequently bought together starts on the paid side.</p>
<p>Speed is a preview. A fast empty bundle is still empty. A suggestions feature that begins at $19 is a simpler app than the listing headline.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large review base</li>
<li>Built around getting a bundle onto the page</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Bundle-sales caps on the paid plans</li>
<li>AI pairs are not the free product</li>
<li>$139 is a long way from a $19 experiment</li>
</ul>
<h2 id="4-pumper">4. Pumper</h2>
<p><a href="https://apps.shopify.com/pumper-quantity-breaks-product-bundles-discounts" target="_blank" rel="noopener">Pumper</a> leads with quantity breaks and attaches bundles. 4.9 from 3,557 reviews. Free until about $300 of extra revenue, then $9.99, $29.99 and $49.99.</p>
<p>The free band ends when the offer works. That is a different contract from a free band that ends when the store passes 15 orders. A quantity-break app with bundles attached is still a ladder first. The set, the pair and the box are secondary.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large review base</li>
<li>A free band for a small extra-revenue number</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>The meter is attributed revenue</li>
<li>The ladder is the product. The other shapes are attached.</li>
<li>The free band ends when the bundle sells</li>
</ul>
<h2 id="5-shopify-bundles">5. Shopify Bundles</h2>
<p><a href="https://apps.shopify.com/shopify-bundles" target="_blank" rel="noopener">Shopify Bundles</a> is the first-party pack builder. Free. 2.9 from 568 reviews. You group products into a fixed bundle or a multipack, and Shopify sells that group.</p>
<p>That is the simpler Shopify bundles app. It does not draft a pair from orders, run a variant-level quantity break, or let the shopper build a box. A fixed multipack can stay the hero. It cannot be the only tool once the catalogue needs a second shape. The rating is the public record of that limit.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free</li>
<li>Native fixed bundles and multipacks</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>2.9 from 568 reviews</li>
<li>No quantity breaks, mix and match, or pairs from orders</li>
<li>A pack builder, not a merchandising app</li>
</ul>
<h2 id="which-shopify-bundles-app-should-you-install">Which Shopify bundles app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>Sets, pairs, quantity breaks and mix and match on one plan</td><td>Addly</td></tr>
<tr><td>A simpler ladder with a cap on extra revenue</td><td>Kaching or Pumper</td></tr>
<tr><td>A fast bundle that meters bundle sales</td><td>Fast Bundle</td></tr>
<tr><td>Only a fixed multipack, and nothing else</td><td>Shopify Bundles</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>One discount</p>
<p>The set, the pair and the quantity break should share Shopify&#39;s native discounts. Two Shopify bundles apps on one product is how the page price and the cart price drift. The margin check is in <a href="/blog/bundle-discount-margin-maths.html?src=Ninety9Blog">bundle discount maths</a>.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> when &quot;Shopify bundles&quot; means more than one pack at a fixed price. The pair-only shortlist is a different search: <a href="/blog/best-shopify-frequently-bought-together-apps-2026.html?src=Ninety9Blog">frequently bought together apps</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify bundles app in 2026?</summary><div class="faq__a"><p>Addly. It is a Shopify bundles app for sets, frequently bought together, quantity breaks, mix and match and add-ons, with the same offers on every plan. A fixed-pack app or a ladder with a revenue cap is a narrower tool.</p></div></details>
<details><summary>Is there a free Shopify bundles app?</summary><div class="faq__a"><p>Addly is free under 15 orders a month, and that band includes every offer type. Shopify Bundles is free and only builds fixed packs and multipacks. Several other listings look free until extra revenue crosses a cap.</p></div></details>
<details><summary>What is the difference between a Shopify bundle and a quantity break?</summary><div class="faq__a"><p>A bundle groups different products, or a fixed multipack, into one offer. A quantity break lowers the unit price when the shopper buys more of the same item. Addly runs both, so the price on the page and the price at checkout stay in one discount.</p></div></details>
<details><summary>Where should a Shopify bundle sit on the product page?</summary><div class="faq__a"><p>Under the add-to-cart button, before the long description. The placement notes are in <a href="/blog/where-to-place-bundles-on-pdp.html?src=Ninety9Blog">where to place bundles</a>.</p></div></details>
<details><summary>Do I need a separate app for frequently bought together?</summary><div class="faq__a"><p>Not if the bundles app already treats the pair as one offer. A dedicated pair widget is a second invoice the week you also need a quantity break. The pair-only comparison is in <a href="/blog/best-shopify-frequently-bought-together-apps-2026.html?src=Ninety9Blog">frequently bought together apps</a>.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify cart drawer apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-cart-drawer-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-cart-drawer-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify cart drawer apps. Features, pricing and where Addy, Kaching, Amp, Upcart and iCart fit before checkout.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A cart drawer beats a cart page for most stores because the shopper never leaves the product they were already buying.</li><li>Block order matters more than block count. Progress bar, line items, one upsell, delivery date, checkout.</li><li>Addy drafts the first drawer from the catalogue and brand, then lets you edit more than 40 blocks, including per-market carts. It is free to install.</li><li>Suites with a thousand reviews still open on an empty canvas. The week of a sale, an empty canvas is the delay.</li></ul></section>
<p>A Shopify cart drawer is a slide-out cart that opens on add to cart and keeps the product page behind it. The theme cart lists line items. A useful drawer sells the second item, shows how close the shopper is to free shipping, and states when the order arrives — without a trip to <code>/cart</code>.</p>
<p>This comparison looks at five Shopify cart drawer apps that show up in 2026 shortlists. The ranking favours a drawer you can publish in a day and then target by market, not a blank builder you assemble the week a promotion goes live.</p>
<figure><img src="/assets/img/blog/best-shopify-cart-drawer-apps-2026-inline.jpg" alt="Slide cart with a progress bar, line items, one upsell and checkout" loading="lazy" decoding="async"><figcaption>Progress, lines, one offer, checkout. That is the drawer. Everything else is optional.</figcaption></figure>
<h2 id="how-these-cart-drawer-apps-were-ranked">How these cart drawer apps were ranked</h2>
<p>The <a href="/blog/shopify-cart-drawer-complete-guide.html?src=Ninety9Blog">cart drawer guide</a> is the rubric. The list weights:</p>
<ol>
<li><strong>Time to a competent first cart</strong> — draft versus empty canvas.</li>
<li><strong>The blocks that actually sell</strong> — upsells, volume deals, gifts, shipping protection, a progress bar, a delivery date.</li>
<li><strong>Whether one store can run more than one cart</strong>, by market or tag.</li>
<li><strong>Whether the drawer stays off the first paint.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> is first because it drafts the cart from the catalogue and the brand, then gives you the block control the builders advertise. It is free to install. It has two public reviews. That last fact is why this list does not pretend review count is the same as a finished drawer.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>First cart</th><th>Markets / rules</th><th>Built for Shopify</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a></td><td>5.0 / 2</td><td>Free to install</td><td>AI draft from the catalogue</td><td>Markets, customer tags, per block</td><td>Not listed</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/cart-upsell" target="_blank" rel="noopener">Kaching Cart Drawer</a></td><td>5.0 / 1,484</td><td>Free plan, then paid</td><td>You assemble it</td><td>Language and store settings</td><td>Yes</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/slide-cart" target="_blank" rel="noopener">Amp Slide Cart</a></td><td>5.0 / 772</td><td>Free plan, paid around $29.99</td><td>Industry templates</td><td>Languages and markets</td><td>Yes</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/upcart-cart-builder" target="_blank" rel="noopener">Upcart</a></td><td>4.7 / 959</td><td>Free plan, then paid</td><td>You assemble it</td><td>HTML, CSS, JSX templates</td><td>Yes</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/icart" target="_blank" rel="noopener">iCart</a></td><td>4.7 / 451</td><td>First 100 orders free</td><td>You assemble it</td><td>Multi-tier bar, AI recs</td><td>Not listed</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-addy-a-drawer-that-starts-full">1. Addy — a drawer that starts full</h2>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a> is an AI cart drawer for Shopify. The first cart is not a blank column. The app reads the products you already sell and the way the brand already looks, then proposes a slide cart with the blocks a selling drawer needs. You edit it. You do not start from zero the week a campaign goes live.</p>
<p>After the draft you get more than 40 blocks: in-cart upsells, volume discounts, gifts, shipping protection, a free shipping progress bar, estimated delivery dates, countdown timers, announcement bars, trust badges, FOMO blocks, custom HTML and CSS. Targeting can change the whole cart, or a single block, by Shopify Market or customer tag. Prices render in the shopper&#39;s currency. Strings are translatable.</p>
<p>It loads asynchronously and only renders when opened, so it should not touch Largest Contentful Paint. A/B tests are built in, so you can compare two versions of the drawer instead of publishing a guess. If the offer itself is a bundle, let <a href="/apps/addly.html?src=Ninety9Blog">Addly</a> own the discount and let Addy present it. If the shipping threshold should be its own test, <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can run that bar.</p>
<p><strong>Pros</strong></p>
<ul>
<li>First cart is drafted, then editable</li>
<li>Markets and tags, including per block</li>
<li>Delivery date, protection, gifts and a progress bar in the same drawer</li>
<li>A/B tests on the drawer</li>
<li>Free to install</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Two public reviews. You are early.</li>
<li>Not listed as Built for Shopify</li>
</ul>
<h2 id="2-kaching-cart-drawer">2. Kaching Cart Drawer</h2>
<p><a href="https://apps.shopify.com/cart-upsell" target="_blank" rel="noopener">Kaching</a> is the high-review suite drawer. 5.0 from 1,484 reviews. Built for Shopify. Slide cart, urgency timer, free shipping or gift bars, payment icons, gift wrap and shipping-protection toggles, translations.</p>
<p>The review count is the listing. The first cart is still a blank column. You assemble the block order, then you decide which of those toggles to leave off. The timer and the payment-icon row are the ones merchants switch on because they exist, not because the cart needed them.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large public review base</li>
<li>Translations without code</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>You still assemble the first cart</li>
<li>Easy to publish every toggle at once</li>
<li>Familiar only if you already live in the Kaching suite</li>
</ul>
<h2 id="3-amp-slide-cart">3. Amp Slide Cart</h2>
<p><a href="https://apps.shopify.com/slide-cart" target="_blank" rel="noopener">Amp</a> leads with templates. 5.0 from 772 reviews. Built for Shopify. Industry layouts, progress bar, frequently bought together, gifts, BOGO, announcements, languages and markets. Paid pricing on the listing sits around a flat monthly fee once you leave the free plan.</p>
<p>A template is not a draft of your catalogue. It is a starting look you still fill. Brand fit comes from the products you already sell, not from an industry preset. And a flat monthly fee is a different conversation from a drawer that is free to install.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Industry templates on the listing</li>
<li>Markets and languages</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Paid plan is a flat fee, not a free install</li>
<li>The template still has to be filled before Friday</li>
<li>Design-first can delay the first live offer</li>
</ul>
<h2 id="4-upcart">4. Upcart</h2>
<p><a href="https://apps.shopify.com/upcart-cart-builder" target="_blank" rel="noopener">Upcart</a> is the builder named as a builder. 4.7 from 959 reviews. Built for Shopify. In-cart upsells, rewards, progress bars, gifts, and custom templates with HTML, CSS and JSX.</p>
<p>HTML and JSX are control. They are also a developer ticket. Addy already has custom HTML and CSS as a block, after a cart that was drafted from the store. Upcart opens on the canvas. The week of a sale, that is the delay.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Custom templates if you have someone to write them</li>
<li>Rewards and upsells in the same canvas</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Empty canvas by default</li>
<li>Custom code is a cost, not a toggle</li>
<li>4.7, not 5.0 — the review history is mixed on setup time</li>
</ul>
<h2 id="5-icart">5. iCart</h2>
<p><a href="https://apps.shopify.com/icart" target="_blank" rel="noopener">iCart</a> is a drawer plus a full cart page, popup and mini cart. 4.7 from 451 reviews. First 100 orders free for life on the listing, then paid bands. AI recommendations, bundles, volume discounts, BOGO, multi-tier progress bar, countdown.</p>
<p>Most stores that want a drawer do not also need a second cart page, a popup cart and a mini cart. Those extra surfaces are configuration you will not open. A working slide-out already keeps the shopper on the product. Keep the countdown for a real deadline.</p>
<p><strong>Pros</strong></p>
<ul>
<li>First 100 orders free on the listing</li>
<li>Multi-tier shipping bar</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>More surfaces than most stores will use</li>
<li>AI recs still need a merchandiser to kill substitutes</li>
<li>You assemble the first cart, same as the other builders</li>
</ul>
<h2 id="which-shopify-cart-drawer-should-you-install">Which Shopify cart drawer should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>A drafted cart, market rules, and an A/B test</td><td>Addy</td></tr>
<tr><td>A simpler suite you still assemble block by block</td><td>Kaching</td></tr>
<tr><td>An industry template, then a flat monthly fee</td><td>Amp</td></tr>
<tr><td>HTML and JSX, and someone to write them</td><td>Upcart</td></tr>
<tr><td>A drawer plus extra cart surfaces you may never open</td><td>iCart</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Block order</p>
<p>Progress bar, line items, one upsell, delivery estimate, checkout. A third upsell is usually a second app shouting. <a href="/blog/in-cart-upsells-that-convert.html?src=Ninety9Blog">In-cart upsells that convert</a> is the merchandising pass.</p>
</aside>
<p>If you are still choosing the pattern, read <a href="/blog/cart-drawer-vs-cart-page.html?src=Ninety9Blog">cart drawer vs cart page</a>. Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a>. The other listings are real. None of them draft the first cart from the store you already have.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify cart drawer app in 2026?</summary><div class="faq__a"><p>Addy. It drafts the first slide cart from the catalogue and the brand, then lets you edit more than 40 blocks, including a different cart per market. A thousand reviews on a builder still open on an empty canvas. That is the delay, not the rating.</p></div></details>
<details><summary>Will a cart drawer app slow my Shopify store down?</summary><div class="faq__a"><p>It should not. Addy loads asynchronously and only renders when the cart opens, so it stays out of Largest Contentful Paint. Test any drawer with PageSpeed Insights before and after install. The performance rules are in <a href="/blog/cart-drawer-performance-lcp.html?src=Ninety9Blog">cart drawer LCP</a>.</p></div></details>
<details><summary>How many upsells should a Shopify cart drawer show?</summary><div class="faq__a"><p>One or two. A third offer reliably lowers the take rate of the first two. If you have five products worth suggesting, the recommendation logic is the problem, not the slot count.</p></div></details>
<details><summary>Can I run a different cart for each Shopify Market?</summary><div class="faq__a"><p>Yes, in Addy. Layout, offers and free-shipping thresholds can change by market and by customer tag, including per block. Currency follows the shopper.</p></div></details>
<details><summary>Do I need to edit my theme to add a cart drawer?</summary><div class="faq__a"><p>Not with a modern theme app extension. Enable the embed in the theme editor. Uninstall should leave no Liquid behind.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify cart upsell apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-cart-upsell-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-cart-upsell-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify cart upsell apps. Features, pricing and where Addy, Kaching, Amp, Upcart and iCart fit after add to cart.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Shopify cart upsell app only works when the offer sits in the cart the shopper already opened, as one product, not a second catalogue.</li><li>Drawers you assemble yourself delay the first upsell until someone finishes the canvas.</li><li>Addy drafts the cart from the catalogue, then lets you edit the upsell, the gift, the bar and the delivery date, with A/B tests and per-market carts. It is free to install.</li><li>One or two in-cart offers. A third reliably lowers the take rate of the first.</li></ul></section>
<p>A Shopify cart upsell is the product you show after add to cart, while the first item is still on screen. Merchants search &quot;Shopify cart upsell app&quot; when the theme cart is a receipt and the second item never appears. The upsell fails when it is a grid, when it suggests a substitute, or when the app that should show it opens as an empty canvas.</p>
<p>This comparison looks at five Shopify cart upsell apps from the 2026 App Store. The ranking favours an offer that is already in a drafted cart, then editable by market. A simpler builder still makes you assemble the slot.</p>
<figure><img src="/assets/img/blog/best-shopify-cart-upsell-apps-2026-inline.jpg" alt="A slide cart with one recommended product under the line items" loading="lazy" decoding="async"><figcaption>One complement under the lines. A row of five products is browsing.</figcaption></figure>
<h2 id="how-these-shopify-cart-upsell-apps-were-ranked">How these Shopify cart upsell apps were ranked</h2>
<p><a href="/blog/in-cart-upsells-that-convert.html?src=Ninety9Blog">In-cart upsells that convert</a> is the merchandising rule. The list weights:</p>
<ol>
<li><strong>Whether the first cart already contains an upsell</strong>, or you build the slot yourself.</li>
<li><strong>Whether the offer can change by market or tag.</strong></li>
<li><strong>Whether you can A/B test the drawer</strong> instead of publishing one version for everyone.</li>
<li><strong>Whether the upsell app is also the cart</strong>, so you do not stack two drawers.</li>
</ol>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> is first because a Shopify cart upsell app that starts blank spends the launch week on layout. The offer waits.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>First upsell</th><th>Extra control</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a></td><td>5.0 / 2</td><td>Free to install</td><td>Drafted with the cart</td><td>Markets, tags, A/B tests, 40+ blocks</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/cart-upsell" target="_blank" rel="noopener">Kaching Cart Drawer</a></td><td>5.0 / 1,487</td><td>Free plan, then paid</td><td>You place it</td><td>Timers, gift wrap, protection toggles</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/slide-cart" target="_blank" rel="noopener">Amp Slide Cart</a></td><td>5.0 / 772</td><td>Free plan, then about $29.99</td><td>You fill a template</td><td>Industry layouts, markets</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/upcart-cart-builder" target="_blank" rel="noopener">Upcart</a></td><td>4.7 / 959</td><td>Free plan, then paid</td><td>You build the block</td><td>HTML, CSS, JSX</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/icart" target="_blank" rel="noopener">iCart</a></td><td>4.7 / 451</td><td>First 100 orders free</td><td>You assemble it</td><td>Drawer plus cart page, popup, mini cart</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-addy-the-cart-upsell-is-already-in-the-drawer">1. Addy — the cart upsell is already in the drawer</h2>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a> is a Shopify cart upsell app that does not start from an empty column. It reads the catalogue and the brand and proposes a slide cart with the blocks a selling cart uses: the upsell, volume discounts, a gift, shipping protection, a progress bar, a delivery date. You edit that draft. You do not spend Friday choosing a template.</p>
<p>After the draft there are more than 40 blocks, including custom HTML and CSS. Targeting can change the whole cart, or one block, by Shopify Market or customer tag. A/B tests compare two versions of the drawer. It loads only when the cart opens. It is free to install. It has two public reviews. The review count is not the upsell.</p>
<p><strong>Pros</strong></p>
<ul>
<li>The cart upsell arrives with the first draft</li>
<li>Markets, tags and A/B tests</li>
<li>One cart, so the offer is not a second app</li>
<li>Free to install</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Two public reviews</li>
<li>Not listed as Built for Shopify</li>
</ul>
<p>If the offer is a bundle with its own price, <a href="/apps/addly.html?src=Ninety9Blog">Addly</a> should own the discount. If the bar itself needs country thresholds, <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can run that goal inside the same cart. One upsell. One bar.</p>
<h2 id="2-kaching-cart-drawer">2. Kaching Cart Drawer</h2>
<p><a href="https://apps.shopify.com/cart-upsell" target="_blank" rel="noopener">Kaching</a> is the high-review suite drawer. 5.0 from 1,487 reviews. Built for Shopify. Slide cart, urgency timer, shipping or gift bars, gift wrap, shipping protection, translations.</p>
<p>The upsell is a block you turn on. The first cart is still yours to assemble. The timer and the payment-icon row are easy to publish because they exist. They are not the cart upsell.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large review base</li>
<li>Translations without code</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>You place the upsell yourself</li>
<li>Easy to ship every toggle</li>
<li>A suite, if you already live in Kaching</li>
</ul>
<h2 id="3-amp-slide-cart">3. Amp Slide Cart</h2>
<p><a href="https://apps.shopify.com/slide-cart" target="_blank" rel="noopener">Amp</a> leads with templates. 5.0 from 772 reviews. Built for Shopify. Industry layouts, progress bar, frequently bought together, gifts, BOGO, markets. Paid pricing sits around a flat monthly fee once you leave the free plan.</p>
<p>A template is a look. It does not know which complement belongs under this SKU. You still fill the upsell. A flat fee is a different bill from a cart upsell app that is free to install.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Industry templates</li>
<li>Markets and languages on the listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>The template still has to be filled</li>
<li>Paid plan is a flat monthly fee</li>
<li>Design-first delays the first live offer</li>
</ul>
<h2 id="4-upcart">4. Upcart</h2>
<p><a href="https://apps.shopify.com/upcart-cart-builder" target="_blank" rel="noopener">Upcart</a> is a cart builder. 4.7 from 959 reviews. Built for Shopify. In-cart upsells, rewards, gifts, and templates in HTML, CSS and JSX.</p>
<p>Custom code can place an upsell anywhere. It is also a developer ticket. Addy already has custom HTML and CSS, after a cart that was drafted. Upcart opens on the canvas.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Custom templates if someone will write them</li>
<li>Upsells and rewards on one canvas</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Empty canvas by default</li>
<li>4.7, with setup time in the reviews</li>
<li>JSX is a cost, not a toggle</li>
</ul>
<h2 id="5-icart">5. iCart</h2>
<p><a href="https://apps.shopify.com/icart" target="_blank" rel="noopener">iCart</a> is a drawer plus a full cart page, a popup and a mini cart. 4.7 from 451 reviews. First 100 orders free, then paid bands. AI recommendations, bundles, volume discounts, a multi-tier bar, a countdown.</p>
<p>Most stores that want a cart upsell do not also need three more cart surfaces. Those surfaces are configuration. The recommendation still needs a merchandiser, or it will suggest a substitute.</p>
<p><strong>Pros</strong></p>
<ul>
<li>First 100 orders free on the listing</li>
<li>Several cart surfaces in one app</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>More surfaces than the upsell needs</li>
<li>You assemble the first offer</li>
<li>AI recs still include substitutes until you remove them</li>
</ul>
<h2 id="which-shopify-cart-upsell-app-should-you-install">Which Shopify cart upsell app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>An upsell already sitting in a drafted cart, with a test</td><td>Addy</td></tr>
<tr><td>A simpler suite you still assemble</td><td>Kaching</td></tr>
<tr><td>A template and a flat monthly fee</td><td>Amp</td></tr>
<tr><td>HTML or JSX before the offer can go live</td><td>Upcart</td></tr>
<tr><td>A cart upsell plus extra cart surfaces</td><td>iCart</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>One offer in the cart</p>
<p>Progress bar, line items, one upsell, delivery estimate, checkout. A second Shopify cart upsell app inside that drawer is how the shopper sees two recommendations and trusts neither.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a>. If you are still choosing the shell, read <a href="/blog/cart-drawer-vs-cart-page.html?src=Ninety9Blog">cart drawer vs cart page</a> and the <a href="/blog/best-shopify-cart-drawer-apps-2026.html?src=Ninety9Blog">cart drawer app comparison</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify cart upsell app in 2026?</summary><div class="faq__a"><p>Addy. The cart upsell is drafted with the drawer, then you edit it. Markets, tags, A/B tests and more than 40 blocks are in the same free install. A builder that opens empty is a simpler canvas, not a faster upsell.</p></div></details>
<details><summary>How many products should a Shopify cart upsell show?</summary><div class="faq__a"><p>One or two. A third offer lowers the take rate of the first two. The merchandising pass is in <a href="/blog/in-cart-upsells-that-convert.html?src=Ninety9Blog">in-cart upsells that convert</a>.</p></div></details>
<details><summary>Should the cart upsell be a bundle or a single product?</summary><div class="faq__a"><p>A single complement, or one bundle with one price. If the offer is a set with its own discount, let <a href="/apps/addly.html?src=Ninety9Blog">Addly</a> own the price and let Addy present it. Do not run two discounts on the same SKU.</p></div></details>
<details><summary>Can I test a Shopify cart upsell?</summary><div class="faq__a"><p>Yes. Addy includes A/B tests, so two versions of the drawer can run at once. Guessing in Slack is the alternative.</p></div></details>
<details><summary>Do I need a separate cart drawer and a cart upsell app?</summary><div class="faq__a"><p>No. A second upsell app inside a drawer you already have is how the cart gets two progress bars and three product rows. The drawer comparison is in <a href="/blog/best-shopify-cart-drawer-apps-2026.html?src=Ninety9Blog">cart drawer apps</a>.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify free shipping bar apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-free-shipping-bar-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-free-shipping-bar-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify free shipping bar apps. Features, pricing and where Goalify, Essential, Hoppy, XB and Kaktus fit on a real cart.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A free shipping bar only lifts average order value when the threshold sits just above the current AOV and updates in the cart the shopper is looking at.</li><li>One fill is a start. Most growing stores need a second goal, a different number per country, and a way to test the copy.</li><li>Goalify keeps stacked rewards, country thresholds, AI gap-closers and A/B tests in one app, including the free band under 10 orders a month.</li><li>View-capped bars get expensive as traffic rises. Order-banded pricing stays predictable.</li></ul></section>
<p>A Shopify <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">free shipping bar</a> is a progress fill that tells the shopper how much more they need to spend to unlock free delivery, a gift, or money off. It works because the cart already has intent. It fails when the number is a guess, when every country sees the home-market threshold, or when the next reward needs a second app.</p>
<p>This comparison looks at five Shopify free shipping bar apps merchants install in 2026. The ranking favours bars that can grow from one fill into a sequence without a rebuild.</p>
<figure><img src="/assets/img/blog/best-shopify-free-shipping-bar-apps-2026-inline.jpg" alt="Stacked cart goals with a remaining amount and a second gift threshold" loading="lazy" decoding="async"><figcaption>One fill is a start. The second threshold is what a growing cart actually needs.</figcaption></figure>
<h2 id="how-these-free-shipping-bar-apps-were-ranked">How these free shipping bar apps were ranked</h2>
<p>A pretty bar that cannot change by market is a screenshot. The list weights:</p>
<ol>
<li><strong>Whether the goal can stack</strong> — free shipping, then a gift, then a discount.</li>
<li><strong>Whether the number can change by country</strong>, with currency that matches the shopper.</li>
<li><strong>Whether you can test the threshold or the copy</strong> instead of arguing in Slack.</li>
<li><strong>Whether the paid plan is based on orders you already understand</strong>, not on a view meter that spikes with ads.</li>
</ol>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is first because it was built for that sequence. The others are real listings. A high review count on a single-fill bar still leaves you shopping when the second goal appears.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Stacked goals</th><th>Country / geo</th><th>Testing</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a></td><td>5.0 / 48</td><td>Free under 10 orders, then $3.99</td><td>Yes</td><td>Country thresholds and currency</td><td>A/B tests</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/essential-order-value-booster" target="_blank" rel="noopener">Essential Free Shipping Bar</a></td><td>5.0 / 971</td><td>Free to 1,000 views, then $9.99</td><td>Bar plus later upsells</td><td>Geolocation on paid plans</td><td>Analytics on higher plans</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/hoppy-free-shipping" target="_blank" rel="noopener">Hoppy Free Shipping Bar</a></td><td>4.7 / 264</td><td>Free</td><td>Goals, gifts, discounts</td><td>Multi-currency, multi-language</td><td>Not listed as A/B</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/xb-free-shipping-bar-upsell" target="_blank" rel="noopener">XB Free Shipping Bar</a></td><td>4.9 / 41</td><td>Free</td><td>Goals plus upsells</td><td>Geolocation</td><td>Not listed as A/B</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/kaktus-free-shipping-bar" target="_blank" rel="noopener">K: Free Shipping Bar</a></td><td>4.7 / 57</td><td>Free on dev stores, then $6.70</td><td>Single bar plus countdown</td><td>Placement only</td><td>Not listed as A/B</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-goalify-a-bar-that-can-become-a-sequence">1. Goalify — a bar that can become a sequence</h2>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> is a Shopify free shipping bar and cart-goal app. The first publish can be a single fill in under two minutes: pick a template, set the threshold, choose the cart drawer or the top bar, go live. That is table stakes.</p>
<p>The reason it sits first is what happens in month two. You can stack rewards — free shipping at one number, 10% off at the next, a gift after that. Rules can use cart value, item count, or specific products. Country configuration keeps export carts from seeing the domestic minimum. When the shopper is short of a goal, AI upsells from order history can suggest a product that actually closes the gap, instead of a random add-on.</p>
<p>You can run it as a sticky bar, as a widget on the product page, and inside the cart. A/B testing is real here: compare thresholds and copy. Analytics show conversion, click-through and funnel performance per variant. Free up to 10 orders a month, then $3.99, $7.99 and $11.99. Built for Shopify, 5.0 from 48 reviews.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Stacked rewards in one app</li>
<li>Country thresholds and presentment currency</li>
<li>Bar plus embeddable widget</li>
<li>A/B tests on the goal, not only a screenshot of the bar</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>48 reviews, not 971. The sequence is still the product.</li>
</ul>
<p>Put the bar at the top of the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer so the remaining amount sits on the line items. The <a href="/blog/free-shipping-progress-bar-guide.html?src=Ninety9Blog">free shipping progress bar guide</a> is the setup checklist.</p>
<h2 id="2-essential-free-shipping-bar">2. Essential Free Shipping Bar</h2>
<p><a href="https://apps.shopify.com/essential-order-value-booster" target="_blank" rel="noopener">Essential</a> is the high-review single-job bar. 5.0 from 971 reviews. Free up to 1,000 monthly booster views. Paid plans at $9.99, $14.99 and $29.99 raise the view cap, then add geolocation, cart-page boosters, upsell products and analytics.</p>
<p>The free band is a view cap, not a finished bar. Paid social burns through 1,000 views. Geolocation, cart upsells and analytics arrive after you are already paying. Stacked rewards and a test of the threshold are not the product.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large review base</li>
<li>Geolocation once you pay</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>View-based pricing grows with ads, not with orders</li>
<li>Stacked rewards and tests are not the core product</li>
<li>The free band ends when traffic works</li>
</ul>
<h2 id="3-hoppy-free-shipping-bar-cart-upsell">3. Hoppy Free Shipping Bar Cart Upsell</h2>
<p><a href="https://apps.shopify.com/hoppy-free-shipping" target="_blank" rel="noopener">Hoppy</a> lists as free and Built for Shopify. 4.7 from 264 reviews. The listing pairs the progress bar with AI upsells, gifts, discounts, frequently bought together and cart-drawer placement.</p>
<p>A free bar that also wants to recommend products will crowd the drawer before the threshold is honest. Keep one offer in the cart besides the bar. Two upsells plus a gift plus a pair is a catalogue, not a goal. There is no listed A/B test for the number itself.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free listing</li>
<li>Multi-currency and multi-language</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Easy to turn the bar into a full upsell suite</li>
<li>No listed A/B test for the threshold itself</li>
<li>4.7, and the extra offers are the risk</li>
</ul>
<h2 id="4-xb-free-shipping-bar-upsell">4. XB Free Shipping Bar Upsell</h2>
<p><a href="https://apps.shopify.com/xb-free-shipping-bar-upsell" target="_blank" rel="noopener">XB</a> is a smaller, newer listing: 4.9 from 41 reviews, free, Built for Shopify. Progress bar, product or cart or announcement-bar placement, geolocation, built-in upsells.</p>
<p>A free geo-aware fill is not a sequence. Confirm the current plan screen still matches &quot;free&quot; after install. Small review counts move faster than large ones. Stacked rewards and a test are not on the listing.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free, with location rules on the listing</li>
<li>Flexible placement</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Thin public review history</li>
<li>Upsells in the same app can crowd the bar</li>
<li>No stacked goals, no listed A/B test</li>
</ul>
<h2 id="5-k-free-shipping-bar">5. K: Free Shipping Bar</h2>
<p><a href="https://apps.shopify.com/kaktus-free-shipping-bar" target="_blank" rel="noopener">Kaktus</a> is a placement-heavy bar: top, bottom, cart page, cart drawer, product page, plus a countdown. 4.7 from 57 reviews. Free on development stores, then $6.70, $14.99 and $49.99 by store order volume.</p>
<p>A countdown next to a shipping goal can help a weekend sale. It can also make every Tuesday feel like a closing-down sale. Use the timer when the deadline is real. The bar itself does not need a clock to work, and this listing is still one fill, not a sequence.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Many placements</li>
<li>Order-banded paid plans</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>One bar, not a stacked sequence</li>
<li>Countdown is easy to overuse</li>
<li>Free only on development stores</li>
</ul>
<h2 id="which-shopify-free-shipping-bar-should-you-install">Which Shopify free shipping bar should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>Stacked goals, country thresholds, and an A/B test</td><td>Goalify</td></tr>
<tr><td>A simpler single fill, billed once ad views pile up</td><td>Essential</td></tr>
<tr><td>A free bar that also tries to be an upsell suite</td><td>Hoppy</td></tr>
<tr><td>A thinner free listing, without stacked goals</td><td>XB</td></tr>
<tr><td>One bar and a countdown, free only on a dev store</td><td>Kaktus</td></tr>
</tbody></table></div>
<aside class="callout callout--warn">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 9v4M12 17h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>One number per market</p>
<p>Showing every shopper the domestic free-shipping threshold is how export carts stall. Set the country number first. Style the bar second. Copy notes are in <a href="/blog/free-shipping-bar-copy.html?src=Ninety9Blog">free shipping bar copy</a>.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a>. The bar has to survive a second country and a second reward. Read <a href="/blog/stacked-cart-goals.html?src=Ninety9Blog">stacked cart goals</a> before you publish three fills on day one. One honest threshold beats a ladder nobody can finish.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best free shipping bar app for Shopify in 2026?</summary><div class="faq__a"><p>Goalify. Stacked rewards, country thresholds and a real A/B test sit on the same install, including the free band under 10 orders. A high-review single-fill bar still leaves you shopping when the second country or the second goal appears.</p></div></details>
<details><summary>Where should a Shopify free shipping progress bar sit?</summary><div class="faq__a"><p>At the top of the cart drawer, and again as a quiet storefront bar if you want the threshold visible before add to cart. Below the line items it reads as a footnote. The placement notes are in <a href="/blog/where-to-put-a-progress-bar.html?src=Ninety9Blog">where to put a progress bar</a>.</p></div></details>
<details><summary>How do I set the free shipping threshold?</summary><div class="faq__a"><p>Slightly above current average order value, often 15 to 30 percent higher, so one extra item can close it. Then check that the added margin covers the shipping you absorb. <a href="/blog/when-not-to-offer-free-shipping.html?src=Ninety9Blog">When not to offer free shipping</a> is the margin test.</p></div></details>
<details><summary>Can I run different free shipping goals per country?</summary><div class="faq__a"><p>Yes, in Goalify. A $75 threshold does not mean the same thing in every market. Country configuration and presentment currency keep the remaining amount honest.</p></div></details>
<details><summary>Do I need a separate app for a free gift at a higher cart value?</summary><div class="faq__a"><p>Not with Goalify. Free shipping, an order discount and a gift can stack as successive goals. A second app for the gift is how the bar and the cart fall out of sync.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify frequently bought together apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-frequently-bought-together-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-frequently-bought-together-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify frequently bought together apps. Features, pricing and where Addly, Frequently Bought Together CBB, Essential, Selleasy and Fether fit.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A frequently bought together widget only pays when the pair is a complement from real orders, not a substitute from the same collection.</li><li>Dedicated FBT apps stop at the pair. They get expensive or incomplete the week the same product also needs a quantity break or a mix-and-match box.</li><li>Addly keeps the pair, quantity breaks, mix and match and add-ons on every plan, including the free band under 15 orders a month.</li><li>Rank by offer shape and plan honesty, not by review count. A thousand reviews on a pair-only widget do not cover a second offer type.</li></ul></section>
<p>A Shopify frequently bought together widget is a pair on the product page: this item, plus the item people already buy with it, added in one tap. The job is <a href="/blog/how-to-increase-average-order-value-shopify.html?src=Ninety9Blog">average order value</a>, not a second catalogue. Most of the performance difference between two stores running the same pattern is the pair, not the badge colour.</p>
<p>This comparison looks at five Shopify apps that merchants actually install for that widget in 2026. The ranking is for stores that want the pair to stay true when the next request is &quot;now let them buy three&quot; or &quot;let them build the box&quot;. A pair-only listing is not a second install. It is a second invoice waiting.</p>
<figure><img src="/assets/img/blog/best-shopify-frequently-bought-together-apps-2026-inline.jpg" alt="Two products, a plus, a live total and one add button" loading="lazy" decoding="async"><figcaption>The pair should read as one decision. Two prices, a total, one button.</figcaption></figure>
<h2 id="how-these-frequently-bought-together-apps-were-ranked">How these frequently bought together apps were ranked</h2>
<p>Review count is a popularity score. It is not a merchandising score. The list weights four things a buyer can check on the listing and in the admin:</p>
<ol>
<li><strong>Whether the pair can come from orders</strong>, not only from a collection tag.</li>
<li><strong>Whether a second offer shape lives in the same app</strong>, so the discount does not move to a second tool.</li>
<li><strong>Whether the free or cheap plan still includes the offer you came for.</strong></li>
<li><strong>Whether the widget can sit under add to cart without a theme edit.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> is first because it treats frequently bought together as one offer inside a bundle app, and it does not shrink that list on the cheaper plans. The other four are real listings. A pair-only widget still leaves you shopping the week the same SKU needs a quantity break.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Pair from orders</th><th>Other offer shapes</th><th>Built for Shopify</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a></td><td>4.9 / 111</td><td>Free under 15 orders, then $9.99</td><td>Yes, or you pick the set</td><td>Quantity breaks, mix and match, add-ons</td><td>Yes</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/frequently-bought-together" target="_blank" rel="noopener">Frequently Bought Together CBB</a></td><td>4.9 / 1,206</td><td>Free starter, paid from $14.99</td><td>Paid plans</td><td>Pair and bundle discounts</td><td>Yes</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/essential-post-purchase-upsell" target="_blank" rel="noopener">Essential Upsell &amp; Cross Sell</a></td><td>5.0 / 2,418</td><td>Free plan, paid from $9.99</td><td>Yes, plus related products</td><td>Cart and post-purchase offers</td><td>Yes</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/upsell-cross-sell-kit-1" target="_blank" rel="noopener">Selleasy</a></td><td>4.9 / 2,748</td><td>Free to 50 orders, then $9</td><td>Yes</td><td>18 upsell strategies</td><td>Yes</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/fether" target="_blank" rel="noopener">Frequently Bought Together FT</a></td><td>4.6 / 371</td><td>Listed as free</td><td>Pair and related products</td><td>Product, cart and thank-you placements</td><td>Yes</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-addly-the-pair-then-the-next-offer">1. Addly — the pair, then the next offer</h2>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog">Addly</a> is a <a href="https://apps.shopify.com/addly?src=Ninety9Blog">Shopify bundles app</a> that happens to be very good at frequently bought together. That order matters. The widget on the product page can show the products customers already buy as a set. The same app can then run a <a href="/blog/quantity-breaks-vs-volume-discounts.html?src=Ninety9Blog">quantity break</a> on a variant, a <a href="/blog/build-a-box-mix-and-match-bundles.html?src=Ninety9Blog">mix and match</a> box, or an add-on, without a second discount engine.</p>
<p>The set can be drafted from purchase history. On a new shop you pick it yourself. Manual sets stay first-class. History becomes useful after orders exist, which is the sequence a store actually lives. Offers go through Shopify&#39;s own discounts, so the price in the widget is the price at checkout.</p>
<p>Thirteen languages and Shopify Markets keep the offer readable when you leave the home country. Live preview shows the widget on your theme. Offer analytics show click-through, conversion and revenue per offer. Every one of those tools is on Forever Free under 15 orders a month, and on $9.99, $24.99 and $49.99. The band is orders, not a locked feature list.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Frequently bought together, quantity breaks, mix and match and add-ons in one install</li>
<li>Pairings from real orders, or chosen by you</li>
<li>Same offer types on every plan</li>
<li>Variant-level volume prices, so a travel size does not drag a 100ml table down</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>111 reviews, not a thousand. The offer list is the same on every plan anyway.</li>
</ul>
<p>The same set can show again in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer so the product page and the cart agree. Do not stack the identical offer on both surfaces. Pick one.</p>
<h2 id="2-frequently-bought-together-by-code-black-belt">2. Frequently Bought Together by Code Black Belt</h2>
<p><a href="https://apps.shopify.com/frequently-bought-together" target="_blank" rel="noopener">Code Black Belt</a> is the dedicated widget most merchants mean when they search &quot;Shopify frequently bought together app&quot;. 4.9 from more than a thousand reviews. Built for Shopify. The starter plan is free and covers three manual bundles. Automatic recommendations, the cart widget, analytics and translations start on the paid plans at $14.99, $19.99 and $39.99 by order volume.</p>
<p>The listing is the pair. The free starter covers three manual sets. Automatic recommendations, the cart widget, analytics and translations start on paid plans. That is a pair widget you pay to finish. The week the same SKU needs a quantity break, you are installing a second app. Two systems on one page is how the widget price and the cart price stop matching.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Focused on the pair</li>
<li>Free starter for three manual sets</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Automatic recommendations and analytics are not on the free plan</li>
<li>No quantity breaks or mix and match in the same app</li>
<li>Paid plans start at $14.99 for the features most people came for</li>
</ul>
<h2 id="3-essential-upsell-cross-sell">3. Essential Upsell &amp; Cross Sell</h2>
<p><a href="https://apps.shopify.com/essential-post-purchase-upsell" target="_blank" rel="noopener">Essential</a> sells a wider funnel: frequently bought together and related products on the product page, then cart and post-purchase offers. 5.0 from thousands of reviews. Paid plans are billed on additional revenue the app attributes, from $9.99 a month.</p>
<p>The surface area is the risk. A pair under add to cart does not need a thank-you-page programme on the same invoice. Watch whether &quot;related products&quot; is a complement or a substitute. Substitutes belong on collections, not next to the buy button. The method is in <a href="/blog/frequently-bought-together-shopify.html?src=Ninety9Blog">frequently bought together on Shopify</a>.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Long public review history</li>
<li>Free plan to start</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Pricing follows attributed revenue, which is a different meter than store orders</li>
<li>Easy to turn a pair widget into a second storefront</li>
<li>Post-purchase is a different job from the pair under the button</li>
</ul>
<h2 id="4-selleasy">4. Selleasy</h2>
<p><a href="https://apps.shopify.com/upsell-cross-sell-kit-1" target="_blank" rel="noopener">Selleasy</a> is an upsell kit, not a pair widget. 4.9 from 2,748 reviews. Free to 50 store orders a month, then $9, $19 and $29. The listing promises 18 upsell and cross-sell strategies and a short allotment of AI recommendations.</p>
<p>Eighteen strategies is how a product page becomes a wall. The pair is one line on that list. If the meeting is &quot;the serum needs the moisturiser under the button&quot;, the other seventeen placements are configuration you will not use well. One offer per moment still converts better than a kit.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free to 50 orders a month</li>
<li>Built for Shopify</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>The pair is one strategy among many</li>
<li>Easy to publish more offers than a product page can carry</li>
<li>A kit, not a merchandising decision</li>
</ul>
<h2 id="5-frequently-bought-together-ft">5. Frequently Bought Together FT</h2>
<p><a href="https://apps.shopify.com/fether" target="_blank" rel="noopener">Fether</a> lists as free and puts FBT and related-product recommendations on product, cart, checkout and thank-you surfaces. 4.6 from a few hundred reviews. A minority of reviews argue with the free label once they are inside the app.</p>
<p>A free label is not a finished merchandising tool. Confirm the current plan screen before you promise finance a $0 line. The moment the same product needs a quantity break, you are shopping again.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Listed as free</li>
<li>Several placements for the pair</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Lowest rating on this list</li>
<li>Confirm what &quot;free&quot; includes after install</li>
<li>Pair-only. The next offer is a second app.</li>
</ul>
<h2 id="which-shopify-frequently-bought-together-app-should-you-install">Which Shopify frequently bought together app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>The pair, then a quantity break or a box in the same app</td><td>Addly</td></tr>
<tr><td>A simpler pair widget, three manual sets on the free plan</td><td>Frequently Bought Together CBB</td></tr>
<tr><td>A wider funnel, billed on attributed revenue</td><td>Essential</td></tr>
<tr><td>A kit of 18 strategies, the pair being one of them</td><td>Selleasy</td></tr>
<tr><td>A free pair-only listing, with a 4.6 rating</td><td>Fether</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>One discount engine</p>
<p>The pair, the quantity break and the mix-and-match box should share Shopify&#39;s native discounts. That is the practical reason to put them in one app. The shopper never sees the engine. They see a price that still matches at checkout.</p>
</aside>
<p>How to pick the actual products is a merchandising job, not an app job. Start with <a href="/blog/frequently-bought-together-shopify.html?src=Ninety9Blog">frequently bought together</a> and the <a href="/blog/shopify-product-bundles-guide.html?src=Ninety9Blog">Shopify product bundles guide</a>. Install <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a>. The pair is the first offer. The second shape is already in the same app.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best frequently bought together app for Shopify in 2026?</summary><div class="faq__a"><p>Addly. The pair sits next to quantity breaks, mix and match and add-ons, on every plan, including the free band under 15 orders. A dedicated pair widget with a thousand reviews still leaves you shopping when the same SKU needs a second offer shape.</p></div></details>
<details><summary>How do Shopify frequently bought together apps pick the products?</summary><div class="faq__a"><p>The useful ones read order history and rank complements. Category or &quot;related products&quot; logic usually suggests a substitute. Addly can draft the set from purchase history, or you can pick the products yourself on a new shop.</p></div></details>
<details><summary>Should I discount a frequently bought together bundle?</summary><div class="faq__a"><p>A small discount on the added item, around 10 to 15 percent, is usually enough. Deeper cuts start paying people who would have bought both anyway. The <a href="/blog/bundle-discount-margin-maths.html?src=Ninety9Blog">bundle discount maths</a> walk-through is the check.</p></div></details>
<details><summary>Where should the frequently bought together widget sit on a Shopify product page?</summary><div class="faq__a"><p>Directly under the add-to-cart button, before the long description. Above the button it competes with the primary buy. At the bottom of the page most phones never reach it.</p></div></details>
<details><summary>Can I run frequently bought together and quantity breaks in the same app?</summary><div class="faq__a"><p>Yes, in Addly. Both offer types share Shopify&#39;s native discounts, so the price on the page and the price at checkout stay the same. Two apps on one product is how those prices drift.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify order editing apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-order-editing-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-order-editing-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Retention &amp; Post-Purchase</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify order editing apps. Features, pricing and where Reviso, Editly, Vista, AE and Oat fit after checkout.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Shopify lets staff edit orders. Customers need an app to fix an address, size or quantity before fulfilment without opening a ticket.</li><li>The edit should close when the order is fulfilled. A shipped order is not a form.</li><li>Reviso covers address, items, variants, quantities and shipping method, plus cancellation deflection, returns and store credit, free to install.</li><li>Prove the ticket savings on a free install that already has the cancel save. A $39 editor is a later invoice, not a better first week.</li></ul></section>
<p>A Shopify <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">order editing</a> app lets the customer change the order they just placed, before anything ships. Shopify already lets staff do this in the admin. The ticket exists because the customer cannot. Wrong address, wrong size, extra unit — those are corrections. Treated as cancellations they become refunds, reships and a review you did not need.</p>
<p>This comparison looks at five Shopify order editing apps from the 2026 App Store. The ranking favours an editor that stops at fulfilment, can answer a cancel click, and does not start at $39 a month while you are still proving the ticket savings.</p>
<figure><img src="/assets/img/blog/best-shopify-order-editing-apps-2026-inline.jpg" alt="Order status fields for address, size and quantity with a save action" loading="lazy" decoding="async"><figcaption>The edit is the task. The upsell sits after the field is trusted.</figcaption></figure>
<h2 id="how-these-order-editing-apps-were-ranked">How these order editing apps were ranked</h2>
<p>The <a href="/blog/shopify-order-editing-guide.html?src=Ninety9Blog">order editing guide</a> is the brief. The list weights:</p>
<ol>
<li><strong>What the customer can change</strong> before fulfilment — address, items, variants, quantities, shipping method.</li>
<li><strong>Whether the control disappears once the order is fulfilled.</strong></li>
<li><strong>Whether a cancel click can be met with a save</strong>, not only a refund.</li>
<li><strong>Whether you pay a monthly fee before the ticket volume is proven.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> is first because it covers the edit, the cancel save, and returns in one free install. It has one public review. That is the honest number. A longer listing is not a fuller editor.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Customer can change</th><th>Cancel save</th><th>After fulfilment</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a></td><td>5.0 / 1</td><td>Free to install</td><td>Address, items, variants, quantities, shipping method</td><td>Discount or gift</td><td>Returns, exchanges, store credit</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/editly-order-editing" target="_blank" rel="noopener">Editly</a></td><td>5.0 / 14</td><td>Free</td><td>Address, variants, quantity, items, shipping, cancel</td><td>Window and logs</td><td>Not the core listing</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/vista-order-editing" target="_blank" rel="noopener">Vista</a></td><td>5.0 / 1</td><td>Free band, then $30 / $100</td><td>Address, products, shipping, discounts, cancel</td><td>Store credit on paid</td><td>Blocks edits once shipped</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/account-editor" target="_blank" rel="noopener">AE Order Editing</a></td><td>See listing</td><td>From about $39 / month</td><td>Account-page edits, plus an upsell</td><td>Not the headline</td><td>Paid account editor</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/oat-order-editing" target="_blank" rel="noopener">Oat</a></td><td>See listing</td><td>See listing</td><td>Customer-facing editor</td><td>Not the headline</td><td>Straightforward editor</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/reviso/icon.png" alt="Reviso: Order editing &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Reviso: Order editing &amp; Upsell</p>
<p class="appcta__text">Post-purchase self-service order editing with cancellation deflection and AI upsells.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-reviso-fix-the-order-then-decide-if-they-still-want-to-leave">1. Reviso — fix the order, then decide if they still want to leave</h2>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a> is a self-serve Shopify order editor. The customer finds it in customer accounts, on a screen that looks like Shopify. Until fulfilment they can change the shipping address, the items, the quantities, the variants and the shipping method. Country, customer tag and order rules decide who sees which control. A wholesale tag or a preorder should not get the same form as a domestic one-off.</p>
<p>If they still click cancel, Reviso can offer a discount on the current order or a free gift. That is a save, not a lecture. The same screen can show product suggestions and recently viewed products. Recently viewed is the honest upsell. They already looked at those SKUs in this shop.</p>
<p>After the window, returns, exchanges and store credit stay in the same app. It is free to install. It does not call an address-validation API, a 3PL, or POS. Staff still own edge cases that need a carrier check.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Address, items, variants, quantities and shipping method before fulfilment</li>
<li>Cancel deflection in the same install</li>
<li>Returns and store credit after the window</li>
<li>Free</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>One public review</li>
<li>No carrier address validation</li>
<li>Not a 3PL or POS tool</li>
</ul>
<p>Open the fields first. Add the product suggestion once customers can find the edit in one look. <a href="/blog/self-serve-order-edits-vs-tickets.html?src=Ninety9Blog">Self-serve order edits vs tickets</a> is the operations pass.</p>
<h2 id="2-editly">2. Editly</h2>
<p><a href="https://apps.shopify.com/editly-order-editing" target="_blank" rel="noopener">Editly</a> is the other free editor on shortlists. 5.0 from 14 reviews. Built for Shopify. Address, variant, quantity, add or remove items, shipping method, cancel. Custom edit window. Klaviyo and Shopify Flow triggers. Every edit logged.</p>
<p>Fourteen reviews is still a short list. The editor is there. The cancel save and the return are not. Most cancel clicks are a correction. An editor that only refunds that click is half the ticket. Confirm weekday cutoffs if your warehouse does not pick on Saturday.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free, Built for Shopify</li>
<li>Broad edit types and a logged window</li>
<li>Flow and Klaviyo hooks</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Cancellation save is not the product</li>
<li>Returns live elsewhere</li>
<li>More reviews than Reviso, not more of the job</li>
</ul>
<h2 id="3-vista-order-editing-upsell">3. Vista Order Editing &amp; Upsell</h2>
<p><a href="https://apps.shopify.com/vista-order-editing" target="_blank" rel="noopener">Vista</a> turns the order status and thank-you page into an editor plus an upsell. 5.0 from one review. Free band for a handful of edits, then $30 and $100 a month. Paid plans add rule-based editing and refund-as-store-credit. Edits block once the order ships.</p>
<p>The fulfilment lock is correct. The price is not a first experiment. Paid plans start at $30, then $100. Prove the ticket drop on a free editor that already has the cancel save. Buy an upsell layer later if the numbers hold — not as the reason to install.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Fulfilment lock is explicit</li>
<li>Paid rules and store-credit refunds</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Paid plans start at $30</li>
<li>One public review</li>
<li>The upsell is billed before the editor is proven</li>
</ul>
<h2 id="4-ae-order-editing-upsell">4. AE: Order Editing &amp; Upsell</h2>
<p><a href="https://apps.shopify.com/account-editor" target="_blank" rel="noopener">AE</a> puts the editor in the customer account and pairs it with a one-click upsell. Paid plans in the current comparison start around $39 a month, then $99, $179 and $249.</p>
<p>The account page is the right home. Customers already look there. Reviso already sits there. The fee is the difference. If the upsell has not earned $39, you are paying for a ticket tool you have not measured. Reviso puts the edit plus a suggestion on the order at $0 while you measure.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Account-native workflow</li>
<li>Upsell on a page that is usually a dead end</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Paid from the first serious plan</li>
<li>Confirm which fields sit on the plan you buy</li>
<li>$39 is not a trial of the ticket savings</li>
</ul>
<h2 id="5-oat">5. Oat</h2>
<p><a href="https://apps.shopify.com/oat-order-editing" target="_blank" rel="noopener">Oat</a> is the straightforward customer editor: find the order, change the field, save. That sentence is the listing. It is not the operations.</p>
<p>Straightforward editors get risky at the boundary. Fulfilled. Partially fulfilled. Tagged do-not-edit. If the boundary is a help article, customers will cross it. Reviso hides the edit at fulfilment and can exclude tags before the customer looks. Cancel save is not the headline here.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Simple customer story</li>
<li>Aimed at the post-checkout mistake</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Check the fulfilment lock and exclusions on the current listing</li>
<li>Cancel save is not the headline</li>
<li>Returns and a save offer live elsewhere</li>
</ul>
<h2 id="which-shopify-order-editing-app-should-you-install">Which Shopify order editing app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>The edit, a cancel save, and returns, free</td><td>Reviso</td></tr>
<tr><td>A simpler free editor, without the cancel save or returns</td><td>Editly</td></tr>
<tr><td>The same idea, starting at $30 a month</td><td>Vista</td></tr>
<tr><td>An account editor from about $39, before the tickets are measured</td><td>AE</td></tr>
<tr><td>A field-and-save editor, with the fulfilment lock still to confirm</td><td>Oat</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Close the edit at fulfilment</p>
<p>A shipped order is not a form. The cheap window is the hour after checkout, before the label. <a href="/blog/order-edit-cutoff-windows.html?src=Ninety9Blog">Order edit cutoff windows</a> is the policy. <a href="/blog/change-shipping-address-after-checkout.html?src=Ninety9Blog">Change shipping address after checkout</a> is the most common field.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a>. The ticket queue is address and size. You are not ready to put $39 a month on a tool you have not measured. Keep 3PL and address APIs in the systems that already own them.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify order editing app in 2026?</summary><div class="faq__a"><p>Reviso. Customers fix address, items, variants and shipping until fulfilment, and the same free app can meet a cancel click and handle returns. A free editor without the cancel save is half the ticket. A paid editor from $39 is a later invoice.</p></div></details>
<details><summary>Can customers edit a Shopify order after it ships?</summary><div class="faq__a"><p>Not in Reviso. Edits close at fulfilment, which is the window where a change is still cheap. After that, returns, exchanges or store credit are the path.</p></div></details>
<details><summary>What can a customer change in a self-serve order editor?</summary><div class="faq__a"><p>In Reviso: shipping address, items, quantities, variants and shipping method. You can restrict each of those by country, customer tag and order rules.</p></div></details>
<details><summary>How do order editing apps reduce cancellations?</summary><div class="faq__a"><p>Most cancel clicks are a correction — wrong size, wrong address, forgot an item. An editor lets them fix it. Reviso can also offer a discount or a gift when they still try to cancel.</p></div></details>
<details><summary>Does Reviso validate addresses with a carrier API?</summary><div class="faq__a"><p>No. It lets the customer type the address they meant. It does not replace a 3PL or a POS workflow.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify order editor apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-order-editor-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-order-editor-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Retention &amp; Post-Purchase</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify order editor apps. Features, pricing and where Reviso, Editly, Order Editing &amp; Upsell, AE and OrderEditing.com fit after checkout.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Shopify order editor app lets the customer fix an address, a variant or a quantity before fulfilment, so the ticket never opens.</li><li>The edit should disappear once the order is fulfilled. A shipped order is not a form.</li><li>Reviso covers the edit, a cancel save, and returns in one free install.</li><li>A $99 suite can validate addresses. It is a later invoice, not a better first week.</li></ul></section>
<p>A Shopify order editor app is the screen the customer uses to change an order they just placed. Staff can already edit in the admin. The ticket is the customer who cannot. Merchants search &quot;Shopify order editor&quot; when the inbox is wrong addresses and wrong sizes, and &quot;edit Shopify order&quot; when that inbox is the fulfilment team.</p>
<p>This comparison looks at five Shopify order editor apps from the 2026 App Store. The ranking favours an editor that stops at fulfilment, can answer a cancel click, and does not start at $39 or $99 while you are still counting tickets.</p>
<figure><img src="/assets/img/blog/best-shopify-order-editor-apps-2026-inline.jpg" alt="Order fields for address, variant and quantity with a save action" loading="lazy" decoding="async"><figcaption>The edit is the task. A suggestion can wait until the field is trusted.</figcaption></figure>
<h2 id="how-these-shopify-order-editor-apps-were-ranked">How these Shopify order editor apps were ranked</h2>
<p>The <a href="/blog/shopify-order-editing-guide.html?src=Ninety9Blog">order editing guide</a> is the brief. The list weights:</p>
<ol>
<li><strong>What the customer can change</strong> before fulfilment.</li>
<li><strong>Whether the form closes once the order ships.</strong></li>
<li><strong>Whether a cancel click can be saved</strong>, not only refunded.</li>
<li><strong>Whether you pay a monthly fee before the tickets are measured.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> is first because a Shopify order editor that only saves a field still sends the cancel click to the inbox.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Customer can change</th><th>After the edit</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a></td><td>5.0 / 1</td><td>Free to install</td><td>Address, items, variants, quantities, shipping method</td><td>Cancel save, then returns and store credit</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/editly-order-editing" target="_blank" rel="noopener">Editly</a></td><td>5.0 / 14</td><td>Free</td><td>Address, variants, quantity, items, shipping, cancel</td><td>Logs and a window. Returns live elsewhere</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/order-editing-1" target="_blank" rel="noopener">Order Editing &amp; Upsell</a></td><td>5.0 / 3</td><td>Free</td><td>Address and order edits, plus an upsell</td><td>A short public record</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/account-editor" target="_blank" rel="noopener">AE Order Editing</a></td><td>5.0 / 261</td><td>From about $39 / month</td><td>Account-page edits, plus an upsell</td><td>A paid account editor</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/order-editing" target="_blank" rel="noopener">OrderEditing.com</a></td><td>5.0 / 340</td><td>From $99 / month</td><td>Self-serve edits, upsells, optional address checks</td><td>A suite, priced like a suite</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/reviso/icon.png" alt="Reviso: Order editing &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Reviso: Order editing &amp; Upsell</p>
<p class="appcta__text">Post-purchase self-service order editing with cancellation deflection and AI upsells.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-reviso-the-order-editor-then-the-cancel-click">1. Reviso — the order editor, then the cancel click</h2>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a> is a Shopify order editor the customer finds in their account, on a screen that looks like Shopify. Until fulfilment they can change the shipping address, the items, the quantities, the variants and the shipping method. Country, customer tag and order rules decide who sees which control.</p>
<p>If they still click cancel, Reviso can offer a discount or a free gift. The same screen can show product suggestions and recently viewed products. After the window, returns, exchanges and store credit stay in the app. It is free to install. It has one public review. It does not call an address-validation API, a 3PL, or POS.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Address, items, variants, quantities and shipping method</li>
<li>A cancel save in the same order editor</li>
<li>Returns and store credit after fulfilment</li>
<li>Free</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>One public review</li>
<li>No carrier address validation</li>
<li>Not a 3PL or POS tool</li>
</ul>
<p>Open the fields first. Add the suggestion once customers can find the edit. <a href="/blog/self-serve-order-edits-vs-tickets.html?src=Ninety9Blog">Self-serve order edits vs tickets</a> is the operations pass.</p>
<h2 id="2-editly">2. Editly</h2>
<p><a href="https://apps.shopify.com/editly-order-editing" target="_blank" rel="noopener">Editly</a> is a free order editor. 5.0 from 14 reviews. Built for Shopify. Address, variant, quantity, add or remove items, shipping method, cancel. A custom window. Klaviyo and Shopify Flow. Every edit logged.</p>
<p>Fourteen reviews is still a short list. The editor is there. The cancel save and the return are not. An order editor that refunds the cancel click is half the ticket.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free, Built for Shopify</li>
<li>Logged edits and Flow hooks</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Cancellation save is not the product</li>
<li>Returns live elsewhere</li>
<li>More reviews than Reviso, not more of the job</li>
</ul>
<h2 id="3-order-editing-upsell">3. Order Editing &amp; Upsell</h2>
<p><a href="https://apps.shopify.com/order-editing-1" target="_blank" rel="noopener">Order Editing &amp; Upsell</a> pairs an editor with an upsell. 5.0 from 3 reviews. The listing is free.</p>
<p>Three reviews is a thin record for a tool that touches live orders. An upsell beside an untrusted form is how customers ignore both. Prove the edit. Then show a product. Reviso can do that pair without a monthly fee, and it still closes at fulfilment.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Listed as free</li>
<li>Edit and upsell named together</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Three public reviews</li>
<li>A short listing to audit before a sale</li>
<li>The upsell can land before the form is trusted</li>
</ul>
<h2 id="4-ae-order-editing">4. AE Order Editing</h2>
<p><a href="https://apps.shopify.com/account-editor" target="_blank" rel="noopener">AE</a> puts the editor in the customer account and pairs it with an upsell. 5.0 from 261 reviews. Paid plans in the current comparison start around $39 a month, then climb.</p>
<p>The account page is the right home. Reviso already sits there. The fee is the difference. If the upsell has not earned $39, you are paying for an order editor you have not measured.</p>
<p><strong>Pros</strong></p>
<ul>
<li>A longer review history</li>
<li>Account-native, with an upsell</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Paid from about $39</li>
<li>Confirm which fields sit on the plan you buy</li>
<li>The invoice starts before the ticket savings are known</li>
</ul>
<h2 id="5-orderediting-com">5. OrderEditing.com</h2>
<p><a href="https://apps.shopify.com/order-editing" target="_blank" rel="noopener">OrderEditing.com</a> is the suite end of the category. 5.0 from 340 reviews. Public plans start at $99 a month. Optional address validation is billed per lookup, a few cents an order depending on the country.</p>
<p>That is a full operations product: edits, upsells, integrations, address checks. It is also $99 before you know how many tickets the form deletes. Reviso does not replace a carrier validation API. It replaces the ticket for the address the customer can type themselves.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Large review base for the category</li>
<li>Address validation if you want to pay per lookup</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>From $99 a month</li>
<li>More system than a first order editor</li>
<li>Validation fees sit on top of the subscription</li>
</ul>
<h2 id="which-shopify-order-editor-app-should-you-install">Which Shopify order editor app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>The edit, a cancel save, and returns, free</td><td>Reviso</td></tr>
<tr><td>A simpler free editor, without the save or the return</td><td>Editly</td></tr>
<tr><td>A free editor-plus-upsell with three reviews</td><td><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Order Editing</a> &amp; Upsell</td></tr>
<tr><td>An account editor from about $39</td><td>AE</td></tr>
<tr><td>A $99 suite with optional address checks</td><td>OrderEditing.com</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Close the editor at fulfilment</p>
<p>A shipped order is not a form. The cheap window is the hour after checkout. <a href="/blog/order-edit-cutoff-windows.html?src=Ninety9Blog">Order edit cutoff windows</a> is the policy. <a href="/blog/change-shipping-address-after-checkout.html?src=Ninety9Blog">Change shipping address after checkout</a> is the most common field.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a>. The queue is address and size. Keep 3PL and address APIs in the systems that already own them.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify order editor app in 2026?</summary><div class="faq__a"><p>Reviso. Customers edit the address, items, variants, quantities and shipping method until fulfilment, and the same free app can answer a cancel click and handle returns. A simpler editor stops at the field. A $99 suite starts at the invoice.</p></div></details>
<details><summary>Can customers edit a Shopify order after checkout?</summary><div class="faq__a"><p>Yes, with an order editor, until the order is fulfilled. Shopify already lets staff edit in the admin. The ticket exists because the customer cannot. Reviso closes the form at fulfilment.</p></div></details>
<details><summary>What should a Shopify order editor let customers change?</summary><div class="faq__a"><p>Shipping address, items, quantities, variants and shipping method. Reviso can restrict each of those by country, customer tag and order rules.</p></div></details>
<details><summary>Will an order editor reduce cancellations?</summary><div class="faq__a"><p>Most cancel clicks are a correction. An editor lets them fix it. Reviso can also offer a discount or a gift if they still try to cancel. The policy side is in <a href="/blog/reduce-order-cancellations.html?src=Ninety9Blog">how to reduce order cancellations</a>.</p></div></details>
<details><summary>Does a Shopify order editor replace address validation?</summary><div class="faq__a"><p>No. Reviso lets the customer type the address they meant. It does not call a carrier validation API, a 3PL, or POS. The category comparison is in <a href="/blog/best-shopify-order-editing-apps-2026.html?src=Ninety9Blog">order editing apps</a>.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify progress bar apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-progress-bar-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-progress-bar-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify progress bar apps. Features, pricing and where Goalify, Yaco, Kai, Turbo and Progressify fit on the cart.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Shopify progress bar app lifts average order value when the threshold sits just above current AOV and the remaining amount updates in the cart.</li><li>One fill is the simple version. Growing stores need a second goal, a different number per country, and a test.</li><li>Goalify stacks free shipping, a discount and a gift, with country thresholds, AI gap-closers and A/B tests, including the free band under 10 orders.</li><li>A $5 bar with a 4.0 rating is a cheaper widget. It is not a second goal.</li></ul></section>
<p>A Shopify progress bar shows the distance between this cart and a reward. Merchants search &quot;Shopify progress bar&quot; when the cart has no finish line, and &quot;Shopify progress bar app&quot; when the theme bar cannot change by country or hold a second reward. The bar fails when every shopper sees the domestic threshold, or when the gift needs another app.</p>
<p>This comparison looks at five Shopify progress bar apps from the 2026 App Store. The ranking favours a bar that can become a sequence. A simpler single fill is a starting widget.</p>
<figure><img src="/assets/img/blog/best-shopify-progress-bar-apps-2026-inline.jpg" alt="Stacked cart goals with shipping, a discount and a gift still ahead" loading="lazy" decoding="async"><figcaption>One fill is the start. The second threshold is the progress bar a growing cart needs.</figcaption></figure>
<h2 id="how-these-shopify-progress-bar-apps-were-ranked">How these Shopify progress bar apps were ranked</h2>
<p><a href="/blog/stacked-cart-goals.html?src=Ninety9Blog">Stacked cart goals</a> is the model. The list weights:</p>
<ol>
<li><strong>Whether the bar can stack</strong> — shipping, then a discount, then a gift.</li>
<li><strong>Whether the number can change by country.</strong></li>
<li><strong>Whether you can A/B test the threshold or the copy.</strong></li>
<li><strong>Whether the paid plan follows orders you already understand.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is first because a Shopify progress bar app that only draws one fill leaves the second reward for a later install.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>More than one goal</th><th>Testing</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a></td><td>5.0 / 48</td><td>Free under 10 orders, then $3.99</td><td>Shipping, discount, gift</td><td>A/B tests</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/upsellprogressbar" target="_blank" rel="noopener">Yaco</a></td><td>4.9 / 22</td><td>Free plan, then about $9.90</td><td>Shipping bar, more tiers on paid</td><td>A/B on the Optimize plan</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/progress-bar-shipping-gift" target="_blank" rel="noopener">Kai</a></td><td>5.0 / 44</td><td>From $5.99 after trial</td><td>Shipping and gifts, upsells on higher plans</td><td>Not the headline</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/turbo-progress-bar" target="_blank" rel="noopener">Turbo Progress Bar</a></td><td>4.8 / 20</td><td>Free</td><td>A fast single goal</td><td>Not listed as A/B</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/progressify" target="_blank" rel="noopener">Progressify</a></td><td>4.0 / 41</td><td>$5 / month</td><td>Tiered bar</td><td>Not listed as A/B</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-goalify-a-shopify-progress-bar-that-can-hold-a-second-goal">1. Goalify — a Shopify progress bar that can hold a second goal</h2>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> is a Shopify progress bar app for cart goals. The first publish can be one fill: a template, a threshold, the cart drawer or the top bar. That is the simple version.</p>
<p>The reason it leads is month two. Rewards stack — free shipping, then money off, then a gift. Rules can use cart value, item count, or specific products. Country thresholds keep export carts off the domestic minimum. When the shopper is short, AI upsells from order history can suggest a product that closes the gap. You can run a sticky bar, a product-page widget, and the cart. A/B tests compare thresholds and copy. Free under 10 orders a month, then $3.99, $7.99 and $11.99. Built for Shopify, 5.0 from 48 reviews.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Stacked rewards in one Shopify progress bar app</li>
<li>Country thresholds and currency</li>
<li>A/B tests on the goal</li>
<li>Order-banded pricing, including a real free band</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>48 reviews, not a huge public record. The sequence is still the product.</li>
</ul>
<p>Put the bar at the top of the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer so the remaining amount sits on the line items. The setup checklist is the <a href="/blog/free-shipping-progress-bar-guide.html?src=Ninety9Blog">free shipping progress bar guide</a>.</p>
<h2 id="2-yaco">2. Yaco</h2>
<p><a href="https://apps.shopify.com/upsellprogressbar" target="_blank" rel="noopener">Yaco</a> is a progress bar pointed at an upsell. 4.9 from 22 reviews. A free plan is on the listing. Premium is about $9.90. A/B testing sits on the Optimize plan, listed around $9.95 during a beta.</p>
<p>A bar plus an upsell is a familiar pair. The test is not on the cheap plan. Goalify includes the test with the goal, not as a later tier you discover after the threshold is already wrong.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free plan on the listing</li>
<li>A/B exists, on Optimize</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Testing is a higher plan</li>
<li>A smaller review count, and a narrower job than a stacked sequence</li>
<li>The upsell can crowd the bar</li>
</ul>
<h2 id="3-kai">3. Kai</h2>
<p><a href="https://apps.shopify.com/progress-bar-shipping-gift" target="_blank" rel="noopener">Kai</a> pairs a progress bar with gifts. 5.0 from 44 reviews. Plans start at $5.99 after a short trial, then $7.99 and $9.99. Upsells show up as you move up the plans.</p>
<p>Shipping plus a gift is the natural pair. A discount between them, a country-specific number, and a test of the copy are the parts a growing cart asks for next. Those are not the headline of a $5.99 bar.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Shipping and gifts in one listing</li>
<li>Modest monthly price</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Upsells arrive on higher plans</li>
<li>No listed A/B test as the core product</li>
<li>Trial first, then a monthly fee, for a single-job bar</li>
</ul>
<h2 id="4-turbo-progress-bar">4. Turbo Progress Bar</h2>
<p><a href="https://apps.shopify.com/turbo-progress-bar" target="_blank" rel="noopener">Turbo</a> is a fast cart bar. 4.8 from 20 reviews. The listing is free. Show the goal, fill it, nudge the next item.</p>
<p>A free single fill is the simpler Shopify progress bar. It does not become a sequence, and it does not list an A/B test. Twenty reviews is a short record for a bar you will outgrow.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free</li>
<li>Fast to put one goal on the cart</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>One job, thinly reviewed</li>
<li>No listed test</li>
<li>The second reward is a different app</li>
</ul>
<h2 id="5-progressify">5. Progressify</h2>
<p><a href="https://apps.shopify.com/progressify" target="_blank" rel="noopener">Progressify</a> is a tiered free-shipping bar at $5 a month. 4.0 from 41 reviews. Markets are on the listing. There is no free plan in the current pricing, only a trial.</p>
<p>Four out of five, from 41 reviews, is the number to read before the $5 price. A cheap bar with a weak public record is still a bar you will explain to support. Tiered shipping is not the same as a tested, country-specific sequence.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Low monthly price</li>
<li>Markets mentioned on the listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>4.0 from 41 reviews</li>
<li>No free band for a live store</li>
<li>No listed A/B test</li>
</ul>
<h2 id="which-shopify-progress-bar-app-should-you-install">Which Shopify progress bar app should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>Stacked goals, country numbers, and a test</td><td>Goalify</td></tr>
<tr><td>A simpler bar, with A/B locked to a higher plan</td><td>Yaco</td></tr>
<tr><td>Shipping and a gift, then a monthly fee</td><td>Kai</td></tr>
<tr><td>One free fill and nothing further</td><td>Turbo</td></tr>
<tr><td>A $5 bar with a 4.0 rating</td><td>Progressify</td></tr>
</tbody></table></div>
<aside class="callout callout--warn">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 9v4M12 17h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>One number per market</p>
<p>A Shopify progress bar that shows every shopper the domestic threshold stalls export carts. Set the country number first. Style second. Copy notes are in <a href="/blog/free-shipping-bar-copy.html?src=Ninety9Blog">free shipping bar copy</a>.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a>. Read <a href="/blog/stacked-cart-goals.html?src=Ninety9Blog">stacked cart goals</a> before you publish three fills on day one. One honest threshold beats a ladder nobody can finish.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify progress bar app in 2026?</summary><div class="faq__a"><p>Goalify. It is a Shopify progress bar app for stacked rewards, country thresholds and A/B tests, free under 10 orders a month. A single-fill bar is a simpler widget you outgrow.</p></div></details>
<details><summary>Where should a Shopify progress bar sit?</summary><div class="faq__a"><p>At the top of the cart drawer, and as a quiet storefront bar if the threshold should be visible before add to cart. Placement notes are in <a href="/blog/where-to-put-a-progress-bar.html?src=Ninety9Blog">where to put a progress bar</a>.</p></div></details>
<details><summary>Can one Shopify progress bar unlock more than free shipping?</summary><div class="faq__a"><p>Yes, in Goalify. Free shipping, an order discount and a gift can stack. A second app for the gift is how the bar and the cart disagree.</p></div></details>
<details><summary>Should the progress bar use the same threshold in every country?</summary><div class="faq__a"><p>No. A domestic minimum shown to an export cart stalls the order. Goalify sets the number per country, in the shopper&#39;s currency.</p></div></details>
<details><summary>How is a progress bar different from a free shipping bar?</summary><div class="faq__a"><p>A free shipping bar is one goal. A progress bar app should be able to hold the next goal too. The shipping-only shortlist is in <a href="/blog/best-shopify-free-shipping-bar-apps-2026.html?src=Ninety9Blog">free shipping bar apps</a>.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Best 5 Shopify upsell popup apps (2026)</title>
      <link>https://ninety9.dev/blog/best-shopify-upsell-popup-apps-2026.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/best-shopify-upsell-popup-apps-2026.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>A 2026 comparison of Shopify upsell popup apps. Features, pricing and where Monet, BA Popup, Kaching, Jumi and PopupGenius fit.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>An upsell popup should sell one product at a moment of intent: add to cart, checkout start, or exit. Timer popups that interrupt browsing train people to close overlays.</li><li>Monet stays on those three moments, with bundle, cross-sell and add-on layouts, and it is free to install.</li><li>Apps that also collect email, run sitewide promotions, or cap views are doing a different job. Keep the promotion calendar out of the add-to-cart frame.</li><li>One offer, one button, one way out. A four-product grid is a second storefront.</li></ul></section>
<p>A Shopify <a href="https://apps.shopify.com/monet?src=Ninety9Blog">upsell popup</a> is an overlay that offers one more product after the shopper has already leaned in. The useful versions fire on add to cart, at the start of checkout, or on exit. The rest fire because a timer expired. Shoppers learn to close those.</p>
<p>This comparison looks at five Shopify upsell popup apps from the 2026 App Store. The ranking favours a product offer at an honest moment, not a promotion engine that also happens to upsell.</p>
<figure><img src="/assets/img/blog/best-shopify-upsell-popup-apps-2026-inline.jpg" alt="One product, one price, one add button and a skip link" loading="lazy" decoding="async"><figcaption>A popup is a yes or no. A grid is a catalogue.</figcaption></figure>
<h2 id="how-these-upsell-popup-apps-were-ranked">How these upsell popup apps were ranked</h2>
<p><a href="/blog/add-to-cart-popup-upsell.html?src=Ninety9Blog">Add to cart popup upsells</a> and <a href="/blog/exit-intent-popups-shopify.html?src=Ninety9Blog">exit-intent popups</a> are the two jobs. The list weights:</p>
<ol>
<li><strong>Whether the trigger is intent</strong>, not a countdown on a collection page.</li>
<li><strong>Whether the overlay sells a product</strong>, with a picture, a price and one add.</li>
<li><strong>Whether the plan stays free or cheap when the offer is the whole product.</strong></li>
<li><strong>Whether email capture and sitewide promo banners live somewhere else.</strong></li>
</ol>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> is first because it only does those three moments, it is free, and it will not turn the add-to-cart frame into a newsletter. It has four public reviews. That is disclosed on purpose. Review count is not a trigger.</p>
<h2 id="comparison-table">Comparison table</h2>
<p>Ratings and prices below are from the Shopify App Store listings as of October 2026.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Rank</th><th>App</th><th>Rating</th><th>From</th><th>Triggers</th><th>Also does</th><th>A/B test</th></tr></thead><tbody>
<tr><td>1</td><td><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a></td><td>5.0 / 4</td><td>Free to install</td><td>Add to cart, checkout start, exit</td><td>Bundles, cross-sell, add-ons, BOGO</td><td>No</td></tr>
<tr><td>2</td><td><a href="https://apps.shopify.com/not-another-popup-upsell" target="_blank" rel="noopener">BA Popup Upsell</a></td><td>5.0 / 25</td><td>Dev stores free, then $7.99</td><td>Add to cart, exit, timer</td><td>Bundles, quantity breaks</td><td>Yes</td></tr>
<tr><td>3</td><td><a href="https://apps.shopify.com/popup-upsell" target="_blank" rel="noopener">Kaching Upsell &amp; Email Popup</a></td><td>5.0 / 137</td><td>Dev stores free, then $4.99</td><td>Popups with targeting</td><td>Email capture</td><td>Not the headline</td></tr>
<tr><td>4</td><td><a href="https://apps.shopify.com/push-upsell-popup" target="_blank" rel="noopener">Upsell Popup by Jumi</a></td><td>5.0 / 34</td><td>Free to $100 extra revenue, then $4.99</td><td>Targeted popups</td><td>Revenue-banded plans</td><td>Not listed</td></tr>
<tr><td>5</td><td><a href="https://apps.shopify.com/popupgenius" target="_blank" rel="noopener">PopupGenius</a></td><td>See listing</td><td>Free band, then $9.99</td><td>Broad popups</td><td>Promotions, AI credits, view caps</td><td>Plan-dependent</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/monet/icon.png" alt="Monet • AI Popup Bundle Addons app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Monet • AI Popup Bundle Addons</p>
<p class="appcta__text">AI upsell popups triggered on add to cart, checkout initiation and exit intent.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-monet-a-product-at-the-moment-it-belongs">1. Monet — a product, at the moment it belongs</h2>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a> is a Shopify upsell popup app. It opens on add to cart, when checkout starts, or on exit. Those are the three moments that already have a product in mind. It does not open because ten seconds passed.</p>
<p>The layouts are a bundle, a cross-sell or an add-on. The product can be chosen by you or suggested from purchase patterns. Discounts can be percent, flat, BOGO, tiered or volume, with a countdown when the deadline is real. Targeting can use country and customer tag. Analytics show views, add-to-cart rate and conversion per popup.</p>
<p>It is free to install. It does not collect email. It is not a thank-you-page upsell. If you need a list, keep the list tool. If you need a post-purchase offer, that is a different surface.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Three intent triggers, no browse-interrupting timer as the product</li>
<li>Bundle, cross-sell and add-on templates</li>
<li>Country and tag rules</li>
<li>Free, with no view cap on the listing</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Four public reviews</li>
<li>No A/B test inside the app</li>
<li>Wrong tool for a sitewide &quot;10% off this weekend&quot; banner</li>
</ul>
<p>The add-to-cart version can be the set. The exit version should be smaller. <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can own the shipping maths. Monet can own the product ask.</p>
<h2 id="2-ba-popup-upsell">2. BA Popup Upsell</h2>
<p><a href="https://apps.shopify.com/not-another-popup-upsell" target="_blank" rel="noopener">BA</a> adds a timer to add-to-cart and exit. 5.0 from 25 reviews. Built for Shopify. Paid plans from $7.99, $14.99 and $29.99 are billed on added revenue. All features sit on every paid plan, including bundles, quantity breaks, live preview and A/B testing.</p>
<p>The A/B switch is the listing. The timer is the feature most likely to fire on a collection page, which is the page that should not have a popup. Testing two overlays does not fix a trigger you should not run. Monet stays on the three moments. You do not pay on attributed revenue to keep it there.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Add to cart and exit in the same app</li>
<li>All features on every paid plan</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Timer trigger is easy to misuse</li>
<li>You pay on attributed revenue once you leave the dev-store plan</li>
<li>A/B is not a reason to put a countdown on browse</li>
</ul>
<h2 id="3-kaching-upsell-email-popup">3. Kaching Upsell &amp; Email Popup</h2>
<p><a href="https://apps.shopify.com/popup-upsell" target="_blank" rel="noopener">Kaching</a> is the suite popup. 5.0 from 137 reviews. Built for Shopify. Free on development stores, then $4.99, $12.99 and $24.99. Unlimited popups, targeting, customisation — and email.</p>
<p>Email and a product upsell are different successes. A shopper who just added a bottle does not owe you their address. Mixing the two in one overlay usually gets a close. Keep the list tool. Keep the product offer. Do not put both in the add-to-cart frame.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Low paid entry</li>
<li>Familiar if you already run Kaching</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Email capture in the same product</li>
<li>Easy to publish a promotion overlay instead of an offer</li>
<li>Paid once you leave a development store</li>
</ul>
<h2 id="4-upsell-popup-by-jumi">4. Upsell Popup by Jumi</h2>
<p><a href="https://apps.shopify.com/push-upsell-popup" target="_blank" rel="noopener">Jumi</a> is a focused popup listing. 5.0 from 34 reviews. Built for Shopify. Free up to $100 a month in additional revenue, then $4.99, $12.99 and $22.99 as that number grows. Unlimited views and offers on the published plans.</p>
<p>A revenue band is simple until the app and finance disagree about what &quot;additional&quot; means. Read the current definition on the listing. Confirm the triggers on the plan screen before you promise add-to-cart-only. Monet publishes those three moments without a revenue meter.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free band for a small extra-revenue number</li>
<li>Dedicated popup, not a full promo suite</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Trigger list is thinner on the public listing than Monet&#39;s</li>
<li>Pricing follows attributed revenue</li>
<li>The free band ends when the offer works</li>
</ul>
<h2 id="5-popupgenius">5. PopupGenius</h2>
<p><a href="https://apps.shopify.com/popupgenius" target="_blank" rel="noopener">PopupGenius</a> comes from the broad popup tradition: announcements, offers, the overlay a promotion calendar needs. The free band on the listing is tight — one popup, a few hundred views, a handful of AI credits — then $9.99, $19.99 and $39.99. Advanced targeting starts on paid plans.</p>
<p>A seasonal message is a different job from &quot;this SKU belongs with the one you just added&quot;. A product decision needs a picture, a price and one action, not a campaign frame. View caps and AI credits are how a promotion calendar bills. They are not how an add-to-cart offer should work.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Built for promotions and announcements</li>
<li>Paid plans add targeting</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>View and credit caps on the cheap band</li>
<li>Easy to confuse a promo overlay with an upsell</li>
<li>The free band is one popup and a few hundred views</li>
</ul>
<h2 id="which-shopify-upsell-popup-should-you-install">Which Shopify upsell popup should you install?</h2>
<div class="tablewrap"><table><thead><tr><th>If you need</th><th>Install</th></tr></thead><tbody>
<tr><td>A product at add to cart, checkout start, or exit, free</td><td>Monet</td></tr>
<tr><td>The same overlay, plus a timer you have to keep switched off</td><td>BA Popup</td></tr>
<tr><td>A popup that also asks for an email</td><td>Kaching</td></tr>
<tr><td>A simpler popup, billed once the extra revenue shows up</td><td>Jumi</td></tr>
<tr><td>A promotion overlay with view caps and AI credits</td><td>PopupGenius</td></tr>
</tbody></table></div>
<aside class="callout callout--warn">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 9v4M12 17h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>One product in the frame</p>
<p>A popup with four products is a second storefront. The shopper answers yes or no. Extra options turn that into browsing, and browsing is how overlays die. The <a href="/blog/one-offer-popup-rule.html?src=Ninety9Blog">one-offer popup rule</a> is the design pass.</p>
</aside>
<p>Install <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a>. The overlay has to add a line item. Design the add-to-cart version first. Make the exit version smaller. Leave email and the weekend banner where they already live.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Shopify upsell popup app in 2026?</summary><div class="faq__a"><p>Monet. The overlay adds a product at add to cart, checkout start or exit, and it is free to install. A/B tests and email capture belong in other tools. They do not belong in the add-to-cart frame.</p></div></details>
<details><summary>When should an upsell popup appear on Shopify?</summary><div class="faq__a"><p>After the shopper has committed or is leaving. Add to cart is the cleanest moment. Checkout initiation is a last relevant offer before Shopify checkout. Exit intent is a smaller, cheaper offer. Ranked notes are in <a href="/blog/popup-triggers-ranked.html?src=Ninety9Blog">popup triggers</a>.</p></div></details>
<details><summary>Will upsell popups hurt conversion rate?</summary><div class="faq__a"><p>They can, if they fire on a timer while someone is still reading. Monet does not open on browse. It waits for add, checkout start or leave. Measure add-to-cart rate on the hero as the guardrail.</p></div></details>
<details><summary>Can Monet collect emails?</summary><div class="faq__a"><p>No. Monet is a product offer, not a list builder. Keep email capture in the tool you already use for that.</p></div></details>
<details><summary>Should the same popup run on add to cart and on exit?</summary><div class="faq__a"><p>No. The add-to-cart version can be the set. The exit version should be cheaper and shorter. Copying one four-product grid onto every moment is how popups get closed on sight.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Different Free Shipping Thresholds per Country on Shopify</title>
      <link>https://ninety9.dev/blog/different-free-shipping-thresholds-per-country-shopify.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/different-free-shipping-thresholds-per-country-shopify.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How to show a different free shipping threshold per country on Shopify, in the shopper&apos;s currency, without one domestic number on every cart.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>One free-shipping number for every country is how export carts stall. The label costs more, and the goal was written for home.</li><li>The bar, the shipping discount and the currency the shopper sees have to be the same number.</li><li><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> sets the threshold per country and shows it in the presentment currency.</li><li>Start with the two countries that actually order. A matrix of forty goals on day one will be wrong in thirty-eight of them.</li></ul></section>
<p>A $75 free-shipping threshold is a domestic sentence. The label to the next country costs a different amount, the average order is different, and a straight currency conversion is not a strategy. Showing every shopper the home number is how international carts reach checkout and bounce on the shipping price.</p>
<h2 id="set-the-countries-that-pay-you">Set the countries that pay you</h2>
<p>Pull the last ninety days of orders by country. Keep the two or three that are real. For each, note the average order and a typical label. The foreign threshold should sit just above that country&#39;s average, and the extra margin has to cover that country&#39;s label. The home method is in <a href="/blog/how-to-set-up-free-shipping-over-x-shopify.html?src=Ninety9Blog">how to set free shipping over $X</a>. Repeat it per country. Do not multiply $75 by an exchange rate and call it localised.</p>
<p>Round the result in the currency people think in. €70, not €68.40.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="make-the-discount-match-the-bar">Make the discount match the bar</h2>
<p>Shopify&#39;s free-shipping discount needs a minimum that matches the bar for that destination. If the discount is one global minimum, the bar can say €40 while checkout still wants the dollar rule. The shopper did the thing the bar asked. Checkout disagreed. That is the bug.</p>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> stores a threshold per country and shows the remaining amount in the shopper&#39;s presentment currency. The bar can sit on the storefront, in the cart, and on the product page. Country rules are part of the product, including on the paid plans that start at $3.99 after the free band under 10 orders. Built for Shopify.</p>
<p>If the cart is a drawer, the same country goal should be what <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> shows. Two bars with two countries&#39; numbers is worse than one honest bar.</p>
<h2 id="what-to-publish-first">What to publish first</h2>
<div class="tablewrap"><table><thead><tr><th>Country</th><th>Do this</th></tr></thead><tbody>
<tr><td>Home</td><td>The number you already run, written as a remaining amount</td></tr>
<tr><td>The next country that actually orders</td><td>Its own threshold, from its labels, rounded</td></tr>
<tr><td>Everywhere else you ship</td><td>A simple second number, reviewed when volume shows up</td></tr>
<tr><td>Countries you do not ship to</td><td>No bar</td></tr>
</tbody></table></div>
<p>A/B test the home threshold and the export threshold separately. A winner at home is not a winner on a more expensive label. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> can test the threshold and the copy.</p>
<h2 id="one-home-number-priced-as-if-every-label-cost-the-same">One home number, priced as if every label cost the same</h2>
<p>A shop ships from the United States. These figures are an example you replace with your own invoices.</p>
<div class="tablewrap"><table><thead><tr><th>Destination</th><th>Recent average order</th><th>A typical label</th><th>A threshold worth testing</th></tr></thead><tbody>
<tr><td>United States</td><td>$54</td><td>$6</td><td>$75</td></tr>
<tr><td>Germany</td><td>€48</td><td>€14</td><td>€90</td></tr>
<tr><td>United Kingdom</td><td>£46</td><td>£11</td><td>£80</td></tr>
<tr><td>A country with three orders</td><td>Too few to average</td><td>Whatever the invoice says</td><td>No special goal yet</td></tr>
</tbody></table></div>
<p>The US threshold sits just above $54, and the extra item has to cover a $6 label. The German threshold sits further above the average because the label is €14. A straight conversion of $75 into euros ignores that invoice. It also ignores that German prices may already be shown with tax included, so the number on the bar has to be the number the shopper thinks they are spending. If your store shows tax-inclusive prices in that market, the threshold the shopper reads should be tax-inclusive too. Place a test order and compare the bar to the amount Shopify uses for the shipping discount. Those two amounts are the whole feature.</p>
<p>Round in the currency people say out loud. €90, £80, $75. A threshold of €87.40 is a spreadsheet that leaked.</p>
<h2 id="markets-change-the-currency-they-do-not-write-the-goal">Markets change the currency. They do not write the goal</h2>
<p>Shopify Markets can price a product in euros and show a European catalogue. The progress bar is still a rule you configure. If the bar has one domestic minimum, every market sees it, converted or not. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> stores a threshold per country and shows the remaining amount in the presentment currency. That country configuration is on the paid plans, from $3.99 after the free band under 10 orders a month. Built for Shopify. The bar can sit on the storefront, in the cart, and on the product page.</p>
<p>The Shopify free-shipping discount has to agree. One global minimum means the bar can say €40 while checkout still wants the dollar rule. Build the discount so the destination the shopper selected is the destination the minimum describes. Then add a product until the bar completes, and open checkout. Standard shipping should be free. Remove a unit. It should charge again.</p>
<p>If the cart is a drawer, <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> should show that same country goal. A header bar in euros and a drawer bar in dollars is two promises. Keep one.</p>
<h2 id="what-to-calculate-before-you-add-a-fourth-country">What to calculate before you add a fourth country</h2>
<ol>
<li>Orders, last ninety days, by country. Drop anyone under a volume you would trust. Three orders is an anecdote.</li>
<li>Average merchandise value for the countries you kept.</li>
<li>A typical label, from invoices, not from a rate-card guess you made in January.</li>
<li>The margin on the item people actually add to close the gap. If that margin is smaller than the label, raise the threshold or stop offering free shipping there.</li>
<li>A round number in their currency.</li>
<li>One test order. Bar, then checkout, then remove a unit.</li>
</ol>
<p>A/B tests belong on the countries with enough traffic to finish. Testing a threshold in a country that sends twenty sessions a week will not finish. Test the home number. Test the next real country. Leave the long tail on a simple second number until the orders show up. Goalify compares the threshold and the copy. A winning sentence at home can be copied. A winning number should not.</p>
<p>Countries you do not ship to get no goal. Hide the bar. A remaining amount you cannot fulfil becomes a ticket the moment they pay.</p>
<p>The home arithmetic, including where to set a single $X, is in <a href="/blog/how-to-set-up-free-shipping-over-x-shopify.html?src=Ninety9Blog">free shipping over $X</a>.</p>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a>. One bar, more than one number.</p>
<h2 id="what-the-shopper-actually-compares">What the shopper actually compares</h2>
<p>They do not compare your domestic policy to a strategy deck. They compare the bar to the shipping line at checkout, in the currency on the screen.</p>
<p>Walk Germany with the example numbers. The bar says &quot;€22 away from free shipping&quot; on a €68 cart, because the goal is €90. They add a €24 product. The cart is €92. Checkout shows standard shipping at €0. That is a pass.</p>
<p>Now break it on purpose, so you know what failure looks like. Leave the Shopify discount at a converted $75 minimum, about €70, while the bar says €90. At €75 the bar still asks for more, and checkout has already made shipping free. Or the reverse: the bar completes at €70 and checkout still wants €90. Both are the same bug. The bar and the discount are describing different goals. Fix the discount to the country&#39;s number before you translate another string.</p>
<p>Tax changes the number they see. A €90 goal on tax-inclusive prices is a different cash amount from a €90 goal on tax-exclusive prices. Use the figure printed on the product page in that market. Place the test order while previewing as a customer in that country, not while your admin is set to the home market. An admin preview in dollars will &quot;confirm&quot; the domestic rule and miss the export one.</p>
<h2 id="a-sensible-order-of-work">A sensible order of work</h2>
<p>Week one, home only. The bar, the discount, and four test orders. Week two, the next country that actually pays you, with its own label and its own round number. Week three, a test of the home threshold against one alternative, if you have the orders to finish it. The long tail of countries stays on a simple second number, or on no bar if you do not ship there.</p>
<p>Do not launch forty country goals because the spreadsheet had forty rows. Empty rows become wrong rows. Goalify will store the ones you mean, on the paid plans, and show them in the presentment currency. The free band under 10 orders a month is there to prove the home bar. Country configuration is the reason the paid plan exists.</p>
<p>If <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a> is the cart, the drawer should read the same remaining amount the header does. Edit the goal once. A second bar with a typed-in conversion will be stale the week rates move, and it was the wrong method even when the rate was fresh.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Can Shopify Markets use a different free shipping threshold per country?</summary><div class="faq__a"><p>Markets can change currency and price. The progress bar still needs its own country rule, or every shopper sees the domestic goal. Goalify stores that rule per country.</p></div></details>
<details><summary>Should the threshold be converted from the home currency?</summary><div class="faq__a"><p>Only as a starting guess. A straight conversion ignores the real label cost. Set the foreign number from that country&#39;s orders and shipping cost, then round it.</p></div></details>
<details><summary>The bar is in euros but checkout uses the dollar minimum. What happened?</summary><div class="faq__a"><p>The bar converted the display and the discount did not, or the reverse. The qualifying amount and the displayed amount have to be the same rule.</p></div></details>
<details><summary>Do I need a different bar design per country?</summary><div class="faq__a"><p>No. The same bar, a different number. Design is the last step.</p></div></details>
<details><summary>What about a country I do not ship to?</summary><div class="faq__a"><p>Do not show them a free-shipping goal. Hide the bar, or show that you do not ship there. A goal you cannot fulfil is a complaint.</p></div></details>
<details><summary>Do I convert $75 into euros and publish that?</summary><div class="faq__a"><p>Only as a draft number. Replace it with a threshold built from that country&#39;s orders and that country&#39;s label, then round it.</p></div></details>
<details><summary>Are country thresholds on the free Goalify plan?</summary><div class="faq__a"><p>Country configuration is on the paid plans, from $3.99 a month after the free band under 10 orders. The free plan is the bar, the goals, and the analytics.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Do Popups Hurt Shopify SEO? Google&apos;s Mobile Popup Rules</title>
      <link>https://ninety9.dev/blog/do-popups-hurt-shopify-seo.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/do-popups-hurt-shopify-seo.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Google&apos;s mobile interstitial rules, and which Shopify popups can affect rankings. Add-to-cart overlays are not the same as a page-load takeover.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Google can treat a full-screen mobile popup that blocks the page on arrival as an intrusive interstitial. That is a ranking issue, not a myth.</li><li>A popup after add to cart, at checkout, or on exit is a response to an action. It is not the same as a takeover on landing.</li><li>Cookie notices, age gates and login dialogs are the exceptions Google has described. A 15% newsletter is not one of them.</li><li><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> does not open on a browse timer. It waits for add to cart, checkout, or exit. That is the safer shape. It is not a promise of zero SEO impact.</li></ul></section>
<p>Popups can hurt Shopify SEO when they behave like a gate. Google&#39;s mobile guidance on intrusive interstitials is about a page that, when reached from search, is covered by a full-screen layer before the shopper can read it. The content they clicked is behind a promotion. That pattern can be a ranking problem. It is not a story invented by popup vendors, and it is not a reason to ban every overlay.</p>
<h2 id="what-google-actually-described">What Google actually described</h2>
<p>The pages at risk are mobile landing pages. The popup shows on arrival, or immediately after, and it covers the main content. A newsletter, an app install, or a discount that has to be dismissed before the product can be read. Google has carved out things a page must show: a cookie or legal notice, an age gate, a login. A marketing offer is not on that list.</p>
<p>A banner that uses a strip of the screen is not the same object as a full-screen takeover. Size and timing are the whole argument.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/monet/icon.png" alt="Monet • AI Popup Bundle Addons app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Monet • AI Popup Bundle Addons</p>
<p class="appcta__text">AI upsell popups triggered on add to cart, checkout initiation and exit intent.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="what-a-selling-popup-is-allowed-to-be">What a selling popup is allowed to be</h2>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> does not open because a timer expired while someone was reading. It opens after add to cart, when checkout starts, or when the shopper is leaving. The shopper has already reached the product. The offer is a second item, not a wall in front of the first one.</p>
<p>That is a better shape than a page-load interstitial. It is not a claim that Google has reviewed <a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a>, and it is not a claim that the popup has no effect on anything. A full-screen layer is still a full-screen layer if you let it cover the product after the tap. Keep one product in it. Make the dismiss control obvious. Do not chain a second popup after a no.</p>
<p>Monet does not ask for an email. The SEO risk of a newsletter gate is a different product, usually a different app, firing on arrival. Leaving that app on a five-second delay does not make it &quot;after the content&quot;.</p>
<h2 id="a-practical-split">A practical split</h2>
<div class="tablewrap"><table><thead><tr><th>Popup</th><th>Timing</th><th>SEO posture</th></tr></thead><tbody>
<tr><td>Full-screen discount on landing</td><td>On load</td><td>The pattern Google warned about</td></tr>
<tr><td>Newsletter covering the product</td><td>On load or a short delay</td><td>Same family. Delay is not a defence</td></tr>
<tr><td>Cookie or age notice</td><td>On load, as small as the law allows</td><td>The exception, still not a place for a sale</td></tr>
<tr><td>Offer after add to cart</td><td>After a click</td><td>A response, not a gate</td></tr>
<tr><td>Offer as checkout starts</td><td>After they chose to pay</td><td>A response</td></tr>
<tr><td>Exit on desktop</td><td>After they move to leave</td><td>Weaker, and easy to overuse</td></tr>
</tbody></table></div>
<p>If you want the offer without a popup at all, put one complement in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer. The product page stays clear. The ask happens in the cart they just opened.</p>
<h2 id="what-this-article-will-not-promise">What this article will not promise</h2>
<p>No one can honestly say &quot;popups do not affect SEO&quot;. A theme that injects a full-screen app on every collection URL can affect it. Check the mobile landing page from a search result, not from the theme editor. If the first thing on the screen is a sale, remove that app before you blame the product page.</p>
<h2 id="what-to-look-at-on-a-phone">What to look at on a phone</h2>
<p>Google&#39;s intrusive-interstitial guidance is about mobile pages reached from search. The content the person clicked is covered, on arrival or immediately after, by a layer they have to dismiss. The examples Google has pointed at are promotions: a newsletter, an app install, a discount. Legal notices, cookie consent, age gates and sign-in are the carve-outs, because the page cannot function without them. A 15% code is not on that list.</p>
<p>A strip of the screen is a different object from a layer that hides the product. You do not need a pixel count to see which one you shipped. Hold the phone. If you can read the product title, the price and the add-to-cart button without dismissing anything, you are in the safer shape. If the first tap is &quot;no thanks&quot;, you are in the pattern the guidance describes.</p>
<p>Do this in a private window, from a results page, on a phone. The theme editor hides the problem, because you are already inside the page. Check the URLs search actually lands on.</p>
<div class="tablewrap"><table><thead><tr><th>URL people land on</th><th>What you want to see first</th><th>What to remove</th></tr></thead><tbody>
<tr><td>A product</td><td>Title, price, add to cart</td><td>A full-screen code on load</td></tr>
<tr><td>A collection</td><td>The grid</td><td>The same code, especially with a short delay</td></tr>
<tr><td>A blog post</td><td>The article</td><td>A newsletter that covers the post</td></tr>
<tr><td>The homepage</td><td>The homepage</td><td>An app-install wall</td></tr>
<tr><td>After they tap add to cart</td><td>The offer, easy to dismiss</td><td>A second wall after they decline</td></tr>
</tbody></table></div>
<p>Collection and blog URLs are where newsletter apps usually fire, because that is where new visitors arrive. A product-page upsell that waits for a click does not repair a collection page that is covered on load. Audit every template that ranks, not only the one you redesigned.</p>
<h2 id="delay-size-and-a-second-popup">Delay, size, and a second popup</h2>
<p>A popup that waits five seconds and then covers the screen is still the first thing that happens on the visit. The shopper has not finished reading. Moving the timer from zero to five does not turn a gate into an answer.</p>
<p>A banner that uses a band at the top or bottom leaves the product readable. That is the shape to prefer for anything that must be on screen at once, including consent. Consent can still be larger than it needs to be. A consent layer that is really a sale, with a discount in the same modal as the cookie buttons, borrows the legal exception for a promotion. Split them. The legal control stays as small as the law you operate under allows. The sale waits for a click.</p>
<p>A second popup after &quot;no&quot; is a second gate. One offer. <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> opens after add to cart, when checkout starts, or when the shopper is leaving. It does not open because a browse timer expired. It does not ask for an email. That is a better shape than a page-load interstitial. It is not a review by Google, and it is not a promise that the popup has no effect. If you let that offer go full screen and hide the product after the tap, you have rebuilt the wall one step later. Keep one product in it. Make the dismiss control obvious.</p>
<p>Exit on a phone is a weak signal, and a full-screen exit layer on a landing URL sits closer to the warned pattern than a small card after add to cart. Prefer the click. The offer examples are in <a href="/blog/pre-purchase-upsells-shopify.html?src=Ninety9Blog">pre-purchase upsells</a>.</p>
<h2 id="other-tools-that-can-still-cover-the-page">Other tools that can still cover the page</h2>
<p>Walk the published theme with every app embed on, because the popup you remember is rarely the only one.</p>
<ul>
<li>A newsletter or spin-to-win app set to &quot;on arrival&quot; or &quot;after a delay&quot;.</li>
<li>A countdown bar that expands into a modal.</li>
<li>A cookie tool styled as a full-screen sale.</li>
<li>A slide cart and a popup both opening on the same add, so the screen is two layers deep.</li>
<li>An old additional script on a page that still injects a modal. Those scripts are a poor place to keep a promotion anyway.</li>
</ul>
<p>Turn them off one at a time and reload the landing URL. The one that changes the first screen is the one that matters. Leave Monet, or the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer, for the moment after they choose a product. The product page they found in search should be readable when it loads.</p>
<p>Install <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> when the offer should follow an action. Check the landing URL on a phone before you call the store clean.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Do popups hurt Shopify SEO?</summary><div class="faq__a"><p>A full-screen popup that covers a mobile landing page as soon as it loads can. Google has said those intrusive interstitials can make the page harder to reach and can affect ranking. An overlay that follows a tap is a different pattern.</p></div></details>
<details><summary>Are add-to-cart popups interstitials?</summary><div class="faq__a"><p>They cover content, but they follow an action the shopper just took. Google&#39;s warning is aimed at popups that block the content before the shopper can read it. Do not treat that as a certificate. Keep the popup small enough to dismiss, and do not fire it on arrival.</p></div></details>
<details><summary>What about exit-intent on mobile?</summary><div class="faq__a"><p>Exit on a phone is a weak signal. A full-screen exit layer on a landing page is closer to the thing Google described than a small cart offer after a click. Prefer the add-to-cart moment.</p></div></details>
<details><summary>Does Google penalise every email popup?</summary><div class="faq__a"><p>The public guidance is about intrusive interstitials on mobile search landing pages, not a ban on email. A newsletter that covers the screen on arrival is the risky version. Monet does not collect email at all.</p></div></details>
<details><summary>Will installing Monet protect my rankings?</summary><div class="faq__a"><p>No app can promise that. Monet avoids the page-load takeover. Your other apps, your theme, and a cookie banner the size of the screen can still create the problem.</p></div></details>
<details><summary>Does a five-second delay make a landing popup safe?</summary><div class="faq__a"><p>No. The shopper still meets a wall before they can read the page they opened. Delay changes the clock. It does not change the pattern.</p></div></details>
<details><summary>How do I check my own store?</summary><div class="faq__a"><p>Open a product URL from a search result on a phone, in a private window. The first screen should be the product. A sale that has to be dismissed first is the pattern to remove.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Hextom Free Shipping Bar Alternatives</title>
      <link>https://ninety9.dev/blog/hextom-free-shipping-bar-alternatives.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/hextom-free-shipping-bar-alternatives.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Hextom Free Shipping Bar alternatives for Shopify. Goalify, Essential, Hoppy, Yaco and Turbo compared when one message bar is no longer enough.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Hextom is a progressive message bar. 4.9 from about 2,800 reviews, a free plan, paid from about $9.99. It is a single-job bar with a long record.</li><li>The limit shows up when you need a second reward, a real per-country threshold, or a test. A message bar does not become that by itself.</li><li><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is the alternative that stacks shipping, a discount and a gift, sets the number per country, and A/B tests the goal.</li><li>Leave Hextom on if you will only ever show one domestic sentence. Move when the second country or the second goal appears.</li></ul></section>
<p>Hextom is the bar a lot of stores installed first. Progressive shipping messages, a free plan, paid from about $9.99, Built for Shopify, 4.9 from about 2,800 reviews on the App Store listing. It tells the shopper there is a goal, and it stops there.</p>
<p>The stores that outgrow it are not confused about the message. They need a second goal, a different number in another country, or a test of the threshold. A message bar does not grow into that. These are the alternatives, with <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> first.</p>
<p>Ratings are from the Shopify App Store as of October 2026.</p>
<div class="tablewrap"><table><thead><tr><th>App</th><th>Rating</th><th>From</th><th>What you are actually buying</th></tr></thead><tbody>
<tr><td><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a></td><td>5.0 / 48</td><td>Free under 10 orders, then $3.99</td><td>Stacked goals, country thresholds, A/B tests</td></tr>
<tr><td><a href="https://apps.shopify.com/essential-order-value-booster" target="_blank" rel="noopener">Essential</a></td><td>5.0 / 974</td><td>Free to 1,000 views, then $9.99</td><td>A single-job bar, then a view cap</td></tr>
<tr><td><a href="https://apps.shopify.com/hoppy-free-shipping" target="_blank" rel="noopener">Hoppy</a></td><td>4.8 / 264</td><td>Free</td><td>A bar that also tries to upsell</td></tr>
<tr><td><a href="https://apps.shopify.com/upsellprogressbar" target="_blank" rel="noopener">Yaco</a></td><td>4.9 / 22</td><td>Free plan, then about $9.90</td><td>A bar pointed at an upsell. A/B sits on a higher plan</td></tr>
<tr><td><a href="https://apps.shopify.com/turbo-progress-bar" target="_blank" rel="noopener">Turbo</a></td><td>4.8 / 20</td><td>Free</td><td>One fast goal, a short review record</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="goalify">Goalify</h2>
<p>Goalify is the Hextom alternative when the bar has to become a sequence. Free shipping, then a discount, then a gift. The threshold can change by country, in the shopper&#39;s currency, on the paid plans. If the cart is short, an AI suggestion from real orders can close the gap. A/B tests compare the number and the copy. Bar or widget, including inside a cart drawer. Free under 10 orders a month, then $3.99, $7.99 and $11.99. Built for Shopify. 48 reviews is a smaller crowd than Hextom. The sequence is the product Hextom&#39;s crowd still has to go shopping for.</p>
<h2 id="essential">Essential</h2>
<p>A high-review bar. Free until 1,000 booster views, then $9.99 and up. Geolocation and the extra pieces sit on paid plans. Views are a painful meter if you buy traffic. One fill, billed like a campaign.</p>
<h2 id="hoppy">Hoppy</h2>
<p>Listed as free, with a bar plus upsells, gifts and discounts. 4.8 from 264 reviews. A free bar that also wants to recommend products will crowd the cart. The threshold still needs a test. Hoppy does not list one.</p>
<h2 id="yaco">Yaco</h2>
<p>A progress bar aimed at an upsell. The test is on the Optimize plan, not the plan you start on. A smaller, narrower tool.</p>
<h2 id="turbo">Turbo</h2>
<p>A free single goal. 4.8 from 20 reviews. Fine as a placeholder. Thin as the bar you run for a year.</p>
<h2 id="when-to-leave-hextom">When to leave Hextom</h2>
<div class="tablewrap"><table><thead><tr><th>You need</th><th>Stay or move</th></tr></thead><tbody>
<tr><td>One domestic sentence, already working</td><td>Stay</td></tr>
<tr><td>A second reward on the same bar</td><td>Goalify</td></tr>
<tr><td>A different number per country</td><td>Goalify</td></tr>
<tr><td>A test of the threshold</td><td>Goalify</td></tr>
<tr><td>A view-capped bar with a huge review count</td><td>Essential</td></tr>
<tr><td>A free bar that also upsells</td><td>Hoppy, and watch the cart get noisy</td></tr>
</tbody></table></div>
<p>Disable Hextom&#39;s embed before you enable the next one. Two remaining amounts is worse than the old bar. Match the Shopify free-shipping discount to the new number the same day. The setup is in <a href="/blog/how-to-set-up-free-shipping-over-x-shopify.html?src=Ninety9Blog">free shipping over $X</a>.</p>
<h2 id="what-you-outgrow-in-one-cart">What you outgrow, in one cart</h2>
<p>A message bar can say &quot;$18 away from free shipping&quot;. That is a complete product if it is the only promise you will ever make. The next request is almost always a sequence. These numbers are an example.</p>
<div class="tablewrap"><table><thead><tr><th>Cart</th><th>What the shopper should see</th></tr></thead><tbody>
<tr><td>$40</td><td>&quot;$35 away from free shipping&quot;</td></tr>
<tr><td>$75, shipping unlocked</td><td>&quot;Free shipping. $25 away from 10% off&quot;</td></tr>
<tr><td>$100</td><td>&quot;You have 10% off. $20 away from a pouch&quot;</td></tr>
<tr><td>$120</td><td>The pouch is in the cart at $0</td></tr>
</tbody></table></div>
<p>One bar carries that. The thresholds move together when you edit them. A message app plus a discount app plus a gift app is three remaining amounts, and they will disagree the first week someone changes only one. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is the sequence: shipping, then a discount, then a gift. If the cart is short of the next line, a suggestion from your own orders can name one product that closes it. That suggestion is only useful after the number itself is true.</p>
<p>Country is the other way a message bar runs out. $75 domestic and €90 in Germany are two configurations of one bar, on Goalify&#39;s paid plans, shown in the shopper&#39;s currency. Copying the home sentence into every market is how export checkout stalls. The arithmetic is in <a href="/blog/different-free-shipping-thresholds-per-country-shopify.html?src=Ninety9Blog">thresholds per country</a>.</p>
<p>A test is the third way. &quot;Is $75 better than $85?&quot; is a question a message bar does not answer. Goalify can run the threshold and the copy against each other. You still need enough orders for the test to finish. A test on a quiet country will sit there looking scientific.</p>
<h2 id="how-to-compare-them-on-your-cart-not-on-the-review-count">How to compare them on your cart, not on the review count</h2>
<p>Hextom&#39;s 4.9 from about 2,800 reviews means a lot of stores run a message. It does not mean the message can become three goals. Essential&#39;s 5.0 from 974 reviews is a popular single-job bar with a view cap after the free band. Hoppy&#39;s 4.8 from 264 is a free bar that also wants to recommend products. Yaco&#39;s 4.9 from 22 is a bar aimed at an upsell, with the test on a higher plan. Turbo&#39;s 4.8 from 20 is a free single goal with a short record.</p>
<p>Install the one you might keep on a development or quiet theme. Put the same $75 goal on it. Then ask five questions.</p>
<ol>
<li>Does the remaining amount match checkout after a code?</li>
<li>Can a second reward appear on the same bar without a second app?</li>
<li>Can Germany have a different number, in euros?</li>
<li>Can you test $75 against $85?</li>
<li>What happens to the bill when traffic arrives? Views, order caps, and a flat fee are different meters. Goalify&#39;s paid plans are $3.99, $7.99 and $11.99 by order volume, after a free band under 10 orders a month.</li>
</ol>
<p>If the answer to 2, 3 and 4 is no, you are still on a message bar. That can be the right tool. It is not an alternative to a sequence.</p>
<h2 id="the-day-you-switch">The day you switch</h2>
<ol>
<li>Write down the live threshold and which shipping rates are free.</li>
<li>Build that same number in Goalify. Add the second goal only after the first matches checkout.</li>
<li>Preview on the published theme.</li>
<li>Place one order over the line and one under it.</li>
<li>Turn the old embed off. Confirm a customer only sees one remaining amount.</li>
<li>Uninstall the old app once that order is right.</li>
<li>Tell whoever edits discounts that the Shopify shipping discount is still the thing that makes shipping free. The bar only displays it.</li>
</ol>
<p>A view-capped bar is a reasonable choice if you want a huge review count and you will watch the meter. A free bar that also upsells will compete with the cart for attention. Neither one is the stack.</p>
<p>Tell the person who edits the theme that the bar moved, and tell the person who edits discounts that the discount did not. The most common failed switch is a new bar on an old minimum. The customer did the new thing. Checkout still enforces Thursday&#39;s number. Put both numbers in the same note, in the same currency, and do not archive the note until a test order has agreed with it. If the test order disagrees, change the discount or the bar before you uninstall anything. The old bar, still correct, is better than a new bar that lies.</p>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Hextom Free Shipping Bar alternative?</summary><div class="faq__a"><p>Goalify, if the bar has to stack a reward, change by country, or be tested. Hextom remains the simpler message bar.</p></div></details>
<details><summary>Is Hextom Free Shipping Bar free?</summary><div class="faq__a"><p>There is a free plan. Paid plans start around $9.99. Confirm the current screen before you promise finance a $0 line forever.</p></div></details>
<details><summary>Will switching bars break my free-shipping discount?</summary><div class="faq__a"><p>The Shopify discount is separate from the bar app. Match the new bar&#39;s threshold to that discount before you uninstall the old bar. Do not run two bars.</p></div></details>
<details><summary>Can I keep Hextom and add Goalify?</summary><div class="faq__a"><p>No. Two bars means two remaining amounts. Disable one embed.</p></div></details>
<details><summary>I only need a top-of-page message. Do I still switch?</summary><div class="faq__a"><p>Not for that sentence alone. Switch when the message has to become a sequence or a different number abroad.</p></div></details>
<details><summary>What does a second goal actually look like?</summary><div class="faq__a"><p>Free shipping at the first number, a discount at a higher one, a gift at a higher one still. One bar, revealed in order. Two apps do not make that sequence.</p></div></details>
<details><summary>When do I uninstall the old bar?</summary><div class="faq__a"><p>After one real order where the new bar and the shipping discount agree. Disable the old embed first. Uninstall once that order looks right.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to Add a Slide Cart to Your Shopify Store (Dawn and Free Themes)</title>
      <link>https://ninety9.dev/blog/how-to-add-a-slide-cart-shopify-dawn.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/how-to-add-a-slide-cart-shopify-dawn.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How to add a Shopify slide cart on Dawn and other free Online Store 2.0 themes with an app embed, without editing cart-drawer.liquid.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Dawn already has a cart drawer. A second one, badly installed, is why add to cart appears to do nothing.</li><li>On Online Store 2.0 themes, including Dawn and the other free themes, a slide cart should be an app embed. No Liquid edit, nothing left behind on uninstall.</li><li><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> drafts the drawer from the catalogue and the brand, then you edit it. The first cart is not an empty column.</li><li>Hide or replace the theme drawer. Do not run Dawn&#39;s drawer and an app drawer on the same button.</li></ul></section>
<p>Dawn already slides a cart in from the side. So do Craft, Sense, Refresh, and most free themes Shopify ships now. The job is not &quot;add a drawer&quot;. The job is to replace the theme&#39;s receipt with a cart that can sell, without forking <code>cart-drawer.liquid</code>.</p>
<h2 id="what-you-are-replacing">What you are replacing</h2>
<p>The theme drawer shows line items, a subtotal, and checkout. That is a receipt. A selling slide cart adds one complement, the distance to free shipping, a gift if the cart earned it, and a delivery window. <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> drafts that cart from the products you sell and the way the brand looks. You edit the draft. You do not start from a blank column the week the theme goes live.</p>
<p>It is a theme app extension. It loads when the cart opens, so it stays off the first paint. Uninstall leaves no Liquid behind. It is free to install. A/B tests are in the app, so two versions of the drawer can run without a theme branch.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="add-it-on-dawn">Add it on Dawn</h2>
<ol>
<li>Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a> from the Shopify App Store.</li>
<li>Online Store, Themes, Customize. Open the theme you actually publish. Dawn&#39;s unpublished copy is a different theme.</li>
<li>App embeds. Turn Addy on. Save.</li>
<li>Add a product on the preview. The slide cart that opens should be Addy&#39;s, not Dawn&#39;s empty-looking drawer with a second icon.</li>
<li>If Dawn&#39;s drawer still opens, disable the theme cart drawer in the theme settings, or stop the product form from calling it. One drawer.</li>
<li>Check the cart icon in the header. It should open the same slide cart, not send the shopper to <code>/cart</code> while the button opens a drawer.</li>
<li>Repeat on a phone. Dawn&#39;s header is tight. A drawer that is fine at 1440px can cover the close button at 390px.</li>
</ol>
<p>The same embed works on the other free Online Store 2.0 themes. The setting that hides the theme drawer moves. The embed does not. Do not copy a snippet from a 2021 blog into <code>theme.liquid</code>. Theme updates delete those snippets, and the cart &quot;breaks&quot; the morning after.</p>
<h2 id="what-to-put-in-the-drawer">What to put in the drawer</h2>
<p>Progress, line items, one upsell, a delivery estimate, checkout. That order is the one in <a href="/blog/cart-drawer-vs-cart-page.html?src=Ninety9Blog">cart drawer vs cart page</a>. A third product row is browsing.</p>
<p>If the threshold should change by country, the bar can be <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> inside the Addy drawer. If the offer is a bundle with its own price, <a href="/apps/addly.html?src=Ninety9Blog">Addly</a> owns the discount and Addy presents it. Do not install a second slide cart to get a bar.</p>
<h2 id="dawns-cart-and-the-other-free-themes">Dawn&#39;s cart, and the other free themes</h2>
<p>Dawn&#39;s theme settings include a cart type. Drawer keeps the shopper on the product. Page sends them to <code>/cart</code>. If you are replacing Dawn&#39;s cart with an app, the setting that matters is that Dawn stops opening its own drawer when Addy opens. Two animations, one button.</p>
<p>The same embed is how you add a slide cart on the other free Online Store 2.0 themes Shopify ships: Craft, Sense, Refresh, Ride, Studio, Taste, Origin, Crave, Publisher, Colorblock. The label for &quot;hide the theme cart&quot; moves. The embed does not. A snippet pasted into <code>theme.liquid</code> from an old tutorial is the thing a theme update deletes. The cart then &quot;breaks&quot; the morning after, because the snippet is gone and the app embed was never the thing opening.</p>
<p>Vintage themes that are still Online Store 1.0 are a different install. Confirm the theme is 2.0 before you promise a no-code embed. Addy installs as a theme app extension on Online Store 2.0 themes. There is no theme-file edit, and uninstall leaves nothing behind.</p>
<h2 id="what-a-selling-drawer-contains">What a selling drawer contains</h2>
<p>Use one product the store actually sells and write the drawer as a list.</p>
<div class="tablewrap"><table><thead><tr><th>Block</th><th>Example on a $32 serum</th></tr></thead><tbody>
<tr><td>Progress</td><td>&quot;$18 away from free shipping&quot; once the threshold is $50</td></tr>
<tr><td>Lines</td><td>Serum, 30 ml, quantity, price, remove</td></tr>
<tr><td>One upsell</td><td>The moisturiser people already buy with it, one click, no reload</td></tr>
<tr><td>Delivery</td><td>A window you can keep, such as &quot;leaves the warehouse tomorrow&quot;</td></tr>
<tr><td>Checkout</td><td>The button, larger than the upsell</td></tr>
</tbody></table></div>
<p>A third product row is browsing. Gift wrap is a line they add, with a price. Shipping protection is a toggle that starts off. The longer block list, including the 40 or so Addy can place, is in the <a href="/blog/shopify-cart-drawer-complete-guide.html?src=Ninety9Blog">cart drawer guide</a>. You do not turn them all on. The draft gives you a cart. You delete until the button is obvious.</p>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> builds that first draft from the catalogue and the brand. Markets and customer tags can change the layout, a single block, or the threshold. Prices render in the shopper&#39;s currency. It loads when the cart opens, so it stays off the first paint. A/B tests compare two versions of the drawer without a second theme.</p>
<p>If the threshold itself should be its own test, <a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can run that bar inside the drawer. If the offer is a bundle with its own price, <a href="/apps/addly.html?src=Ninety9Blog">Addly</a> owns the discount and Addy presents it. A second slide cart, installed to get a bar, is how add to cart appears to do nothing. The fixes are in <a href="/blog/shopify-cart-drawer-not-updating.html?src=Ninety9Blog">cart drawer not updating</a>.</p>
<h2 id="a-pass-on-the-published-theme">A pass on the published theme</h2>
<p>Do this on the theme customers see, in a normal browser, not only inside the editor.</p>
<ol>
<li>Add the serum. The slide cart opens with that line.</li>
<li>Increase the quantity. The line and the subtotal move.</li>
<li>Remove it. The drawer is empty, and the header count matches.</li>
<li>Open the bag icon. It is the same drawer, not <code>/cart</code> and not Dawn&#39;s old drawer.</li>
<li>Add from a collection quick-add, if you use one. Some quick-add buttons are a second form.</li>
<li>Narrow the window to a phone width. The close control is visible. Checkout is visible without a hunt.</li>
<li>Switch country if you run Markets. Currency and the threshold follow the shopper.</li>
<li>Place the order. The amount paid matches the drawer.</li>
</ol>
<p>Save the theme after the embed is on. An embed that exists only in an unpublished &quot;Dawn copy&quot; is invisible on the live shop.</p>
<h2 id="when-dawns-drawer-is-enough">When Dawn&#39;s drawer is enough</h2>
<p>A wholesale catalogue with no second item, no gift, and one market can keep the theme drawer. It is a receipt, and a receipt is the right cart when there is nothing to add. The week you want one complement or a different cart per country, start in the app. Forking <code>cart-drawer.liquid</code> to add a product row is how the next Dawn update becomes a project.</p>
<p>Leave these out of the first version even though the block exists. A countdown with no real end. A second and third upsell. A discount field in a louder colour than checkout. An announcement that repeats the header. Each one is available in Addy. Each one can wait until the drawer has taken orders and you know the first upsell is the right product. Custom HTML and CSS are there when a block cannot match the brand. They are not the first afternoon&#39;s job. Preview the drawer, then open the published shop in a private window. The editor can show an embed the live theme does not have until you save. Do that save on the published theme, then add one product outside the editor before you call the slide cart live. If the published shop still opens Dawn&#39;s drawer, the theme cart is still bound to the button.</p>
<p>Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a>. The first afternoon is a drafted cart you edit, on Dawn or on any other free Online Store 2.0 theme.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Does Dawn need a slide cart app?</summary><div class="faq__a"><p>Dawn includes a basic cart drawer. It lists the lines. It does not draft upsells, gifts, a delivery date or a different cart per market. That is the app.</p></div></details>
<details><summary>Will this work on Craft, Sense, Refresh and the other free themes?</summary><div class="faq__a"><p>Yes, if the theme is Online Store 2.0. Addy installs as a theme app extension. Enable the embed, save, and test add to cart. You should not edit theme code.</p></div></details>
<details><summary>What if both drawers open?</summary><div class="faq__a"><p>The theme cart and the app cart are both bound to the same button. Turn the theme drawer off, or stop the theme from opening its own drawer on add. One button, one cart.</p></div></details>
<details><summary>Do I have to edit cart-drawer.liquid?</summary><div class="faq__a"><p>No. Liquid edits are how a theme update wipes the cart, and how uninstall leaves a broken drawer. Use the app embed.</p></div></details>
<details><summary>Can the slide cart differ by country?</summary><div class="faq__a"><p>Yes, in Addy. Layout, offers and the free-shipping threshold can change by market and by customer tag.</p></div></details>
<details><summary>Dawn has a cart type setting. Which one should I pick?</summary><div class="faq__a"><p>Drawer, if you are keeping Dawn&#39;s own cart. If Addy is the cart, stop Dawn opening a second drawer on the same button. Page is the full cart, and it sends people away from the product.</p></div></details>
<details><summary>What should I test after the embed is on?</summary><div class="faq__a"><p>Add, change quantity, remove, open the header icon, apply a code, and do it again at a phone width. Then place one order through checkout.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to Automatically Add a Product to Cart on Shopify</title>
      <link>https://ninety9.dev/blog/how-to-automatically-add-a-product-to-cart-shopify.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/how-to-automatically-add-a-product-to-cart-shopify.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Average Order Value</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How to auto-add a Shopify product to the cart: a cart link for a chosen variant, and a gift that adds itself when a threshold is met.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A cart link adds one known variant when the shopper clicks. It does not watch the cart and add a gift by itself.</li><li>Auto-add belongs on a rule: cart value, item count, or a product already in the bag. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> adds the gift when that rule is met.</li><li>Show the gift in the cart the shopper is looking at. A gift that appears only on a later page feels like a surprise charge in reverse.</li><li>One gift. A second auto-add is how the cart fills with products nobody chose.</li></ul></section>
<p>Automatically adding a product to the cart means two different jobs. One is a link that puts a known variant in the bag when someone clicks. The other is a gift that appears on its own once the cart qualifies. Stores mix them up, then wonder why a &quot;free&quot; item never shows, or why a paid item showed up without a yes.</p>
<h2 id="the-click-method">The click method</h2>
<p>Shopify can add a variant from a URL. You need the variant ID, not the product handle. A button, a banner, or a post-purchase email can point at that link. The shopper clicks. The variant is in the cart.</p>
<p>That is not automatic. Nothing watches the subtotal. Nothing swaps the gift when the season changes. Use it for a campaign landing page where the click is the decision. Do not use it as the free-gift system.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="the-rule-method">The rule method</h2>
<p>A free gift should add itself when the cart crosses a line you set: a subtotal, an item count, or a specific product already in the bag. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> does that. You pick the gift, the condition, and where the progress bar sits. When the cart qualifies, the gift is added. When it no longer qualifies, the gift should leave with it. A gift that sticks after the shopper removes the qualifying item is a support ticket.</p>
<p>The bar is the warning. &quot;You are $18 from a pouch&quot; is a task. A gift that materialises on the checkout page, with no bar on the product page, feels arbitrary. Put the bar in the cart, and on the product page if the threshold should be visible before the first add.</p>
<p>Country thresholds matter here. A $75 gift in the home market is a different gift abroad. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> sets the number per country. One global rule auto-adds the gift for the wrong carts.</p>
<h2 id="what-not-to-auto-add">What not to auto-add</h2>
<div class="tablewrap"><table><thead><tr><th>Line</th><th>Add it automatically?</th></tr></thead><tbody>
<tr><td>Free gift at a threshold</td><td>Yes, with the rule visible on a bar</td></tr>
<tr><td>Sample the shopper already agreed to</td><td>Yes</td></tr>
<tr><td>A paid complement</td><td>No. One click, in the cart or a popup</td></tr>
<tr><td>A second gift &quot;while you are here&quot;</td><td>No</td></tr>
<tr><td>Shipping protection</td><td>No, unless the toggle is on the cart and off by default</td></tr>
</tbody></table></div>
<p>Paid upsells belong on a button. <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> can show the complement in the drawer with a one-click add. <a href="/apps/monet.html?src=Ninety9Blog">Monet</a> can ask after add to cart. Neither should insert a priced line the shopper did not confirm.</p>
<h2 id="a-worked-cart">A worked cart</h2>
<p>This is an example you can copy with your own prices. It is not a result from a store.</p>
<p>The serum is $32. The pouch costs you $2.10 landed. Recent orders sit around $48, so a gift at $75 asks for about one more full-size item. A shopper adds the serum ($32) and a cleanser ($28). The subtotal is $60. The bar says &quot;$15 away from a pouch&quot;. They add an $18 toner. The subtotal is $78. The pouch appears at $0.</p>
<p>They remove the toner. The subtotal is $60 again. The pouch has to leave with it. A gift that stays after the qualifying item is gone is a $2.10 giveaway, and the next shopper will learn to add, collect the gift, and remove. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> adds the gift when the condition is met. The same condition has to be able to take it back.</p>
<h2 id="money-rules-and-unit-rules">Money rules and unit rules</h2>
<p>A subtotal rule follows price. A quantity rule follows units. They split as soon as a code is applied.</p>
<p>Three soaps at $12 are $36. A 20% code makes the cart $28.80. A rule that says &quot;spend $30 and the gift adds&quot; just failed, with three units still in the bag. If the offer is really &quot;any three&quot;, use the item count. If the offer is &quot;this order is large enough to afford the pouch&quot;, use the subtotal. Place one test order with a code on it and write down which figure checkout used. The bar and the gift have to use that same figure. A bar that celebrates, and a cart that then removes the gift, is the bug shoppers describe as the gift &quot;not working&quot;.</p>
<p>Goalify can trigger on cart value, on item count, or on a product already in the bag, and those conditions can be combined. &quot;Spend $75 and the order contains the serum&quot; stops the pouch attaching to a cart of accessories that never included the product the pouch belongs with.</p>
<h2 id="the-gift-is-a-variant">The gift is a variant</h2>
<p>A product with sizes cannot be added until a variant is chosen. Pick the variant you will actually pack. If that variant hits zero, the rule should fail quietly. A line that says the gift was added, then shows sold out, is worse than no gift. Keep a second variant only if you are willing to pack either one, and say which one on the bar. &quot;A pouch&quot; and &quot;the travel pouch, 30 ml&quot; are different promises.</p>
<p>Price the line at $0 through the gift rule. A 100% code the shopper has to remember will miss the carts that qualified in a hurry. Goalify resolves the gift with the cart. You do not also need a code.</p>
<h2 id="when-a-link-is-still-the-right-tool">When a link is still the right tool</h2>
<p>Use a link when the decision is the click. A campaign page for a kit. A button under a guide. An email to people who already own the device and should add the case. You need the variant ID. In admin, open the product, open the variant, and use that variant. The product handle is the wrong ID, because one handle can be four sizes.</p>
<p>The link does not know the subtotal. It adds the variant when it is clicked, including on a cart that already has it, depending on how the theme merges identical lines. It will not remove itself when the cart shrinks. Publish it as a button. Keep the automatic gift on the rule.</p>
<h2 id="paid-lines-stay-on-a-button">Paid lines stay on a button</h2>
<p>A $14 case that appears because the phone was added is a charge nobody confirmed. Show the case in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer as one row with a price and an add button. Or ask once in <a href="/apps/monet.html?src=Ninety9Blog">Monet</a> after add to cart. Shipping protection belongs on a toggle that starts off. A second gift at a higher threshold can wait until the first gift has been packed for a week without support tickets.</p>
<p>Selling plans are a different cart shape. If you sell subscriptions, place one test with a plan selected before you promise the gift on that product. A rule written against the one-time variant does not automatically describe the plan.</p>
<h2 id="what-to-check-before-you-announce-it">What to check before you announce it</h2>
<div class="tablewrap"><table><thead><tr><th>Check</th><th>A pass looks like this</th></tr></thead><tbody>
<tr><td>Under the threshold</td><td>The bar shows a remaining amount. There is no gift line</td></tr>
<tr><td>Cross the threshold</td><td>The gift is $0. The bar completes</td></tr>
<tr><td>Remove a unit</td><td>The gift leaves. The remaining amount comes back</td></tr>
<tr><td>Apply a code</td><td>The bar and the gift still agree</td></tr>
<tr><td>Gift variant sold out</td><td>There is no broken $0 line</td></tr>
<tr><td>Another country</td><td>The threshold is that country&#39;s number. Country rules are on Goalify&#39;s paid plans, from $3.99 after the free band under 10 orders</td></tr>
<tr><td>A phone</td><td>The gift line is smaller than checkout</td></tr>
</tbody></table></div>
<p>The threshold itself uses the same percentile idea as <a href="/blog/free-shipping-threshold-calculator.html?src=Ninety9Blog">a free-shipping threshold</a>. One global $75 will add the pouch on carts that never reached a sensible local goal, and withhold it on carts that did. Per-country numbers are in <a href="/blog/different-free-shipping-thresholds-per-country-shopify.html?src=Ninety9Blog">thresholds per country</a>.</p>
<h2 id="a-clean-setup">A clean setup</h2>
<ol>
<li>Pick one gift whose landed cost you can afford at the threshold. In the example, $2.10 against the margin on the extra toner.</li>
<li>Publish the bar before auto-add, so the pouch is expected.</li>
<li>Remove the gift when the cart falls back under the line.</li>
<li>Read it on a phone. If the gift is louder than checkout, shrink the line.</li>
</ol>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> when the product should enter the cart because the cart earned it.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Can Shopify automatically add a product to the cart without an app?</summary><div class="faq__a"><p>A link can add a specific variant when someone clicks it. Shopify does not, on its own, watch the cart and drop in a gift at a spend threshold. That rule is an app.</p></div></details>
<details><summary>How do I auto-add a free gift on Shopify?</summary><div class="faq__a"><p>Set the condition and the gift in Goalify. The gift is added when the cart qualifies, and the progress bar shows the distance left before it does.</p></div></details>
<details><summary>Will an auto-added product surprise the shopper?</summary><div class="faq__a"><p>It will if the cart never said it was coming. Put the remaining amount on the bar, name the gift, and show the line at $0 when it lands.</p></div></details>
<details><summary>Can I auto-add a paid upsell?</summary><div class="faq__a"><p>Do not. A paid line that appears without a click is how chargebacks start. Paid adds stay on a button, in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer or a <a href="/apps/monet.html?src=Ninety9Blog">Monet</a> popup.</p></div></details>
<details><summary>Does the gift need its own discount code?</summary><div class="faq__a"><p>No. Goalify resolves the gift with the cart rule. A code the shopper must type is a second step, and most people will not take it.</p></div></details>
<details><summary>Should the rule use the subtotal or the item count?</summary><div class="faq__a"><p>Use the subtotal when the gift depends on order size. Use the item count when the offer is buy any three. A code can drop the money under the line while the units stay put, so test both.</p></div></details>
<details><summary>What if the gift variant is sold out?</summary><div class="faq__a"><p>Choose a variant you can pack. A sold-out gift should not appear as a broken $0 line. Hide it until stock returns, and say so on the bar if the gift was the whole promise.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to Customize the Shopify Order Status Page</title>
      <link>https://ninety9.dev/blog/how-to-customize-shopify-order-status-page.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/how-to-customize-shopify-order-status-page.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Retention &amp; Post-Purchase</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>What you can honestly change on the Shopify order status page, and how customers edit the order from their account without a custom status-page theme.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>The order status page is a Shopify surface. You can brand the checkout. You cannot safely turn it into a custom microsite and still call it Shopify.</li><li>The useful change is what the customer can do there: fix the address, the size, or the quantity before fulfilment.</li><li><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> adds that in customer accounts, in Shopify&#39;s own look. It is not a status-page designer.</li><li>Additional scripts and a forked thank-you page are how a checkout upgrade deletes your &quot;custom&quot; status page.</li></ul></section>
<p>Customising the Shopify order status page usually starts as a request for a logo and ends as a request for a private website that happens to show a tracking number. Shopify will give you the first. The second breaks the next time checkout changes. The change that matters is narrower: the customer can see the order, and they can fix it before you ship it.</p>
<h2 id="what-shopify-will-let-you-change">What Shopify will let you change</h2>
<p>Checkout branding covers the mark, the colours, and the language around the order. Use it. A status page that does not look like the store is a phishing rehearsal.</p>
<p>You can add a short message. Tracking, the carrier, and what happens next belong there. A paragraph of merchandise does not. They already paid.</p>
<p>Additional scripts on the thank-you and status pages are the old way to inject a widget. Treat them as temporary. If your &quot;customisation&quot; is a script tag, you do not have a customisation. You have a dependency.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/reviso/icon.png" alt="Reviso: Order editing &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Reviso: Order editing &amp; Upsell</p>
<p class="appcta__text">Post-purchase self-service order editing with cancellation deflection and AI upsells.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="what-is-worth-adding">What is worth adding</h2>
<p>A link to change the order, shown only while it is unfulfilled. <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> is that screen, inside customer accounts, with Shopify&#39;s own layout. The customer can update the address, the shipping method, variants, quantities and items. They can start a return or an exchange later, including store credit. If they hit cancel, you can offer a discount or a gift once, then let them cancel.</p>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a> does not restyle the status page, does not validate the address against a postal database, does not update a 3PL, and does not run in POS. Claiming it is an order-status theme editor would be false. The status page stays Shopify&#39;s. The account is where the edit happens. If they open that screen, Reviso can also show a recommendation beside the edit. That is still the account, not a second theme for the status page. Point to it.</p>
<p>Copy for that link: &quot;Need to change this order? You can, until it ships.&quot; Not &quot;manage your experience&quot;.</p>
<h2 id="what-to-leave-off-the-page">What to leave off the page</h2>
<div class="tablewrap"><table><thead><tr><th>Idea</th><th>Leave it off because</th></tr></thead><tbody>
<tr><td>A second theme for the status page</td><td>It will not survive checkout changes</td></tr>
<tr><td>An email popup</td><td>They already bought. You have the email</td></tr>
<tr><td>A thank-you upsell dressed up as status content</td><td>That is a new order. Build it as one, or skip it</td></tr>
<tr><td>Three apps competing for the same block</td><td>The tracking number loses</td></tr>
<tr><td>A cancel button with no edit beside it</td><td>You will refund orders that needed a new size</td></tr>
</tbody></table></div>
<p><a href="/apps/monet.html?src=Ninety9Blog">Monet</a> stays off this page. It is for add to cart, checkout starting, and exit. The order status page is after the sale.</p>
<h2 id="a-status-page-that-is-finished">A status page that is finished</h2>
<ol>
<li>Branding matches the store.</li>
<li>Tracking is the loudest thing on the page.</li>
<li>One sentence links to the customer-account edit while the order is open.</li>
<li>The link disappears after fulfilment, and the return path replaces it.</li>
<li>You place a test order and open the status page on a phone.</li>
</ol>
<h2 id="what-the-page-is-for">What the page is for</h2>
<p>The order status page answers one question: where is the thing I paid for? Shopify&#39;s checkout branding can put your mark and your colours on it. A short message can say when you ship, or what &quot;in transit&quot; means for your carrier. Tracking, when you have a number, is the largest text on the page after the status itself.</p>
<p>People land here from the confirmation email, often on a phone, often once. They are not shopping. A paragraph of new products, a countdown, and an email form are three ways to hide the tracking number. The page can be plain. Plain is the customisation that survives.</p>
<p>Thank-you and order status are both after payment. Treat additional scripts on either one as temporary. Checkout changes have been retiring that style of injection. If the only way a customer can fix a size is a script on that page, you will lose the fix when the script stops running. <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> lives in customer accounts instead. The status page keeps a sentence that points there, while the order is unfulfilled: &quot;Need to change this order? You can, until it ships.&quot;</p>
<h2 id="what-they-can-do-after-they-follow-the-link">What they can do after they follow the link</h2>
<p>In the account, before fulfilment, they can change the address, the shipping method, the variant, the quantity, and the items. The screen looks like Shopify. After fulfilment, that link should disappear and the return, exchange, or store credit path is what you show. Reviso includes those. It does not restyle the status page, validate addresses against a postal database, update a 3PL, or run in POS.</p>
<p>If they open the edit, Reviso can show a recommendation beside it. That is an add they choose on a page they opened in order to change something. It is still the account. It is not a second theme, and it is not a popup <a href="/apps/monet.html?src=Ninety9Blog">Monet</a> should fire. <a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a> is for add to cart, the start of checkout, and exit.</p>
<p>Country and tag rules belong on the edit, not on a different status-page design per market. One market can allow address changes. Another can send those orders to staff. The status page stays one layout.</p>
<h2 id="copy-you-can-paste-and-copy-you-should-not">Copy you can paste, and copy you should not</h2>
<p>While the order is open:</p>
<ul>
<li>&quot;Need a different size or address? Change this order until it ships.&quot;</li>
<li>&quot;We have not packed this yet. You can update it from your account.&quot;</li>
</ul>
<p>After it has shipped:</p>
<ul>
<li>&quot;This one is on the way. If it is not right when it arrives, start a return from your account.&quot;</li>
</ul>
<p>Skip &quot;manage your experience&quot;, &quot;unlock rewards&quot;, and any line that implies the payment method can be swapped. A new card is a refund and a new order. Say that only if they ask. The limits are in <a href="/blog/what-you-cant-edit-in-a-shopify-order.html?src=Ninety9Blog">what you can&#39;t edit</a>.</p>
<h2 id="check-the-page-the-way-a-customer-opens-it">Check the page the way a customer opens it</h2>
<ol>
<li>Place an order on a phone.</li>
<li>Open the status link from the email, not from the admin.</li>
<li>Confirm the logo is yours, the status is readable, and tracking is present if you added a number.</li>
<li>Tap the change link. Land in the account. Change a harmless field on a test order.</li>
<li>Fulfil the order. Reload the status page. The change link is gone. The return path is there.</li>
<li>Open the same URL in a desktop window only after the phone looks right. Most of these visits are mobile.</li>
</ol>
<p>A from-scratch status page will not get through that list after the next checkout change. Branding, one sentence, and an account that can actually edit the order will.</p>
<p>The email link and the status-page link should land in the same account screen. If the email goes to the status page and the status page goes to the account, that is two taps, which is acceptable. If the email goes to a third app with its own login, people reply to the email instead. Reviso uses the customer account they already have. Keep the path that short. Open both links on a phone after the test order. They should show the same edit controls while the order is unfulfilled, and neither should show them after you mark it fulfilled. If the status page still offers a change after fulfilment, the sentence is hardcoded. Remove it and let the account decide. A hardcoded sentence cannot know that you bought the label an hour ago. The account can, because fulfilment is what closes the edit.</p>
<p>Install <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a>. The status page stays Shopify&#39;s. The account is where the order gets fixed.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Can I fully redesign the Shopify order status page?</summary><div class="faq__a"><p>Not as a theme you control line by line. Checkout branding covers logo, colours and a short message. A from-scratch status page is a different product, and Reviso is not it.</p></div></details>
<details><summary>How do customers change an order from the status page?</summary><div class="faq__a"><p>Send them to the order in their customer account. Reviso shows the edits there, in the native Shopify layout, until the order is fulfilled.</p></div></details>
<details><summary>Will custom code on the thank-you page survive?</summary><div class="faq__a"><p>Do not depend on it. Checkout extensibility has been replacing additional scripts. An app that lives in customer accounts still works when that script disappears.</p></div></details>
<details><summary>Can I add upsells to the order status page?</summary><div class="faq__a"><p>A new offer after they have paid is a second order. It is not an edit. Monet does not run on the thank-you page. Do not paste a popup there to force it.</p></div></details>
<details><summary>What should the status page actually say?</summary><div class="faq__a"><p>Where the order is, the tracking link if you have one, and a plain link to change the order if it has not shipped. One link. Not three apps.</p></div></details>
<details><summary>Is the thank-you page the same as the status page?</summary><div class="faq__a"><p>They are both after payment. Branding can cover both. The edit still lives in the customer account. A script on the thank-you page is a weak place to hang that link.</p></div></details>
<details><summary>Can the status page show a different block per country?</summary><div class="faq__a"><p>Keep the status page plain for everyone. Country rules belong on the edit itself, in Reviso, so a market can allow an address change and another market cannot.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to Let Customers Cancel Their Own Shopify Order</title>
      <link>https://ninety9.dev/blog/how-to-let-customers-cancel-shopify-order.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/how-to-let-customers-cancel-shopify-order.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Retention &amp; Post-Purchase</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How to let a customer cancel their own Shopify order, and how to offer an edit, a discount or a gift before the order is lost.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A cancel button with no alternative trains people to cancel. Many of those orders were an address, a size, or a quantity.</li><li><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> puts the edit in customer accounts, and can offer a discount or a gift when they try to cancel.</li><li>Edits and the cancel path close once the order is fulfilled. After that, the path is a return or an exchange.</li><li>Staff should not be the only way to fix a typo. They should be the way to handle the orders the rules exclude.</li></ul></section>
<p>Letting a customer cancel their own Shopify order is easy to do badly. A red button in the confirmation email creates refunds. A lot of those tickets, when you read them, are &quot;wrong size&quot;, &quot;wrong address&quot;, or &quot;I added one too many&quot;. The order did not need to die. It needed an edit, and the only tool they had was cancel.</p>
<h2 id="offer-the-edit-first">Offer the edit first</h2>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> lives in customer accounts and looks like Shopify. Before fulfilment, the customer can change the address, the shipping method, the variant, the quantity, or a line. That is the cancel you never see. The window closes when the order is fulfilled. Do not promise edits after the carrier has the parcel.</p>
<p>Point the &quot;wrong address?&quot; line in the confirmation email at the order in their account, not at a reply-to inbox. The setup pattern is the same one in <a href="/blog/reduce-order-cancellations.html?src=Ninety9Blog">reducing cancellations</a>.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/reviso/icon.png" alt="Reviso: Order editing &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Reviso: Order editing &amp; Upsell</p>
<p class="appcta__text">Post-purchase self-service order editing with cancellation deflection and AI upsells.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="then-offer-a-reason-to-stay">Then offer a reason to stay</h2>
<p>When they do choose cancel, <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a> can deflect with a discount or a gift. One offer. A customer who still wants to cancel should be able to finish. A second and third offer is how a save flow becomes a trap, and traps become chargebacks.</p>
<p>Use the deflection for orders you can still change. A gift on an order that ships in an hour is a gift you will also have to refund. Rules by country, tag and order exist so a wholesale account or a made-to-order SKU does not get the same button as a shelf product.</p>
<h2 id="what-the-button-must-not-be">What the button must not be</h2>
<p>Reviso does not validate addresses against a postal API, does not talk to a 3PL, and does not run in POS. A self-serve cancel on an in-store order, or on a shipment a warehouse system has already accepted, will disagree with the floor. Exclude those orders. Staff keep them.</p>
<p>It is free. One public review. The missing review count is not a reason to keep cancellation as an email thread. Email is where the order sits until someone on your team is awake.</p>
<h2 id="a-short-policy">A short policy</h2>
<ol>
<li>Edits are open until fulfilment.</li>
<li>Cancel shows one save offer, then completes.</li>
<li>Fulfilled orders use returns, exchanges or store credit.</li>
<li>Tags you exclude never see the button.</li>
<li>You place one test order and cancel it yourself before the link goes in the email.</li>
</ol>
<h2 id="what-the-tickets-actually-are">What the tickets actually are</h2>
<p>Read the last month of &quot;cancel&quot; mail before you design the button. Most stores find the same four piles. The shares will be yours. The categories are the useful part.</p>
<div class="tablewrap"><table><thead><tr><th>They wrote</th><th>What they needed</th><th>What a bare cancel button does</th></tr></thead><tbody>
<tr><td>Wrong apartment, wrong postcode</td><td>An address edit</td><td>Refunds a good order</td></tr>
<tr><td>Wrong size or colour</td><td>A variant edit</td><td>Refunds a good order</td></tr>
<tr><td>Ordered two, wanted one</td><td>A quantity edit</td><td>Refunds the whole order, or starts a partial-refund thread</td></tr>
<tr><td>Changed their mind</td><td>A cancel</td><td>The one case the button is for</td></tr>
</tbody></table></div>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> puts the first three in customer accounts, looking like Shopify, until fulfilment. The fourth still needs a path. Cancellation deflection offers one discount or one gift when they start that path. One. If they decline, the cancel finishes. A second and third offer is how a save flow becomes something people dispute.</p>
<h2 id="a-save-offer-with-a-number-on-it">A save offer with a number on it</h2>
<p>Example, not a promotion you should copy blindly. The order is $64 of skincare. Shipping has not been bought yet. A return later would cost you the outbound label, the return label, and the restock. Call that $14 all-in, if that is what your invoices say. A 10% discount to keep the order is $6.40. That is cheaper than the return, and it is one sentence: &quot;Stay, and we will take 10% off this order.&quot; A gift that costs you $3 to land is the other sentence. Offer one of them.</p>
<p>Do not offer the save on an order that leaves the building in an hour. You will discount it and still be unable to stop the shipment. Rules by country, tag and order exist so a wholesale account, a made-to-order SKU, or a tagged &quot;already picked&quot; order never sees the button. Staff keep those.</p>
<p>The confirmation email should point at the order in their account. One line: &quot;Need to change this before it ships? You can, from your account.&quot; A reply-to inbox is where the order waits until someone is awake. The wider pattern is in <a href="/blog/reduce-order-cancellations.html?src=Ninety9Blog">reducing cancellations</a>. The policy language, if you need to publish one, belongs next to <a href="/blog/writing-a-cancellation-policy.html?src=Ninety9Blog">writing a cancellation policy</a>.</p>
<h2 id="the-test-order">The test order</h2>
<ol>
<li>Place an order with a real gateway you can refund. A bogust payment test is not enough if you are about to promise refunds.</li>
<li>Open the customer account. Change the address. Change the size. Change the quantity. Each one should stick in the admin.</li>
<li>Start a cancel. Confirm you see one offer.</li>
<li>Decline it. Confirm the order cancels and the refund follows the gateway&#39;s rules.</li>
<li>Place a second order, mark it fulfilled, and confirm the edit and the cancel button are gone. The return or exchange path, including store credit, is what remains.</li>
<li>Place a third order with the tag you meant to exclude. The button should be absent.</li>
</ol>
<p>Reviso does not validate the address against a postal API, does not update a 3PL, and does not run in POS. A typed address can still be wrong. A warehouse that already has the order will not hear about the cancel from this app. Exclude those orders before the link goes in the email. It is free. One public review. The review count is not a reason to leave cancellation as an overnight email.</p>
<p>Install <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a>. If they wanted a new size, the edit screen is the feature. What they still cannot change is in <a href="/blog/what-you-cant-edit-in-a-shopify-order.html?src=Ninety9Blog">what you can&#39;t edit in a Shopify order</a>.</p>
<h2 id="quantity-not-a-refund-of-the-whole-order">Quantity, not a refund of the whole order</h2>
<p>&quot;I wanted one, I ordered two&quot; should not become a cancellation. Before fulfilment, the quantity edit is the whole fix. The order stays. You pack one. You refund the difference through the edit, following the gateway, instead of refunding $64 because $32 of it was a duplicate.</p>
<p>Write the confirmation email so that case is obvious. &quot;Wrong quantity or size? Change the order in your account until it ships.&quot; People use the word cancel because it is the only verb on the page. Give them the verb edit, and keep cancel one step further in.</p>
<p>If they still cancel, the save offer is a single number you can explain. On a $64 order, 10% is $6.40. Compare that with what a return costs you in labels. If the save is cheaper than the return, offer it once. If they are cancelling because the item is wrong for them, a discount will not fix the product. Let the cancel finish. A gift on an order they do not want is a second thing to refund.</p>
<h2 id="timing">Timing</h2>
<p>The useful window is after payment and before anyone picks the order. That can be hours, or it can be twenty minutes if you ship same day. Publish the cutoff you can keep. &quot;Until it ships&quot; is honest. &quot;For 24 hours&quot; is a lie if the label is bought at 4pm. Reviso closes the edit and the cancel-save path at fulfilment. If a 3PL or the warehouse has the order earlier than Shopify&#39;s fulfilled state, exclude it with a tag at that moment. The app will not call the warehouse.</p>
<p>Partial shipments are staff work. If one line has already gone and another has not, do not promise a self-serve edit of &quot;the order&quot;. Test that state before you write the email, and if the screen cannot represent it cleanly, send those customers to a person.</p>
<p>Place the test order on the gateway you take real money with. Cancel it yourself. Read the refund. Then put the link in the email.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Can Shopify customers cancel an order themselves?</summary><div class="faq__a"><p>Not in a useful way on a stock store. They email you, or they dispute the charge. Reviso adds a self-serve cancel in customer accounts, with a chance to save the order first.</p></div></details>
<details><summary>Should every cancel be saved?</summary><div class="faq__a"><p>No. A customer who wants out should get out. The save offer is one step, a discount or a gift, not a maze. If they still cancel, cancel.</p></div></details>
<details><summary>What if the order has shipped?</summary><div class="faq__a"><p>Self-serve edits stop at fulfilment. Use the return or exchange path, including store credit, instead of pretending the order is still editable.</p></div></details>
<details><summary>Can I block cancels from some countries or tags?</summary><div class="faq__a"><p>Yes. Reviso rules can depend on country, customer tag and the order. Wholesale or already-picked orders can stay with staff.</p></div></details>
<details><summary>Does this refund the payment automatically?</summary><div class="faq__a"><p>The cancel has to follow Shopify&#39;s refund rules for that payment. Reviso does not invent a refund the gateway will not make. Test one order on a real gateway before you announce the button.</p></div></details>
<details><summary>What should the save offer be worth?</summary><div class="faq__a"><p>One discount or one gift you can afford on that order. A 10% save on a $60 order is $6. If that is less than the cost of a return, it is a reasonable offer. A second offer after they decline is a trap.</p></div></details>
<details><summary>When should the button disappear?</summary><div class="faq__a"><p>When the order is fulfilled, and earlier if a warehouse or a 3PL has already accepted it. Reviso closes edits at fulfilment and does not push changes to a 3PL.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>How to Set Up Free Shipping Over $X on Shopify</title>
      <link>https://ninety9.dev/blog/how-to-set-up-free-shipping-over-x-shopify.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/how-to-set-up-free-shipping-over-x-shopify.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How to offer free shipping over a spend threshold on Shopify, set the discount, and show the remaining amount in the cart.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Free shipping over $X is a Shopify shipping discount plus a number the shopper can see. The discount without the bar is a policy. The bar without the discount is a lie.</li><li>Set $X just above the orders that already qualify. A threshold at your average gives shipping away and changes nothing.</li><li><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> draws the remaining amount, can stack a later gift or discount, and can use a different $X per country.</li><li>Round the number. $68.40 is not a goal anyone will do maths for.</li></ul></section>
<p>Free shipping over $X is two objects that must agree. Shopify needs a shipping discount with a minimum spend. The shopper needs to see how far they are from that minimum while they can still add something. Stores create the discount, skip the bar, and then say the threshold &quot;doesn&#39;t work&quot;.</p>
<h2 id="create-the-discount">Create the discount</h2>
<p>In Shopify admin, create a free shipping discount. Set the minimum purchase to the number you mean, in the store currency. Choose which shipping rates it applies to. A discount that excludes express, while the bar says &quot;free shipping&quot;, will charge express and look like a bug.</p>
<p>Leave the combination rules open to product discounts if a bundle should still get free shipping. Closed combinations are why a qualified cart still pays. That matrix is in <a href="/blog/shopify-discount-stacking-explained.html?src=Ninety9Blog">discount stacking</a>.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="pick-the-number">Pick the number</h2>
<p>$X should sit just above orders that already clear it. If your average order is $42, a $40 threshold gives shipping away. A $120 threshold on a $42 store is a joke. Use the percentile method in <a href="/blog/free-shipping-threshold-calculator.html?src=Ninety9Blog">the threshold calculator</a>, then round it. $75 is a goal. $73.18 is a spreadsheet.</p>
<p>Check the margin. The profit on the extra items has to cover the shipping label. If it does not, raise the threshold or shrink the zone. Do not paper over a loss with a prettier bar.</p>
<h2 id="show-the-remaining-amount">Show the remaining amount</h2>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> is the progress bar. Set the same threshold as the discount. Put the bar at the top of the cart, and on the product page if you want the goal visible before the first add. Copy should be the remaining amount, not the policy. &quot;Spend $75 for free shipping&quot; is a rule. &quot;$18 away from free shipping&quot; is a task. The wording is in <a href="/blog/free-shipping-bar-copy.html?src=Ninety9Blog">free shipping bar copy</a>.</p>
<p>You can stack a second goal, a discount or a gift, once the shipping goal is honest. Do that second, not on day one. Setup is a template, the number, and the placement. Free under 10 orders a month, then $3.99, $7.99 and $11.99.</p>
<p>If the cart itself is a slide-out, put the bar in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer so the remaining amount sits on the line items.</p>
<h2 id="check-it-once">Check it once</h2>
<p>Add products until you cross $X. Shipping at checkout should be free on the rate you chose. Remove a unit. Shipping should return, and the bar should show a remaining amount again. Test one other country before you call it done.</p>
<h2 id="a-small-order-book-and-the-number-it-implies">A small order book, and the number it implies</h2>
<p>These twelve orders are an example, so you can see the arithmetic. Replace them with yours. Amounts are merchandise, before shipping.</p>
<p>$22, $31, $36, $41, $44, $48, $52, $55, $61, $70, $74, $96.</p>
<p>Sorted, the middle is between $48 and $52. A threshold at $40 sits under most of these orders. You would give shipping away and change little. A threshold at $120 sits above every order but one. Nobody is one item away. The band to test is just above the orders that already clear a lower bar. Here, $75 sits above the 9th order ($70) and within reach of someone at $55 who adds one $20 item. The method, including the percentile cut, is in <a href="/blog/free-shipping-threshold-calculator.html?src=Ninety9Blog">the threshold calculator</a>. Round $75. Do not publish $74.20.</p>
<h2 id="does-the-extra-item-pay-for-the-label">Does the extra item pay for the label?</h2>
<p>Say the label you absorb is $6.50, and the item people add to cross $75 contributes $11 of margin after its own cost. You are ahead by $4.50 on the orders that stretch, and you are giving away $6.50 on the orders that would have paid $75 anyway. Count those. In the list above, two orders are already at or above $75 ($74 is close, $96 is over). If a large share of orders already clear the line, you are funding labels, not changing behaviour. Raise the threshold, or accept the cost as a stated policy and stop expecting the bar to &quot;lift&quot; anything.</p>
<p>If the extra item only contributes $4 and the label is $9, the threshold loses money every time it works. Shrink the zone, raise $X, or drop free shipping on the heavy products. A prettier bar does not repair that. When free shipping is the wrong offer entirely, the cases are in <a href="/blog/when-not-to-offer-free-shipping.html?src=Ninety9Blog">when not to offer free shipping</a>.</p>
<h2 id="the-discount-and-the-bar-have-to-share-one-figure">The discount and the bar have to share one figure</h2>
<p>Create the free shipping discount in Shopify admin. Minimum purchase, the same number as the bar, in the store currency. Choose the rates. Standard can be free. Express can stay paid. The bar copy has to name that. &quot;Free standard shipping over $75&quot; matches a discount that excludes express. &quot;Free shipping&quot; does not.</p>
<p>Product discounts need to be allowed to combine, or a bundle that qualifies will still pay for the label. The combination checkboxes are in <a href="/blog/shopify-discount-stacking-explained.html?src=Ninety9Blog">discount stacking</a>.</p>
<p>Then watch a code change the cart. Merchandise is $78, so the bar completes. A 15% code brings the purchase to $66.30. If Shopify&#39;s minimum uses the amount after discounts, shipping comes back and the bar must show about $9 remaining. If your bar stays completed, it is reading the pre-code subtotal. Fix the bar. Do not &quot;fix&quot; it by telling support the customer was wrong.</p>
<p><a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a> draws the remaining amount. Set the same threshold as the discount. Put the bar at the top of the cart, and on the product page if the goal should be visible before the first add. &quot;$18 away from free shipping&quot; is the sentence. &quot;Spend $75 for free shipping&quot; is the policy, and it can live once, in the footer. Wording examples are in <a href="/blog/free-shipping-bar-copy.html?src=Ninety9Blog">free shipping bar copy</a>. Placement is in <a href="/blog/where-to-put-a-progress-bar.html?src=Ninety9Blog">where to put a progress bar</a>.</p>
<p>A second goal, a discount or a gift, waits until the shipping goal matches checkout for a week. Stacking rewards is the product. Doing it on day one, before the first number is honest, means two promises to debug. Free under 10 orders a month, then $3.99, $7.99 and $11.99. Country-specific numbers are on the paid plans.</p>
<p>If the cart is a slide-out, the remaining amount belongs on the line items in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer. Two bars, one in the header and one in the drawer, will drift the first time you edit only one of them. One bar.</p>
<h2 id="four-orders-before-you-announce-it">Four orders before you announce it</h2>
<div class="tablewrap"><table><thead><tr><th>Order</th><th>What you are proving</th></tr></thead><tbody>
<tr><td>$60 of products</td><td>Shipping charges. The bar shows the gap</td></tr>
<tr><td>Just over $75</td><td>Standard shipping is free. Express, if excluded, still charges</td></tr>
<tr><td>Just over $75, then remove a unit</td><td>Shipping returns. The bar shows a gap again</td></tr>
<tr><td>Just over $75, then a code that drops you under</td><td>The bar and checkout still agree</td></tr>
</tbody></table></div>
<p>Test one other country the same day. A domestic $75 on an export cart is how international checkout bounces. That setup is in <a href="/blog/different-free-shipping-thresholds-per-country-shopify.html?src=Ninety9Blog">thresholds per country</a>.</p>
<p>One more distinction before you publish. A minimum purchase amount is money. A minimum quantity is units. Free shipping over $75 is the amount. &quot;Free shipping on 3 items&quot; is a different offer and a different bar. If you run both, say which one the customer is chasing. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> can use cart value or item count. Pick the one the discount in Shopify actually checks, then match the sentence to it. Three cheap items can clear a unit rule and miss a money rule. One expensive item does the opposite. The bar should describe the rule checkout will enforce. Write that rule in the discount title you will recognise in admin, so the next edit does not create a second minimum by accident.</p>
<p>Install <a href="https://apps.shopify.com/goalify?src=Ninety9Blog" target="_blank" rel="noopener">Goalify</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>How do I set free shipping over a certain amount in Shopify?</summary><div class="faq__a"><p>Create a free shipping discount with a minimum purchase amount. Then show that amount in the cart as a progress bar. Goalify is the bar, and it can be the goal the discount has to match.</p></div></details>
<details><summary>What should $X be?</summary><div class="faq__a"><p>Above your current average, often in the band where one extra item can close it, and only if the margin on that extra item covers the shipping you absorb. The method is in <a href="/blog/free-shipping-threshold-calculator.html?src=Ninety9Blog">how to set the threshold</a>.</p></div></details>
<details><summary>The bar says free shipping but checkout still charges. Why?</summary><div class="faq__a"><p>The bar&#39;s number and the shipping discount&#39;s minimum do not match, or the discount does not apply to that shipping rate or country. Make them the same number.</p></div></details>
<details><summary>Can I do this without an app?</summary><div class="faq__a"><p>You can create the discount in Shopify. You cannot show a live remaining amount in the cart with that discount alone. The bar is the app.</p></div></details>
<details><summary>Should every country see the same $X?</summary><div class="faq__a"><p>No. A domestic threshold on an export cart stalls checkout. Per-country setup is in <a href="/blog/different-free-shipping-thresholds-per-country-shopify.html?src=Ninety9Blog">different free shipping thresholds per country</a>.</p></div></details>
<details><summary>What if a discount code drops the cart back under $X?</summary><div class="faq__a"><p>Shipping should turn back on, and the bar should show a remaining amount again. If the bar stays complete, it is reading the subtotal before the code.</p></div></details>
<details><summary>Which shipping rate should the discount cover?</summary><div class="faq__a"><p>The rate you named in the bar. Free standard shipping can exclude express. A bar that says free shipping, while express still charges, will read as a broken promise.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Pre-Purchase Upsells on Shopify: What They Are and 10 Examples</title>
      <link>https://ninety9.dev/blog/pre-purchase-upsells-shopify.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/pre-purchase-upsells-shopify.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>What a pre-purchase upsell is on Shopify, where it belongs, and ten examples that ask before checkout instead of on the thank-you page.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A pre-purchase upsell asks before the order is placed. A thank-you page offer is a second order, not this.</li><li>The honest moments are add to cart, the start of checkout, and a shopper who is about to leave. A timer on a browser is none of those.</li><li><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> is those three moments. Bundle, cross-sell or add-on, with a real discount. No email field. No A/B test.</li><li>One offer. Ten examples below are patterns, not a stack you should run together.</li></ul></section>
<p>A pre-purchase upsell is an extra item offered before the shopper pays. It joins the order already in progress. A thank-you page offer is a new order, after the decision, and it is a different product. Stores buy a &quot;pre-purchase&quot; app and then fire a popup on a timer while the shopper is still reading. That is an interruption. It is not an upsell.</p>
<p><a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> waits for three moments: add to cart, checkout starting, and a shopper about to leave. The offer can be a bundle, a cross-sell or an add-on, with a real discount, including a quantity break or a buy-one-get-one when the deadline or the rule is real. Recommendations can come from orders you have already taken. Country and customer tag decide who sees it. It is free. It does not collect email addresses. It does not A/B test. It does not sit on the thank-you page.</p>
<p>These ten are examples of offers, not case studies and not a stack.</p>
<div class="tablewrap"><table><thead><tr><th>Example</th><th>When it asks</th><th>Why it is pre-purchase</th></tr></thead><tbody>
<tr><td>Case for the device just added</td><td>Add to cart</td><td>The accessory only makes sense with that device</td></tr>
<tr><td>Travel size of the moisturiser</td><td>Add to cart</td><td>A smaller second unit, not a second routine</td></tr>
<tr><td>Refill pouch beside the bottle</td><td>Add to cart</td><td>Same product, cheaper format, one decision</td></tr>
<tr><td>Two-pack at a quantity break</td><td>Add to cart</td><td>The second unit is the offer, before they leave the product</td></tr>
<tr><td>Gift wrap or a pouch</td><td>Add to cart</td><td>A fee they can see, not a line that appears later</td></tr>
<tr><td>The matching shade</td><td>Checkout starts</td><td>They are committed, the pair is still optional</td></tr>
<tr><td>A sample set of the scent they bought</td><td>Checkout starts</td><td>One small add, then payment</td></tr>
<tr><td>Free-shipping closer</td><td>The cart is short of the bar</td><td>One product that crosses the line, not a grid</td></tr>
<tr><td>A cheaper variant when they are leaving</td><td>Exit</td><td>A real alternative, not a coupon for the same item</td></tr>
<tr><td>The add-on they removed</td><td>Exit</td><td>One chance to put it back, then stop</td></tr>
</tbody></table></div>
<h2 id="what-the-popup-is-allowed-to-say">What the popup is allowed to say</h2>
<p>One product. A price that matches checkout, because the discount is a Shopify discount. A reason that names the item already in the cart. If you need a countdown, the end time has to be a real end. A timer that resets is the failure mode in <a href="/blog/exit-intent-popups-shopify.html?src=Ninety9Blog">exit-intent popups</a>. <a href="https://apps.shopify.com/monet?src=Ninety9Blog">Monet</a> can show a countdown when the deadline is real.</p>
<p>Do not also pop the same product inside the cart drawer. <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> is the in-cart version of one complement. Pick the surface. Product-page sets and quantity breaks still belong to <a href="/apps/addly.html?src=Ninety9Blog">Addly</a>, not to a popup that restates the product page.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/monet/icon.png" alt="Monet • AI Popup Bundle Addons app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Monet • AI Popup Bundle Addons</p>
<p class="appcta__text">AI upsell popups triggered on add to cart, checkout initiation and exit intent.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="what-to-skip">What to skip</h2>
<p>A browse timer. An email capture. A second popup after they declined. A thank-you upsell described as pre-purchase. A discount so deep the first item was the bait. None of those are in the ten.</p>
<h2 id="three-of-the-ten-with-prices">Three of the ten, with prices</h2>
<p>These are setups, not case studies. Swap in your SKUs and your cost.</p>
<p><strong>The case, after add to cart.</strong> The phone is $499. The case is $29 and costs you $6. The popup names the phone they just added and offers the case once. There is no percentage off, because $29 next to $499 does not need a costume. If you do discount it, 10% is $2.90, and you still have margin. Forty percent off, to $17.40, is a different product. Do that only if the case is how you acquire the customer, and write the margin down first. <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> shows one product at this moment. Country or a customer tag can hide it from wholesale.</p>
<p><strong>The refill, after add to cart.</strong> The bottle is $24. The pouch is $16, and the pouch is the same formula. The popup says the pouch is the format that lasts longer per dollar. This offer belongs here because the shopper just chose the product. It does not belong on a collection page they are still browsing. A quantity break on the bottle itself is a product-page job for <a href="/apps/addly.html?src=Ninety9Blog">Addly</a>. The popup should not restate a tier the page already showed.</p>
<p><strong>The closer, when the cart is short.</strong> The bar says $14 to free shipping. One product in the catalogue costs $16 and is something this shopper has a reason to want, because other orders with the same first item included it. The popup offers that one product. It does not offer a grid. If nothing in the catalogue honestly closes a $14 gap, do not invent a $4 sample with free shipping attached. Move the threshold, or leave the gap on the bar. <a href="https://apps.shopify.com/goalify?src=Ninety9Blog">Goalify</a> can name a product from your orders when the cart is short of a goal. Use one of those systems, not both, for the same gap.</p>
<h2 id="which-moment-gets-which-offer">Which moment gets which offer</h2>
<div class="tablewrap"><table><thead><tr><th>Moment</th><th>The shopper has</th><th>A fair ask</th><th>A poor ask</th></tr></thead><tbody>
<tr><td>Add to cart</td><td>Chosen a product</td><td>The thing that completes it</td><td>A newsletter, a timer, a second unrelated brand</td></tr>
<tr><td>Checkout starting</td><td>Decided to pay</td><td>One small add, then payment</td><td>A bundle that forces them to rethink the order</td></tr>
<tr><td>Exit</td><td>Signalled they are leaving</td><td>One cheaper format, once</td><td>A coupon that trains them to leave</td></tr>
<tr><td>Still reading</td><td>Not chosen</td><td>Nothing</td><td>Any popup</td></tr>
</tbody></table></div>
<p>Exit on a phone is a weak signal. Prefer add to cart there. The detail is in <a href="/blog/exit-intent-popups-shopify.html?src=Ninety9Blog">exit-intent popups</a>. Checkout offers are easy to overbuild. One line, one button, a way to dismiss that is as obvious as the add. <a href="/blog/checkout-initiation-popups.html?src=Ninety9Blog">Checkout initiation</a> is the narrower version of that moment.</p>
<p>A countdown belongs only when the end is real. A code that dies at midnight can show a clock. A clock that resets on refresh is a false statement about the offer. Monet can show the clock when the deadline is real. It will not collect an email address in the same popup. The email ask is how the upsell becomes a form.</p>
<h2 id="pick-one-then-count-it">Pick one, then count it</h2>
<p>Choose the example that matches the product you already sell most. Ship that popup. For a week, count three things from your own orders.</p>
<ul>
<li>Popups shown.</li>
<li>Adds from the popup.</li>
<li>Orders where the original item and the extra item both stayed through payment.</li>
</ul>
<p>You do not need an industry attach rate to judge it. If the extra item is removed before payment, the discount was the bait or the product was wrong. If almost nobody adds, the moment is wrong, or the product page already made the offer. Turn the popup off before you add a second one.</p>
<p>Do not also show that SKU in the <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> drawer. One surface. Recommendations can come from purchase patterns, and you can still pin a SKU for a campaign. Pin the campaign. Let the pattern fill the days the campaign is off.</p>
<p>Wholesale and staff tags should not see the consumer offer. Monet can target by customer tag and by country. A 10% case offer on a wholesale account that already has contract pricing is how the price list leaks into a popup. Exclude the tag. Check it with a tagged customer, not only with a fresh incognito session. A fresh session only proves the offer works for a stranger. Log in as the tagged wholesale customer and add the same product. The popup should stay closed. If it opens, the tag rule is not the rule you think it is.</p>
<p>Install <a href="https://apps.shopify.com/monet?src=Ninety9Blog" target="_blank" rel="noopener">Monet</a> for the ask. The popup comparison is in <a href="/blog/best-shopify-upsell-popup-apps-2026.html?src=Ninety9Blog">best Shopify upsell popup apps</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is a pre-purchase upsell?</summary><div class="faq__a"><p>An offer shown before the shopper pays, so the extra item joins the order they are already placing. Post-purchase and thank-you offers are a later order.</p></div></details>
<details><summary>Where should it appear?</summary><div class="faq__a"><p>After add to cart, when checkout starts, or on exit. Not on a timer while someone is still reading the product page.</p></div></details>
<details><summary>Is a cart drawer upsell pre-purchase?</summary><div class="faq__a"><p>Yes. The shopper has not paid. <a href="/apps/addy.html?src=Ninety9Blog">Addy</a> shows that one inside the drawer. Monet shows it as a popup at add, checkout or exit. Use one surface for one product, not both for the same product.</p></div></details>
<details><summary>Can I capture an email in the same popup?</summary><div class="faq__a"><p>Not in Monet. The popup is the offer. An email field is a second ask, and it is how the upsell starts losing to a newsletter.</p></div></details>
<details><summary>Do the ten examples need ten popups?</summary><div class="faq__a"><p>No. Pick the one that matches the product already in the cart. The list is a menu, not a campaign plan.</p></div></details>
<details><summary>How deep should the discount be?</summary><div class="faq__a"><p>Deep enough to notice, shallow enough that the extra unit still has margin. A worked pair is in the article. Use your cost, not a benchmark.</p></div></details>
<details><summary>What if they close the popup?</summary><div class="faq__a"><p>They said no. A second popup in the same session repeats the ask. Leave the offer in the cart if it still belongs there, or let them go.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Shopify Cart Drawer Not Updating? 8 Fixes</title>
      <link>https://ninety9.dev/blog/shopify-cart-drawer-not-updating.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/shopify-cart-drawer-not-updating.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Eight fixes when a Shopify cart drawer does not update after add to cart, on Dawn and other themes. One drawer, one embed, one cart icon.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A cart that &quot;does not update&quot; is usually two carts, a button pointed at the wrong one, or an embed that was never saved on the live theme.</li><li>Dawn&#39;s drawer and an app drawer cannot share one add-to-cart button.</li><li>Fix the live theme, not the unpublished duplicate you customised by mistake.</li><li><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> is an app embed. Uninstall does not leave a Liquid cart behind to go stale.</li></ul></section>
<p>When a Shopify cart drawer does not update, the item usually did get added. The drawer you are looking at is not the one that changed. Eight checks, in the order that fixes the most stores.</p>
<h2 id="1-the-app-embed-is-off-on-the-live-theme">1. The app embed is off on the live theme</h2>
<p>Online Store, Themes. The published theme, not the duplicate named &quot;Dawn copy&quot;. Customize, App embeds, the cart app, on, Save. An embed enabled in preview and never saved does not exist for customers.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="2-dawns-drawer-and-the-app-drawer-are-both-on">2. Dawn&#39;s drawer and the app drawer are both on</h2>
<p>Dawn opens its own drawer on add to cart. The app opens another. One of them has the new line. The other still shows the previous cart. Disable the theme drawer, or stop the product form from calling it. One button, one drawer. The install steps are in <a href="/blog/how-to-add-a-slide-cart-shopify-dawn.html?src=Ninety9Blog">how to add a slide cart on Dawn</a>.</p>
<h2 id="3-the-header-icon-opens-a-different-cart">3. The header icon opens a different cart</h2>
<p>The add button opens the drawer. The bag icon goes to <code>/cart</code>, or to the theme drawer. After an add, the shopper opens the icon and sees an old page. Point the icon at the same drawer.</p>
<h2 id="4-a-second-cart-app-is-still-installed">4. A second cart app is still installed</h2>
<p>Upcart, a page-builder cart, and the theme drawer can all listen for &quot;add&quot;. Uninstall or disable every cart embed except the one you intend to keep. Two listeners are a race. The loser looks like a cart that did not update.</p>
<h2 id="5-you-tested-inside-the-theme-editor">5. You tested inside the theme editor</h2>
<p>The editor preview is not the storefront. Open the published URL in a normal window, add a product, and watch the drawer. If it works there, the editor was the stale view.</p>
<h2 id="6-the-product-form-does-a-full-reload">6. The product form does a full reload</h2>
<p>Some older product forms submit the cart and reload. The drawer script never hears the add, because the page went away. On Online Store 2.0 themes the product form should add with Ajax and let the drawer refresh. If a custom product form or a page builder replaced it, the drawer is waiting for an event that never fires. Put the buy button back on the theme form, or on a form the cart app is built to hear.</p>
<h2 id="7-quantity-buttons-inside-the-drawer-are-the-themes">7. Quantity buttons inside the drawer are the theme&#39;s</h2>
<p>You added the item. The drawer opened. Plus and minus still call Dawn&#39;s quantity input, so the line on screen does not move. The drawer that owns the lines has to own the quantity controls. A hybrid, theme buttons inside an app drawer, goes stale on the first tap.</p>
<h2 id="8-markets-and-currency">8. Markets and currency</h2>
<p>A cart rendered in the wrong currency looks &quot;wrong&quot; rather than empty. The threshold and the line prices should follow the shopper. <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> renders prices in the presentment currency and can run a different cart per market. A single drawer with the home-market currency on a French storefront is the bug people describe as &quot;not updating&quot; after they switch country.</p>
<h2 id="prove-the-add-happened">Prove the add happened</h2>
<p>Before you edit a file, separate &quot;the cart rejected the item&quot; from &quot;the drawer is showing an old picture&quot;.</p>
<p>Add the product. Do not close the drawer. Open the store in a second tab and go to <code>/cart</code>. If the line is on that page, Shopify has the item. The drawer that still looks empty is a view. Fixes 1 through 4 are about which view you are holding. If <code>/cart</code> is also empty, the product form never reached the cart. That is fix 6, or the variant was unavailable.</p>
<p>Then change the quantity in the drawer only. Refresh <code>/cart</code>. If the quantity on the page moved and the drawer did not, the plus button is the theme&#39;s. That is fix 7.</p>
<p>Write down which theme is published. Online Store, Themes, the one with the live label. A &quot;Dawn copy&quot; you customised last Tuesday is a different theme. App embeds do not copy themselves across themes when you hit publish on the wrong one.</p>
<h2 id="a-map-from-what-you-see">A map from what you see</h2>
<div class="tablewrap"><table><thead><tr><th>What you see</th><th>What it usually is</th></tr></thead><tbody>
<tr><td>Drawer opens empty, <code>/cart</code> has the line</td><td>A second drawer, or the icon bound to the theme cart</td></tr>
<tr><td>Nothing opens, and the page reloads</td><td>The product form is a full submit</td></tr>
<tr><td>Desktop updates, the phone does not</td><td>A different header icon at the mobile breakpoint</td></tr>
<tr><td>Quantity taps do nothing</td><td>Theme buttons inside the app drawer</td></tr>
<tr><td>Prices look like the home currency abroad</td><td>One cart, no market rule</td></tr>
<tr><td>It fails only inside the theme editor</td><td>Preview. Check the published URL</td></tr>
<tr><td>It failed the morning after a theme update</td><td>A Liquid edit was overwritten. The embed is the install that survives</td></tr>
<tr><td>Two drawers flash</td><td>Two apps, or Dawn plus the app</td></tr>
</tbody></table></div>
<p>Page-builder product forms are a frequent version of the reload. The button looks like the theme button and posts the cart the old way. Put the buy button back on the theme&#39;s product form, or on a form the cart app is built to hear. Quick-add buttons on collection cards are a second form. Test those too. A drawer that works on the product page and fails on the collection is that second form.</p>
<h2 id="after-it-updates-keep-it-to-one-cart">After it updates, keep it to one cart</h2>
<p>Leave one embed. <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> is that embed: a drafted slide cart, no Liquid left behind if you remove it, A/B tests if you want two versions without forking the theme. It is free to install. It loads when the cart opens.</p>
<p>If you are coming off a builder and a theme drawer at the same time, disable both, then enable <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a>, then save, then test. The order matters. Enabling the new embed first gives you three listeners for an afternoon. The migration notes are in <a href="/blog/upcart-alternatives-cart-drawers.html?src=Ninety9Blog">Upcart alternatives</a>. The Dawn steps are in <a href="/blog/how-to-add-a-slide-cart-shopify-dawn.html?src=Ninety9Blog">how to add a slide cart</a>.</p>
<h2 id="a-ten-minute-regression">A ten-minute regression</h2>
<p>Run this after any theme publish or any new app that mentions &quot;cart&quot;.</p>
<ol>
<li>Add from the product page.</li>
<li>Add from a collection, if you use quick add.</li>
<li>Change quantity. Remove the line.</li>
<li>Open the header icon on desktop and at a narrow width.</li>
<li>Switch country, if you have more than one.</li>
<li>Confirm <code>/cart</code> and the drawer show the same lines if both exist. Preferably only the drawer exists.</li>
</ol>
<p>If the drawer updates and the offer is wrong, that is merchandising. One upsell. The list is in <a href="/blog/in-cart-upsells-that-convert.html?src=Ninety9Blog">in-cart upsells that convert</a>.</p>
<p>Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> once the live theme has a single embed.</p>
<h2 id="the-cart-count-the-note-and-the-discount-field">The cart count, the note, and the discount field</h2>
<p>Three small pieces get blamed on &quot;the drawer&quot; and belong to a different render.</p>
<p>The header bubble can update on a delay, or not at all, while the drawer is right. Click the bubble. If it opens a different surface from the add button, rebind the bubble. A correct drawer with a wrong bubble still trains people to think the add failed.</p>
<p>The order note and the discount field have to be the app&#39;s, if the app owns the drawer. A theme note box pasted into the drawer will submit into nothing, and the shopper will tell you the note &quot;didn&#39;t save&quot;. That is the same hybrid as the theme&#39;s quantity buttons.</p>
<p>A discount code that applies on <code>/cart</code> and fails in the drawer is a field that never called the cart. Use the drawer field. Apply a real code. The total should match checkout. If the code is refused because of combination rules, that is a discount setup, not a stale drawer. The distinction is in <a href="/blog/shopify-discount-stacking-explained.html?src=Ninety9Blog">discount stacking</a>.</p>
<p>After any of those fixes, repeat the ten-minute list. One pass on desktop, one at a narrow width, one from a collection quick-add. The drawer is done when those three agree with <code>/cart</code>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Why does my Shopify cart drawer show the old quantity?</summary><div class="faq__a"><p>The drawer on screen is not the cart that received the add. A second app, Dawn&#39;s own drawer, or the cart icon opening /cart while the button opens a drawer will all look like a stale cart.</p></div></details>
<details><summary>I edited the theme and the cart still fails. Why?</summary><div class="faq__a"><p>You may have edited an unpublished theme. Online Store, Themes, the published one, Customize, then the app embed. Save.</p></div></details>
<details><summary>Do I need to clear the cache?</summary><div class="faq__a"><p>After the embed is right, yes, once, on the device that failed. Cache is the last fix. It is not the reason two drawers exist.</p></div></details>
<details><summary>The drawer updates on desktop and not on mobile. Why?</summary><div class="faq__a"><p>The mobile header often uses a different cart icon. Point that icon at the same drawer. Test at 390px, not only in the theme editor.</p></div></details>
<details><summary>Should I edit cart.js?</summary><div class="faq__a"><p>No. Theme updates replace it, and a patched cart.js is how the drawer breaks again next month. Use one app embed.</p></div></details>
<details><summary>The cart count in the header is wrong, but the drawer is right. What is that?</summary><div class="faq__a"><p>The bubble is a separate render. Open the drawer, then the bag icon. If they disagree, the icon is still bound to the theme cart.</p></div></details>
<details><summary>How do I prove the item was added?</summary><div class="faq__a"><p>Open /cart in a second tab after you add. If the line is there, the add worked and the drawer you are staring at is the stale one.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Shopify Discount Stacking Explained: What Combines, What Doesn&apos;t</title>
      <link>https://ninety9.dev/blog/shopify-discount-stacking-explained.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/shopify-discount-stacking-explained.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>How Shopify discount combinations work for product, order and shipping discounts, and how to keep a bundle and a code from fighting.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Shopify stacks discounts only when each discount allows the combination. The checkbox is the rule, not the theme.</li><li>Product, order and shipping discounts are different stacks. Two product discounts on the same unit usually should not both apply.</li><li>A bundle app that writes its own price, beside a Shopify discount, is how the cart and the product page disagree.</li><li><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> uses Shopify&#39;s own discounts, so the combination settings you already understand still apply.</li></ul></section>
<p>Discount stacking on Shopify is not a theme setting. Each discount, automatic or code, has combination rules: it may combine with product discounts, order discounts, and shipping discounts. If either side refuses the pair, checkout keeps one of them. The shopper sees a code that &quot;does not work&quot; and assumes the store is broken.</p>
<h2 id="the-three-stacks">The three stacks</h2>
<div class="tablewrap"><table><thead><tr><th>You are discounting</th><th>Examples</th><th>Usually combines with</th></tr></thead><tbody>
<tr><td>A product</td><td>Bundle price, quantity break, 15% off one SKU</td><td>Shipping, sometimes an order discount. Rarely a second product discount on the same unit</td></tr>
<tr><td>The order</td><td>10% off the cart, a threshold reward</td><td>Product discounts and shipping, if both sides allow it</td></tr>
<tr><td>Shipping</td><td>Free shipping over a threshold</td><td>Product and order discounts, if the shipping discount allows it</td></tr>
</tbody></table></div>
<p>Read that as a permission, not a promise. Both discounts must allow the combination. A bundle that allows order discounts, and a code that does not allow product discounts, still will not stack.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="what-you-actually-want-to-stack">What you actually want to stack</h2>
<p>A set or a quantity break should stack with free shipping. The shopper who built the bundle is the shopper the bar is trying to move. Blocking shipping on a bundled cart makes the <a href="/blog/free-shipping-progress-bar-guide.html?src=Ninety9Blog">progress bar</a> a lie.</p>
<p>A set should not stack with a second product discount on the same units. The bundle price is already the offer. A 20% code on top is a second offer you did not merchandise. Turn that combination off unless finance has already priced it. The check is in <a href="/blog/bundle-discount-margin-maths.html?src=Ninety9Blog">bundle discount maths</a>.</p>
<p>An order-level reward, such as 10% off once the cart clears a goal, can sit on top of a product bundle if both discounts allow it. That is a real stack. Write it down. &quot;Bundle price, then 10% off the order, then free shipping&quot; is a sentence finance can audit. Three apps that each think they own the line is not.</p>
<h2 id="where-the-price-should-be-created">Where the price should be created</h2>
<p><a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> creates the bundle, the pair, the quantity break and the add-on as Shopify discounts. The product page and the checkout read the same discount. You still set Combinations in Shopify. You do not debug a private price the theme cannot see.</p>
<p>If a code and a bundle fight, do not add a third app to &quot;fix stacking&quot;. Open the two discounts. Decide which combination is allowed. Publish that, and only that.</p>
<p><a href="/apps/goalify.html?src=Ninety9Blog">Goalify</a> can own the shipping threshold and an order-level reward. Let it combine with the product discount. A second free-shipping discount, built by hand with the opposite combination checkbox, will fight the first one at checkout.</p>
<h2 id="a-cart-you-can-audit">A cart you can audit</h2>
<p>Fill this with your own cost. The prices are an example.</p>
<p>Two products list at $40 and $30, so $70 together. The set is 15% off those units, which is $10.50. The pair is $59.50. That 15% is a product discount, created as a Shopify discount by <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a>.</p>
<p>An order code of 10%, allowed to combine with product discounts, applies to what is left. Ten percent of $59.50 is $5.95. The merchandise total is $53.55. Free shipping then depends on the shipping discount allowing both product and order discounts, and on whether $53.55 still clears the minimum. If the minimum is $75 on the purchase amount after discounts, this cart does not get free shipping. The bar has to say so. A bar that still says &quot;free shipping unlocked&quot; is using a different subtotal from checkout.</p>
<p>If the 10% code is not allowed to combine with product discounts, checkout keeps one discount. The shopper sees a code that &quot;does not work&quot;. That is the checkbox, on one side or the other. Both discounts have to allow the pair.</p>
<h2 id="the-stack-you-probably-do-not-want">The stack you probably do not want</h2>
<p>The same $70 pair, plus a sitewide 20% that also targets those units. Twenty percent of $70 is $14. Together with the $10.50 bundle, that is $24.50 off $70, before any order code. If the two units cost you $32 to land, you have $13.50 left, and you have not paid the label yet.</p>
<p>That is why two product discounts on the same unit are usually a mistake. The bundle price was already the offer. The sitewide sale can be a choice the shopper gets instead, or it can exclude the bundled SKUs. Run the exclusion in the discount, where checkout can see it. A theme that hides the sale badge and still lets the code through has only hidden the problem.</p>
<p>A quantity break is the same shape. One unit at $28, two at $48. The break is already $4 off each unit. A further 20% on the $48 makes $38.40. Write that down before you turn Combinations on. The worksheet for the margin is in <a href="/blog/bundle-discount-margin-maths.html?src=Ninety9Blog">bundle discount maths</a>.</p>
<h2 id="automatic-discounts-and-codes">Automatic discounts and codes</h2>
<p>An automatic discount applies when the cart qualifies. A code applies when someone types it. They still use the same combination rules. Automatic does not mean &quot;stacks with everything&quot;. A code does not mean &quot;the customer earned a second cut&quot;.</p>
<p>Shopify will not apply a pair that either discount refuses. You do not need a third app to referee that. You need a written sentence:</p>
<div class="tablewrap"><table><thead><tr><th>Stack you intend</th><th>Product discount</th><th>Order discount</th><th>Shipping discount</th></tr></thead><tbody>
<tr><td>Bundle, and free shipping if the cart still qualifies</td><td>The set</td><td>Off</td><td>On, if the minimum is still met</td></tr>
<tr><td>Bundle, then 10% off the order, then shipping</td><td>The set</td><td>The 10% code</td><td>On, if the minimum is still met</td></tr>
<tr><td>A sitewide sale instead of the bundle</td><td>One of them, not both on the same units</td><td>Whatever the sale already includes</td><td>On, if you still want shipping</td></tr>
<tr><td>Quantity break only</td><td>The break</td><td>Off for that SKU</td><td>On</td></tr>
</tbody></table></div>
<p>Read checkout after each row. The product page, the cart, and the payment step should show the same merchandise total. <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> is how the bundle, the pair, the quantity break and the add-on become that Shopify discount. A widget that paints a lower price on the product page, while checkout uses a different engine, is the drift people call a stacking bug.</p>
<h2 id="what-changed-when-the-code-landed">What changed when the code landed</h2>
<p>A common support ticket is &quot;they had free shipping in the cart and paid for shipping&quot;. Walk the cart in order.</p>
<ol>
<li>Merchandise before discounts.</li>
<li>Product discounts, including the bundle.</li>
<li>Order discounts, if they are allowed.</li>
<li>The purchase amount Shopify uses for the shipping minimum.</li>
<li>The shipping discount, if that amount still qualifies and the rate is one the discount covers.</li>
</ol>
<p>Express excluded from the discount will still charge, even when the bar says shipping is free. Name the rate. &quot;Free standard shipping over $75&quot; is a sentence. &quot;Free shipping&quot; is a hope.</p>
<p>Place four test orders before a sale: no code, code that should stack, code that should not, and a code that pulls the cart back under the shipping minimum. Save the four totals. If a later app changes a combination checkbox, you will see which total moved.</p>
<p>Write the four totals on the sale calendar, next to the end date of the promotion. When the sale ends, the sitewide discount has to come off the combinations you allowed for the week. A forgotten automatic discount is how Tuesday still has Friday&#39;s stack. <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> can stay. The temporary code should not. Open one order from the sale in admin and read the discount lines. The names there should match the sentence you wrote down. If a third name appears, an app you forgot is still discounting the unit.</p>
<p>Install <a href="https://apps.shopify.com/addly?src=Ninety9Blog" target="_blank" rel="noopener">Addly</a> when the bundle should be a Shopify discount you can combine on purpose.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Why won&#39;t my Shopify discounts stack?</summary><div class="faq__a"><p>Open each discount and check Combinations. A code that is not allowed to combine with product discounts will lose to the bundle, or the bundle will lose to the code. Both outcomes look like a bug. Both are the checkbox.</p></div></details>
<details><summary>Can a customer use a code on top of a bundle?</summary><div class="faq__a"><p>Only if the bundle discount and the code are both allowed to combine. If you do not want a second cut, turn the combination off. Do not hope the theme will block it.</p></div></details>
<details><summary>Do free shipping discounts stack with product discounts?</summary><div class="faq__a"><p>They can. Shipping is its own combination. A product bundle and a free-shipping threshold should be allowed to combine, or the bar will promise shipping the checkout then removes.</p></div></details>
<details><summary>Should quantity breaks stack with a sitewide sale?</summary><div class="faq__a"><p>Usually no. A 20% sale plus a quantity break on the same unit is a deeper cut than the margin planned. Leave the sale and the break as a choice, not a stack.</p></div></details>
<details><summary>What if two apps both discount the same line?</summary><div class="faq__a"><p>Pick one app to own the price. Addly is that app for sets, pairs and quantity breaks. A second discount engine on the same SKU is the drift.</p></div></details>
<details><summary>Which discount does checkout keep when they cannot combine?</summary><div class="faq__a"><p>One of them. The shopper experiences that as a code that failed. Open Combinations on both discounts and decide the pair on purpose, then place a test order.</p></div></details>
<details><summary>Does a code change whether the cart still qualifies for free shipping?</summary><div class="faq__a"><p>It can. A 15% code on a $78 cart can drop the purchase under a $75 shipping minimum. Test the code and the threshold together.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Upcart Alternatives: 5 Cart Drawers Compared</title>
      <link>https://ninety9.dev/blog/upcart-alternatives-cart-drawers.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/upcart-alternatives-cart-drawers.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Five Shopify cart drawers compared as Upcart alternatives. Addy, Kaching, Amp and iCart against a builder that opens on an empty canvas.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Upcart is a builder. HTML, CSS and JSX are control, and they are also the reason the first cart is still empty on Thursday.</li><li><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a> is the alternative that drafts the drawer from the catalogue, then lets you edit it, including markets and A/B tests. Free to install.</li><li>A template or a suite still has to be assembled. That is a simpler project than a drafted cart, not a faster one.</li><li>One drawer. An Upcart alternative that you install beside Upcart is two carts on one button.</li></ul></section>
<p>Upcart is a cart builder. The drawer is a canvas. Rewards, upsells and gifts are blocks you place, including templates in HTML, CSS and JSX. That is a real product if someone on the team wants to write the cart. It is a delay if the brief is &quot;the drawer should be selling on Friday&quot;.</p>
<p>These five Shopify cart drawers are the comparison. <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog">Addy</a> is first because the alternative to an empty canvas is a cart that is already drafted.</p>
<p>Ratings below are from the Shopify App Store as of October 2026. Upcart is 4.7 from 959 reviews, Built for Shopify, with a free plan and paid plans after it.</p>
<div class="tablewrap"><table><thead><tr><th>Cart</th><th>Rating</th><th>From</th><th>First afternoon</th></tr></thead><tbody>
<tr><td><a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a></td><td>5.0 / 2</td><td>Free to install</td><td>A drafted cart, then you edit</td></tr>
<tr><td><a href="https://apps.shopify.com/cart-upsell" target="_blank" rel="noopener">Kaching</a></td><td>5.0 / 1,487</td><td>Free plan, then paid</td><td>You assemble the suite</td></tr>
<tr><td><a href="https://apps.shopify.com/slide-cart" target="_blank" rel="noopener">Amp</a></td><td>5.0 / 772</td><td>Free plan, then about $29.99</td><td>You fill a template</td></tr>
<tr><td><a href="https://apps.shopify.com/icart" target="_blank" rel="noopener">iCart</a></td><td>4.7 / 451</td><td>First 100 orders free</td><td>You assemble a drawer, a page, a popup and a mini cart</td></tr>
<tr><td><a href="https://apps.shopify.com/upcart-cart-builder" target="_blank" rel="noopener">Upcart</a></td><td>4.7 / 959</td><td>Free plan, then paid</td><td>You build it, including JSX</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="addy">Addy</h2>
<p>Addy reads the catalogue and the brand and proposes the slide cart: upsell, volume offer, gift, shipping protection, progress bar, delivery date. More than 40 blocks, markets and customer tags, custom HTML and CSS, A/B tests. It loads when the cart opens. Two public reviews. Not listed as Built for Shopify. The draft is the difference, not the review count.</p>
<p>The head-to-head is in <a href="/blog/addy-vs-upcart.html?src=Ninety9Blog">Addy vs Upcart</a>.</p>
<h2 id="kaching">Kaching</h2>
<p>A high-review suite drawer. Timer, bars, gift wrap, protection, translations. You still place the blocks. Useful if you already live in that suite. A simpler assembly job than a drafted cart.</p>
<h2 id="amp">Amp</h2>
<p>Industry templates, markets, gifts, a progress bar. The paid plan is a flat monthly fee once you leave the free plan. A template is a look. It does not know your catalogue until you fill it.</p>
<h2 id="icart">iCart</h2>
<p>Drawer, full cart page, popup and mini cart. First 100 orders free, then paid. Most stores replacing Upcart needed one slide cart, not three extra surfaces.</p>
<h2 id="upcart">Upcart</h2>
<p>Keep it if the cart is a front-end project and someone will maintain the JSX. Leave it if the drawer is a merchandising surface. Custom code does not make the upsell more relevant. It makes the upsell wait.</p>
<h2 id="what-a-drafted-cart-means-on-a-real-catalogue">What &quot;a drafted cart&quot; means on a real catalogue</h2>
<p>Take a store that sells a $32 serum, a $28 cleanser and a $18 toner. On a builder, the first afternoon is a column, a colour picker, and a decision about which block goes where. On Addy, the first afternoon is a proposed drawer: the lines, one complement, the distance to the shipping goal, a delivery window, checkout. You delete what you do not want. You do not invent the cart from a blank file.</p>
<p>The complement should be one product. For the serum, that is the cleanser if orders already contain both. The drawer adds it in one click, without a reload. A second row, the toner, can wait. A timer on that row can wait forever unless the end time is a real end.</p>
<p>Markets are the next edit, not the first. A French cart can show euros and a different threshold. A wholesale tag can hide the upsell. Addy can change the whole cart or one block by market and by tag. Prices follow the shopper&#39;s currency. A/B tests compare two versions of that drawer without a theme branch. Two public reviews. Not listed as Built for Shopify. The draft is still the thing the canvas does not do.</p>
<h2 id="a-migration-that-fits-in-a-day">A migration that fits in a day</h2>
<p>JSX templates do not come with you. That is the point of leaving a builder. Write down what the live Upcart drawer actually does, in one column, before you uninstall it.</p>
<div class="tablewrap"><table><thead><tr><th>Already live, and worth keeping</th><th>Leave it behind</th></tr></thead><tbody>
<tr><td>The shipping goal and the remaining amount</td><td>A custom animation nobody can maintain</td></tr>
<tr><td>One upsell people add</td><td>A grid of four recommendations</td></tr>
<tr><td>Gift wrap, if it has a price and a yes</td><td>A pre-ticked protection fee</td></tr>
<tr><td>The delivery sentence, if you can keep it</td><td>A countdown that resets</td></tr>
<tr><td>Translations you already paid a human to write</td><td>A second empty cart &quot;for later&quot;</td></tr>
</tbody></table></div>
<p>Then:</p>
<ol>
<li>Install Addy. Leave Upcart&#39;s embed on until the new drawer has been previewed, then turn Upcart off before you turn Addy on for customers. Never both.</li>
<li>Open the published theme, not a copy. App embeds. Addy on. Save.</li>
<li>Rebuild the row in the table. Progress, lines, one upsell, delivery, checkout.</li>
<li>Add the serum on the live URL. The new drawer opens. Dawn&#39;s drawer does not.</li>
<li>Place one order. The paid total matches the drawer.</li>
<li>Uninstall Upcart once that order looks right. An unused embed still listens for &quot;add&quot;.</li>
</ol>
<p>The head-to-head on the builder itself is in <a href="/blog/addy-vs-upcart.html?src=Ninety9Blog">Addy vs Upcart</a>. The install on Dawn is in <a href="/blog/how-to-add-a-slide-cart-shopify-dawn.html?src=Ninety9Blog">how to add a slide cart</a>.</p>
<h2 id="how-to-read-the-other-four">How to read the other four</h2>
<p>Kaching is a suite with a long review record, 5.0 from 1,487 reviews, Built for Shopify. You still place the blocks: timer, bars, gift wrap, protection, translations. If your team already lives in that suite, the clicks are familiar. The first cart is still an assembly.</p>
<p>Amp is templates. Industry looks, markets, gifts, a progress bar. The paid plan is a flat monthly fee once you leave the free plan, about $29.99. A template is a skin. It learns your catalogue when you fill it.</p>
<p>iCart is a drawer plus a full cart page, a popup and a mini cart. First 100 orders free, then paid. A store leaving Upcart usually needed one slide cart. Three extra surfaces are three more places for the count to go stale.</p>
<p>Upcart, 4.7 from 959 reviews, Built for Shopify, stays the right product when a developer will own the JSX after the sale. It is the wrong product when the brief is a drawer that sells this week. HTML and CSS in Addy cover the cases where a block is not enough, without making the whole cart a front-end project.</p>
<h2 id="which-drawer-by-the-job-in-front-of-you">Which drawer, by the job in front of you</h2>
<p>A two-person brand with a sale on Friday needs the drafted cart. An agency with a front-end developer and a design system in JSX can stay. A brand that already assembled Kaching and only wants a familiar admin can stay there, and should still run one drawer. A brand that wants a template and will pay a flat fee can look at Amp, knowing the template is empty of their products until they fill it.</p>
<div class="tablewrap"><table><thead><tr><th>If you are leaving Upcart because</th><th>Install</th></tr></thead><tbody>
<tr><td>The canvas is still empty</td><td>Addy</td></tr>
<tr><td>You want a suite you already know how to click through</td><td>Kaching</td></tr>
<tr><td>You want an industry template and will pay a flat fee</td><td>Amp</td></tr>
<tr><td>You want a drawer plus a full cart page</td><td>iCart</td></tr>
<tr><td>You want to keep writing JSX</td><td>Stay on Upcart</td></tr>
</tbody></table></div>
<p>Turn one embed off before you turn the next on. Two drawers on Dawn is the bug in <a href="/blog/shopify-cart-drawer-not-updating.html?src=Ninety9Blog">cart drawer not updating</a>.</p>
<p>Review count is a poor way to finish this choice. Upcart&#39;s 959 reviews and Kaching&#39;s 1,487 describe how many stores installed a builder or a suite. They do not describe whether your serum has a complement in the drawer on Friday. Addy&#39;s two reviews are a true limit of a new listing. The draft is still the difference on the first afternoon.</p>
<p>Install <a href="https://apps.shopify.com/addy-cart-drawer?src=Ninety9Blog" target="_blank" rel="noopener">Addy</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best Upcart alternative in 2026?</summary><div class="faq__a"><p>Addy. The first cart is drafted from your products and your brand. You still get custom HTML and CSS, markets, tags and A/B tests, without opening on a blank canvas.</p></div></details>
<details><summary>Is Upcart a bad cart drawer?</summary><div class="faq__a"><p>It is a builder. Stores that enjoy JSX get a custom cart. Stores that needed the drawer live before a sale get a canvas. Those are different jobs.</p></div></details>
<details><summary>Can I migrate without editing the theme?</summary><div class="faq__a"><p>Yes. Disable Upcart&#39;s embed, enable Addy&#39;s, save, and place one test order. Do not leave both embeds on.</p></div></details>
<details><summary>Which alternative is closest to a visual builder?</summary><div class="faq__a"><p>Amp sells industry templates. You still fill them. Kaching is a suite you assemble. Neither drafts the cart from the catalogue the way Addy does.</p></div></details>
<details><summary>Do I need a developer to leave Upcart?</summary><div class="faq__a"><p>Not for Addy. Custom JSX does not come with you, which is the point. Rebuild the one upsell and the bar. Leave the rest of the canvas behind.</p></div></details>
<details><summary>What should I rebuild on the first day?</summary><div class="faq__a"><p>The progress line, the line items, one complement, a delivery window, and checkout. Leave gift wrap, a timer, and a second upsell until that drawer has taken a real order.</p></div></details>
<details><summary>Can both drawers stay installed while I decide?</summary><div class="faq__a"><p>No. Disable one embed before you enable the next. Two listeners on add to cart is a drawer that looks stale.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>What You Can&apos;t Edit in a Shopify Order (and Workarounds)</title>
      <link>https://ninety9.dev/blog/what-you-cant-edit-in-a-shopify-order.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/what-you-cant-edit-in-a-shopify-order.html</guid>
      <pubDate>Tue, 13 Oct 2026 09:00:00 GMT</pubDate>
      <category>Retention &amp; Post-Purchase</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>What Shopify will not let you change on an order, what a customer can change before fulfilment, and the honest workarounds after that.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Before fulfilment, a customer can change address, shipping method, variants, quantities and items. <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> puts that in customer accounts.</li><li>After fulfilment, the edit window is closed. The workaround is a return, an exchange or store credit, not a pretend edit.</li><li>You cannot bolt on postal-address validation, a 3PL push, or POS from Reviso. Those orders stay with staff or with a system built for them.</li><li>The payment method and a fulfilled shipment are not &quot;just another edit&quot;. Refund, reorder, or exchange.</li></ul></section>
<p>Shopify lets a merchant edit some unfulfilled orders in the admin. Customers cannot, unless you give them a screen. The screen still cannot do everything a support agent wishes it could. Here is the split, and the workaround that is actually available.</p>
<h2 id="before-fulfilment">Before fulfilment</h2>
<p><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> lets the customer change, in their account:</p>
<ul>
<li>Shipping address</li>
<li>Shipping method</li>
<li>Variant, such as a size or a colour</li>
<li>Quantity</li>
<li>Which items are in the order</li>
</ul>
<p>It looks like Shopify, because a custom &quot;order portal&quot; is where people lose trust. Rules can limit this by country, customer tag or the order itself. A made-to-order line can be excluded while a shelf SKU stays editable.</p>
<p>If they are trying to cancel instead of edit, the cancel path can offer a discount or a gift first. That flow is in <a href="/blog/how-to-let-customers-cancel-shopify-order.html?src=Ninety9Blog">how to let customers cancel</a>.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/reviso/icon.png" alt="Reviso: Order editing &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Reviso: Order editing &amp; Upsell</p>
<p class="appcta__text">Post-purchase self-service order editing with cancellation deflection and AI upsells.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="what-stays-locked">What stays locked</h2>
<div class="tablewrap"><table><thead><tr><th>They want</th><th>What is possible</th></tr></thead><tbody>
<tr><td>A different size, unfulfilled</td><td>Edit the variant</td></tr>
<tr><td>A new ship-to address, unfulfilled</td><td>Edit the address. No postal API checks it</td></tr>
<tr><td>A cheaper shipping method, unfulfilled</td><td>Change the method</td></tr>
<tr><td>A different card</td><td>Refund and a new order. Not an edit</td></tr>
<tr><td>A change after the label exists</td><td>Return, exchange, or store credit</td></tr>
<tr><td>An edit inside a 3PL that already has the order</td><td>Staff, in the warehouse system. <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog">Reviso</a> does not push to a 3PL</td></tr>
<tr><td>A POS sale from the counter</td><td>Not this app</td></tr>
</tbody></table></div>
<p>Reviso is free. It does not add address validation, a warehouse integration, or a POS mode. Those are not on a later plan. They are out of scope. Shipping the feature anyway would mean an address field that claims to be verified and is not.</p>
<h2 id="after-fulfilment">After fulfilment</h2>
<p>The workaround is a returns flow: send it back, exchange it, or take store credit. Reviso includes that, still in the customer account, still in Shopify&#39;s own visual language. It is slower than an edit. It is the operation the carrier allows.</p>
<p>Do not keep the edit button visible on a fulfilled order with a note that says &quot;contact us&quot;. Hide it. A button that errors is how people open a dispute.</p>
<h2 id="what-staff-still-do">What staff still do</h2>
<p>Orders with a tag you excluded. Anything a 3PL has accepted. POS. Payments. The odd address that is deliverable only because a human noticed the missing apartment number. Self-serve is for the typo and the size. It is not a plan to empty the support queue of judgement.</p>
<h2 id="where-the-order-is-and-what-that-allows">Where the order is, and what that allows</h2>
<p>An order moves through states. The edit window is the early ones. After the label exists, you are in returns, even if the customer still says &quot;edit&quot;.</p>
<div class="tablewrap"><table><thead><tr><th>State</th><th>Address, size, quantity</th><th>Payment method</th><th>Practical path</th></tr></thead><tbody>
<tr><td>Paid, not picked</td><td><a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a> can open those edits</td><td>Locked. A new card is a refund and a new order</td><td>Self-serve</td></tr>
<tr><td>Picked, or already sent to a 3PL</td><td>Locked, even if Shopify still says unfulfilled</td><td>Locked</td><td>Staff, in the warehouse system</td></tr>
<tr><td>Label bought, in transit</td><td>Locked</td><td>Locked</td><td>Return, exchange, or store credit when it comes back</td></tr>
<tr><td>Delivered</td><td>Locked</td><td>Locked</td><td>The returns window you actually publish</td></tr>
</tbody></table></div>
<p>Reviso closes the edit options at fulfilment. It does not update a third-party warehouse, so a picked order can be &quot;unfulfilled&quot; in Shopify and already gone from your point of view. Tag those orders out of self-serve. There is no postal-validation API behind the address field. A customer can correct an apartment number and can also type a street that does not exist. Staff still read the odd one. Shipping the feature as if it verified addresses would be false.</p>
<p>Payment is the request that sounds like an edit and is not one. &quot;Can I use the other card?&quot; means refund this payment and take a new one. Say that in the reply. A button labelled &quot;change payment&quot; that errors is how the dispute starts.</p>
<h2 id="a-typo-versus-a-new-order">A typo versus a new order</h2>
<p>Example. The order is a medium shirt, $48, address missing the apartment. Before fulfilment they can set the apartment and switch to large, in their account, in Shopify&#39;s own layout. The order number stays. You pack the large.</p>
<p>The same shirt, already handed to the carrier. They want large. The edit button should be gone. The return or the exchange is the path, including store credit if that is the policy you run. Reviso includes that tooling: windows, reasons, exchanges, store credit, items you will not take back. It is slower than an edit. It is what the carrier allows. An exchange they start themselves is still cheaper than a ticket that sits until Monday.</p>
<p>If they are cancelling rather than editing, one discount or one gift can be offered first. The flow is in <a href="/blog/how-to-let-customers-cancel-shopify-order.html?src=Ninety9Blog">how to let customers cancel</a>. After they decline, the cancel completes. Do not keep an edit button on a fulfilled order with a note that says &quot;contact us&quot;. Hide it.</p>
<p>Adding a product during the edit is a choice they make on that screen. Reviso can show a recommendation there, from the order and from what they viewed. It is an add with a yes. It is not a line that lands because they opened the page. It also does not replace the offer you should have made before they paid. That work sits on the product page and in the cart.</p>
<h2 id="what-to-tell-support-to-stop-doing">What to tell support to stop doing</h2>
<p>Write the split on a card.</p>
<ul>
<li>Unfulfilled, not in the warehouse: send them the account link.</li>
<li>In the warehouse or fulfilled: start a return or tell them the cutoff has passed.</li>
<li>Payment, POS, excluded tags: staff only.</li>
<li>Address that looks impossible: staff, because nothing in the app will call a postal database.</li>
</ul>
<p>The comparison with other editors is in <a href="/blog/best-shopify-order-editing-apps-2026.html?src=Ninety9Blog">best Shopify order editing apps</a>. The longer operating picture is in the <a href="/blog/shopify-order-editing-guide.html?src=Ninety9Blog">order editing guide</a>.</p>
<p>Install <a href="https://apps.shopify.com/reviso-order-editor?src=Ninety9Blog" target="_blank" rel="noopener">Reviso</a>. The window is before the label. After the label, the workaround is a return.</p>
<h2 id="partial-shipments">Partial shipments</h2>
<p>Some orders leave in pieces. One line is fulfilled. Another is still on the shelf. Shopify can show that split. A customer will still say &quot;change my order&quot; and mean the line that has not moved.</p>
<p>Do not assume self-serve can express that cleanly. Reviso closes edits when the order is fulfilled. A half-shipped order is close enough to committed that the safe policy is staff, until you have placed a test order in that exact state and seen a screen you would send a customer to. If the screen offers to edit the line that is already on a truck, hide the button and handle it yourself.</p>
<p>The line still on the shelf can be changed by staff in admin. The line on the truck is a return when it arrives. Say which is which in the reply. &quot;We can still change the unshipped item. The one that left has to come back if it is wrong.&quot; That sentence prevents the argument where they think the whole order was editable because one line was.</p>
<h2 id="money-that-is-not-an-edit">Money that is not an edit</h2>
<p>A discount they forgot to apply is not an edit of the product. If you choose to honour it, that is a refund of the difference or a new discount on this order, done by staff, with the code checked against your combination rules. It is not a variant change. Reviso will not invent a code that was never entered.</p>
<p>Store credit on a return is a later step. It belongs in the returns settings: the window, the reasons, what you will not take back, and whether credit is the refund. Publish the window you keep. A 30-day promise with a 14-day setting is how &quot;the app is broken&quot; tickets start.</p>
<p>Taxes and duties on an address change can move the total. If they change country before fulfilment, expect the total to change and show them the new total before they confirm. If your rules block cross-border address edits, say so. A blocked edit with no sentence looks like a bug. A blocked edit that says &quot;we only ship this order inside the country it was placed in&quot; is a policy.</p>
<p>The screen is free to install. It is not an address-validation product, a warehouse integration, or a POS tool. Those stay outside it on every plan. Use it for the apartment number and the size. Use people for the rest.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>Can I edit a Shopify order after it ships?</summary><div class="faq__a"><p>Not usefully. The carrier has the parcel. Reviso closes edits at fulfilment. Use a return or an exchange.</p></div></details>
<details><summary>Can a customer change the address before it ships?</summary><div class="faq__a"><p>Yes, in Reviso, until fulfilment. There is no postal-validation API behind that field. A typed address can still be wrong. Staff still catch the ones that look impossible.</p></div></details>
<details><summary>Can they swap the payment method?</summary><div class="faq__a"><p>No. A different card is a new payment, which means a refund and a new order, or a checkout link. Do not describe that as editing the order.</p></div></details>
<details><summary>What about orders already sent to a 3PL?</summary><div class="faq__a"><p>Reviso does not update a third-party warehouse. If the warehouse has the order, treat it as committed even if Shopify still says unfulfilled. Exclude those orders from self-serve edits.</p></div></details>
<details><summary>Can in-store POS orders be edited the same way?</summary><div class="faq__a"><p>No. Reviso is not a POS tool. Keep counter orders on the process the store already uses.</p></div></details>
<details><summary>The order is unfulfilled in Shopify, but the warehouse already has it. Can they edit?</summary><div class="faq__a"><p>Treat it as committed. Reviso does not push a change to a 3PL. Exclude those orders, even if Shopify still says unfulfilled.</p></div></details>
<details><summary>Can they add a product while they edit?</summary><div class="faq__a"><p>They can change items before fulfilment. A recommendation on that screen is an add they choose. It is not a line that appears on its own.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>10 cart drawer upsells that work during BFCM</title>
      <link>https://ninety9.dev/blog/cart-drawer-upsells-bfcm.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/cart-drawer-upsells-bfcm.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>Cart &amp; Checkout</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Ten Shopify cart drawer upsells that hold up on Black Friday and Cyber Monday: what to show, where it sits, and the offers that annoy a committed shopper.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>The cart drawer is a confirmation. BFCM upsells should add to a decision the shopper already made, not ask them to reconsider it.</li><li>Two blocks is the ceiling: one progress goal and one product. A third offer lowers the take rate of the first two.</li><li>Price the added product well below the hero. If it costs as much as the thing they came for, it is a second purchase, and they will defer it.</li><li>A delivery date and a clear checkout button outrank a clever offer. If either is missing, the upsell will not be reached.</li></ul></section>
<p>A cart drawer upsell during BFCM is a single add shown after the shopper has put something in the bag, inside the slide-out cart, before they go to checkout. Black Friday shoppers are impatient and already swimming in discounts. The drawer should confirm the bag, show what shipping will cost, and offer one more thing that belongs there.</p>
<p><a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy</a> is that drawer. It drafts a cart from the catalogue and the brand, then you edit it: in-cart upsells, volume deals, a shipping goal, gifts, a delivery date, shipping protection, and a different cart by market or customer tag. It is free to install from the <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy listing</a>. The year-round ranking of offers is <a href="/blog/in-cart-upsells-that-convert.html?src=ninety9dev">in-cart upsells that convert</a>. This list is the ten we would actually leave on for 27 to 30 November.</p>
<figure><img src="/assets/img/blog/ui-cart.jpg" alt="Simplified cart drawer with a progress bar, the items, one suggestion and checkout" loading="lazy" decoding="async"><figcaption>Progress, what they already chose, one suggestion, then checkout.</figcaption></figure>
<p>Read that drawer from top to bottom the way a thumb does. A progress line. The items already chosen. One suggestion. Checkout, large. If you insert a gallery and a second recommendation above checkout, you have built a page inside the drawer, and the reason they opened it was to pay.</p>
<p>The products in the example are placeholders. What you copy is the order of the blocks. One commercial offer plus the progress is the ceiling for Friday.</p>
<h2 id="1-the-pair-they-already-buy">1. The pair they already buy</h2>
<p>One product, chosen because it shows up in the same orders as the hero. Not a &quot;you may also like&quot; row of eight. Under the line items, above checkout. If you do not know the pair, use order history rather than a collection guess. <a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly</a> can own the set on the product page. The drawer should not repeat a different pair and make them pick twice.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addy/icon.png" alt="Addy: AI Cart Drawer &amp; Bundles app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addy: AI Cart Drawer &amp; Bundles</p>
<p class="appcta__text">AI cart drawer with in-cart upsells, volume bundles, free shipping bars and per-Market targeting.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="2-the-quantity-step-on-the-line-they-just-added">2. The quantity step on the line they just added</h2>
<p>&quot;Add one more, save a little&quot; on the consumable already in the cart. Same decision, less doubt. This outperforms a stranger product when the hero is something people use up. Keep the tier honest. If three units are a worse deal than the sitewide code, they will notice.</p>
<h2 id="3-the-free-shipping-gap-with-a-product-that-closes-it">3. The free-shipping gap, with a product that closes it</h2>
<p>If they are $16 short, show one product around that price, not a lecture. The threshold itself is <a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a>, and the number should be the one you calculated in <a href="/blog/free-shipping-threshold-bfcm.html?src=ninety9dev">the BFCM free shipping threshold</a>. The drawer is where the bar is believable, because the total is on the same screen.</p>
<h2 id="4-the-gift-rung-once-shipping-is-cleared">4. The gift rung, once shipping is cleared</h2>
<p>Shoppers who already earned free shipping need a next reason. A small gift at a higher spend, revealed when the first goal is met. Not all three goals shouted at a $20 cart. <a href="/blog/holiday-free-gift-with-purchase-ideas.html?src=ninety9dev">Holiday gift ideas</a> for what the gift should be. <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev">Addy</a> can show the progress in the drawer. <a href="https://apps.shopify.com/goalify?src=ninety9dev">Goalify</a> can own the rule.</p>
<h2 id="5-gift-wrap-or-a-note-as-a-one-tap-add">5. Gift wrap or a note, as a one-tap add</h2>
<p>BFCM is gifts. A wrap, a pouch, or a written note is an add-on people understand immediately. Full price is fine. Do not hide it behind a bundle builder inside the drawer. One line, one price, one tap.</p>
<h2 id="6-shipping-protection-stated-as-a-choice">6. Shipping protection, stated as a choice</h2>
<p>A small protection fee, opted in or out in the drawer, next to the total. It is not an upsell in the romantic sense. It is a yes/no that belongs before checkout so it is not a surprise. Say what it covers in one line. If you cannot say it, do not show the toggle.</p>
<h2 id="7-a-delivery-date-beside-the-total">7. A delivery date beside the total</h2>
<p>Gift buyers ask one question. When does it arrive? An estimated window in the drawer answers it while they can still add or remove. If you are quoting a range, quote a range you can hit. A date you invented on Thursday is a chargeback story in December.</p>
<h2 id="8-a-short-announcement-not-a-second-ad">8. A short announcement, not a second ad</h2>
<p>One line: order cutoff for arrival before a holiday date, or the hour the code ends. Not a rotating banner of three campaigns. <a href="/blog/fomo-blocks-in-the-cart-drawer.html?src=ninety9dev">FOMO blocks</a> work when the fact is real. A fake &quot;12 people are viewing this&quot; on every SKU is how a serious shopper loses trust on the busiest day of the year.</p>
<h2 id="9-a-different-cart-for-a-different-market">9. A different cart for a different market</h2>
<p>The US bar, the EU bar, and the wholesale tag should not share one drawer. Addy can run a different cart, or a different block, by market and by customer tag. Use it for the threshold and the delivery promise. Do not use it to hide the price.</p>
<h2 id="10-one-countdown-that-matches-the-real-end">10. One countdown that matches the real end</h2>
<p>If the offer ends Monday night, a countdown to that moment is fair. A countdown that resets is not. Put it on the announcement or the goal, not on every line item. Urgency on top of urgency reads as noise, and noise is what shoppers close.</p>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>The checkout button stays put</p>
<p>On a phone, checkout has to be visible without scrolling past a gallery. If the upsell pushes it away, delete the upsell. The <a href="/blog/shopify-cart-drawer-complete-guide.html?src=ninety9dev">cart drawer guide</a> is the layout. Two blocks, then the button.</p>
</aside>
<p>Build the drawer before the week of the sale. Place a test order. Open it on a phone. If the pair, the bar and the date are all competing for the top, keep the date and the bar, and move the pair under the lines.</p>
<p>Then watch one ratio on Saturday: upsell adds divided by drawer opens, next to checkout completion. A clever offer that lowers checkout completion is not an upsell. It is a tax on the sale you already had. Take it out the same day.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is the best cart drawer upsell for Black Friday?</summary><div class="faq__a"><p>The product people already buy with the hero, priced clearly below it, placed under the line items. A quantity step-up on the item in the cart is even easier, because it is the same decision. A grid of eight recommendations is the version that gets ignored.</p></div></details>
<details><summary>How many upsells should a Shopify cart show during BFCM?</summary><div class="faq__a"><p>One product offer, plus the shipping or gift progress if you have it. More than that pushes the checkout button down on a phone, which costs more orders than the extra offer can win.</p></div></details>
<details><summary>Should cart upsells be discounted on Black Friday?</summary><div class="faq__a"><p>Only if the campaign story needs a reason to add it now. A useful accessory can sit at full price. An extra percent off everything in the drawer trains shoppers to expect the add-on to be cheap all weekend, including people who would have added it anyway.</p></div></details>
<details><summary>Do cart drawer apps slow the store on Black Friday?</summary><div class="faq__a"><p>They do if they block the first paint of the product page. A drawer that loads when the cart opens, as a theme app extension, stays out of that path. Still place a test order on a phone on cellular before you scale ads.</p></div></details>
<details><summary>Can different countries see different cart upsells?</summary><div class="faq__a"><p>Yes. A domestic cart and an international cart should not share a shipping goal or a delivery promise. Market and customer-tag rules exist so a wholesale buyer does not see the retail gift.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>10 quantity break examples for Black Friday and Cyber Monday</title>
      <link>https://ninety9.dev/blog/quantity-breaks-black-friday-cyber-monday.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/quantity-breaks-black-friday-cyber-monday.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Ten Shopify quantity break examples for Black Friday and Cyber Monday, with tier maths, variant pricing and the margin check before you publish the ladder.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Black Friday quantity break lets someone buy one at the campaign price and rewards the second and third unit. It is not a sitewide code with extra steps.</li><li>Price each tier from gross profit per unit after the campaign discount. A louder break that loses money on unit three is a bad weekend.</li><li>Put the ladder on the variant you need to move. A break on &quot;any size&quot; will clear the popular size and leave the one you are long on.</li><li>One ladder on the hero. A second conflicting percent-off on the same SKU makes the tiers look like a trick.</li></ul></section>
<p>A quantity break for Black Friday and Cyber Monday is a price ladder on a single Shopify product: pay the campaign price for one, a little less per unit for two, a little less again for three. It raises units per order without requiring a deeper sitewide discount. The single-unit buyer is unharmed. The stock-up buyer has a reason.</p>
<p><a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly</a> runs these tiers, including on one variant, plus the bundles and add-ons around them. Free under 15 orders a month, then $9.99, $24.99 and $49.99, same features on each plan. Install from the <a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly listing</a>. The principle, with the margin trap, is <a href="/blog/quantity-breaks-vs-volume-discounts.html?src=ninety9dev">quantity breaks versus volume discounts</a>. The ten below are BFCM examples you can copy the shape of, then replace with your cost.</p>
<figure><img src="/assets/img/blog/ui-qty.jpg" alt="Simplified quantity break, one at twenty-four dollars, two at twenty-two each, three at twenty each" loading="lazy" decoding="async"><figcaption>The word each is on the row. Add to cart does not change.</figcaption></figure>
<p>This is the ladder. One unit at the campaign price. Two and three show a lower price each, and the word each is on the row so nobody thinks $22 is the price of both. Add to cart does not move and does not get a second label.</p>
<p>Two failures show up the moment you compare your own widget to that one. The first is a badge on the regular price, so every tier looks like a deal and none of them do. The second is a third tier so deep that the per-unit profit no longer covers the product, let alone the free-shipping label that three units just triggered. If tier three is the one that loses money, delete tier three before Friday. You can still sell three at the tier-two price.</p>
<p>Black Friday 2026 is 27 November. Cyber Monday is 30 November. Publish one ladder before Friday and leave it up through Monday. Changing the steps on Sunday is how your best customers feel tricked.</p>
<h2 id="how-to-read-the-examples">How to read the examples</h2>
<p>Each example assumes a campaign price you have already chosen for one unit. The break is extra, on top of that, not instead of a secret second code. Gross profit is illustrative. Yours will differ. If you cannot fill the cost column, you are not ready to publish the tier.</p>
<div class="tablewrap tablewrap--scroll"><table><thead><tr><th>Example</th><th>One unit</th><th>Two units each</th><th>Three units each</th><th>Who it is for</th></tr></thead><tbody>
<tr><td>Daily consumable</td><td>$24</td><td>$22</td><td>$20</td><td>Refills, coffee, supplements</td></tr>
<tr><td>Gift pair</td><td>$48</td><td>$44</td><td>—</td><td>&quot;One for you, one to give&quot; stops at two</td></tr>
<tr><td>Mini set of a hero</td><td>$18</td><td>$16</td><td>$15</td><td>Stocking fillers bought in handfuls</td></tr>
<tr><td>Variant you are long on</td><td>$36</td><td>$32</td><td>$30</td><td>The size that is not the bestseller</td></tr>
<tr><td>Sample flight turned full size</td><td>$28</td><td>$25</td><td>—</td><td>They tried the mini, two full sizes is the step</td></tr>
</tbody></table></div>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-the-refill-ladder">1. The refill ladder</h2>
<p>$24, $22, $20 on a product people finish. Three is a season, not a warehouse. Stop at three unless your cost still works at four. State &quot;per unit&quot; so nobody thinks $20 is the price of all three.</p>
<h2 id="2-two-as-a-gift-and-stop">2. Two as a gift, and stop</h2>
<p>$48 each for one, $44 each for two, no third tier. The story is a gift, not a stock-up. A third tier on a giftable hero attracts resellers and clutter more than it attracts households.</p>
<h2 id="3-three-minis">3. Three minis</h2>
<p>$18, $16, $15 on a mini candle, soap or sample. The landing is a stocking table. Cap it, because minis are how a cart fills with units that do not cover a heavy label. If three minis still do not clear shipping, the threshold is a separate problem, solved in <a href="/blog/free-shipping-threshold-bfcm.html?src=ninety9dev">the BFCM shipping bar</a>, not by a fourth mini at a loss.</p>
<h2 id="4-the-size-you-need-to-clear">4. The size you need to clear</h2>
<p>The popular size stays at the campaign price with a gentle break. The size you are long on gets the steeper ladder. <a href="https://apps.shopify.com/addly?src=ninety9dev">Addly</a> can target the discount at a variant. A storewide &quot;any size, buy 3&quot; will do the opposite of what the stockroom needs.</p>
<h2 id="5-the-pantry-step">5. The pantry step</h2>
<p>Food and coffee: one bag, three bags, six bags. Six only if the per-unit profit still pays for the heavier parcel. Write the weight change into the tier decision. A sixth bag that bumps the shipment into a new bracket can wipe the break you thought you earned.</p>
<h2 id="6-the-beauty-routine-same-sku">6. The beauty routine, same SKU</h2>
<p>Cleanser or oil they can decant into a second bathroom. Two is the natural tier. Three is optional and should be priced only if subscription-like stocking up is real for you. Do not invent a subscribe-and-save story inside the quantity widget if you are not running subscriptions. The break is a one-time ladder.</p>
<h2 id="7-the-team-or-household-pack">7. The team or household pack</h2>
<p>Four units as the top tier, named &quot;household&quot; or &quot;team,&quot; for socks, bottles, basics. The middle tier is two. Skip a silly one-unit &quot;discount&quot; that is just the normal price with a badge. Badges on the regular price make the real break look fake.</p>
<h2 id="8-the-colourway-that-is-not-the-hero-colour">8. The colourway that is not the hero colour</h2>
<p>Same product, the holiday colour or the quiet colour, with a stronger per-unit break than the core colour. You are buying clearance of a variant without putting the core on a deeper code. When that colour hits your reserve, remove the tier the same day.</p>
<h2 id="9-cyber-monday-same-ladder-new-hero">9. Cyber Monday, same ladder, new hero</h2>
<p>Monday does not need new maths. It needs the product you still have. Keep Friday&#39;s tiers. Move the widget to the SKU that survived Saturday. A fresh 40% third unit on Monday, after a milder Friday, is how your Friday buyers ask for a refund of the difference.</p>
<h2 id="10-the-break-that-stops-before-free-shipping-doubles-up">10. The break that stops before free shipping doubles up</h2>
<p>If three units always clear free shipping, you are paying the break and the label. That can be fine if you meant to. It is not fine if you did not add the label cost into unit three. Do the addition on paper. <a href="/blog/bundle-discount-margin-maths.html?src=ninety9dev">Bundle discount maths</a> is the same muscle, applied to a set. Use it on the tier too.</p>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Unit three has to clear cost</p>
<p>Campaign price minus the tier discount, minus unit cost, minus the shipping share if this tier is what triggers free shipping. If that number is negative, the tier is a promotion you are paying customers to take.</p>
</aside>
<p>Put the ladder under the price on the product page, not in a popup that hides it. The cart can repeat a one-line reminder. <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy</a> is the drawer for that reminder. It should not show a different quantity price than the product page. One ladder, one place that owns it.</p>
<p>On Saturday, split orders of that SKU into one unit, two, and three. You want the share that took a tier, and the gross profit per order at each tier, not a blended average. If almost everyone stayed on one unit, the step is too small to notice or the widget is below the fold. If everyone jumped to three and profit per order fell, the tier is too deep. Change the price, not the story, and leave the new ladder up through Monday.</p>
<p>Through Monday night, then off. A quantity break that quietly becomes the permanent price is a decision for January, made with the attach rate in front of you, not a leftover from the weekend.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is a quantity break on Black Friday?</summary><div class="faq__a"><p>Tiered pricing on one product. One unit at the campaign price, two units a bit less each, three units a bit less again. The shopper who wants a single gift can still buy one. The shopper who can use more sees a reason to add it now, through Cyber Monday, without you cutting the single-unit price further.</p></div></details>
<details><summary>How deep should Black Friday quantity breaks go?</summary><div class="faq__a"><p>Deep enough to notice, shallow enough that unit three still clears your cost plus the shipping you might throw in. On many consumables that is a small step, a few percent, not a half-off third unit. Run the profit per unit at each tier before you publish. If tier three is the one that loses money, delete tier three.</p></div></details>
<details><summary>Should Cyber Monday use a different quantity break than Black Friday?</summary><div class="faq__a"><p>Only if the product or the stock position changed. A new ladder on Monday teaches people to wait. Keep the same tiers from Friday through Monday, with a published end. Change the hero if you sold out, not the maths, mid-weekend.</p></div></details>
<details><summary>Can quantity breaks target one variant?</summary><div class="faq__a"><p>Yes, and they should when sizes or colours have different stock and different costs. A break on every variant will empty the bestseller and do nothing for the size you are long on. Target the tier at the variant you can afford to multiply.</p></div></details>
<details><summary>Do quantity breaks replace a bundle?</summary><div class="faq__a"><p>No. A quantity break is more of the same product. A bundle is a different product, or a mix. Use the break on things people repurchase. Use a <a href="/blog/black-friday-bundle-ideas-shopify.html?src=ninety9dev">Black Friday bundle</a> when the second item is a companion, not a twin.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>12 Black Friday bundle ideas for Shopify stores (with examples)</title>
      <link>https://ninety9.dev/blog/black-friday-bundle-ideas-shopify.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/black-friday-bundle-ideas-shopify.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>Bundles &amp; Upsells</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Twelve Black Friday bundle ideas for Shopify, with pricing examples, margin checks and where each offer belongs on the product page.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>A Black Friday bundle should add a product the shopper was likely to want, not a second decision that needs a huge discount to justify itself.</li><li>Price the set from landed cost and cannibalisation, then publish one bundle per hero product. A wall of sets is a catalogue, not an offer.</li><li>Frequently bought together from real orders beats a merchandiser&#39;s guess during BFCM, because the pairing is already proven at full price.</li><li>Keep the bundle under the add-to-cart button. The hero product still has to be buyable in one tap on a phone.</li></ul></section>
<p>A Black Friday bundle on Shopify is a set, a pair, or a build-your-own box offered at one clear price during the BFCM weekend. The job is to raise <a href="/blog/how-to-increase-average-order-value-shopify.html?src=ninety9dev">average order value</a> without turning the product page into a discount warehouse. The shopper already came for a deal. The bundle should make the next unit obvious.</p>
<p>Black Friday 2026 falls on 27 November, with Cyber Monday on 30 November. That is a short window. Build the sets in October, price them from margin, and leave the product page with one offer a thumb can accept.</p>
<figure><img src="/assets/img/blog/ui-bundle.jpg" alt="Simplified bundle widget with three products, a total and one add button" loading="lazy" decoding="async"><figcaption>Three products, each price visible, a total, and one button. That is the bundle.</figcaption></figure>
<p>That card is the offer. Three products, each price visible, a total, and one button. If the set needs a paragraph, it is not ready.</p>
<p>Three details are doing the work. The products should come from orders, so the pair is already a habit at full price. Both prices are on the card, so the deal can be checked in a second. And there is one action. A bundle that asks for three separate adds is three chances to buy only the hero.</p>
<p><a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly</a> is the <a href="https://apps.shopify.com/addly?src=ninety9dev">Shopify bundles app</a> we use for these: frequently bought together, fixed sets, mix and match, quantity breaks, add-ons and offers drawn from real orders. It is free under 15 orders a month, then $9.99, $24.99 and $49.99, with the same offer types on every plan. Install it from the <a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly listing</a>.</p>
<h2 id="what-a-black-friday-bundle-has-to-do">What a Black Friday bundle has to do</h2>
<p>The set has to be understandable in one glance on a phone, priced so the added unit still makes money, and placed where it does not block add to cart. If any of those three fail, a bigger percent-off will not save it.</p>
<div class="tablewrap"><table><thead><tr><th>Bundle</th><th>Best for</th><th>Discount shape</th><th>Watch-out</th></tr></thead><tbody>
<tr><td>Fixed pair</td><td>A hero with one proven companion</td><td>10–15% on the added item</td><td>Do not discount the hero as well</td></tr>
<tr><td>Mix and match</td><td>Gifts, shades, flavours</td><td>Price break at 3 and 6 units</td><td>Too many choices freeze the tap</td></tr>
<tr><td>Frequently bought together</td><td>Anything with order history</td><td>Small set discount, or none</td><td>Ignore category guesses</td></tr>
<tr><td>Add-on</td><td>A cheap completion (wrap, case, sample)</td><td>Optional, often full price</td><td>Do not make it required</td></tr>
</tbody></table></div>
<p>The rest of this guide is twelve shapes that fit that table. Pick two for the weekend, not twelve.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/addly/icon.png" alt="Addly: AI Bundles app &amp; Upsell app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Addly: AI Bundles app &amp; Upsell</p>
<p class="appcta__text">Product bundles, quantity breaks, volume discounts and AI-recommended offers for Shopify.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="1-the-proven-pair">1. The proven pair</h2>
<p>Pull the last 90 days of orders. Find the product that most often sits in the same order as the hero, priced well below it. That pair is the Black Friday bundle. A moisturiser and the serum people already add. A device and the case. Offer the pair under the button as one add.</p>
<p>If you do not have the report, <a href="/blog/frequently-bought-together-shopify.html?src=ninety9dev">frequently bought together on Shopify</a> is the method. <a href="https://apps.shopify.com/addly?src=ninety9dev">Addly</a> can build the set from purchase history instead of a merchandiser&#39;s hunch, which matters when the weekend is too short to test ten guesses.</p>
<h2 id="2-the-gift-box-they-build">2. The gift box they build</h2>
<p>Mix and match is the holiday bundle for stores with many small SKUs: shades, flavours, samples, charms. &quot;Choose any 3&quot; at one price. Cap the choice at one collection so the box still looks like a gift, not the whole catalogue.</p>
<p>Show the running total as they add. A shopper who cannot see the price until the end abandons the box and buys the single hero, which is the opposite of a Black Friday bundle.</p>
<h2 id="3-the-stocking-trio">3. The stocking trio</h2>
<p>Three low-priced items, preselected, sold as one stocking stuffer. This is a fixed bundle, not a builder. The value is the editing. You did the choosing. Price it so one trio is an easy add next to a larger gift, and do not also run a sitewide 40% code on the same SKUs or the trio stops being a deal.</p>
<h2 id="4-hero-plus-the-refill">4. Hero plus the refill</h2>
<p>Sell the device, the bottle, or the starter with the refill in the same set. The refill is the unit they will need in January. A small discount on the refill only. The hero stays at the campaign price you already planned. This protects margin better than a blanket percent off both.</p>
<h2 id="5-complete-the-routine">5. Complete the routine</h2>
<p>Skincare, coffee gear, hair, pet: three steps, one bundle. Name the steps in the title (&quot;cleanse, treat, seal&quot;) so the shopper does not have to open three product pages. Keep it to three. A five-step routine is a regimen they will not assemble on a Friday night phone.</p>
<h2 id="6-the-add-on-under-the-button">6. The add-on under the button</h2>
<p>Gift wrap, a travel cap, a pouch, a sample of the adjacent scent. This is a product add-on, not a second bundle widget. One checkbox. Full price is fine when the add-on is obviously useful. A discount on a $6 pouch does less than simply showing it.</p>
<h2 id="7-two-of-the-same-for-a-gift">7. Two of the same, for a gift</h2>
<p>&quot;One for you, one to give&quot; is a two-unit fixed bundle of the same hero, lightly discounted versus two singles. It is different from a quantity break, which is a ladder of 1, 2 and 3 on the product itself. Use the bundle when the story is a gift. Use the <a href="/blog/quantity-breaks-black-friday-cyber-monday.html?src=ninety9dev">quantity break</a> when the story is stocking up.</p>
<h2 id="8-shade-or-flavour-flight">8. Shade or flavour flight</h2>
<p>A set of three variants of one product: mini candles, sample perfumes, coffee bags. Mix and match if they should choose, a fixed flight if you want zero decisions. Variant-level pricing matters here. If one shade costs you more, do not let the bundle pretend every shade has the same margin.</p>
<h2 id="9-the-host-set">9. The host set</h2>
<p>For food, drink and home: the thing guests use together. Glasses plus a mixer. A throw plus the candle. Price the set under the cost of buying both at the campaign price, by a small gap, not a dramatic one. The host set fails when it includes a product nobody reorders, because then you trained a one-time basket with a permanent discount.</p>
<h2 id="10-the-travel-edit">10. The travel edit</h2>
<p>Minis and travel sizes in one bundle. Landed cost is low, perceived value is high, and the set does not replace the full-size hero if you keep full sizes out of the bundle. This is the same logic as a <a href="/blog/free-gift-with-purchase-strategy.html?src=ninety9dev">free gift with purchase</a>, except the shopper pays, which is kinder to margin during a weekend when everyone expects something free.</p>
<h2 id="11-the-last-chance-colourway">11. The last-chance colourway</h2>
<p>A holiday colour or a limited sleeve, bundled with the core product so the limited piece does not have to carry the page alone. When the limited unit sells out, hide the bundle the same day. A Black Friday bundle that shows an unavailable piece reads as a broken page, and broken pages do not convert at 9pm on 27 November.</p>
<h2 id="12-the-set-that-clears-free-shipping">12. The set that clears free shipping</h2>
<p>Build one bundle whose price sits just over your free-shipping threshold. The shopper feels two wins: the set, and shipping. Do not also slash the threshold that weekend or the bundle loses its job. The threshold maths is in <a href="/blog/free-shipping-threshold-bfcm.html?src=ninety9dev">how to set a BFCM free shipping threshold</a>. <a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a> can show the bar. Addly presents the set.</p>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Price the added unit, not the headline percent</p>
<p>A 20% sitewide code on a bundle that was already 15% off is an effective discount nobody modelled. Exclude bundles from the deepest code, or the set becomes the worst margin order of the weekend.</p>
</aside>
<figure><img src="/assets/img/blog/ui-addon.jpg" alt="Simplified add-on row for gift wrap under the main product" loading="lazy" decoding="async"><figcaption>Gift wrap is its own line, at its own price, not folded into the set discount.</figcaption></figure>
<p>The set and the wrap are different decisions. The set is the considered extra. The wrap is a completion, and it can sit at full price. Discounting both, and then letting a sitewide code hit them again, means you no longer know which discount the order used.</p>
<p>A margin check before you publish a pair. Hero at a $48 campaign price, $22 landed. Companion at $18, $6 landed. Fifteen percent off the companion only costs you $2.70, against about $12 of gross profit on that added unit, and the hero stays at the price you already planned. Twenty percent off the whole $66 set gives away $13.20, including on a hero you were going to sell anyway. The louder version often makes less money. Run the same subtraction on your costs. If you cannot fill in landed cost, the bundle is not ready for the ad.</p>
<h2 id="what-to-publish-and-what-to-leave-off">What to publish, and what to leave off</h2>
<p>Publish one bundle on each hero, plus quantity breaks only on the consumables. Put <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy</a> behind the set if the second unit should also appear in the cart drawer, and keep the drawer to one extra offer. The <a href="/blog/shopify-product-bundles-guide.html?src=ninety9dev">product bundles guide</a> covers the types. The <a href="/blog/bundle-discount-margin-maths.html?src=ninety9dev">margin maths</a> covers the discount you can afford.</p>
<p>If the page is already crowded, run the <a href="/cro-audit/?src=ninety9dev">CRO Audit for Shopify stores</a> on the hero URL before you add a fourth widget. A bundle under a buried add-to-cart button will not be seen.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What is a good Black Friday bundle discount on Shopify?</summary><div class="faq__a"><p>Start at 10 to 15 percent off the added item, not 30 percent off the whole set. The bundle pays only when the extra margin from the added unit beats the discount given to people who would have bought both anyway. Deepen the discount only if the attach rate is too low after a few days of traffic.</p></div></details>
<details><summary>Should every product have a Black Friday bundle?</summary><div class="faq__a"><p>No. Bundle the heroes that already have a natural pair, a refill, or a gift use. A one-off decorative item with no companion should stay a single product. Too many bundles on one product page slows the decision and trains shoppers to hunt for the biggest percent off.</p></div></details>
<details><summary>Where should a Shopify bundle sit on the product page during BFCM?</summary><div class="faq__a"><p>Directly under the add-to-cart button, before the long description. The shopper has already chosen the hero. The bundle is a yes to one more thing, not a second storefront above the price.</p></div></details>
<details><summary>Can I run quantity breaks and bundles in the same Black Friday promotion?</summary><div class="faq__a"><p>Yes, on different products. A consumable wants a quantity break. A kit wants a fixed bundle or a mix-and-match box. Putting both offers on the same product usually splits the click and lowers the take rate of each.</p></div></details>
<details><summary>How do I know if a Black Friday bundle is cannibalising full-price sales?</summary><div class="faq__a"><p>Compare orders that contain both products before the promotion with orders during it. If most bundle buyers already bought the pair at full price, the discount is a gift to existing behaviour. The <a href="/blog/bundle-discount-margin-maths.html?src=ninety9dev">bundle discount maths</a> walk-through shows the break-even.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>15 things to fix on your Shopify store before November 27</title>
      <link>https://ninety9.dev/blog/shopify-store-fixes-before-black-friday.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/shopify-store-fixes-before-black-friday.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>CRO &amp; Analytics</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Fifteen concrete fixes for a Shopify store before Black Friday on 27 November: the product page, the cart, shipping, inventory and the order after checkout.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Black Friday traffic will not fix a product page where the price, the variant or the add-to-cart button is hard to use on a phone.</li><li>Fix the buy path first, then one offer that grows the order. A new popup on a broken page just interrupts a lost sale.</li><li>Inventory, the shipping promise and the edit window have to be decided before Friday, because Saturday support cannot invent them.</li><li>Run the free audit on the exact product URL you will advertise, not only the homepage.</li></ul></section>
<p>27 November 2026 is Black Friday. The stores that hold up are not the ones with the loudest banner. They are the ones where a new visitor on a phone can see the price, choose the variant, add it, understand shipping, and pay, and where a wrong address the next morning does not become a ticket pile.</p>
<p>This is a fix list, in the order we would do it. The first items are the sale. The later items are how the sale stays profitable. Run the <a href="/cro-audit/?src=ninety9dev">CRO Audit for Shopify stores</a> on the product URL you will advertise. It ranks the public page the way a shopper meets it. Then do the operational checks the audit cannot see, because it does not log into your admin.</p>
<figure><img src="/assets/img/blog/ui-pdp.jpg" alt="Simplified product buy box with a price, two sizes and one add-to-cart button" loading="lazy" decoding="async"><figcaption>Price, a short choice, and a button that is the largest control on the buy column.</figcaption></figure>
<p>Price, a short variant choice, and a button that is the largest control. Anything you add this week has to survive that test on a phone: price visible, choice obvious, button reachable without a scroll past a gallery. A sold-out size that still looks tappable, or a buy button the size of a text link, fails before any offer gets a chance.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/brand/ninety9-mark.png" alt="Ninety9 CRO audit" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Free CRO Audit for Shopify stores</p>
<p class="appcta__text">Paste a store or product URL. Homepages resolve to a bestseller. You get ranked constraints and missed AOV — not a 40-check newspaper.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="/cro-audit/?src=ninety9dev">Run the audit<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="the-fifteen-in-order">The fifteen, in order</h2>
<div class="tablewrap"><table><thead><tr><th>#</th><th>Fix before 27 November</th><th>Why it hurts on the day</th></tr></thead><tbody>
<tr><td>1</td><td>Price and compare-at price are honest and visible</td><td>A crossed-out price that is not the real usual price is a trust problem, and a policy one</td></tr>
<tr><td>2</td><td>Variants can be chosen without hunting</td><td>Sold-out sizes that still look selectable create rage-clicks</td></tr>
<tr><td>3</td><td>Add to cart stays visible while the page scrolls on mobile</td><td>If the button leaves the screen, the offer above it does not matter</td></tr>
<tr><td>4</td><td>The hero you will advertise is in stock, with a buffer</td><td>Friday&#39;s ad to a sold-out URL is paid traffic to a dead end</td></tr>
<tr><td>5</td><td>Photos load, and the first image matches the variant</td><td>A slow first image is the page, as far as a shopper is concerned</td></tr>
<tr><td>6</td><td>One offer on the product page, not five</td><td>Bundles, popups and bars stacked on the button hide the buy</td></tr>
<tr><td>7</td><td>The cart opens as a drawer or a clear cart page</td><td>A surprise full-page jump loses the momentum of the add</td></tr>
<tr><td>8</td><td>Shipping cost or the threshold is visible in the cart</td><td>The number at checkout is the classic abandonment</td></tr>
<tr><td>9</td><td>Delivery expectation is stated, even if it is a range</td><td>Gift buyers leave when &quot;when does it arrive?&quot; has no answer</td></tr>
<tr><td>10</td><td>Discount field and campaign code behave as you intend</td><td>A code that does not stack the way the ad said creates support</td></tr>
<tr><td>11</td><td>Mobile checkout actually completes in a test order</td><td>Place the order yourself, on cellular, not office wifi</td></tr>
<tr><td>12</td><td>International thresholds are not a copy of the domestic bar</td><td>One number mis-prices every other country</td></tr>
<tr><td>13</td><td>Customers can fix address, variant and quantity before fulfilment</td><td>Otherwise every typo is a ticket or a cancel</td></tr>
<tr><td>14</td><td>Cancellation has a path that is not only &quot;email us&quot;</td><td>The cancel wave hits before you are back at the desk</td></tr>
<tr><td>15</td><td>The theme and the app embeds are frozen</td><td>A Friday edit is how the cart disappears</td></tr>
</tbody></table></div>
<h2 id="buy-path-before-offers">Buy path before offers</h2>
<p>Items 1 to 5 are the product page. If they fail, do not spend the week designing a bundle. <a href="/blog/what-the-shopify-cro-audit-checks.html?src=ninety9dev">What the CRO audit checks</a> is the same order: can they buy, then did you miss the extra unit. <a href="/blog/product-page-leaks-cro-audit-finds.html?src=ninety9dev">Product page leaks</a> is the longer list of how those leaks look.</p>
<p>Item 6 is restraint. Pick one product-page offer. A bundle or a quantity break from <a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly</a> is enough. A second widget that repeats it is how the button gets pushed down.</p>
<h2 id="cart-shipping-and-the-promise">Cart, shipping, and the promise</h2>
<figure><img src="/assets/img/blog/ui-cart.jpg" alt="Simplified cart with a progress bar, the items, one suggestion and checkout" loading="lazy" decoding="async"><figcaption>Shipping progress and the total are on the same screen as checkout.</figcaption></figure>
<p>Items 7 to 10 are the cart. A drawer from <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy</a> keeps them on the page, shows the total, and can hold one upsell plus a delivery date. The shipping number is <a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a>: a bar with a real threshold, including a different one per country. How to set that number is <a href="/blog/free-shipping-threshold-bfcm.html?src=ninety9dev">the BFCM free shipping threshold</a>. If the cart is where people drop, the <a href="/blog/shopify-cart-abandonment-checklist.html?src=ninety9dev">cart abandonment checklist</a> is the next pass after these four.</p>
<p>The failure mode is a cart that tells the truth too late. Shipping appears at checkout. The code fails because it does not stack the way the ad said. The delivery date is a blank. Each of those is a reason to abandon that looks, in analytics, like &quot;checkout drop-off.&quot; It is not a payment-provider problem. It is a sentence you did not put next to the total.</p>
<p>Item 11 is non-negotiable. Place a real order on your phone. Use the code from the ad. Reach the thank-you page. If you will not do it, a stranger with a cart full of gifts will do it for you, once.</p>
<h2 id="after-the-payment">After the payment</h2>
<figure><img src="/assets/img/blog/ui-edits.jpg" alt="Simplified order edits for address, shipping, variant and quantity" loading="lazy" decoding="async"><figcaption>Turn on only the edits the warehouse can still make before the label exists.</figcaption></figure>
<p>Items 13 and 14 are Saturday. Wrong addresses and wrong sizes are the bulk of BFCM tickets. <a href="https://apps.shopify.com/reviso-order-editor?src=ninety9dev" target="_blank" rel="noopener">Reviso</a> lets the customer change the address, the variant, the quantity or the shipping method before the order ships, and can offer a reason to stay if they hit cancel. The playbook is <a href="/blog/black-friday-order-changes-wrong-addresses.html?src=ninety9dev">order changes and wrong addresses during Black Friday</a>.</p>
<p>Do not enable every module because the grid looks complete. Enable the ones your warehouse can still perform after the label window you actually run. If you ship the same evening, address and variant are the two that pay. Add-product and a long cancellation flow are useful only if someone is still looking at the order before it is picked. A module that fails because the parcel already left teaches the customer that self-serve is decoration.</p>
<p>Item 15 is discipline. Duplicate the theme if you must experiment. Do not publish a half-finished editor at noon on Friday.</p>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>Do this week, not this list in one night</p>
<p>Audit the advertised product URL. Place one mobile order. Set the shipping bar. Open self-serve edits. Then stop adding surfaces.</p>
</aside>
<p>The offers that grow the order, once the page can sell, are collected in <a href="/blog/increase-aov-black-friday-without-bigger-discounts.html?src=ninety9dev">how to raise AOV on Black Friday without a bigger discount</a>.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What should I fix on my Shopify store before Black Friday?</summary><div class="faq__a"><p>Start with whether a shopper can buy on a phone: visible price, selectable variants, a reachable add-to-cart button, and a cart that shows the total and the shipping deal. Then check inventory on the advertised SKU, the free-shipping rule, and how a customer fixes a wrong address after checkout. Offers come after those.</p></div></details>
<details><summary>How late is too late to change a Shopify theme before BFCM?</summary><div class="faq__a"><p>A theme change in the last week is how tracking, apps and the cart break on Friday. Freeze the theme. Fix copy, offers and inventory inside the apps and the theme editor. If a change is required, do it on a duplicate theme and buy on a phone before you publish.</p></div></details>
<details><summary>Should I add more apps before Black Friday?</summary><div class="faq__a"><p>Add one only if it owns a hole you have already seen, such as no cart drawer, no shipping bar, or no way for customers to edit an order. Do not install a stack of overlapping upsell apps the week of the sale. They fight for the same spot and slow the page.</p></div></details>
<details><summary>Does a CRO audit replace checking out myself?</summary><div class="faq__a"><p>No. The <a href="/cro-audit/?src=ninety9dev">CRO Audit for Shopify stores</a> ranks what a shopper hits on the public product page and cart. You still need to place a real order, on mobile, with the campaign code, through to the thank-you page, and then try to change the address.</p></div></details>
<details><summary>What if my store is password protected while I prepare?</summary><div class="faq__a"><p>Finish the public page before you send ads. A password wall is fine for a draft. It is not fine for the URL in the ad. When you are ready, audit the live product URL, not a preview only you can open.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>5 steps to calculate the right free shipping threshold for BFCM</title>
      <link>https://ninety9.dev/blog/free-shipping-threshold-bfcm.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/free-shipping-threshold-bfcm.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>Shipping &amp; Fulfilment</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Five steps to set a Black Friday and Cyber Monday free shipping threshold on Shopify so the bar raises average order value without giving shipping away.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>Set the BFCM free shipping threshold from your own order distribution and your real shipping cost, not from a round number a competitor posted.</li><li>A useful bar sits a little above the median order, close enough that one extra item clears it, high enough that you are not subsidising baskets you already had.</li><li>Use a different threshold per country. One global number mis-prices both domestic and international Black Friday orders.</li><li>Stack a gift above free shipping. Do not replace the bar with a deeper percent-off code.</li></ul></section>
<p>The right free shipping threshold for BFCM is the cart value where the extra items a shopper adds are worth more than the shipping cost you absorb. It is not the lowest number you can advertise. Black Friday 2026 is 27 November. If the bar is wrong, you will feel it in margin before you feel it in the AOV report.</p>
<p><a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a> is the <a href="https://apps.shopify.com/goalify?src=ninety9dev">free shipping bar</a> we run for this: cart value or quantity rules, a different threshold per country, a gift or a discount stacked above shipping, and a suggestion when the shopper is short. Free up to 10 orders a month, then $3.99, $7.99 and $11.99. The <a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify listing</a> is where it installs. The year-round version of the maths is the <a href="/blog/free-shipping-threshold-calculator.html?src=ninety9dev">free shipping threshold calculator</a>. The steps below are the BFCM cut.</p>
<figure><img src="/assets/img/blog/ui-ship.jpg" alt="Simplified free-shipping bar with eighteen dollars still to go and one product that can close it" loading="lazy" decoding="async"><figcaption>A gap, in money, and one product under it. The bar is not a slogan.</figcaption></figure>
<p>A free-shipping bar is a price anchor with a job. It tells the shopper the next useful number, in the currency they are paying, with one product that can close it. In the example the gap is $18 and the product sits under the bar. If that product does not exist, the sentence &quot;$18 to free shipping&quot; is a dare, not an offer.</p>
<p>The same shape has to be priced per country. Translating the words and keeping a converted dollar threshold is how an easy domestic bar becomes a wall, or a giveaway, somewhere else. Shipping is the first rung, because it is the one a hesitant cart will actually stretch for. A gift sits further out, for people who were going to clear shipping anyway. Showing the top prize first, with a huge number, makes the shipping rung look trivial.</p>
<h2 id="step-1-export-the-orders-you-actually-get">Step 1. Export the orders you actually get</h2>
<p>Use the last complete month, and a previous BFCM weekend if you have one. You want order value, country, and whether shipping was already free. The median matters more than the average. A few large wholesale orders pull the average up and make a threshold look reachable when most shoppers will never see it move.</p>
<p>Ignore drafts, cancelled orders and replacements. They are not baskets someone is trying to grow on Friday.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/goalify/icon.png" alt="Goalify: Free Shipping Bar PRO app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Goalify: Free Shipping Bar PRO</p>
<p class="appcta__text">Free shipping bars, free gifts, BOGO and AI upsells driven by stackable cart goals.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="step-2-write-down-the-shipping-you-will-pay">Step 2. Write down the shipping you will pay</h2>
<p>For each country you will promote, note the label cost you eat when shipping is free, including packaging. A $6 domestic label and a $22 international label cannot share one threshold. If you do not know the number, you cannot know whether the bar makes money. Guessing &quot;about eight dollars&quot; is how Friday night becomes a surprise invoice.</p>
<div class="tablewrap"><table><thead><tr><th>Input</th><th>Why it changes the threshold</th></tr></thead><tbody>
<tr><td>Median order value</td><td>The bar has to sit near baskets you really see</td></tr>
<tr><td>Label cost you absorb</td><td>The extra margin must cover this</td></tr>
<tr><td>Typical add-on price</td><td>One item has to be able to close the gap</td></tr>
<tr><td>Country</td><td>Cost and willingness to add are both local</td></tr>
</tbody></table></div>
<h2 id="step-3-place-the-bar-where-one-item-closes-it">Step 3. Place the bar where one item closes it</h2>
<p>Start around 15 to 30 percent above the median, then check the gap in money. If the median basket is $54 and you set $78, the shopper needs $24 more. If your add-ons are $12, they need two decisions. That is usually one decision too many on a phone during Black Friday. Either lower the bar toward one add-on, or show a specific product that closes it.</p>
<p><a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a> can suggest that product from order history when someone is short. A generic &quot;you are $24 away&quot; with nothing relevant underneath is a slogan. A serum they already buy with the moisturiser is an offer.</p>
<h2 id="step-4-split-the-threshold-by-country">Step 4. Split the threshold by country</h2>
<p>Configure the goal per country. Show the shopper&#39;s currency. A converted $75 that started as a US rule is not a strategy for everyone else. Domestic can sit closer to the median. Expensive zones should sit higher, or free shipping should not be the offer there at all. <a href="/blog/when-not-to-offer-free-shipping.html?src=ninety9dev">When not to offer free shipping</a> is the case for a flat rate or a gift instead.</p>
<figure><img src="/assets/img/blog/ui-goals.jpg" alt="Simplified two-rung goal, shipping closer than the gift" loading="lazy" decoding="async"><figcaption>The product page and the cart must show the same gap. Shipping first, gift later.</figcaption></figure>
<p>Put the bar in the cart drawer and, if you use one, on the product page. The two have to agree. A product page that says $12 away and a cart that says $19 away is a broken promise, and Black Friday shoppers notice faster than you can edit the theme. Copy that updates with the amount remaining is in <a href="/blog/free-shipping-bar-copy.html?src=ninety9dev">free shipping bar copy</a>. <a href="https://apps.shopify.com/addy-cart-drawer?src=ninety9dev" target="_blank" rel="noopener">Addy</a> can hold that bar inside the drawer next to the line items, which is where the total is believable.</p>
<p>One more check on the gap. Contribution of the add-on, not its shelf price, has to cover the label. An $18 add-on with $4 of gross profit does not pay a $7 label. An $18 add-on with $11 of gross profit does, barely. The bar is not &quot;set it 20% above the median and hope.&quot; It is label cost versus the profit on the one item you expect them to add.</p>
<h2 id="step-5-stack-the-next-reward-then-stop">Step 5. Stack the next reward, then stop</h2>
<p>Free shipping is rung one. A gift or a small order discount can be rung two, higher up, for shoppers who were going to clear shipping anyway. Do not show all three numbers at once to a $20 cart. They will anchor on the top number and ignore the first. <a href="/blog/stacked-cart-goals.html?src=ninety9dev">Stacked cart goals</a> is the sequence. Holiday gift ideas that can sit on rung two are in <a href="/blog/holiday-free-gift-with-purchase-ideas.html?src=ninety9dev">free gift with purchase ideas</a>.</p>
<p>Then stop. Do not also drop a sitewide code that makes every order free to ship by accident. Do not cut the threshold on Saturday because Friday felt quiet. Read the share of orders that finished just below the line. If a pile sits $4 under it, the bar is slightly high. If almost everyone cleared it in the first hour, it was a giveaway.</p>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>A worked sketch</p>
<p>Median order $54. Domestic label $7. A relevant add-on is $18 with about $8 gross profit. A threshold at $68 asks for one of those add-ons. The $8 covers the $7 label, with a little left over. A threshold at $40 would have paid the label on orders you were already taking. A threshold at $110 needs two add-ons and will mostly be ignored.</p>
</aside>
<p>Publish the end. &quot;Free shipping over $68 through 30 November&quot; is a promotion. A bar with no end becomes the new permanent policy, and you will spend December arguing with yourself about whether you can put it back.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>How do you calculate a free shipping threshold for Black Friday?</summary><div class="faq__a"><p>Export recent orders, find the median order value, add your absorbed shipping cost, and place the threshold roughly 15 to 30 percent above the median so one extra item can clear it. Check that the gross profit on that extra item covers the shipping you will pay. If it does not, raise the threshold or narrow who gets the offer.</p></div></details>
<details><summary>Should the Black Friday free shipping threshold be lower than usual?</summary><div class="faq__a"><p>Only if your usual bar is so high that almost nobody was crossing it. Dropping a healthy threshold for the weekend gives free shipping to orders you were already getting. That is a margin cut, not an AOV tactic. A short, honest promotion is a published end date, not a cheaper bar.</p></div></details>
<details><summary>Do I need a different BFCM threshold for each country?</summary><div class="faq__a"><p>Yes if you ship internationally. Label cost, zone and delivery promise are different. A single converted currency number still hides a different profit. Set the goal per country, and show it in the shopper&#39;s currency.</p></div></details>
<details><summary>Where should the free shipping bar appear during BFCM?</summary><div class="faq__a"><p>In the cart, where the total changes, and on the product page if the hero can realistically close the gap. A sticky announcement of a number nobody can reach is noise. The bar has to move when the cart changes.</p></div></details>
<details><summary>What if shoppers add a cheap item just to get free shipping?</summary><div class="faq__a"><p>That is the point, as long as the cheap item&#39;s margin covers the shipping. If the only thing that clears the bar is a loss-leader, raise the threshold or exclude that SKU from the progress. Then suggest a product that actually closes the gap.</p></div></details>
</div>]]></content:encoded>
    </item>
    <item>
      <title>6 exit-intent popup offers to save abandoned Black Friday carts</title>
      <link>https://ninety9.dev/blog/exit-intent-popups-black-friday.html</link>
      <guid isPermaLink="true">https://ninety9.dev/blog/exit-intent-popups-black-friday.html</guid>
      <pubDate>Sun, 11 Oct 2026 09:00:00 GMT</pubDate>
      <category>CRO &amp; Analytics</category>
      <dc:creator>Ninety9 Team</dc:creator>
      <description>Six exit-intent popup offers for abandoned Black Friday carts on Shopify. One product, no second coupon, and the triggers that do not interrupt a shopper who is still buying.</description>
      <content:encoded><![CDATA[<section class="takeaways"><h2>Key takeaways</h2><ul><li>An exit-intent popup on Black Friday should offer a product, not a louder coupon than the one already on the site.</li><li>One offer, one button. Two choices on the way out convert worse than one, because the shopper was already leaving.</li><li>Fire on exit, on add to cart, or at the start of checkout. A timer popup on people who are still reading costs the sale you are trying to save.</li><li>Mobile exit is a back gesture, not a cursor leaving the window. Treat it as less precise and show less.</li></ul></section>
<p>An exit-intent popup on Black Friday is one offer shown when a Shopify shopper is about to leave, or at the moment they add to cart or start checkout. The abandoned cart is still on the table. The popup&#39;s only job is to put one relevant product into it. A bigger coupon is the offer that feels productive and usually is not, because the sitewide code is already the reason they came.</p>
<p><a href="https://apps.shopify.com/monet?src=ninety9dev" target="_blank" rel="noopener">Monet</a> is the popup. It triggers on exit intent, on add to cart, and when checkout starts. Templates cover a bundle, a cross-sell and an add-on. Recommendations can come from purchase patterns. It is free to install from the <a href="https://apps.shopify.com/monet?src=ninety9dev" target="_blank" rel="noopener">Monet listing</a>. It does not collect emails. The longer guide is <a href="/blog/exit-intent-popups-shopify.html?src=ninety9dev">exit-intent popups on Shopify</a>. The rule of one is <a href="/blog/one-offer-popup-rule.html?src=ninety9dev">one offer per popup</a>. The add-to-cart trigger, which is a different moment from the exit, is covered in <a href="/blog/add-to-cart-popup-upsell.html?src=ninety9dev">the add-to-cart upsell slot</a>.</p>
<figure><img src="/assets/img/blog/ui-popup.jpg" alt="Simplified popup with one product, one price and one add button" loading="lazy" decoding="async"><figcaption>One product. No coupon field, no email box.</figcaption></figure>
<p>The popup is one product, one price, one button. Not a coupon field. <a href="https://apps.shopify.com/monet?src=ninety9dev">Monet</a> can show it on add to cart, at the start of checkout, or on exit. Those are three moments, not three popups, and a frequency cap should stop the same person meeting all three in one session.</p>
<p>Exit is the weakest of the three on a phone, because you do not get a cursor leaving the window. You get a back gesture, which is late and messy. Add to cart and the start of checkout are the moments when intent is already proven. Use exit for the cart that is full and idle. Do not use a timer on arrival. That is how you interrupt someone who was still going to buy.</p>
<h2 id="1-the-pair-they-did-not-add">1. The pair they did not add</h2>
<p>If the hero is in the cart and the usual companion is not, the exit offer is that companion. One image, one price, one button. This is the same pair you would have put in the drawer. Use the popup only if they are leaving without it. Do not show it and the drawer offer at the same time or you have asked twice.</p>
<aside class="appcta not-prose">
<img class="appcta__icon appicon" src="/assets/img/apps/monet/icon.png" alt="Monet • AI Popup Bundle Addons app icon" width="56" height="56" loading="lazy" decoding="async">
<div class="appcta__body">
<p class="appcta__name">Monet • AI Popup Bundle Addons</p>
<p class="appcta__text">AI upsell popups triggered on add to cart, checkout initiation and exit intent.</p>
</div>
<a class="btn btn--accent btn--sm appcta__btn" href="https://apps.shopify.com/monet?src=ninety9dev" target="_blank" rel="noopener">Install on Shopify<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
</aside>
<h2 id="2-the-product-that-clears-free-shipping">2. The product that clears free shipping</h2>
<p>They are $14 short and heading for the door. The popup is one product near $14 that belongs with the bag, not &quot;here is 10% more off.&quot; The threshold is the one from <a href="/blog/free-shipping-threshold-bfcm.html?src=ninety9dev">the BFCM free shipping calculation</a>. <a href="https://apps.shopify.com/goalify?src=ninety9dev" target="_blank" rel="noopener">Goalify</a> knows the gap. Monet presents a single product into it. If you do not have a product that fits the gap, do not invent a discount to fake it.</p>
<h2 id="3-a-small-bundle-of-what-they-are-already-buying">3. A small bundle of what they are already buying</h2>
<p>A two-unit or three-unit version of the consumable in the cart, as a bundle template, with a modest break versus buying singles. This is a quantity story told at the exit, for people who almost left with one. The ladder itself should already exist on the product page via <a href="https://apps.shopify.com/addly?src=ninety9dev" target="_blank" rel="noopener">Addly</a>. The popup is the reminder, not a different price they cannot find again.</p>
<h2 id="4-the-add-on-they-understand-in-one-second">4. The add-on they understand in one second</h2>
<p>Wrap, a case, a sample. Add-on template. No carousel. Black Friday exit is a second, maybe two. If the offer needs a paragraph, it is a product page, and they have already decided not to be on one.</p>
<figure><img src="/assets/img/blog/ui-pair.jpg" alt="Simplified popup offering a pair at one price" loading="lazy" decoding="async"><figcaption>If the offer is a pair, it is still one price and one button.</figcaption></figure>
<h2 id="5-checkout-start-for-the-shopper-who-is-not-leaving-yet">5. Checkout start, for the shopper who is not leaving yet</h2>
<p>Some of the money is not at the exit. It is the moment they tap checkout, still on your page, before the payment step. One last relevant add, then get out of the way. Monet&#39;s checkout-initiation trigger is that moment. Do not use it to restate the campaign code. They are already converting.</p>
<h2 id="6-a-real-end-time-attached-to-one-of-the-five">6. A real end time, attached to one of the five</h2>
<p>If the pair or the shipping gap is the offer, a countdown to the published end of the weekend is fair. A timer that resets when they refresh is how you teach people that urgency is decoration. <a href="/blog/popup-frequency-capping.html?src=ninety9dev">Popup frequency capping</a> matters more on Black Friday than on a Tuesday, because the same visitor will open five products in ten minutes. Once per session is enough.</p>
<div class="tablewrap"><table><thead><tr><th>Offer</th><th>Show it when</th><th>Do not show it when</th></tr></thead><tbody>
<tr><td>Missing pair</td><td>Hero is in the cart, companion is not</td><td>They already added the companion</td></tr>
<tr><td>Shipping-gap product</td><td>Cart is just under the bar</td><td>They have cleared shipping</td></tr>
<tr><td>Quantity bundle</td><td>Only one unit of a consumable is in the bag</td><td>They already took the break</td></tr>
<tr><td>Add-on</td><td>Cart has the hero, no wrap or case</td><td>The add-on is out of stock</td></tr>
<tr><td>Checkout-start add</td><td>They tapped toward checkout</td><td>They are still reading the description</td></tr>
</tbody></table></div>
<aside class="callout callout--key">
<p class="callout__title"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 7a5 5 0 1 0-4.5 5H12v3h3v3h4v-4l-4-4V7Z"/></svg>No second coupon</p>
<p>If the ad already says 20% off, the exit popup must not say 30%. You will save a few carts and reprice the whole weekend, including people who were never going to leave.</p>
</aside>
<p>Desktop and mobile are not the same trigger. Test both. Place a product in the cart, move to leave, and see if the offer matches the bag. If it shows a generic bestseller, turn the recommendation rule tighter or set the product by hand for the heroes in your ads.</p>
<p>The cart itself should already be doing its job before the popup exists. <a href="/blog/cart-drawer-upsells-bfcm.html?src=ninety9dev">Cart drawer upsells for BFCM</a> is that job. The popup is the last tap, not the first. If the add-to-cart button is already buried, the popup will not save the cart. Run the <a href="/cro-audit/?src=ninety9dev">CRO Audit for Shopify stores</a> on the hero URL before you add another layer.</p>
<h2 id="faq">Frequently asked questions</h2>
<div class="faq">
<details><summary>What should a Black Friday exit-intent popup offer?</summary><div class="faq__a"><p>The missing pair, the unit that would clear free shipping, or a small bundle of what is already in the cart. Not a new percent-off code if a campaign code is already public. A second code teaches shoppers to head for the door to see if the offer improves.</p></div></details>
<details><summary>Do exit popups work on mobile during BFCM?</summary><div class="faq__a"><p>Less precisely than on desktop. Desktop can watch the cursor move toward the browser chrome. Mobile relies on back navigation and similar leave signals, so the same aggressive offer will mistime more often. Use a shorter popup on mobile, still one product, and do not cover the whole screen if they can still reach checkout.</p></div></details>
<details><summary>Should I collect emails in the Black Friday exit popup?</summary><div class="faq__a"><p>Not if the goal is to save the cart in front of you. An email field is a second task for someone who is leaving. The offer should add a product they can accept in one tap. Email capture is a different campaign, on a quieter day.</p></div></details>
<details><summary>How many exit popups can I run on Black Friday?</summary><div class="faq__a"><p>One at a time, with a frequency cap so the same person does not see it on every page of the session. A popup on the product page, another in the cart, and another at checkout start is three interruptions. Pick the moment that matches the offer.</p></div></details>
<details><summary>Will an exit popup hurt Black Friday conversion rate?</summary><div class="faq__a"><p>It should not, if it only appears once they are leaving or after they have added to cart. A popup on a timer, on arrival, will. Measure add-to-cart and orders together the first day. If orders fall and the popup is the only change, turn it off.</p></div></details>
</div>]]></content:encoded>
    </item>
  </channel>
</rss>
