Skip to main content

TikTok campaign metrics under-report vs TikTok Ads Manager (spend −22.3%, impressions −26.6%) — gap is non-uniform and worse on older dates

Summary

For a TikTok ad account, the metrics returned by the Ads API are consistently LOWER than what TikTok Ads Manager shows for the same campaign and the same date range.

We have ruled out the obvious causes on our side (see "What we ruled out"), and we have evidence that the pipeline itself is correct: several ads match Ads Manager to the exact KRW. The shortfall appears to be missing/stale delivery data for a subset of ads and days.

Reproduction

GET /v1/ads/campaigns/1869603293308258/analytics ?accountId=6aba06dcb53728af48fa0de6 &fromDate=2026-09-01&toDate=2026-09-30

Connection (SocialAccount): 6aba06dcb53728af48fa0de6 (platform: tiktokads) Ad account: 7450327792480518161 Campaign: 1869603293308258 "*구매_칠레" Currency: KRW Compared against: TikTok Ads Manager, same campaign, Sep 1–30 2026

The gap

Metric

API

Ads Manager

Diff

spend

1,976,136

2,543,776

-22.3%

impressions

861,164

1,173,841

-26.6%

clicks

6,132

7,858

-22.0%

conversions

1,042

1,311

-20.5%

What we ruled out

  1. Missing days — the response contains all 30 daily rows and none has spend = 0.

  2. Date boundary / timezone — widening the window to 2026-08-31..2026-10-01 still returns only 2,228,743 (still ~12% short).

  3. Missing ads — /v1/ads with pagination returns 170 ads for this campaign, with 170 unique platformAdId values and no duplicates. Querying with and without a date range returns the same 170. Their spend sums exactly to the campaign total (1,976,136), so the API is internally consistent.

  4. Missing ad groups — the API returns 1 ad group for this campaign, which matches Ads Manager (1 ad group).

Evidence that our side is correct

Ads Manager groups creatives under a parent row; the API returns one object per creative. Grouping our rows by the parent name they carry, several groups match the Ads Manager parent row exactly, to the KRW:

Ad (Ads Manager parent row)

Ads Manager

API

AD_260923_hidden-deal

32,788

32,788

BOGO_Others

84,886

84,886

BOGO_SKIN104

80,627

80,627

BUNDLE_SKIN1004

30,607

30,607

AD_260918_freeshipping

730,841

549,474

So the shortfall is not uniform scaling and not a currency/aggregation error — some ads are complete and others are not.

The gap is non-uniform and worse for older dates

Daily spend, API / Ads Manager:

09-01 104,931 / 106,168 99% 09-04 61,658 / 86,677 71% 09-08 42,169 / 83,479 51% 09-11 34,870 / 81,106 43% 09-15 37,358 / 67,252 56% 09-19 35,673 / 85,958 42% <- worst 09-20 40,405 / 70,746 57%

Sep 1-20 total: 1,006,892 / 1,481,965 = 68% Sep 21-30 total: 969,244 / 1,061,811 = 91%

Likely cause (our hypothesis)

Ad status also looks stale. The API returns 169 of 170 ads as active (1 cancelled), while Ads Manager shows several of the parent rows as Paused for the same period.

The AdEngagementCounts schema documents a related behaviour: "paused TikTok ads are not re-synced, so campaigns that ended before the rollout keep 0s here"

If paused ads are not re-synced, their historical delivery would only be partially stored — which matches both the non-uniform daily shortfall and the fact that older dates are affected more.

Request

  1. Please confirm the cause.

  2. Please re-sync historical delivery for this ad account (and, if the cause is general, for TikTok accounts overall).

  3. If paused ads are intentionally not re-synced, we would like to know the exact boundary so we can describe the limitation to advertisers.

Impact on us

We have disabled TikTok result-report publishing on our side until this is resolved. Our reports are frozen snapshots, so an under-reported number would be preserved permanently and would not match what the advertiser sees in Ads Manager. Our live dashboard still shows TikTok data with a notice that the numbers may read lower than the platform.

Status: Completed1 comment

Log in to comment and vote

Comments1

  • Miquel Palet López

    Team•

    Oct 8

    Fixed and re-synced for your account. The cause was creatives deleted in TikTok Ads Manager: TikTok's API leaves deleted ads out of both the ad listing and the ad-level report unless every status is requested explicitly, so their delivery never reached us while Ads Manager still counts it in the campaign totals. That is why some parent rows matched to the KRW and others were short, and why older days (with more deleted creatives) were hit hardest.

    We now request all statuses, import deleted ads that delivered in the last 90 days as cancelled (instead of showing them as active), and backfill their history. Deleted ads also keep syncing for 7 days after their last delivery, so late conversions are picked up.

    Campaign 1869603293308258, Sep 1 to 30, now matches Ads Manager exactly: spend 2,543,776 KRW, impressions 1,173,841, clicks 7,858, conversions 1,311 (Sep 1 to 20: 1,481,965; Sep 21 to 30: 1,061,811). Nothing to do on your side, and other TikTok accounts are picked up automatically on the next hourly sync. On the schema note about paused ads: it only meant the engagement breakdown fields added in August stay at 0 for days stored before then; spend, impressions, clicks and conversions were never affected by that.