TikTok Ads
TikTok Ads reports advertising statistics at the level of individual ads. You assemble the report yourself from dimensions and metrics: spend and cost metrics, impressions and clicks, conversions and results, video views by watch depth, paid engagement events, and Instant Experience statistics. Renta exports this report to your data warehouse.
A second report type, Account metadata, loads the profile of every connected ad account: name, status, balance, currency, timezone, and contact details.
Authentication
Renta uses OAuth to authenticate with TikTok Ads. You will be redirected to TikTok for Business to grant Renta limited access to your ad accounts.
Your credentials are encrypted in transit and at rest, and never stored in Renta's application database. You stay in control and can revoke access from your TikTok for Business account settings at any time.
Connect TikTok Ads source
- Navigate to the Connections > Catalog section in the left sidebar.
- Open the Advertising category and click the TikTok Ads card.

Click Log in to your Tiktok Ads account. You will be redirected to TikTok for Business to grant access.

TikTok for Business shows the permissions Renta requests: Ad Account Management, Reporting, Pixel Management, and TikTok Accounts. Click Confirm. TikTok may additionally ask you to verify your identity with a code sent to the email of your TikTok account. After that you are redirected back to Renta.

Finish the setup:
- Source name.
Specify a name for this data source. This is used exclusively in the Renta interface. - Access granted.
Verify that the account is connected successfully.
Click Save to finish.
If your TikTok Ads authorization later changes, click Re-authorize on this source. The connection refreshes in place and every pipeline built on it keeps running.

The new source appears in the Sources list with the Active status. You can now use it in pipelines.

Create a TikTok Ads pipeline
Once the source is connected, create a pipeline to sync your TikTok Ads data into your destination.
In the left sidebar, click New pipeline. On the Source step, select TikTok Ads under Already connected and click Next step.

Choose the TikTok Ads connection you created earlier and click Next step.

On the Destination step, select your destination (for example, Google BigQuery) and click Next step.

Choose the destination connection you want to load data into and click Next step.

Pipeline configuration
On the final step, choose which TikTok Ads data to export and how Renta loads it.
Report configuration
Point the pipeline at the ad accounts you need.

- Ad accounts.
Choose one or several TikTok Ads accounts to export data from. The list shows the ad accounts available to the authorized TikTok for Business user. Renta loads rows from every selected account into the same destination table. - Report Types.
Choose what the pipeline exports.
| Report type | Description |
|---|---|
| Statistics report | Ad-level advertising statistics that you assemble from dimensions and metrics. This is the default report type. |
| Account metadata | The profile of each selected ad account: name, status, balance, currency, timezone, and contact details. |
Parameters
Select the TikTok Ads fields to include in the destination table. The parameters you choose here define the table schema.

