Skip to content
Bach.ai

The Hidden Fulfillment Costs That Reset Your Break-Even ROAS

You scaled a campaign sitting at 2.1 ROAS because your spreadsheet said break-even was 1.6, so 2.1 looked like comfortable profit. It wasn’t. Once you load the costs that sit between “order placed” and “package delivered and kept,” your real break-even ROAS was closer to 2.4 — and you spent the last six weeks paying to lose money on every incremental sale. This is the common way a DTC operator celebrates a campaign that is quietly underwater.

For the neighboring economics, compare Payment & Processor Fees: The 2-3% That Breaks Break-Even and use How to Compute Break-Even ROAS From Your True Margin to validate the measurement decision.

The formula many people use is half-built

The standard break-even ROAS formula is clean and wrong by omission:

Break-even ROAS = 1 ÷ gross margin %

If your product carries a 65% gross margin, that math says you break even at 1.54 — every dollar of ad spend just needs to return $1.54 in revenue. It’s tidy, it’s the number most dashboards imply, and it treats your gross margin as if it were the money actually available to pay for an order.

It isn’t. Gross margin only subtracts the cost of the goods. The auction doesn’t bill you for accounting categories — it bills you for the real, fully-loaded cost of getting one more unit into one more customer’s hands and keeping it there. Everything between COGS and that outcome is missing from the naive number.

Gross margin is not contribution margin

The number your ads actually have to clear is built on contribution margin — what’s left of an order after every variable cost of fulfilling it, before you’ve spent a dollar on acquisition. The correct formula is the same shape, with an honest denominator:

Break-even ROAS = 1 ÷ contribution margin ratio

where contribution margin ratio = (Revenue − COGS − pick/pack − packaging − net shipping − returns provision − payment fees) ÷ Revenue

Each cost you add to that bracket shrinks the contribution ratio, and because break-even ROAS is its inverse, the break-even number climbs faster than people expect. Here’s the same $100 order rebuilt layer by layer. Treat the figures as an illustrative planning model — plug in your own.

Cost layer added Per-order cost Contribution margin Break-even ROAS
Product cost only (COGS) $35 65% 1.54
+ Pick-and-pack $4 61% 1.64
+ Packaging & inserts $3 58% 1.72
+ Outbound shipping (free to customer) $9 49% 2.04
+ Returns fulfillment provision $4.35 44.7% 2.24
+ Payment processing $3 41.7% 2.40

Same product, same price. The break-even ROAS your ads must beat went from 1.54 to 2.40 — a 56% jump — without a single change to your product cost. A 2.1 campaign clears the first number and fails the last.

The layers that move the number

Pick-and-pack and packaging

Every order consumes warehouse labor (or a 3PL pick fee) and physical materials: the box, the void fill, the branded insert, the tape, the label. Individually they’re small. Together they’re frequently 5–8% of order value, and they scale linearly with volume — exactly the orders your ads are buying. They belong inside break-even because you pay them on the marginal unit, not as fixed overhead.

Shipping, and the free-shipping tax

This is the layer that quietly does the most damage, because “free shipping” is never free — you absorbed it. When you eat $9 of delivery on a $100 order, you’ve handed back nearly a fifth of your gross margin before acquisition. If you charge a shipping fee, only the net cost (carrier cost minus what the customer paid) belongs in the formula. Most operators offer free shipping above a threshold and then forget that the threshold orders carry the full freight. Heavier or bulkier SKUs make this worse, and shipping rates drift up over time — which means your break-even ROAS drifts up with them, silently, between the quarters when you last recalculated it.

The fulfillment side of returns

Returns are where the naive number breaks down completely, for two reasons.

First, a return is not a neutral reversal. You already paid to pick, pack, and ship the unit out; now you pay again for the inbound label, plus inspection and restock labor, and you refund the revenue. If the item can’t be resold, add the COGS on top. In the table, the returns provision assumes a roughly 15% return rate and about $29 of unrecoverable fulfillment cost per return (outbound shipping, pick/pack, packaging, inbound label, restocking) on a resalable unit — spread across all orders, that’s $4.35 each. Both the rate and the per-return cost are illustrative; your category may run far higher or lower, and a high not-resalable share pushes it up sharply.

Second — and this is the trap that hides the damage — the ad platform reports gross purchase value at the moment of conversion. Refunds land days or weeks later, outside the attribution window, so they never touch the ROAS you’re staring at. The platform credits you full revenue for orders that came back. Your reported ROAS is already optimistic before you account for the cost of processing those returns. Both effects push the same direction: the real break-even is higher, and the number you’re optimizing toward is inflated.

Payment processing fees belong in the bracket too — commonly a couple of percent of revenue — but they’re well-covered elsewhere, so treat them as the one-line entry they are in the table.

What this does to your targets

Break-even is the floor, not the goal. Once you have the honest number, two things change.

You stop scaling campaigns that sit between the fake break-even and the real one — the 1.7-to-2.4 dead zone where the dashboard says “winner” and the bank account says “leak.” That band is where most overspend hides.

And you can finally set a profit target instead of a survival one. To actually keep, say, 20% of revenue after ad spend on the example above, you’d need:

Target ROAS = 1 ÷ (contribution margin ratio − desired net margin) = 1 ÷ (0.417 − 0.20) ≈ 4.6

That gap between a 2.4 break-even and a 4.6 profit target is the real shape of thin-margin DTC, and it’s invisible to anyone still dividing 1 by gross margin.

The takeaway

Build your break-even ROAS once, properly:

  1. Start with revenue, not margin.
  2. Subtract COGS, pick/pack, packaging, net shipping, a returns provision, and payment fees.
  3. Invert the contribution margin ratio — that’s the number your ads must clear to not lose money.
  4. Set your target ROAS above it by whatever net margin you intend to keep.
  5. Recompute every quarter, because shipping rates and return rates move and your break-even moves with them.

Then push that real floor into how you read campaigns. (This is the difference Bach AI looks for when it flags a campaign as underwater — it scores against loaded contribution margin, not gross margin, and surfaces the call for your approval rather than acting on it.) The product cost was never the hard part. The costs between the sale and the kept delivery are what decide whether your ads make money — so put them in the formula before you decide a campaign is winning.

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