How-toPromotionsBetter Bundles11 min read

Shopify BOGO without cart-discount leakage

When buy-X-get-Y should be a locked Shopify pack product versus a cart automatic discount — leakage modes, free-item allocation, same-SKU vs cross-SKU design, and a checkout QA checklist.

Jeshua Leger

Founder, Leger Studio ·

BOGO looks simple on a whiteboard: buy two, get one free. On Shopify it becomes an ops choice. You can enforce the deal with a cart automatic discount, a theme script that rewrites the drawer, or a pack product that only unlocks the savings when that pack is in cart. Those three mechanisms convert differently, leak differently, and break inventory differently — and most “BOGO isn’t working” tickets are really mechanism mismatches, not weak creative.

This is not another gift-with-purchase setup guide. The GWP inventory deep dive and GWP use case already own gift stock honesty and the Better Bundles click-path. This post owns the promo-ops decision: when buy-X-get-Y should be a locked pack, when a cart rule is still legitimate, and how leakage shows up before Black Friday makes it expensive.

Note: Better Bundles sells BOGO-style offers as real Shopify products: free-item (or item-based) pricing, checkout discounts via Shopify Functions, and availability computed from component stock — no theme scripts and no discount codes for customers to share. Basic is free forever (up to 3 active bundles, limited AI); Starter / Growth / Pro are $17 / $37 / $77 with a 15-day trial. Docs: discount modes.

Name the offer before you pick the mechanism

Merchants say “BOGO” for at least four different commercial contracts. Write the one you mean on one line before you touch Shopify admin:

  • Same-SKU BOGO — buy 1 tee, get a second tee free (or 50% off). Qualifying unit and free unit are the same product.
  • Cross-SKU BXGY — buy the serum, get the travel mini free. This is GWP with BOGO language; treat it as a pack + free-item allocation.
  • Quantity break — buy 3, pay for 2 (or tiered % off at 2 / 4 / 6). Often better as a multipack shelf price than a cart rule that fires on any mix.
  • Mix-and-match — any two from a collection, get the third free. Hardest to lock into a single pack product; cart rules win only if you accept leakage and ops complexity.

If you cannot state which SKUs qualify, which unit is free, and whether the deal is permanent shelf merchandising or a dated promo, you do not have an offer yet — you have a slogan. Mechanism choice comes after that sentence.

Tip: Same-SKU BOGO and cross-SKU GWP are different inventory problems. A free second tee doubles demand on one SKU. A free mini steals cover from a gift SKU that may also sell alone. Do not reuse one reserve-buffer policy for both.

Three mechanisms — and what each actually guarantees

Cart automatic discounts

Shopify’s built-in automatic discounts (or apps that emit similar rules) watch the cart for quantity / collection conditions and apply savings when the rule matches. Customers do not need a code. That is the upside. The downside is the rule is usually *cart-shaped*: any combination that meets “2× product A” or “3 items from collection Beauty” can qualify — including combinations you never meant to advertise.

Theme / cart-drawer scripts

Scripts can show a polished “Add a free gift” UI. They do not make checkout the source of truth. Theme updates, Shop Pay, and race conditions still break priced carts. We already argued against this pattern in Why storefront scripts hurt Shopify bundles. For BOGO specifically, the failure mode is “drawer said free, checkout charged both” — support hell during peak.

Pack product + checkout Functions

You publish a real product — “Buy 2 Tees, Get 1 Free” or “Serum + Free Mini” — with components inside. Customers add that one product. At checkout, Shopify Functions expand components and allocate the discount (free-item or spread). The deal only exists when that pack SKU is present. No code to share. No “any two from the collection” surprise. Fulfillment still sees real SKUs.

Important: If the commercial intent is a *specific* BOGO (these units, this free item, this shelf story), a cart rule that matches on quantity alone will eventually leak. Pack products are the locked contract; cart rules are the flexible — and leaky — one.

Leakage modes that quietly erase margin

Leakage is any path where a customer (or bot) receives BOGO economics without living inside the offer you designed. These are the failure modes we see merchants hit after the first promo weekend:

  • Collection-wide BXGY — “buy any 2 skincare, get a mini free” fires on clearance + hero + sample mixes that destroy contribution margin.
  • Stacking with codes — an automatic BOGO plus a sitewide 15% code applies both unless you explicitly block combinations; finance sees a different AOV story than merchandising pitched.
  • Partial-cart gaming — customer adds two paid units to trigger free, then removes the expensive paid unit if the rule does not re-validate cleanly mid-session (script apps are especially weak here).
  • Wholesale / draft orders — staff recreate retail BOGO economics on B2B carts because the automatic discount does not know channel.
  • Shared discount codes for “permanent BOGO” — the code escapes email and lives on Reddit; you cannot turn off the shelf deal without breaking the code path.

A pack product does not magically fix bad margin math, but it *does* confine the savings to shoppers who chose that pack. That is the first-party operating reason to prefer packs for evergreen BOGO merchandising: the discount contract travels with the product ID, not with a cart predicate anyone can satisfy.

Decision rules: pack vs cart rule

Use a **pack product** when most of these are true:

  • The offer is evergreen or campaign-dated but always the same SKU recipe (same tee ×3, serum + mini, starter duo).
  • You need a product page, collection placement, and ads creative pointing at one URL.
  • Fulfillment and returns must see real component lines every time.
  • You cannot afford collection-wide or mix-and-match leakage.
  • You want inventory availability derived from components (including free units), not a fake kit stock pool.