| Name | API name | Description |
|---|---|---|
Advertiser ID text | advertiser_id | Group by Advertiser account ID |
Campaign ID text | campaign_id | Group by Campaign ID |
Ad group ID text | adgroup_id | Group by Ad group ID |
Ad ID text | ad_id | Group by Ad ID |
Date date | stat_time_day | Group by day |
Name text | advertiser_name | Group by Advertiser account name |
Campaign name text | campaign_name | Group by Campaign name |
Objective text | objective_type | Group by Advertising objective |
Split Test Status text | split_test | Group by Split test status |
Campaign Budget text | campaign_budget | Group by Campaign budget |
iOS dedicated campaign text | campaign_dedicate_type | Group by Campaign type. iOS14 Dedicated Campaign or regular campaign. |
App promotion type text | app_promotion_type | Group by App promotion type. Enum values: APP_INSTALL, APP_RETARGETING. |
Ad Group Name text | adgroup_name | Group by Ad group name |
Placements Types text | placement_type | Group by Placement type |
Promotion Type text | promotion_type | Group by Promotion type. It can be app, website, or others. |
On/Off text | opt_status | Group by Automated creative optimization status |
Website URL text | adgroup_download_url | Group by Download URL/Website URL |
Profile Image text | profile_image | Group by Profile image |
Catalog Sales Audience text | dpa_target_audience_type | Group by Target audience type for DPA |
Ad Group Budget text | budget | Group by Ad group budget |
Optimization Goal text | smart_target | Group by Optimization goal |
| Name | API name | Description |
|---|---|---|
Cost float | spend | Sum of your total ad spend. |
CPC (Destination) float | cpc | Average cost of each click to a specified destination. |
CPM float | cpm | Average amount you spent per 1,000 impressions. |
Impression int | impressions | Number of times your ads were shown. |
Gross Impressions (Includes Invalid Impressions) int | gross_impressions | Number of times your ads were shown, including invalid impressions. |
Clicks (Destination) int | clicks | Number of clicks from your ads to a specified destination. |
CTR (Destination) float | ctr | Percentage of impressions that resulted in a destination click out of all impressions. |
Reach int | reach | Number of unique users who saw your ads at least once. |
Cost per 1,000 People Reached float | cost_per_1000_reached | Average cost to reach 1,000 unique users. |
Frequency float | frequency | The average number of times each user saw your ad over a given time period. |
Conversions int | conversion | Number of times your ad resulted in the optimization event you selected. |
CPA float | cost_per_conversion | Average amount spent on a conversion. |
CVR (Impressions) float | conversion_rate_v2 | Percentage of results you received out of all impressions on your ads. |
Real-time Conversions int | real_time_conversion | Number of times your ad resulted in the optimization event you selected. |
Real-time CPA float | real_time_cost_per_conversion | Average amount spent on a conversion. |
Real-time CVR (Impressions) float | real_time_conversion_rate_v2 | Percentage of conversions you received out of all impressions on your ads. |
Results int | result | Number of times your ad resulted in an intended outcome based on your campaign objective and optimization goal. |
Cost Per Results float | cost_per_result | Average cost per each result from your ads. |
Results Rate float | result_rate | Percentage of results that happened out of all impressions on your ads. |
Real-time Results int | real_time_result | Number of times your ad resulted in an intended outcome based on your campaign objective and optimization goal. |
Real-time Cost Per Results float | real_time_cost_per_result | Average cost per each result from your ads. |
Real-time Results Rate float | real_time_result_rate | Percentage of results that happened out of all impressions on your ads. |
Secondary Goal Result text | secondary_goal_result | Number of times your ad resulted in an intended outcome based on the secondary goal you selected. |
Cost per Secondary Goal Result text | cost_per_secondary_goal_result | Average cost per each secondary goal result from your ads. |
Secondary Goal Result Rate (%) text | secondary_goal_result_rate | Percentage of secondary goal results that happened out of all impressions on your ads. |
Video views int | video_play_actions | Number of times your video started to play. For each video impression, plays are counted separately and replays are excluded. |
2-Second Video Views int | video_watched_2s | Number of times your video was played for at least 2 seconds. For each video impression, plays are counted separately and replays are excluded. |
6-Second Video Views int | video_watched_6s | Number of times your video was played for at least 6 seconds. For each video impression, plays are counted separately and replays are excluded. |
6-second views (Focused view) int | engaged_view | Number of times your video was played for at least 6 seconds, played in full if it is less than 6 seconds, or received at least 1 engagement within the first 6 seconds. |
15-second views (Focused view) int | engaged_view_15s | Number of times your video was played for at least 15 seconds, played in full if it is less than 15 seconds, or received at least 1 engagement within the first 15 seconds. |
Video Views at 25% int | video_views_p25 | Number of times your video was played at least 25% of its length. For each impression, views are counted separately and replays are excluded. |
Video Views at 50% int | video_views_p50 | Number of times your video was played at least 50% of its length. For each impression, views are counted separately and replays are excluded. |
Video Views at 75% int | video_views_p75 | Number of times your video was played at least 75% of its length. For each impression, views are counted separately and replays are excluded. |
Video Views at 100% int | video_views_p100 | Number of times your video was played 100% of its length. For each impression, views are counted separately and replays are excluded. |
Average Watch Time per Video View float | average_video_play | Average time your video was played per single video view, including any time spent replaying the video. |
Average Watch Time per Person float | average_video_play_per_user | Average time your video was played per user, including any time spent replaying the video. |
Clicks (All) int | engagements | Number of clicks from your ads. This includes clicks that lead to destination as well as those for social and interaction purposes. |
CTR (All) int | engagement_rate | Percentage of impressions that resulted in a click out of all impressions. |
Paid Followers int | follows | Number of follows to the associated profile during the ad impression. |
Paid Likes int | likes | Number of times your ad was liked during the ad impression. |
Paid Comments int | comments | Number of comments sent on your ad during the ad impression. |
Paid Shares int | shares | Number of shares of your ad during the ad impression. |
Paid Profile Visits int | profile_visits | Number of visits to the associated profile during the ad impression. |
Paid Profile Visit Rate float | profile_visits_rate | Percentage of profile visits from ads out of all impressions on your ads. |
Clicks on Music Disc int | clicks_on_music_disc | Number of clicks on the sound associated with your ad during the ad impression. |
Duet Clicks int | duet_clicks | Number of clicks on the "Duet" button. |
Stitch Clicks int | stitch_clicks | Number of clicks on the "Stitch" button. |
Sound Usage Clicks int | sound_usage_clicks | Number of clicks on the "Use sound" button. |
Anchor Clicks int | anchor_clicks | Number of clicks on ad anchors. |
Anchor Clicks Rate int | anchor_click_rate | Percentage of anchor clicks out of all impressions on your ads. |
Clicks on hashtag challenge int | clicks_on_hashtag_challenge | Number of clicks on the hashtag challenge associated with your ad during the ad impression. |
Instant Experience Average View Time float | ix_page_duration_avg | Average time your Instant Experience was shown. |
Instant Experience Average View Percentage float | ix_page_viewrate_avg | Average percentage of content on your Instant Experience that was viewed. |
Instant Experience Video Component Views int | ix_video_views | Number of times your Instant Experience video was played. Replays are excluded. |
Instant Experience Video Component Views at 25% int | ix_video_views_p25 | Number of times your Instant Experience video was played at least 25% of its length. Replays are excluded. |
Instant Experience Video Component Views at 50% int | ix_video_views_p50 | Number of times your Instant Experience video was played at least 50% of its length. Replays are excluded. |
Instant Experience Video Component Views at 75% int | ix_video_views_p75 | Number of times your Instant Experience video was played at least 75% of its length. Replays are excluded. |
Instant Experience Video Component Views at 100% int | ix_video_views_p100 | Number of times your Instant Experience video was played 100% of its length. Replays are excluded. |
Instant Experience Video Component Views int | ix_average_video_play | Average time your instant experience video was played in a single video view, including any time spent replaying the video. |
Playlist page visits int | tt_playlist_visit | The number of playlist page visits the paid ad drove during the campaign. |
Playlist page visit rate float | tt_playlist_visit_rate | The rate of playlist page visits per impression the paid ad drove during the campaign. |
| Name | API name | Description |
|---|---|---|
Address text | address | Address of the advertiser |
Advertiser Account Type text | advertiser_account_type | Type of advertiser account (e.g., AUCTION) |
Advertiser ID text | advertiser_id | Group by Advertiser account ID |
Balance float | balance | Account balance |
Brand text | brand | Brand name if provided |
Cellphone Number text | cellphone_number | Contact cellphone number |
Company text | company | Name of the company |
Contacter text | contacter | Contact person for the account |
Country text | country | Country code (ISO format) |
Create Time datetime | create_time | Account creation timestamp (UNIX) |
Currency text | currency | Default currency of the account |
Description text | description | Description or website URL |
Display Timezone text | display_timezone | Display timezone for the account |
Email text | email | Email address associated with the account |
Industry text | industry | Industry code of the advertiser |
Language text | language | Preferred language setting |
License City text | license_city | City where business license is registered |
License Number text | license_no | Business license number |
License Province text | license_province | Province where business license is registered |
License URL text | license_url | URL to the business license |
Account Name text | name | Display name of the advertiser account |
Owner BC ID text | owner_bc_id | Business center ID of the account owner |
Promotion Area text | promotion_area | Promotion area setting |
Promotion Center City text | promotion_center_city | Promotion center city |
Promotion Center Province text | promotion_center_province | Promotion center province |
Rejection Reason text | rejection_reason | Reason for account rejection, if any |
Role text | role | Role of the advertiser account (e.g., ROLE_CHILD_ADVERTISER) |
Status text | status | Current status of the advertiser account |
Telephone Number text | telephone_number | Landline telephone number |
Timezone text | timezone | Timezone in GMT format |
On the Dimensions tab, check the fields that describe the ad behind each row: Date, advertiser id and name, campaign id, name, budget and objective, ad group id, name and budget, ad id, placement type, promotion type, and optimization goal.
On the Metrics tab, check the figures to export: spend, CPC, CPM and CPA, impressions and clicks, reach and frequency, conversions and results together with their real-time variants, video views by watch depth, paid followers, likes, comments and shares, profile visits, clicks on the music disc, Duet and Stitch buttons, Instant Experience statistics, and playlist visits.
Whichever dimensions you pick, the statistics stay at the level of individual ads. Fields such as campaign or ad group name describe the objects the ad belongs to.
The Statistics report requires at least one metric. A configuration with dimensions only is rejected with the error "Please add at least one TikTok Ads metric".
For the Account metadata report the picker contains only dimensions: account name and status, balance and currency, timezone, country, company and contact details, and business license attributes. The destination table gets one row per selected ad account.
Include the Date dimension in the Statistics report. With it, each row in the destination table is one day, the table is partitioned by the stat_time_day column, and Renta loads data incrementally. Without it, Renta reloads the whole date range on every run.
Table name
Name the pipeline and the destination table.

