Dev.to · 4 min read

CAC payback for TikTok Shop should use customer cohorts, not campaign ROAS

CAC payback for TikTok Shop should use customer cohorts, not campaign ROAS

A TikTok Shop campaign can produce a strong ROAS and still take too long to pay back its customer acquisition cost. Campaign ROAS combines new and returning buyers, mixes product margins, and often stops at revenue. A cohort view asks a narrower question: after all costs attached to the buyers acquired in one period, when did the business recover what it spent to acquire them? This model uses contribution profit, refund maturity and repeat purchases at the customer level. Start with a customer cohort A useful cohort is the group of customers whose first paid TikTok Shop order occurred during one closed period, usually a week or month. Do not assign an existing customer to a new acquisition cohort because of a repeat order. Do not count a canceled first order as an acquired customer. Keep acquisition source available so paid, organic, creator and referral cohorts can be compared. For each customer, calculate contribution profit per order: Order contribution profit = net merchandise revenue - product cost - fulfillment and shipping cost - platform and payment fees - creator commission - refund reversals - allocated variable operations cost Exclude fixed salaries, software subscriptions and other costs that do not change with the order. Keep those costs in a later profitability view. Define CAC for the same cohort Customer acquisition cost is: CAC = acquisition spend attributed to the cohort / number of customers acquired Use spend with the same currency, tax treatment and time boundary as the cohort. If campaign spend includes returning-customer orders, allocate it only when the attribution rule is documented. Otherwise report a blended acquisition metric and say so. Organic customers can be useful for comparison, but their CAC is not zero. Their acquisition cost may sit in content, creator seeding or team time outside the ad platform. Measure cumulative contribution, not first-order revenue For each acquisition cohort, accumulate contribution profit over closed observation windows: Cumulative cohort contribution(t) = sum of contribution profit from all orders placed by cohort customers through day t CAC payback occurs on the first day when: Cumulative cohort contribution(t) >= acquisition spend The result is a payback band, such as 31–60 days, rather than a false single-day precision. Worked example Assume one campaign acquired 300 first-time customers and spent 6,000 currency units. CAC = 6,000 / 300 = 20 Contribution profit from the first order averaged 14 per customer. Thirty days later, 25% of the cohort had placed a second order, adding 18 contribution profit per repeat order. Day 30 contribution per acquired customer = 14 + (0.25 × 18) = 18.50 The cohort had recovered 92.5% of CAC by day 30. By day 60, 40% had repeated: Day 60 contribution per acquired customer = 14 + (0.40 × 18) = 21.20 The cohort crossed CAC at some point between day 31 and day 60. The useful operating statement is “31–60 day payback on this cohort,” provided refunds through the chosen maturity window were included. Avoid mixing mature and immature cohorts A cohort measured for seven days cannot be compared with one measured for 90 days. Refunds, cancellations and repeat orders continue to arrive at different times. Use cohort age, not calendar-quarter age: Day 7: first-order quality and early refund signal Day 30: initial repeat-purchase signal Day 60 or 90: more stable payback view Post-maturity: late refunds still require reconciliation Do not call an immature cohort a failure. Mark it pending until its observation window closes. SQL starting point The query below assumes one row per order with contribution profit after refunds known to the maturity cutoff. WITH first_orders AS ( SELECT customer_id, MIN(order_time) AS first_order_time FROM orders WHERE paid_units > 0 AND paid_units > canceled_units GROUP BY customer_id ), cohorts AS ( SELECT customer_id, DATE_TRUNC('week', first_order_time)::date AS cohort_week FROM first_orders ), customer_contribution AS ( SELECT c.cohort_week, o.customer_id, DATE_PART( 'day', o.order_time - (c.cohort_week + INTERVAL '7 days') )::int AS cohort_day, o.contribution_profit FROM orders o JOIN cohorts c USING (customer_id) WHERE o.order_time < CURRENT_DATE - INTERVAL '21 days' ), cohort_totals AS ( SELECT cohort_week, COUNT(DISTINCT customer_id) AS acquired_customers, SUM(contribution_profit) AS cumulative_contribution FROM customer_contribution WHERE cohort_day

This is a summary aggregated from Dev.to. Read the complete article on the original site:

Read full article at Dev.to

More Business & Finance News