How to load TikTok Ads data into Snowflake with OWOX Data Marts
To get TikTok Ads data into Snowflake, create a connector Data Mart, sign in with TikTok, enter the advertiser IDs, choose the data level and the Ad Performance endpoint, and publish. The data level sets the grain of the table and should not be changed after the first load. The connector then refreshes the table on a schedule.

TikTok spend tends to arrive in a marketing budget quickly and in reporting slowly. The campaigns are live within a week. Six months later the numbers still reach the channel report as a monthly export, because nobody set up the load.
This guide sets it up: TikTok Ads data in Snowflake, loaded by the TikTok Ads connector in OWOX Data Marts, refreshed on a schedule. It also covers the one decision in the setup that cannot be changed afterwards, and the SQL to read the table.
What you end up with
A table in your own Snowflake account, tiktok_ads_ad_insights, with one row per ad per day by default: impressions, clicks, spend, conversions, video views and engagement.
The connector reads the TikTok Marketing API, writes that table and repeats on a schedule. It does not model the data. Reports on top of it are SQL you write.
Before you start
In TikTok. A TikTok for Business user assigned to the advertiser account, and the numeric advertiser ID. You find it in TikTok Ads Manager.
In Snowflake. A storage of type Snowflake connected to your project, as described in the storage guide: account identifier, warehouse, and a key pair or a username with a programmatic access token. The role must be able to create a database, a schema and tables. A small dedicated warehouse with auto-suspend is enough, and Snowflake pricing explained shows what a daily load costs.
OWOX Data Marts
See your first report built in real time. 15 minutes.
- Connect your data warehouse
- Pick your metrics
- Get a live Google Sheets report
In the time it takes to write a ticket. Then imagine never writing that ticket again.
Book a DemoWe'll use your actual use case
Step 1: create the Data Mart
Click New Data Mart, enter a title such as “TikTok Ads Insights”, select the Snowflake storage and click Create Data Mart. On the Data Setup tab, set Definition Type to Connector and choose TikTok Ads.
Step 2: sign in and enter the advertisers
Step 2: sign in and enter the advertisers
Continue with TikTok is the short way. Sign in as a user who can access the advertiser account and approve access. It needs no developer app.
Manually means your own TikTok developer app: an access token, an App ID and an App Secret. TikTok reviews every app, which can take up to seven business days, so this route is slower. The credentials guide covers it.
Then fill in Advertiser IDs. Use the numbers only. Several advertisers go in one field, separated by commas or semicolons, and they all write into the same table.

Step 3: choose the data level
This is the setting to get right the first time. Data Level decides what one row of the performance table means.
- AUCTION_AD, the default. One row per ad per day.
- AUCTION_ADGROUP. One row per ad group per day.
- AUCTION_CAMPAIGN. One row per campaign per day.
- AUCTION_ADVERTISER. One row per advertiser per day.
A finer level means more rows and more detail. A coarser one means a smaller table that cannot be broken down later.
The level also decides the keys the connector merges rows on, which is why you should not change it after data has been loaded. New rows would be matched on a different set of keys than the rows already in the table. If you need a second grain, create a second Data Mart with its own table.
For most reporting, keep the default. Ad level can always be summed up to campaigns. The reverse is not possible.
Step 4: choose the endpoint and the fields
Step 4: choose the endpoint and the fields
Each Data Mart loads one endpoint.
- Ad Performance (
ad_insights). Daily performance at the data level you chose. The one for reporting. - Ad Performance by Country (
ad_insights_by_country). The same, with a country breakdown. - Campaigns, Ad Groups and Ads. Names, objectives, budgets, statuses and creative details.
- Advertiser and Audiences. Account details and custom audiences.
Then select fields. The key fields for your data level are locked, and the panel says which ones.

Beyond impressions, clicks and spend, the TikTok-specific fields are worth a look: video views, two-second and six-second views, completion, and likes, comments, shares and follows.
The last screen asks for the database, schema and table. The setup proposes a database named after the source, the schema PUBLIC and a table named after the endpoint.
Step 5: publish, backfill and schedule
Step 5: publish, backfill and schedule
Click Publish & Run Data Mart. The first run loads data from the first day of the previous month and can take several minutes. Afterwards the Data Setup tab shows the source, the Snowflake table and its columns.

History. Click Manual Run and choose Backfill (custom period). One backfill run covers at most 31 days. For a longer history, run consecutive periods, each after the previous one has finished.

Schedule. A Data Mart without a trigger does not run again. On the Triggers tab, add a trigger of type Connector Run: daily, weekly, monthly or at an interval.

