At a glance
Return on ad spend, the headline efficiency number for TikTok. total_complete_payment_value ÷ spend. A 4x ROAS means £1 of TikTok spend produced £4 of TikTok-attributed purchase value. TikTok is a discovery-time channel: creative quality dominates over targeting precision, so ROAS swings more on a fresh creative drop than on audience tweaks. Caveat: post-iOS 14.5, expect TikTok-claimed ROAS to over-state UTM-truth Shopify by 30, 60% on iOS-heavy audiences without Events API.
| The formula | total_complete_payment_value ÷ spend, both pulled from the TikTok Ads Reporting API (/v1.3/report/integrated/get/) at advertiser level. Result is unitless. |
| Reporting API level | Advertiser-level. Per-campaign, per-adgroup, per-ad ROAS rolls up to this card weighted by spend. |
| Cost basis | Auction CPM converted to CPC / CPA / CPV by the optimisation goal. Campaigns optimised for COMPLETE_PAYMENT (Conversions objective) bid against expected purchase value; campaigns optimised for CLICK or IMPRESSION are awareness-tier and won’t show meaningful ROAS. |
| What “spend” means | Gross media cost in account currency, before agency markup. Excludes creator-partnership fees on Spark Ads (those are invoiced separately). |
| What “purchase value” means | TikTok-attributed revenue (total_complete_payment_value). NOT order revenue from the commerce platform. Includes Pixel-confirmed conversions, Events API events, and modeled-conversion fill. |
| Currency | Account currency. Single-currency per account. |
| Attribution model | 7-day click + 1-day view (post-iOS 14.5 default). Configurable per ad account to 1d, 7d, 14d, 28d for click and 1d, 7d for view. |
| Attribution window | Default 7d/1d. Lengthening to 14d/1d typically lifts ROAS 5, 12% but TikTok has flagged longer windows as deprecating. |
| iOS 14.5+ ATT impact | Material but smaller than Meta’s. TikTok skews younger and Android-heavier in US Gen-Z (typical iOS share 35, 45% vs 55, 65% on Meta). Without Events API, expect TikTok-reported ROAS to over-state by 30, 60% on iOS-heavy audiences. With Events API live, narrows to 10, 25%. |
| Events API vs Pixel-only | Pixel-only: ATT-blocked iOS conversions missing → ROAS under-states (real higher); TikTok auto-fills with modeled conversions → over-states (modeled differs). Net: noisy and slightly inflated. Events API live: tighter, less modeled fill. |
| Creative-fatigue dominance | TikTok ROAS deteriorates faster than Meta because the For You feed surfaces the same creative to the same audience faster. Typical creative fatigue 2, 3 weeks per ad (vs 4, 8 weeks on Meta). Plan fortnightly creative refreshes. |
| View-through | Included by default (1-day view window). Pure click-only ROAS is in payment_value_in_click ÷ spend (separate metric, not surfaced here). |
| Frequency cap relevance | High frequency (>4 in 7d) compresses ROAS by exhausting the audience. The card doesn’t filter by frequency, but a falling ROAS alongside high frequency is the creative-fatigue signature. |
| Time window | 30D vsP (default 30D vs prior 30D). 2, 6 hour ingest lag on today; modeled-conversion convergence takes 24, 72h. |
| Alert trigger | <2 (warn), <1 (critical). Below 2x is unprofitable for most DTC margins after COGS, fulfilment, and overhead; below 1x is bleeding cash. |
| Sentiment key | {'type': 'gauge', 'thresholds': {'good': 4, 'warn': 2}} |
| Roles | owner, marketing, finance |
Calculation
Calculated automatically from your TikTok Ads data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A US Gen-Z DTC beauty brand on Shopify. 30-day window 02 Apr 26 to 01 May 26. Account currency USD. Events API live since 18 Mar 26. iOS share 38%.| Campaign | Spend ($) | Purchase value ($) | Per-campaign ROAS | iOS share |
|---|---|---|---|---|
| Conversions, cold prospect (CBO, In-Feed) | 22,400 | 78,400 | 3.50x | 39% |
| Conversions, retargeting 7d | 4,200 | 33,400 | 7.95x | 42% |
| Catalog Sales (DSA) | 8,800 | 38,200 | 4.34x | 37% |
| Spark Ads (creator boost) | 3,400 | 9,800 | 2.88x | 41% |
| Account total (this card) | $38,800 | $159,800 | 4.12x | 39% |
- The headline 4.12x is honest by TikTok’s measurement, but the business ROAS is closer to 1.5, 2.0x. Real TikTok-driven Shopify revenue (a probabilistic blend of UTM truth and modeled lift) is probably 159k. Divide by spend: 1.5, 2.1x. Don’t quote 4.12x to the CFO without the gap caveat.
- Retargeting 7d at 7.95x is misleading. Recent site visitors were going to come back anyway; you’re paying TikTok to defend revenue you’d capture for free via email or organic. Same dynamic as Branded Search on Google Ads. The “true acquisition” ROAS is closer to the cold-prospect 3.50x (or ~1.4x on Shopify-truth basis).
- iOS share is 39%, structurally lower than Meta’s typical 60%+. That makes the iOS gap less severe than on Meta. Events API rolled out in March; pre-rollout the gap was probably 80, 110%, post-rollout it’s down to 50, 80%. Don’t apply Meta heuristics directly.
- Modeled fill is running 13% of
total_complete_payment_value. Reasonable, indicates Events API is healthy (modeled fill dropped from ~24% pre-rollout). If you see modeled fill above 22% on an Events-API-live account, the implementation has gaps; checkevent_iddeduplication and event coverage. - 30-day prior window had ROAS 4.62x, 11% decline. Spend up 7%, ROAS down 11%. That’s more than mild scaling pressure on TikTok where creative-fatigue cycles are short. Plan a creative refresh in the next 5, 7 days (cold-prospect creative frequency hit 4.8 last week, the textbook fatigue threshold for TikTok).
- ROAS up + spend up = healthy scaling on a winning creative. Hold.
- ROAS flat + spend down = budget pull-back without channel deterioration. Channel is healthy.
- ROAS up + spend down = pulled back wisely from low-quality auctions, scale back when audience refreshes.
- ROAS down + spend up = scaling beyond the efficient frontier. Cap budget, refresh creative immediately on TikTok, fatigue is faster.
- ROAS down + spend flat = something changed in attribution, conversions, or creative resonance. Investigate before cutting. Check Conversions Trend, CTR Trend, and Clicks vs Conversions first.
Sibling cards merchants should reference together
| Card | Why pair it with ROAS | What the combination tells you |
|---|---|---|
| Total Spend | The denominator. ROAS up + spend up is healthy scaling; ROAS up + spend down is just a retreat. | The shape of growth. |
| Total Revenue | The numerator. Tells you whether ROAS moved on cost-side or revenue-side. | If ROAS dropped because revenue cratered (not spend rising), the issue is on the conversion path. |
| ROAS Trend | Daily series. ROAS is volatile day-to-day on TikTok; the 7-day rolling is the actionable read. | Detect the shape of decline (gradual creative fatigue vs sudden tracking break). |
| ROAS by Campaign | Account ROAS hides per-campaign variance (Conversions vs Spark vs Catalog can differ 2, 3x). | Open before any campaign-level decision. |
| Clicks vs Conversions | The broken-tracking canary. Clicks up + conversions flat = tag-fire failure. | ROAS will look like it dropped, but the cause is measurement. Don’t cut spend on a tracking bug. |
| CTR Trend | Click-through rate. CTR drops typically precede ROAS drops by 5, 10 days on TikTok (creative fatigue). | Early-warning shape for ROAS deterioration. |
| Wasted Spend | Adsets producing zero attributed conversions. | Lowering wasted-spend share lifts ROAS without touching the numerator. |
| GA4 Revenue by Channel | Independent attribution check on TikTok’s self-reported revenue. | TikTok usually reports 30, 60% higher than GA4. The ratio is your iOS gap. |
| Shopify Total Revenue | The truth side. Real business ROAS = (Shopify revenue × TikTok channel share) ÷ TikTok spend. | If business ROAS is 1.7x and TikTok-claimed ROAS is 4.1x, that’s a 2.4x over-claim, normal post-iOS without Events API. |
| Meta Ads ROAS | Peer paid-social ROAS on a different platform. | Different ecosystems, similar attribution mechanics. TikTok’s number is structurally slightly less inflated than Meta’s because of lower iOS share. |
| Google Ads ROAS | Paid-acquisition peer. | Different ecosystems. Google’s ROAS is typically tighter (less attribution gap, intent-driven). |
Reconciling against the vendor’s own dashboard
Where to look in TikTok Ads Manager: TikTok Ads Manager > Campaign > Columns > “Complete payment ROAS (shared)”. This is the column TikTok itself surfaces as the headline efficiency reading. Match the date range to this card’s window and the footer total reconciles to within sub-percent rounding. Other Ads Manager columns that look similar but aren’t:- Mobile App ROAS: app-purchase ROAS via SDK; separate ecosystem from web. Not in this card.
- Conversion ROAS (lead-gen): lead-form conversion value, not purchase value. Different objective.
- Click-through rate (CTR): an engagement metric, not ROAS.
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days off | TikTok uses ad-account TZ (immutable for the existing account). This card uses UTC. For 30D windows the gap averages out; for “today” or “yesterday” it can shift on US Pacific accounts. |
| Attribution window changes | Direction depends | Default 7d/1d post-iOS 14.5. If your account changed mid-window, TikTok retroactively reflows the data. A 7d→14d switch typically lifts ROAS 5, 12%. |
| Modeled conversions | Both inflate equally | TikTok blends modeled into total_complete_payment_value; this card reads the same blended field. |
| Ingest lag | Lower for “today” | 2, 6 hour ingest lag. Today’s ROAS reads low until catchup. Yesterday and earlier are stable. |
| CBO opacity | None on the headline | Campaign Budget Optimisation aggregates audience and placement breakdowns invisibly; the headline ROAS reconciles. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_analytics.ga_revenue_by_channel | GA4 Paid Social TikTok revenue ÷ TikTok spend ≈ this card × 0.6, 0.8 | TikTok uses last-click within 7d/1d; GA4 uses last-non-direct click. TikTok inflates by 30, 60% versus GA4 structurally on iOS-heavy accounts. |
shopify.total_revenue | TikTok’s total_complete_payment_value is a subset of Shopify total revenue but TikTok-attributed Shopify revenue (UTM-tagged) is much smaller than TikTok claims. | TikTok typically claims 1.4, 2.0x the UTM-truth Shopify number on Gen-Z DTC accounts. Use a 40 / 60 TikTok / Shopify blend for the CFO read. |
facebook_ads.fac_roas | Peer paid-social ROAS, NOT a reconciliation | Different audiences, different attribution windows similar in shape. TikTok’s ROAS is structurally slightly less inflated (lower iOS share). |
google_ads.gads_roas | Independent paid channel | Different ecosystems. Google’s ROAS is tighter (intent-driven, less iOS impact, Enhanced Conversions has cleaner consent handling). |
Known limitations / merchant FAQs
Why does TikTok say I’m at 4x ROAS but Shopify says I’m at 1.5x? Three layers stack:- Different denominator definitions. TikTok’s ROAS uses
total_complete_payment_value= TikTok-claimed revenue including modeled conversions and 7d/1d attribution. Shopify’s “TikTok-source revenue” uses UTM-tagged orders only. - iOS 14.5 ATT. Even on the same orders, TikTok has Pixel + Events API + modeling; Shopify has only what’s tagged with the right UTM.
- Last-click vs UTM-truth. TikTok credits any purchase that touched a TikTok click within 7 days. Shopify only credits orders where the customer arrived via a UTM-tagged TikTok link.
- The Pixel can still fire on opted-in users.
- For opted-out users, Pixel is blocked from receiving advertiser-id (IDFA), so TikTok can’t link the conversion back.
- TikTok backfills with statistical modeling and Events API (server-to-server bypass).
- Shopify: TikTok official Sales Channel app > enable Events API > “Maximum” data sharing. 30, 60 minute setup. Auto-deduplicates Pixel + Events via
event_id. - BigCommerce: TikTok Pixel app + manual Events API via Tag Manager + custom event_id. 2, 4 hours.
- Adobe Commerce / Magento: TikTok extension + custom server endpoint. 1, 3 days.
- Custom / headless: server-side proxy mirroring Pixel events. 1, 2 weeks.
- In all cases: deduplicate via
event_id. Test in TikTok Events Manager > Test Events. Allow 7, 14 days for retraining.
total_complete_payment_value for Pixel-only DTC. Patterns:
- Pre-Events-API: ~20, 30%. Inflated.
- Post-Events-API clean: ~5, 12%. Healthy.
- Post-Events-API still high (>20%): implementation gaps.
- Creative fatigue is faster (2, 3 weeks vs 4, 8 on Meta). The For You feed surfaces same creative to same audience faster.
- Algorithm reactivity. TikTok’s CBO responds aggressively to viral creative; a single ad going viral can lift ROAS 30, 50% in 48 hours, dying creative drops it back.
- Google Ads: most reliable. Search has less iOS impact (intent-driven, desktop / Android-heavier). Modeled-conversion share is lowest (5, 12%).
- TikTok: middle. Lower iOS share than Meta, similar modeled fill. Higher week-to-week variance from creative fatigue.
- Meta: least reliable on iOS-heavy audiences. Highest iOS share (55, 65%), highest modeled fill (8, 18% post-CAPI; 20, 30% pre-CAPI).