Skip to content
Bach.ai

Free-Shipping Thresholds: The Hidden Hit to Contribution Margin

Many brands set their free-shipping threshold by copying a competitor or rounding to a number that “feels right.” Then they wonder why scaling spend on a healthy-looking ROAS still drains the bank account. The offer isn’t on the P&L line you stare at — it’s buried inside CM2, eating contribution on every qualifying order, silently. Here’s how to model the free shipping threshold margin against your real basket economics so the offer funds growth instead of subsidizing it.

For the neighboring economics, compare Post-Purchase Flows as a Contribution-Margin Lever and use The Contribution Margin Waterfall: A $100 Order, Dissected to validate the measurement decision.

Free shipping is a margin line, not a marketing line

Nobody ships for free. When you promise free shipping over a threshold, you absorb the carrier cost into your unit economics for every order that qualifies. That cost doesn’t show up next to your ad spend — it disappears into fulfillment, which most operators only look at in aggregate at month-end.

To see it, you have to walk down the contribution stack on a single order:

  • CM1 = net revenue − COGS. This is product gross margin.
  • CM2 = CM1 − variable order costs: pick/pack, payment processing, fulfillment, returns provision, and the shipping you eat.
  • CM3 = CM2 − ad spend. This is what’s actually left to cover overhead and profit.

Free shipping lives entirely between CM1 and CM2. It is invisible to your ad platform, invisible to your blended ROAS, and in many cases invisible to the person setting the threshold.

The hidden hit, in one worked example

Take a representative order:

  • AOV: $60
  • Product gross margin (CM1): 55% → $33
  • Pick/pack + payment processing + returns provision: ~$4
  • Fully-loaded shipping cost to carrier: ~$9

If the customer pays their own shipping, CM2 is $33 − $4 = $29, roughly 48% of the order. If you absorb shipping, CM2 drops to $20 — about 33%.

That single decision cut contribution margin by 15 points without touching price, product, or ad spend. On a thousand qualifying orders a month, that’s a five-figure swing in absolute terms that never appears on the dashboard you optimize against.

Why thresholds quietly subsidize losses

The intuition behind a threshold is sound: make people add more to clear the bar, lift AOV, spread the fixed shipping cost over a bigger basket. The trap is assuming any AOV lift is good. It isn’t — the lift only pays if the margin on the incremental basket exceeds the shipping you newly absorb.

Picture a customer whose natural order is around $48. You set the threshold at $60. They add an item to qualify.

  • You gained $12 of revenue at 55% CM1 = ~$6.60 of incremental margin.
  • You now eat ~$9 of shipping you would otherwise have charged.

Net, that nudge cost you ~$2.40 versus letting them check out at $48 and pay their own shipping. The threshold “worked” — AOV went up, conversion looked fine — and contribution went down. You taught your best-converting customers to cost you more.

The nudge only wins when one of two things is true: the alternative was a genuine abandonment (no order at all), or the incremental basket carries enough margin to cover the shipping you forfeit. Most threshold math assumes the first case for every order. In reality it’s a minority.

Set the threshold off CM2, not off a round number

The right threshold is the basket size where the contribution you keep comfortably absorbs the shipping you give away. A workable operator heuristic:

  1. Find fully-loaded shipping per order — carrier cost plus packaging plus the share of orders that need reships or generate support. Use the real average, not the least expensive zone.
  2. Express it as a fraction of CM1 at candidate baskets. At the threshold, the shipping you eat should be a modest slice of the product margin on that order — keep it well under a third as a starting discipline, then tune.
  3. Confirm CM2 stays clearly positive at and just above the threshold, with buffer for returns and discounts that stack on top.
  4. Pressure-test the band just above the line, because that’s where the most orders cluster and where you subsidize most difficult relative to incremental margin.

Mapped against AOV, the pattern looks like this:

Threshold vs basket What happens to CM2 Verdict
Below typical basket You absorb shipping on orders that needed no nudge Pure subsidy
Near median basket Some real uplift, but margin-thin at the line Tune carefully
Modestly above median Uplift covers shipping; orders clear with margin intact Funds growth
Far above reach Few qualify; offer is decorative, AOV barely moves Dead weight

The growth-funding zone is a band, not a point: high enough that clearing it requires a genuinely larger basket whose margin pays for the shipping, low enough that a real share of customers can reach it without resentment. These are planning ranges to model against your own numbers, not fixed rules.

The part that wrecks paid scaling

Here’s where this loops back to acquisition. Your breakeven ROAS is roughly the inverse of your CM2 margin. In the example above, CM2 fell from ~48% to ~33% the moment free shipping turned on. That pushes breakeven ROAS from about 2.1 to about 3.0.

Same campaigns. Same creative. Same audiences. But the ROAS you need to hit to break even jumped by nearly a full point — and the ad platform has no idea. It will happily report a “profitable” 2.5 ROAS while every order at that efficiency loses contribution, because the platform optimizes to revenue and never sees the shipping you absorbed downstream.

This is the quiet killer: a generous threshold doesn’t just thin margin, it silently raises the efficiency bar on everything you’re trying to scale. Operators who only watch platform ROAS keep pouring spend into accounts that have moved underwater without a single metric on screen turning red. The signal lives in CM2 and breakeven ROAS, not in the ad manager.

This is the kind of leak Bach is built to surface — reading contribution after fulfillment rather than the platform’s revenue-side ROAS — but you can run the same check by hand monthly.

A practical takeaway

The setup math is a one-time exercise; staying out of the subsidy trap is a recurring one. A few principles to operate by:

  • Anchor on the offer, not the average. When you change the threshold, raise a free-shipping tier, or absorb a carrier increase, your breakeven ROAS moves — so re-derive it from post-shipping CM2 and re-point your campaign targets at the new number. A ROAS goal set before the offer existed is fiction.
  • Trust CM2, not the ad manager. The platform optimizes to revenue and will keep reporting “profitable” accounts that have slipped underwater. Contribution after fulfillment is the only place the leak is visible, so that’s the number that governs scaling decisions.
  • Revisit on every margin event. Product-mix shifts, return-rate creep, and discount stacking all change what the threshold actually costs you. None of them show up in the ad account.

Free shipping is one of the few “marketing” levers that never touches the marketing budget — it hides in fulfillment and shows up as a thinner CM2 and a higher bar on everything you spend to acquire. Model it against AOV, set it off contribution, and the same offer that was quietly subsidizing losses starts paying for the growth you’re chasing.

See what your Meta ads are really costing you.

Connect your account and Bach ranks every revenue leak in minutes — each with the money it costs and a one-tap fix. Free for 7 days, no credit card.

Start Free Audit
Start your free audit