Ad Integrations
integrations/ad-integrations.md

Ad Integrations

Supported advertising platforms, how they connect, and platform-specific details.

Supported Platforms

PlatformConnectionData
MetaOAuthHourly campaign spend (last 13 months, daily beyond)
Google AdsOAuthHourly campaign spend
TikTokOAuth (Beta)Hourly campaign spend
SnapchatOAuth (Beta)Hourly campaign spend
AppLovinAPI KeyHourly spend (no campaign breakdown)
GoAffProAPI TokenDaily affiliate commissions

All platforms can be connected from Settings → Integrations.

Google Ads — Google gives Kleio the same permissions as the authenticating user. If you authenticate with a user that only has read-only access in Google Ads, Kleio will only have read-only access too.

Meta — Access tokens expire after 60 days and cannot be auto-refreshed. You’ll need to reconnect manually when the token expires. Kleio will notify you when your token is about to expire.

TikTok / Snapchat — Currently in Beta. If you run into any issues, please contact support.

AppLovin — Historical backfills are limited to a 30-day query window.

GoAffPro — Imports daily affiliate commissions. These are included as a cost in your P&L calculations.

Ad Spend Filters

Ad spend filters are text-based rules that control which campaigns Kleio considers. They match against campaign names — if a campaign name contains the filter text, the rule applies. Excluded campaigns are ignored everywhere: P&L, dashboards, new customer metrics, and any other calculation that uses ad spend.

You’ll find them in Settings → Integrations under “Ad spend filters.”

Platform Toggles

Each connected ad platform (Meta, Google, TikTok, Snapchat, AppLovin, GoAffPro) has an Apply filters checkbox. When unchecked, none of the filters below apply to that platform’s spend — all of it is included unfiltered.

By default, filters apply to all platforms.

Filter Types

There are five filter types. Each takes a text string that is matched against campaign names.

Exclude

Ignore ad spending from campaigns containing this text. Matching campaigns are excluded from all analytics — P&L, dashboards, ROAS, everything. Use this for campaigns you don’t want Kleio to consider at all, like brand awareness campaigns.

Exclude and Include are mutually exclusive. You cannot have both set at the same time.

Include

Only consider ad spending from campaigns containing this text. Everything else is ignored. Use this when you only care about a specific subset of campaigns.

Exclude from New Customer Calculations

Exclude ad spending from new customer metrics for campaigns containing this text. The spend still appears in your overall P&L, but it’s excluded from new customer acquisition cost calculations.

A common use case is retargeting campaigns — they target existing customers, so including them in new customer metrics would inflate your acquisition costs.

Allocate % to New Customers

Some campaigns — like Google PMax — serve both new and existing customers, so a binary include/exclude doesn’t fit. To handle this, you can allocate a percentage split to that campaign by putting the following in the campaign name:

kleio_allocate_nc_XX

where XX is the percentage (0–100) of that campaign’s spend to count as new customer spend. The remaining percentage counts as existing customer spend. For example, kleio_allocate_nc_40 means 40% of the spend is attributed to new customers and 60% to existing customers.

This tag takes precedence over the “Exclude from New Customer Calculations” filter. Values above 100 are capped at 100.

Exclude from Online Channel

Exclude ad spending for campaigns containing this text when viewing the online channel. The spend still appears in your total P&L, but not when you filter to online-only.

Useful for campaigns that drive in-store traffic (e.g., campaigns with “store_traffic” in the name) — you want those costs attributed to POS, not online.

Subscription Campaigns

Only include ad spending from campaigns containing this text when viewing subscription orders. This lets you isolate subscription acquisition spend from your general ad spend.

Example

Say you run a skincare brand with a US Shopify store. You sell online, in retail stores, and offer a subscription box. Your Meta ad account runs campaigns for multiple countries, but this Kleio store only cares about US spend.

Campaigns

CampaignDaily spend
US_prospecting_summer$500
US_retargeting_summer$200
US_store_traffic_NYC$150
US_sub_box_acquisition$100
US_pmax_kleio_allocate_nc_60$300
UK_prospecting_summer$400
UK_retargeting_summer$150

Total Meta spend: $1,800/day.

Filters

On your US store, you set up these filters:

FilterValueWhy
IncludeUS_Only consider campaigns for the US store. You could also use Exclude with UK_ instead.
Exclude from NCretargetingRetargeting targets existing customers, not new ones.
Exclude from Online Channelstore_trafficThis spend drives in-store sales.
Subscription Campaignssub_boxIsolate subscription acquisition spend.

Result

The UK campaigns ($550) are ignored entirely — they belong to a different store. The remaining $1,250 in US spend flows into different parts of Kleio depending on context:

Filtering byCampaigns includedAd spend
All channelsprospecting, retargeting, store_traffic, sub_box, pmax$1,250
Online channelprospecting, retargeting, sub_box, pmax$1,100
New customer metricsprospecting ($500) + store_traffic ($150) + sub_box ($100) + 60% of pmax ($180)$930
Subscription orderssub_box$100

Notice how the PMax campaign’s $300 spend is split: $180 (60%) counts toward new customer metrics and $120 (40%) toward existing customers.

When Do Filters Take Effect?

Changing the filter text in Settings takes effect immediately — Kleio will re-evaluate all existing campaign data against the new filter on the next calculation.

However, if you rename campaigns in the ad platform (e.g. adding [Exclude Kleio NC] to a Meta campaign name), the updated name needs to sync to Kleio first:

  • Active campaigns (currently spending): campaign names update every ~20 minutes during regular ad spend syncs.
  • Inactive campaigns (no longer spending): won’t be picked up by regular syncs. Use “Refresh All Ad Spend” in Settings → Integrations to force a full resync that includes inactive campaigns.