At a glance
Per-campaign drill-down of zero-conversion spend. The companion to Wasted Spend: that card sums, this card lists. Each row is a campaign that’s been live more than 7 days and produced zero attributed purchases. The 7-day filter excludes Learning-Phase campaigns (TikTok’s algorithm typically needs 25, 50 conversions before delivery stabilises; campaigns younger than 7 days are still in that learning window).
| What it counts | Per-campaign rows where total_complete_payment (purchases) = 0 AND spend > 0 AND campaign_age_days >= 7. Each row shows campaign name, age, spend, impressions, clicks, CTR, the diagnostic shape. |
| Reporting API level | Campaign-level. Drill down further to adgroup-level via Wasted Spend drill-throughs or directly in Ads Manager. |
| The 7-day filter | TikTok’s algorithm needs 25, 50 conversions to exit Learning. Campaigns younger than 7 days are usually still in Learning and shouldn’t be flagged as zero-conversion failures yet. The 7-day age filter is the standard. Lower-volume accounts may need to extend to 10, 14 days. |
| Currency | Account currency. |
| Attribution model | Account-default (typically 7d/1d post-iOS 14.5). |
| iOS 14.5+ ATT impact | Material false-positive risk on iOS-heavy campaigns. A campaign with high iOS share and Pixel-only attribution will appear here even when it’s actually converting (the attribution is just blocked). Cross-check against GA4 Paid Social TikTok sessions and Shopify UTM-tagged orders before acting. |
| Events API impact | Reduces false positives by 40, 60% on iOS-heavy campaigns post-rollout. The card will show fewer rows and lower per-row spend after Events API stabilises. |
| Time window | 30D. |
| Alert trigger | >$0 on any campaign >7D old. Fires the moment any qualifying campaign appears. |
| 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 accessories brand. 30-day window 02 Apr 26 to 01 May 26. Account currency USD. Events API live. iOS share 36%.| Campaign | Age (days) | Spend ($) | Impressions | Clicks | CTR | Verdict |
|---|---|---|---|---|---|---|
| Cold prospect, hypebeast 18-24 (Manual) | 28 | 1,840 | 412,000 | 4,820 | 1.17% | Pause: audience-mismatch waste |
| Catalog Sales, summer drop SKUs | 21 | 1,420 | 318,000 | 3,140 | 0.99% | Refresh: feed-creative fatigue |
| Spark Ads, creator @taylor_drips boost | 14 | 920 | 218,000 | 6,400 | 2.94% | Watch: high CTR, awareness-tier |
| Conversions, lookalike 5% (video viewers) | 11 | 680 | 142,000 | 1,180 | 0.83% | Pause: weak-signal LAL |
| BHC support, #DripCheckChallenge | 9 | 480 | 1,840,000 | 18,200 | 0.99% | Expected: reach-objective |
- Cold prospect, hypebeast 18-24 ($1,840, 28 days, zero conversions). CTR 1.17% is healthy for TikTok cold traffic. The audience clicks but doesn’t buy. That’s the audience-mismatch signature, hypebeasts on TikTok scroll, save, screenshot for price comparison; they don’t convert in-session. Pause this audience entirely. Don’t refresh creative; the issue isn’t the hook, it’s the buyer intent of the segment.
- Catalog Sales, summer drop SKUs ($1,420, 21 days). CTR 0.99% is low; impressions still high (318k) means delivery is fine but the creative isn’t engaging. Catalog ads on TikTok work best with seasonal hooks; “summer drop” feels stale by week 3. Refresh the catalog creative template (new music, new transition pattern, fresh on-screen text). Don’t pause the campaign, refresh the creative.
- Spark Ads, creator @taylor_drips boost ($920, 14 days). CTR 2.94% is excellent (well above platform average). Zero conversions despite strong engagement is the awareness-tier shape: people watch, save, follow the creator, but don’t click through to buy. Watch, don’t pause. Spark Ads have brand-equity value (UGC rights, creator association) that doesn’t show up here. Judge on a 60, 90 day MMM read.
- Conversions, lookalike 5% (video viewers) ($680, 11 days). CTR 0.83% is below platform average, conversions zero. LAL based on video-viewer signal is structurally weak (video views are a noisy intent signal on TikTok; viewers are casual, not buyers). Pause, redirect to LAL 1% (purchasers) or LAL 1, 3% (engagers).
- BHC support, #DripCheckChallenge ($480, 9 days). Reach-objective campaign, 1.84M impressions. Zero attributed purchases is expected for reach-objective. Don’t read this row as waste. The signal that the BHC worked lives elsewhere (branded-search lift on Google, organic site traffic, follower growth on the brand TikTok account). Filter or exclude reach-objective campaigns from this card’s read by configuring
objective != 'REACH'in the alert rule.
- Pause the hypebeast cold prospect and the LAL 5% video-viewer adset today (clearest waste, $2,520 freed).
- Refresh creative on the Catalog Sales summer-drop campaign within 48h (don’t pause; the SKUs are still active).
- Re-allocate $2,520 to LAL 1% (purchasers) and the cart-abandoner retargeting pool (already at 5+ ROAS).
- Filter BHC support out of this card’s alert (configure
objective != 'REACH'in the trigger rules).
- Row count rising while account ROAS holding = experimentation cost. Expected.
- Row count rising while account ROAS dropping = systemic creative fatigue. Refresh creative across the account.
- Same campaign appearing here for 3+ consecutive periods = the audience or creative is broken; pause or rebuild.
- Reach-objective campaigns appearing = configure the alert filter to exclude them.
- High-CTR campaigns with zero conversions = post-click problem (landing page, pricing, audience intent mismatch). Don’t fix at the ad level; fix downstream.
Sibling cards merchants should reference together
| Card | Why pair it with Zero-Conversion Spend | What the combination tells you |
|---|---|---|
| Wasted Spend | The summary view; this is the per-row drill-down. | Whether the waste is concentrated (1, 2 big campaigns) or spread (5+ small ones). Different fixes. |
| Total Spend | The denominator. | Whether $3k of zero-conversion spend is 5% of account spend (manageable) or 30% (urgent). |
| CTR Trend | A high-CTR / zero-conversion row is a downstream problem (landing page, pricing). A low-CTR / zero-conversion row is creative-fatigue. | Different fixes: refresh landing vs refresh ad. |
| Conversion Rate Trend | The downstream-funnel check. | If many campaigns are zero-conversion AND CR is dropping site-wide, the issue is post-click, not ad-level. |
| ROAS by Campaign | Side-by-side with this list lets you compare zero-conversion campaigns to the rest. | Are the zero-conversion ones a minority of total spend or a big chunk? |
| Worst Performing Campaigns | The negative-ROAS list. | Some zero-conversion campaigns are also on the worst-performing list (different definitions, overlapping rows). |
| Campaign Comparison | Per-campaign vsP shape. | Whether a zero-conv campaign is a new failure or a pattern. |
| Conversion Lag | TikTok’s 7d/1d window means today’s “zero-conv” campaign might convert tomorrow. | Don’t act on day-1 reads of new campaigns. |
| Meta Ads Zero-Conversion Spend | Cross-platform peer. | Compare which platform produces more zero-conv waste. TikTok typically more creative-fatigue-driven; Meta more audience-mismatch-driven. |
Reconciling against the vendor’s own dashboard
Where to look in TikTok Ads Manager: TikTok Ads Manager > Campaigns > sort by “Complete payment” ascending, filter Cost > 0, filter Created > 7 days ago. The list of campaigns at the top of the sort with non-zero cost and zero purchases is the same set this card lists. Other relevant Ads Manager views:- Reports > Custom > Campaign Performance: same data downloadable.
- Audience Insights per campaign: helps diagnose audience-mismatch waste.
- Delivery > Learning Phase status: campaigns still in Learning shouldn’t be counted here (the 7-day filter approximates this).
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days off | TikTok uses ad-account TZ; this card uses UTC. A campaign converting just after midnight TZ can look zero-conversion. |
| Modeled conversions | Lower row count in our card | Modeled fill counts toward the campaign’s purchase count; Pixel-only accounts get fewer rows here than they “should” because of modeled fill. |
| Learning-Phase exclusion | Ours stricter | Our 7-day age filter excludes Learning-Phase campaigns; TikTok’s UI does not filter automatically. |
| Ingest lag | Higher row count for “today” | Recent (2, 6h) conversions may not be in yet. |
| Attribution window changes | Direction depends | A 14d→7d switch increases the row count (longer windows hide more campaigns from this list). |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_analytics.ga_revenue_by_channel | If GA4 attributes Paid Social TikTok revenue to a campaign in this list, the iOS attribution gap is the cause. | Real iOS conversions invisible to Pixel show up in GA4 but not in TikTok. |
shopify.total_revenue | UTM-tagged TikTok-source orders should account for any “real” conversion the listed campaigns drove. | Without UTM tags, Shopify cannot attribute back to specific campaigns. |
facebook_ads.fac_zero_conversion_spend | Independent paid-social peer. | Different shape: TikTok rows are more often creative-fatigue (refresh works), Meta more often audience-mismatch (pause works). |
Known limitations / merchant FAQs
Why is the same campaign appearing here for 3 weeks running? Three possibilities, ordered by probability:- Audience-creative mismatch (most common). The audience clicks but doesn’t buy; the campaign won’t convert no matter how many creatives you swap in. Pause and rebuild around a different audience.
- Frequency cap too high. The same audience is seeing the ad 5+ times in 7 days; saturation kills conversion. Cap at 3, 4 in 7d.
- Tracking failure. Pixel mis-fires on the landing page, Events API event_id duplication, or Conversions API event mapping wrong. Audit in Events Manager > Test Events.
campaign_age_days >= 7 (or 10, 14 days for low-volume accounts).
My BHC support campaign always appears here, is that a problem?
No. Reach-objective campaigns systematically appear because they don’t optimise to purchases. Configure the alert to exclude objective in ('REACH', 'VIDEO_VIEWS', 'TRAFFIC') to filter them out. They have value (branded-search lift, follower growth) measured elsewhere.
Should I pause every campaign on this list?
No. Triage by:
- CTR shape. High-CTR / zero-conversion = downstream problem (landing page, pricing, intent mismatch). Don’t pause; fix downstream.
- Creative age. Older than 14 days with declining performance = creative fatigue. Refresh, don’t pause.
- Audience size. Smaller than 100k = audience may be exhausted; rebuild with a broader signal.
- Spend size. Below $50 cumulative = often a test that didn’t get enough volume to learn. Either kill or scale up to give it a chance.
- Creative fatigue: campaign converted historically (e.g. ROAS 3+ for 2, 3 weeks), then dropped to zero. Same audience, different time. → Refresh creative.
- Audience mismatch: campaign never converted from launch, multiple creatives tested. → Pause and rebuild.