Skip to main content
← Back to BlogField notes

Why your contribution margin disagrees with your dashboards.

Six places refunds, shipping zones, and discount stacks quietly destroy DTC margin and how to model the truth in one definition.

DA
Marc Dubois|Field Notes·April 17, 2026·11 min read

Your P&L says 62% gross margin. Your cohort analysis says 41%. You've been operating on the wrong number for eight months. The gap isn't a reporting lag — it's five specific places where margin quietly bleeds out, and your dashboards aren't built to show you where.

1. Refunds Don't Hit Revenue; They Hit Margin

Stripe exports show refunds as a separate line item below revenue. Most BI tools pull top-line revenue first, then append refunds as a cost. That ordering breaks your margin math.

When a $120 product is refunded, your revenue sheet still shows $120 in sales. Refund cost shows as $120 below the line. Your gross margin calculation never sees the adjustment — it runs against the full $120 before the return. You're reporting 62% when the true figure is closer to 58%, and that 4-point gap compounds across every cohort.

The fix: refunds must be applied before margin is calculated, not treated as a post-hoc deduction. In SQL or your BI tool, match refunds to the original transaction by order ID and date. Subtract refunded revenue from gross sales before dividing by COGS.

2. Your Shipping Zones Have Different Margins Than You Think

You're charging a flat $8 shipping. Your average COGS per shipment is $11.40. Net shipping margin: negative 30%.

But your dashboard shows this as a $0 line item — or worse, it rolls shipping revenue into product revenue and calls the blend "net revenue." You've got no idea which shipping zone is killing you. West Coast orders might break even. Southeast orders, with longer transit and higher damage rates, lose $4.20 per order after accounting for replacement costs.

Shopify's native analytics don't segment by zone out of the box. You need to export fulfillment cost by region and join it against your order table. Most brands run this monthly and are surprised every single time.

3. Discount Stacks Are Invisible Until They Aren't

Klaviyo flows emit a 15% abandoned cart discount. Your brand ambassador program adds another 10%. A first-purchase offer from last quarter's campaign applies automatically. A BFCM code from 2022 is still live on a Reddit thread and generating orders.

Individually, each looks reasonable. Together, a customer who converted through three stacked offers is sitting at a 35% effective discount on a $80 AOV product. Your COGS on that product is $34. At 35% discount, you're selling at $52 — below cost, and your dashboard never flags it because each discount layer is tracked in a different tool.

Build a discount attribution table that maps every order to every active promotion code. Cross-reference against COGS. Segments running sub-margin should get flagged before the next campaign launches, not after.

4. LTV Cohort Windows Are Misaligned With Return Rates

You're calculating contribution margin on a 90-day LTV window. Your actual return rate on certain SKUs peaks at day 120. Every order placed in that cohort window before the return spike looks profitable — then isn't.

For apparel and accessory DTC brands, 30-day windows are standard but often too short. Returns cluster between 45 and 90 days. Your CAC-to-contribution ratio looks healthy at day 30, deteriorates sharply by day 90, and your finance team can't explain why the LTV cohort diverged from the plan.

Fix the window, then segment by product category. Some SKUs return at 3%. Others at 18%. Blending them into a single margin number hides the problem category and inflates confidence in the business model.

5. Blended AOV Hides the Real Unit Economics

Your average AOV is $94. You're using it to calculate contribution per order: (AOV × gross margin) – CAC. Simple formula. Wrong denominator.

That blended AOV includes a 12% mix of high-AOV bundlers, a 20% mix of single-item buyers at $42 AOV, and a promotional channel driving volume at $56 AOV with a 25% discount applied. Each segment has a different margin profile. Your blended calculation overstates returns on the low-AOV, high-discount segments and understates the actual leverage in your bundling program.

Split your cohort tables by acquisition channel, AOV band, and discount tier before calculating contribution. Report three unit economics numbers, not one.

The Next Step

Pull your last 90 days of Stripe refunds. Cross-reference by product SKU and compare against your COGS per unit. Run the math on what the true gross margin per SKU is — not what your dashboard says it is. If you find a gap larger than 3 points, you have a structural margin problem that campaigns and channel spend won't fix. It needs to be addressed in the product and pricing layer first.

See it in action

Connect your data sources and get your first automated report in under a week.

Book a Demo →
Ready when you are

See Your Data Clearly — Without Building a Data Team.

Connect your sources, standardize your metrics, and get decision-ready answers in minutes.

We use cookies to enhance your browsing experience, serve personalized ads or content, and analyze our traffic. By clicking "Accept All", you consent to our use of cookies.