Keep (or accept) a **cart automatic discount** when:

  • The promo is truly cart-shaped — any three from a large collection, sitewide BOGO weekend, flash rules you will delete in 72 hours.
  • You have staff watching discount combination settings and a post-promo audit for stacked codes.
  • You accept that some carts will qualify in ways creative did not show.
  • Building N pack products for N temporary mixes would create more catalog debt than the promo is worth.
Tip: Default for Shopify BOGO that you will still be running next quarter: pack product. Default for a three-day sitewide experiment you will delete: cart rule with combination locks and a calendar reminder to turn it off.

Build a BXGY pack with free-item allocation

Once you choose the pack path, allocation is the next policy. For classic buy-X-get-Y, free-item mode is the honest customer story: paid lines keep natural prices; free lines absorb savings first and read as $0.00 when you use product-level application. That is the same allocation primitive GWP uses — the difference is offer design and leakage scope, not the math engine. Detail: Shopify Functions discount allocation and discount modes docs.

Worked example (cross-SKU): Serum $48 + Mini $18 = $66 natural. Pack sells as “Serum + free mini” at $48. Free-item allocation puts $18 of savings on the mini. Order lines: Serum $48, Mini $0. Customer sees the gift. Finance sees which SKU carried the promo. Warehouse picks both.

Worked example (same-SKU 3-for-2): Tee $30 × 3 = $90 natural. Pack price $60 (pay for two). Free-item mode marks one tee free → $30 savings on that line; the other two stay $30. If you instead use fixed price $60 with spread mode, each tee shows ~$10 off — cleaner for “3-pack $60” shelf language, weaker for “third tee free” creative. Pick allocation to match the headline you paid media for.

  1. Create the pack with every component quantity explicit (2 paid + 1 free, or 1 hero + 1 gift).
  2. Choose free-item / item-based pricing for “Y is free,” or fixed / percent when the shelf story is a set price.
  3. Preview allocation in the editor — if savings exceed free-item value, Better Bundles warns and spreads the remainder; fix the offer before publish.
  4. Publish the draft Shopify product into the collections and templates you will advertise.
  5. Run a test checkout and confirm expanded lines, prices, and inventory decrements.

Inventory: free units still consume cover

BOGO does not create free inventory. A “get one free” tee still leaves the building. Pack availability should be the minimum of what every component can support — including the free line — so you do not sell BOGO packs after the gift SKU is gone. That is the same component-derived model as kit inventory sync; BOGO just makes the free unit’s stock the binding constraint more often.

  • Reserve buffer on the pack when the free (or paid) component also sells alone and you need to protect standalone PDP conversion.
  • Watch shared components across multiple packs — one viral BOGO can starve three other kits that share a mini or sample.
  • For same-SKU 3-for-2, remember velocity on that SKU will spike harder than a cross-SKU gift; do not size replenishment off pre-BOGO 30-day averages alone (velocity windows).
  • Recalculate after bulk inventory imports; stale pack counts during a BOGO weekend are an oversell machine.
Important: If gift stock hits zero and the pack still shows available, your mechanism is lying. Fix availability math before you scale ads — not after the first oversell ticket.

Margin and “which unit is free”

Retailers argue about whether the free unit is the lowest-priced, the last added, or a designated gift SKU. On a pack product you decide in the editor: mark the component(s) that absorb savings. That removes checkout ambiguity and support improvisation.

  • Contribution check — pack price (or pay-for-N economics) must clear payment fees, expected returns, and gift COGS. If it only works at full attach with zero returns, the offer is fragile.
  • Ads vs checkout language — if Meta says “3rd free,” do not ship spread allocation that shows three partially discounted lines unless support has a one-sentence explanation.
  • Channel fencing — keep wholesale / POS out of DTC BOGO packs (separate catalogs or publish rules) so B2B carts cannot silently inherit retail gift economics.
  • End date — evergreen packs stay published; dated promos get an owner and a takedown date the same way you would delete a cart rule.

Checkout QA before you buy traffic

  1. Add the pack alone — confirm expanded components and free-item (or fixed) totals.
  2. Add pack + unrelated SKU — confirm BOGO savings do not spill onto the unrelated line.
  3. Add two of the pack — confirm discount scales with pack quantity, not with a broken per-cart cap.
  4. Attempt a known sitewide code (if you use codes) — confirm combination behavior matches policy.
  5. Complete a paid test order — packing slip shows real SKUs; inventory decremented on paid and free components.
  6. Process a partial refund in staging — know which line finance reverses when the customer keeps the gift.

If any step fails, do not “fix it in flight” with a second automatic discount. Either repair the pack configuration or kill the offer. Layering mechanisms is how leakage compounds.

Where this sits next to GWP and kits

Ship one locked BOGO this week

Pick one recipe you can defend for 30 days. Prefer a pack product unless the promo is deliberately cart-shaped and short-lived. Use free-item allocation when the creative says “free,” fixed or percent when the shelf says a set price. QA checkout for leakage. Then measure attach and contribution — not just units of the free SKU.

Note: Ready to run BOGO as a real product? Install Better Bundles (Basic free forever), follow create your first bundle, and keep GWP setup notes in the gift-with-purchase use case when the free item is a companion SKU.

Newsletter

Want the next one in your inbox?

Subscribe for new posts, app releases, and Better Bundles updates.

Product updates, release notes, and new posts. Unsubscribe anytime. Privacy

Ready to grow your average order value?

Create your first native-style bundle and see the discount at checkout. Start free on Basic — paid plans include a 15-day trial.