Contribution-Margin-Per-Customer: The Single Number That Catches AOV-LTV Inversions

Why 90-day CM per customer — not AOV, not revenue per customer — is the single number that catches AOV lifts that quietly damage reorder rate, returns, and lifetime value.
Contribution Margin Per Customer (90-day)
The gross profit a customer generates in their first 90 days after all variable costs — the one KPI an AOV test can't fake.
Contribution margin per customer (CM/customer) is the average gross profit a newly acquired customer produces across every order they place in their first 90 days, after subtracting COGS, discounts, payment fees, shipping cost, and returns. Unlike AOV, it can't be inflated by a bundle test that lifts basket size but crushes reorder rate. Unlike revenue per customer, it doesn't reward margin-dilutive discounts. It is the guardrail metric you gate rollouts on, because it's the closest cheap proxy for how a change affects true unit economics — before you've waited a full LTV cycle to find out.
The reason this metric exists is a pattern every Shopify store eventually hits: a test lifts AOV, the team ships it, and three months later reorder rate is down and returns are up. The AOV win was real, but it was a cost pushed forward in time — bigger baskets from marginal buyers who never come back, or bundle SKUs that get partially returned.
CM/customer catches this because it aggregates behaviour across the whole 90-day window, not a single order. If the AOV lift came from cannibalising a second purchase, the second purchase is missing from the numerator. If it came from a discount, the discount is netted out. If the bundle drove a 30% return rate, the refund lands in the same customer's ledger. There is no seam to hide the leak in.
CM_per_customer = (Sum of net revenue in 90d − COGS − discounts − payment fees − shipping cost − returns cost) / New customers acquired in cohort
Net revenue 90d
Net revenue in 90 days
Gross order value less taxes for every order placed by the cohort within 90 days of first purchase.
COGS
Cost of goods sold
Landed product cost for units shipped, including inbound freight and packaging.
Discounts
Discount cost
Code and automatic discount value allocated per customer, not per order (see the allocation spoke).
Payment fees
Payment processing fees
Shopify Payments / Stripe / PayPal fees on the gross order value.
Shipping cost
Net outbound shipping cost
Carrier cost minus shipping revenue collected — pulled from the Shopify Shipping API or carrier invoices.
Returns cost
Returns cost
Refunded revenue plus reverse-logistics cost minus recovered inventory value.
New customers
New customers acquired
Distinct first-time buyers in the cohort window.
A mid-market apparel store on Shopify acquired 1,000 new customers in September. Across their first 90 days those customers placed 1,340 orders totalling €95,000 in net revenue.
Net revenue (90d): €95,000
COGS: €36,000
Discounts: €7,500
Payment fees (2.4%): €2,280
Net shipping cost: €6,700
Returns cost (12% return rate): €8,900
New customers acquired: 1,000
→ CM/customer = (95,000 − 36,000 − 7,500 − 2,280 − 6,700 − 8,900) / 1,000 = €33.62
€33.62 is the guardrail number. If a bundle test lifts AOV 18% but drops this figure to €29.90 in the treatment cohort, the AOV win is a CM loss and the rollout gate closes.
Two computation choices matter more than people realise. First, allocate discounts per customer, not per order — a customer who used a first-order code should carry that cost against their whole 90-day contribution, not just order one. Second, net returns at the cohort level, not the order level, so a partial refund on a bundle SKU actually reduces the customer's CM rather than getting written off elsewhere in finance.
Typical 90-day CM per customer by vertical and AOV tier (Shopify, WooCommerce, Magento)
| Vertical | AOV tier | Median 90d CM/customer | Top-quartile 90d CM/customer | Typical 90d return rate |
|---|---|---|---|---|
| Apparel & accessories | €40–70 AOV | €22–34 | €45–60 | 10–14% |
| Beauty & personal care | €30–55 AOV | €28–42 | €55–75 | 3–6% |
| Home & lifestyle | €60–120 AOV | €35–55 | €70–95 | 6–9% |
| Consumer electronics | €90–200 AOV | €18–32 | €40–60 | 8–12% |
| Supplements (non-subscription) | €35–60 AOV | €30–48 | €60–85 | 2–4% |
| Supplements (subscription-first) | €35–60 AOV | €45–70 | €90–130 | 2–4% |
Use the table as a sanity check, not a target. A subscription-first store looking at €45 CM/customer at day 90 may still be underperforming, because most of that customer's value lands in months four to nine — a case covered in the subscription-store edge case. For a one-shot apparel test, €33 in the treatment vs €30 in control is a genuine, actionable win worth rolling out.
Frequently asked questions
Optimise CM per customer, monitor AOV. AOV is a leading indicator that's easy to read on the dashboard the day after a test, but it can move in the opposite direction to profit. CM per customer is what actually pays for CAC, ad spend, and headcount, so it's the number you gate rollouts on.
30 days misses the reorder — most stores see the second purchase land between days 35 and 75, and that reorder is where AOV-lift tests most commonly break. 365 days is directionally better but too slow for a test cadence. 90 days captures the reorder signal while still letting you decide within a quarter.
Revenue per customer ignores COGS, discounts, returns, shipping, and payment fees — all the places an AOV test can leak value. The gap between the two numbers is exactly where inversions hide, which is why the comparison page treats that gap as its own diagnostic.
CM-adjusted LTV is the full lifetime version of the same idea. CM per customer at 90 days is the cheap, fast, testable proxy — you can decide on a variant in a quarter instead of waiting 18 months for LTV to settle.
Yes. A bundle or free-shipping-threshold test that pushes basket size often also raises return rate, and the returns don't post to Shopify's report until the customer actually initiates them 2–6 weeks later. Without netting returns into the cohort's CM, you'll misread the test.
Per customer. A first-order code taken by a one-and-done buyer is 100% cost against that customer's 90-day CM. Splitting it per order dilutes the cost and makes acquisition discounts look cheaper than they are, which is a common source of overconfidence in welcome-offer tests.
The rollout gate depends on your traffic and confidence interval, but a common heuristic is +5% CM per customer at 90 days with a 95% confidence bound above zero. Below that, the risk of a false positive from cohort noise usually outweighs the expected gain.
Orders API for revenue and discounts, Refunds API for returns, Shipping API (or carrier invoices) for outbound cost, and a manual COGS table joined by SKU. The data pipeline spoke walks through the exact endpoints and the joins that trip teams up.
It works but understates the winner. Subscription cohorts realise most CM in months 4–9, so a 90-day snapshot systematically under-credits variants that improve subscription conversion. In that case, extend the window to 180 days or weight by expected subscription retention.
Ship it — that's the clean case. The point of tracking CM per customer isn't to override AOV, it's to catch the ~30–40% of AOV wins that are actually neutral or negative on profit. When both move up together, you have a real win.
Get an AI expert review of your site
Paste your URL — Metricuno's AI runs the same heuristic checks a senior CRO consultant would, scoring your page and prioritising the fixes that'll move conversion fastest.