Each scheduled run re-requests the days set by the Reimport Lookback Window, two by default. Impressions, clicks and spend settle within a day or two. Conversions keep arriving for as long as your attribution window, so if you report on them, set the lookback at least that long.
One advanced setting to leave alone: Create Empty Tables. With it off, an account with no delivery yet gets no table, and later runs fail because the table is not found.
What the table looks like in Snowflake
What the table looks like in Snowflake
Names are case-sensitive. The connector creates the schema, table and column names quoted. In Snowflake that makes them case-sensitive, and an unquoted name is read as upper case. ads_owox.public.tiktok_ads_ad_insights fails with “does not exist or not authorized”. ads_owox."PUBLIC"."tiktok_ads_ad_insights" works. The database is not quoted; the schema, the table and every column are.
The day is stat_time_day, a date column.
IDs, not names. The performance table carries campaign_id, adgroup_id and ad_id. Names are in the Campaigns, Ad Groups and Ads endpoints. Load the ones you need as separate Data Marts and join on the ID.
Metrics are numbers. impressions, clicks, spend, the video counts and the engagement counts can be summed directly.
Query the data
Both queries were validated on Snowflake against a table loaded by the connector. The examples use a shared database, ads_owox, for all ad platforms.
Spend, clicks and cost per click by campaign and day, for the last 30 days:
SELECT
"stat_time_day" AS date,
"campaign_id",
SUM("impressions") AS impressions,
SUM("clicks") AS clicks,
SUM("spend") AS spend,
SUM("spend") / NULLIF(SUM("clicks"), 0) AS cpc
FROM ads_owox."PUBLIC"."tiktok_ads_ad_insights"
WHERE "stat_time_day" >=
DATEADD(day, -30, CURRENT_DATE())
GROUP BY "stat_time_day", "campaign_id"
ORDER BY date, spend DESC;
Engagement rate by campaign, a number TikTok reports are often read for:
SELECT
"campaign_id",
SUM("impressions") AS impressions,
SUM("likes") + SUM("comments") + SUM("shares")
AS engagements,
(SUM("likes") + SUM("comments") + SUM("shares"))
/ NULLIF(SUM("impressions"), 0)
AS engagement_rate,
SUM("spend") AS spend
FROM ads_owox."PUBLIC"."tiktok_ads_ad_insights"
WHERE "stat_time_day" >=
DATEADD(day, -30, CURRENT_DATE())
GROUP BY "campaign_id"
ORDER BY spend DESC;
What counts as an engagement is your definition. Here it is likes, comments and shares. Write it down once, in a query that is published, and not in each report.
Compute cpc, ctr and cpm from sums, as above. The columns with those names hold the ratio for one ad on one day and cannot be averaged across rows.
From table to report
A connector Data Mart can be reported from directly. On its Destinations tab you attach reports to Google Sheets, Data Studio, Slack or email, each with its own columns and schedule. Snowflake reports in Google Sheets walks through it.
For a report with campaign names and your own engagement definition, publish that query as a second Data Mart and report from it. To put TikTok next to the other channels in one table, see self-service marketing analytics on Snowflake.
Where to go next
The same setup loads the other sources into the same Snowflake account: Facebook Ads, Google Ads, Microsoft Ads, LinkedIn Ads, Reddit Ads and Shopify.
On Databricks the steps are the same and the table names have three parts: see TikTok Ads to Databricks. For the platform itself, start with what Snowflake is and how it works.
Turn your data into decisions.
Governed data marts give you the clean foundation ML needs to actually work.
- No AI hallucinations
- Analyst-governed definitions
- Every number traces to SQL
Frequently Asked Questions
Why does my query say the TikTok Ads table does not exist in Snowflake?
The connector creates schema, table and column names quoted, which makes them case-sensitive in Snowflake, and an unquoted name is read as upper case. Write the names in double quotes exactly as created, for example ads_owox."PUBLIC"."tiktok_ads_ad_insights" and "stat_time_day". The database name is not quoted.
How do I deliver TikTok Ads data from Snowflake to stakeholders?
On the Data Mart's Destinations tab, create reports to Google Sheets, Data Studio, Slack or email, each with its own columns and schedule. For campaign names and your own engagement definition, publish that query as a second Data Mart and report from it. The data stays in your Snowflake account.
How can TikTok Ads be combined with other paid channels in Snowflake?
Load each platform with its own connector Data Mart into the same Snowflake account. Then write one query that selects date, channel, impressions, clicks and spend from each table and combines them with UNION ALL. For TikTok the day is stat_time_day and spend is the spend column. Publish the query as a Data Mart so every report uses the same definition.
What is the data level in the TikTok Ads connector?
The data level sets what one row of the performance table means: one ad, ad group, campaign or advertiser per day. The default is the ad level. It also sets the keys the connector merges rows on, so it should not be changed after data has been loaded. For a second grain, create another Data Mart with its own table.
Which TikTok Ads endpoints can I load into Snowflake?
Ad Performance for daily metrics at the chosen data level, and Ad Performance by Country for the same metrics with a country breakdown. Campaigns, Ad Groups and Ads hold names, objectives, budgets and statuses. Advertiser and Audiences hold account details and custom audiences. Each endpoint is its own Data Mart and table.
What do I need before connecting TikTok Ads to Snowflake?
Your store address, permission to create and install an app in the store, and an Admin API access token issued for that app with read scopes. In Snowflake you need a connected storage with an account identifier, a warehouse and a key pair or a username with a programmatic access token, on a role that can create a database, schema and tables.
How far back should the lookback window go for TikTok Ads?
The Reimport Lookback Window is two days by default, and each scheduled run re-requests those days. Impressions, clicks and spend settle within a day or two. Conversions keep arriving for as long as your attribution window, so if you report on conversions, set the lookback at least as long as that window.
How do I load TikTok Ads data into Snowflake automatically?
Create a Data Mart in OWOX Data Marts on your Snowflake storage, set its definition type to Connector and choose TikTok Ads. Sign in with TikTok, enter the numeric advertiser IDs, choose the data level, pick the Ad Performance endpoint and the fields you need, then publish. A Connector Run trigger on the Triggers tab repeats the load daily, weekly, monthly or at an interval.



