The CAC payback period in ecommerce is the number of days it takes for the cumulative contribution from a customer cohort to equal what you paid to acquire it. Not revenue. Not platform-reported ROAS. Contribution: revenue net of GST, minus landed COGS, payment fees, shipping, packaging and the cost of returns and RTOs. For a D2C brand funding growth from its own cash flow, 90 days is the bar that matters, because that is roughly how long you can carry inventory and ad spend before the working capital gap starts to bite. If a channel pays back in 45 days you should be spending more on it. If it pays back in 140 days you are running a lending business you did not intend to start.
Most brands we work with have never calculated this properly. They have a ROAS target instead, which is a different number, computed by a party with an interest in the answer.
Why platform ROAS is the wrong input
Three things go wrong at once when you use Ads Manager numbers to judge payback.
First, the revenue figure is gross. It includes GST you will remit, discounts already applied, shipping you will pay for, and orders that will be cancelled or come back as RTO. Second, it is double-counted: Meta claims an order, Google claims the same order, and if you add the two platforms together your "revenue" exceeds what Shopify recorded. Third, the attribution window quietly does the heavy lifting. A 7-day-click, 1-day-view window on a retargeting campaign will report a ROAS of 8 on customers who were going to buy anyway.
The fix is not a better attribution model. It's to stop asking the platform how it did and ask Shopify instead.
Get the contribution number right before you touch cohorts
Everything downstream depends on one figure: contribution per new customer order. Here is the arithmetic for an Indian D2C store, with numbers you should replace with your own.
- AOV, inclusive of GST, after discounts: ₹2,400
- Net of 18% GST: 2,400 ÷ 1.18 = ₹2,034
- Landed COGS, ex-GST: ₹700
- Payment gateway at ~2% plus GST on the fee: ₹57
- Forward shipping: ₹95
- Packaging and pick-pack: ₹22
Contribution on a delivered order: 2,034 − 700 − 57 − 95 − 22 = ₹1,160.
Now the part that only applies here. Say 55% of orders are COD, RTO on COD runs at 18% and on prepaid at 2%. Blended RTO = (0.55 × 18%) + (0.45 × 2%) = 10.8%. Each RTO costs you forward freight, reverse freight and destroyed packaging, call it ₹180 all-in, with the unit going back into sellable stock.
Expected contribution per order placed: (0.892 × 1,160) − (0.108 × 180) = 1,035 − 19 = ₹1,016.
So a ₹2,400 order is worth about a thousand rupees to you. A campaign hitting 3x ROAS is spending ₹800 to make ₹1,016, which is fine but a lot thinner than the dashboard suggests. At 2x ROAS, ₹1,200 CAC against ₹1,016, you are underwater on the first order and the whole question becomes whether the second order arrives inside 90 days.
Pull the cohort out of Shopify
Shopify's customer cohort analysis, under Analytics, gives you cumulative revenue per customer by acquisition month. That is the spine of the model. Two things to know about it: it works in monthly buckets, and it reports revenue, not margin.
Handle both like this. Multiply every cell in the cohort table by your contribution margin on net revenue, which in the example above is 1,016 ÷ 2,034 = 50%. Repeat orders usually carry a slightly better margin, because discounting is lighter and prepaid share is higher, so if you want to be precise, run a second margin for repeat orders and apply it to everything after the first purchase. If you need day-level granularity rather than month buckets, export orders as CSV, key on customer ID and first-order date, and build the 30/60/90-day cumulative columns in a sheet. It takes an afternoon once and about twenty minutes a month after that.
For channel splits, use the marketing attribution Shopify stores on the customer's first order and treat it as first-touch. It's imperfect. It's also independent of the ad platforms, which is the entire point. When channel-level payback disagrees violently with what Ads Manager says, the disagreement is the finding.
Worked example: a cohort that misses 90 days
Take the store above. Meta prospecting brings in 1,000 new customers in October at a channel CAC of ₹1,400 (total Meta spend on prospecting campaigns divided by new customers first attributed to Meta, not the platform's cost-per-purchase).
- Day 0 contribution: ₹1,016 per customer. Cumulative: 1,016. Short by ₹384.
- By day 90, 22% of the cohort has placed a second order at ₹1,100 contribution: 0.22 × 1,100 = ₹242. Cumulative: ₹1,258.
Still ₹142 short at day 90. Extrapolating the cohort curve, break-even lands somewhere around day 125. That channel is not unprofitable, but it is consuming cash at roughly ₹384 per customer on the day of acquisition, and at 1,000 customers a month that is ₹3.8 lakh of working capital going out the door monthly before repeat orders start covering it. During a festive ramp, when you are also paying for inventory, that is exactly when brands run out of money while their dashboards look great.
What 90-day payback looks like by channel
The shapes below are patterns we see repeatedly, not benchmarks. Your numbers are the only ones that count.
Brand search. Almost always pays back on the first order, often within days. Also the most cannibalised channel in the account: a meaningful share of those clicks would have arrived organically. Run a brand-term pause for a week and watch total orders, not just paid orders. Some brands find they can hold 70% of the volume without spending.
Non-brand search and Shopping. Usually the closest thing to honest CAC, because intent is explicit and attribution is short. If this channel cannot pay back in 90 days, the problem is generally price or margin, not the campaign.
Performance Max. Blends brand, Shopping and retargeting into one reported number. Payback looks excellent until you segment by first-order attribution in Shopify and discover a third of it was people typing your name into Google. Split brand out with exclusions before you judge it.
Meta prospecting. The channel that most often runs past 90 days, and the one most worth fixing rather than cutting, since it is usually the only source of genuinely new demand. Judge it with a geo holdout, not with attribution.
Meta and Google retargeting. Reported CAC is low, real incremental CAC is frequently a multiple of it. Cheap to keep running at low budget. Dangerous to scale on reported ROAS.
Influencer and affiliate. Payback depends entirely on whether the coupon code is being used by the influencer's audience or by your existing customers who searched "[brand] discount code" at checkout. Check code redemptions against customer first-order dates. We find repeat customers on those codes more often than anyone likes.
Email and SMS. Do not credit these with acquisition. They compress the time to second order, which pulls the whole cohort curve to the left. That is where their value shows up in this model, and it is substantial: moving the 90-day repeat rate from 22% to 30% in the example above adds ₹88 per customer and drags break-even in by about three weeks.
Organic and content. No CAC line in the model, which flatters it, and a long build, which does not. It works on the blended number over quarters rather than on a channel payback curve. If your paid payback is stuck, organic demand is the lever that changes the denominator instead of the numerator.
Sanity-check everything against blended CAC
Channel attribution will always over-allocate. Divide total marketing spend for the month, including agency fees, creative and influencer payments, by net new customers from Shopify. That blended CAC is the number your bank account agrees with. If your channel-level CACs, weighted by volume, come out well below blended, your attribution is leaking and the channel payback figures are optimistic by the same margin.
A blunt opinion: if you are spending under roughly ₹40 to ₹50 lakh a month, a marketing mix model is not worth what it costs. Weekly blended CAC against contribution, plus one geo holdout per quarter on your largest channel, gets you 80% of the answer for the price of a spreadsheet.
When payback runs past 90 days
Four levers, roughly in order of how fast they move.
- Prepaid share. In the example, shifting COD from 55% to 40% takes blended RTO from 10.8% to 8.8% and adds about ₹25 per order. A ₹75 prepaid discount that converts a COD order costs less than the RTO it avoids, once you count both freight legs.
- AOV. Bundles and threshold-based free shipping move contribution rupee-for-rupee. Going from ₹2,400 to ₹2,750 AOV at the same margin structure adds roughly ₹150 of contribution per order, which in the worked example closes the 90-day gap on its own.
- Conversion rate. Lower CAC without touching bids. Site speed is the cheapest version of this, particularly on 4G in tier-2 cities where a heavy theme costs you the session before the hero image paints. We have taken plenty of stores from a 4-second LCP to under 2 by cutting app scripts and deferring third-party tags; the work is mostly subtraction.
- Time to second order. A well-timed replenishment flow with the right interval for your product does more for payback than another creative test. Find the median days-to-second-order in your cohort export and set the flow to fire at 60% of it.
Where this model breaks
It assumes Shopify sees every order. If you sell on Amazon, Nykaa, Blinkit or in retail, those customers are invisible to the cohort and your blended CAC is wrong in whichever direction the offline halo runs. It assumes customers use one email address, which wedding-gift buyers and family accounts routinely do not. And for genuinely one-time products, mattresses, large appliances, most of the jewellery category, the 90-day frame is meaningless: you have to break even on the first order or not at all, and the entire discussion collapses into unit economics.
Multi-location fulfilment breaks the shipping cost assumption too. A single blended freight figure across a Bengaluru and a Delhi warehouse hides the fact that one of them is losing money on every northern order.
Do this on Monday
Export twelve months of orders from Shopify. Add three columns to each customer: first-order date, contribution on first order, cumulative contribution at day 90. Group by first-order month and by the marketing source on that first order. Put channel spend for the same month next to it. You will have a payback curve per channel by lunchtime, and at least one of them will surprise you.
If you would rather have someone check the model against your actual store data, including the RTO and gateway costs most spreadsheets miss, our free store audit covers the commercial side, not just the theme.