- Integration name.
The name of the pipeline. It is used exclusively in the Renta interface. - Table name.
The destination table name. You can keep the auto-generated name or enter your own.
Date range
Set the historical period to load.

- Date start.
The first date of the extraction period. - Date end.
The last date of the extraction period. Leave it as Today to keep collecting new data on every run.
TikTok Ads builds each report asynchronously. Renta creates a report task, waits until TikTok finishes it, and downloads the result. Requests are split into windows of up to 30 days per ad account, so a wide historical range takes longer to load than a few days.
Overwrite period
The overwrite period defines how many recent days Renta reloads on every run.

On each run, Renta re-fetches the report starting from the date of the last successful run minus the overwrite period. The affected days are deleted from the destination table and inserted again, while older data stays untouched. The options range from Without overwrite data to Overwrite all data. The default is Last 3 days.
TikTok Ads can update statistics for recent days after they are first loaded, for example when conversions are attributed to an earlier impression. Keep the overwrite period at several days to capture these updates.
Schedule
Choose how often the pipeline runs.

| Schedule type | Description |
|---|---|
| Manual | The pipeline runs only when triggered manually through the interface or via API. |
| Daily | The pipeline runs once a day at the specified update time. |
| Interval | The pipeline runs at specified time intervals. |
| Cron Expression | The pipeline runs on a schedule defined by a cron expression. |
For Daily schedules, set the Update time, the exact time each run starts, then click Create pipeline.

Renta also supports API triggers and integration with external orchestrators such as Apache Airflow, Dagster, and Prefect. See the full scheduling documentation for details.
The new pipeline appears in the Pipelines section under the ETL tab, where you can track its runs, progress, and the destination table name.

Sync strategy
The synchronization strategy depends on the report type and on whether the report includes the Date dimension.
| Strategy | Supported report types | Description |
|---|---|---|
| Incremental | Statistics report (with the Date dimension selected) | Each row is one day, and the destination table is partitioned by the stat_time_day column. On every run Renta reloads the window from the last successful run minus the overwrite period to the end of the date range: those daily partitions are deleted and inserted again, and older partitions stay untouched. |
| Full reload | Statistics report (without the Date dimension) | The table has no date column to partition by, so Renta requests the whole configured date range and replaces the dataset on every run. |
| Full reload | Account metadata | The report has no date column, so Renta reloads the current state of every selected ad account on each run. |
Changing the selected dimensions or metrics updates the table schema, so the next run after the change reloads the entire date range.
Ready to get started?
Build your data pipeline today or get a personalized demo. Start free!
Need help?
Get expert support to ensure your project succeeds. We're here to help!
Feature requests?
Help shape our product! Share your ideas for new features and integrations.