Skip to content
  1. Home
  2. Help centre
  3. TikTok, Windsor.ai and CSV

Ad spend

TikTok, Windsor.ai and CSV

For TikTok and other platforms, Balanik reads spend from a feed. Use a Windsor.ai account, a public CSV link, or upload a CSV file by hand.

Which route to pick

RouteGood forRefresh
Windsor.ai feedTikTok, Snapchat, Pinterest, Microsoft Ads or LinkedIn Ads, without a developer appAutomatic
CSV linkA published Google Sheet or any export URL you already keep up to dateAutomatic
CSV uploadOne-off history, or a platform with no feedBy hand

You can save up to 10 feeds, Windsor and CSV links combined. While the dashboard is open, each feed refreshes at most once an hour. It can also refresh hourly in the background if you switch that on under Costs → Email and background refresh.

Add a Windsor.ai feed

  1. Create a free account at windsor.ai and connect TikTok Ads there. Windsor’s free plan covers one platform. More platforms need a paid Windsor plan.

  2. Copy your API key from your Windsor account.

  3. In WordPress, open Balanik → Ad spend. On the TikTok and other platforms card, open Add a spend feed.

  4. Set Source to Windsor.ai, give the feed a Name and paste the key into Windsor API key (for Windsor).

  5. Pick a Windsor data source: TikTok Ads, Snapchat Ads, Pinterest Ads, Microsoft Ads, LinkedIn Ads, or All connected sources.

  6. Set Spend currency to the currency your ad account bills in, then press Save feed.

  7. The feed appears on the card. Press Import selected period once to check that spend comes through.

Only ad spend comes through Windsor. Your orders and customers stay on your site.

Add a CSV link

Use the same form, but set Source to CSV link (Google Sheet, export URL) and paste the address into CSV link (for CSV link). The link must be public and start with https://. The file can be up to 2 MB and 20,000 campaign-days.

Balanik needs a date, a spend column and a campaign column. It reads these header names, in any order, and ignores other columns:

ColumnHeader names it accepts
Date (required)date, day, segments.date, date_start
Spend (required)spend, cost, amount, ad_spend, metrics.cost
Campaign IDcampaign_id, campaign id, campaignid, campaign.id
Campaign namecampaign_name, campaign, campaign name, campaign.name, name
Currency (optional)currency, account_currency, currency_code
Source (optional)source, platform, datasource, data_source, channel

You need a campaign ID, a campaign name, or both. Write dates as 2026-09-30. Write spend as a plain number such as 12.50, with no currency sign or thousands separator. If the same campaign appears twice on one day, Balanik adds the two rows together.

Upload a CSV

The Upload a CSV box at the bottom of the Ad spend tab takes a file from your computer. It’s stricter than a CSV link. The first line must be exactly:

date,campaign_id,campaign_name,currency,spend

  1. Set the dashboard period to the dates your file covers.

  2. Enter a Source name, such as manual or tiktok-2025. Use letters, numbers or hyphens.

  3. Choose the file and tick Replace this source’s saved spend for the selected period.

  4. Press Import CSV.

The file can hold up to 5,000 rows and 1 MB. Every row needs all five columns. A campaign ID can hold letters, numbers, - and _, up to 64 characters. Each campaign can appear once per date. Importing again replaces that source’s spend for the period, so nothing is counted twice.

Currencies

Spend is saved in its own currency and converted to your store’s currency. For any currency other than your store’s, add a rate under Costs → Exchange rates first. Balanik uses the newest rate on or before each day. If no rate exists yet, the import stops and names the missing currency. Spend it already converted keeps its rate when you import again.

Direct connections (beta)

Under More direct connections (advanced) you can connect TikTok Ads, Snapchat Ads and Pinterest Ads without Windsor. Each needs your own approved developer app and an access token. Enter the account ID and token, then press Verify and save. Balanik checks the account’s time zone first, as it does for Meta.

  • Snapchat Ads (beta) uses a UUID as its account ID and imports up to 31 days at a time. Replace the token when it expires.
  • Pinterest Ads (beta) imports up to 31 days at a time and only the last 90 days. The token needs ads:read. Use a CSV for older history.

Remove a feed

Press Remove next to a feed. Spend it already imported stays in your reports.

Assigning feed campaigns to products. Allocating Google Ads Script and spend-feed campaigns to products is coming in an update. Their spend already counts in your store’s profit. Campaigns from a CSV upload or a direct connection can be assigned now.

What to do next