Tiktok Ads model

Ad performance daily

Daily delivery and conversion results per ad, the Ads Manager "Ads" tab by day.

Grain
date_day x account_id x ad_id
Built from
  1. 5
    Raw tables
  2. 5
    Staging
  3. 1
    Core
  4. 1
    Analytics
Reads from Tiktok Ads
adad_daily_reportad_groupadvertisercampaign
Ships as
Weld and dbt SQL, open source on GitHub
core.tiktok_ads.ad_performance_daily
1-- core.tiktok_ads.ad_performance_daily
2-- Daily delivery and conversion results per ad, the Ads Manager "Ads" tab by day.
3--
4-- Grain: date_day x account_id x ad_id. Currency: the advertiser's.
5-- Depends on: staging.tiktok_ads.ad_daily_report, .ad, .ad_group, .campaign, .advertiser
6--
7-- The first twelve columns are the cross-channel ad contract (date_day,
8-- account_id, account_name, campaign_id, campaign_name, ad_id, ad_name, spend,
9-- impressions, clicks, conversions, conversion_value) shared with the other paid
10-- ads templates in this repo, so they can be stacked with UNION ALL.
11-- In TikTok terms: account_id is the advertiser, the ad set level is the ad group.
12--
13-- conversions = TikTok's "Conversions" column: the number of times the ad's
14-- optimisation event happened (a purchase for a purchase-optimised ad group, a
15-- form submit for a lead ad group, an install for an app ad group), under the
16-- attribution window set on the ad group. What it counts therefore differs per
17-- ad group; optimization_goal and optimization_event say which.
18--
19-- conversion_value = the website Complete Payment value (count x average value).
20-- It is a purchase value, not the value of the optimisation event, so ROAS here
21-- is TikTok's "Complete payment ROAS". App purchases are kept apart in
22-- app_purchases and app_purchase_value. For an app or lead account,
23-- conversion_value will be 0 and ROAS empty.
24
25SELECT
26    r.date_day,
27    r.account_id,
28    adv.account_name,
29    COALESCE(a.campaign_id, g.campaign_id) AS campaign_id,
30    c.campaign_name,
31    r.ad_id,
32    a.ad_name,
33    r.spend,
34    r.impressions,
35    r.clicks,
36    CAST(r.conversions AS FLOAT64)         AS conversions,
37    r.complete_payment_value               AS conversion_value,
38
39    'tiktok_ads'                           AS source,
40    adv.currency,

This model and the 6 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().

Notes

How it counts. And where it stops.

The first twelve columns are the cross-channel ad contract (date_day, account_id, account_name, campaign_id, campaign_name, ad_id, ad_name, spend, impressions, clicks, conversions, conversion_value) shared with the other paid ads templates in this repo, so they can be stacked with UNION ALL. In TikTok terms: account_id is the advertiser, the ad set level is the ad group. conversions = TikTok's "Conversions" column: the number of times the ad's optimisation event happened (a purchase for a purchase-optimised ad group, a form submit for a lead ad group, an install for an app ad group), under the attribution window set on the ad group. What it counts therefore differs per ad group; optimization_goal and optimization_event say which. conversion_value = the website Complete Payment value (count x average value). It is a purchase value, not the value of the optimisation event, so ROAS here is TikTok's "Complete payment ROAS". App purchases are kept apart in app_purchases and app_purchase_value. For an app or lead account, conversion_value will be 0 and ROAS empty.

Raw tables it reads

  • raw.tiktok_ads.ad
  • raw.tiktok_ads.ad_daily_report
  • raw.tiktok_ads.ad_group
  • raw.tiktok_ads.advertiser
  • raw.tiktok_ads.campaign

Put Tiktok Ads in front
of your agents.

Connect Tiktok Ads, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.