← Windsor.ai TikTok AdsCONTENT HISTORY

Update to Windsor.ai TikTok Ads

Snapshot Sep 30, 2026 · 22:58 UTC · version 1.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "tiktok-ads",
  "description": "Analyze and manage TikTok Ads through Windsor.ai. Use when the user asks about their TikTok Ads performance — pulling live campaign, ad group, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns — or when they want to pause or enable a campaign, ad group, or ad, or change a campaign or ad group budget. Do not use for TikTok organic (that's the TikTok Organic connector — no ad or cost data there), or other ad platforms (Meta/Facebook, Google, LinkedIn, Microsoft Ads).",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 496
    }
  ],
  "skill_md_contents": "---\nname: tiktok-ads\ndescription: Analyze and manage TikTok Ads through Windsor.ai. Use when the user asks about their TikTok Ads performance — pulling live campaign, ad group, or ad metrics (spend, impressions, clicks, conversions, CPA, ROAS), comparing date ranges, or finding top or underperforming campaigns — or when they want to pause or enable a campaign, ad group, or ad, or change a campaign or ad group budget. Do not use for TikTok organic (that's the TikTok Organic connector — no ad or cost data there), or other ad platforms (Meta/Facebook, Google, LinkedIn, Microsoft Ads).\n---\n\n# TikTok Ads via Windsor.ai\n\nWindsor.ai exposes live TikTok Ads data (read) and a small set of campaign\nmanagement actions (write) through MCP tools. The connector id is `tiktok`.\nOn the TikTok Ads app the connector is already scoped, so you usually do not\nneed to pass it — but when a tool asks for a connector, use `tiktok`.\n\nGolden rules:\n\n- **Never guess field, account, action, or option names.** They come from\n  `get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those\n  first; do not invent identifiers.\n- **Reads are safe; writes change live ad spend.** Only call `execute_action`\n  after the user has confirmed the specific change.\n- Report numbers the user asked for, concisely. Don't dump raw rows unless asked.\n\n## 1. Ground yourself first\n\nCall `get_connectors` to see which TikTok Ads accounts are connected (each has\nan id and, usually, a name). If none are connected, help the user connect one:\ncall `get_connector_authorization_url` (or `get_connector_connect_info` for the\nauth type and steps) and give them the setup link — do not describe manual\ndashboard navigation.\n\nIf the user names an account, match it to a connected account id. If several are\nconnected and the request is ambiguous, ask which account.\n\n## 2. Reading performance data\n\n1. Call `get_fields` for `tiktok` to get valid field ids (e.g. campaign,\n   ad_group, ad, date, spend, impressions, clicks, conversions, ROAS, CPA — use\n   the exact ids returned, not these examples).\n2. If the analysis needs attribution or segmentation controls, call\n   `get_options` to see the connector's options and valid values.\n3. Call `get_data` with:\n   - `fields`: the ids you actually need (keep the set small).\n   - `accounts`: the target account id(s); omit for all connected accounts.\n   - A date range: either `date_from`/`date_to` (`\"2026-07-01\"`), or\n     `date_preset` — `last_7d`, `last_30d`, `last_Xd`/`last_Xw`/`last_Xm`,\n     `this_month`, `this_year`, `last_year`. Append `T` to include today\n     (e.g. `last_7dT`, `this_monthT`).\n   - `options`: only if get_options showed relevant ones.\n   - `filters`: optional conditions, e.g. `[[\"spend\", \"gt\", 100]]`; combine with\n     `\"and\"`/`\"or\"` and nest as needed.\n\nCommon requests → recipe:\n\n- **Overview / trend:** fields `date` + the metrics, over a preset range.\n- **By campaign:** fields `campaign` + metrics; sort/aggregate in your answer.\n- **Best / worst campaign:** pull campaign + the metric, then rank; return only\n  what was asked (e.g. just the campaign name) if the user constrained the\n  output format.\n- **Efficiency:** CPA = spend ÷ conversions; ROAS = conversion value ÷ spend.\n  Compute from returned fields; note if conversions are zero.\n\nWatch out: TikTok Ads money fields are in the account currency (state it if\nknown). If a field the user wants isn't in `get_fields`, say so rather than\nsubstituting a different metric.\n\n## 3. Managing campaigns (write actions)\n\nTikTok Ads exposes a small set of write actions via `list_actions` /\n`execute_action`. Always call `list_actions` first for the exact ids and JSON\nschemas — treat the summary below as guidance, not gospel. They cover:\n\n- **Status:** `pause_campaign` / `enable_campaign`, `pause_ad_group` /\n  `enable_ad_group`, `pause_ad` / `enable_ad` — each reversible via its\n  counterpart.\n- **Budget:** `set_campaign_budget` (needs `campaign_id` and `amount`) and\n  `set_ad_group_budget` (needs `ad_group_id` and `amount`). There is no\n  ad-level budget action.\n\nBudget mechanics:\n\n- Amounts are in the **account currency major unit**, not a subunit — `100`\n  means one hundred, not cents or micros.\n- The budget type (daily, lifetime, or dynamic daily) is fixed when the\n  campaign or ad group was created and is detected automatically; you only\n  supply the new amount, not the type.\n- `set_campaign_budget` and `set_ad_group_budget` set an **absolute** value,\n  not a delta. To \"raise by 20%\", read the current budget first (via\n  `get_data` or the platform), compute the new absolute amount, and set that.\n- A campaign whose budget is unlimited (`BUDGET_MODE_INFINITE`) or managed at\n  the ad group level has no campaign budget to set — use\n  `set_ad_group_budget` instead, and vice versa for an ad group whose budget\n  is managed at the campaign level (Campaign Budget Optimization). The action\n  reports this rather than silently doing nothing.\n- Lifetime budget changes take effect immediately. Daily and dynamic daily\n  budget changes take effect from 00:00 the following day in the ad account's\n  time zone — say so if the user expects an instant change.\n\nWrite workflow — every time:\n\n1. Resolve the campaign/ad group/ad to its id (via a `get_data` read on the\n   corresponding name and id fields if the user gave a name).\n2. Build the exact params from the `list_actions` schema.\n3. **Show the user the concrete change and ask them to confirm** — e.g.\n   \"Pause campaign 'Summer Sale' (id 123…) on account 456…?\" or \"Set daily\n   budget for ad group X to €50.00?\".\n4. Only after an explicit yes, call `execute_action` and report the result.\n\nIf the user says \"pause the worst campaign\", first do the read + ranking, then\nname the specific campaign and confirm before pausing — don't pause on the\nstrength of the aggregate alone.\n\n## 4. Reference the user's data, don't fabricate\n\nIf a tool returns an error (unknown field/connector/account), call the relevant\ndiscovery tool (`get_fields`, `get_connectors`, `list_actions`) and retry with\ncorrect ids. Never fill gaps with made-up numbers or campaign names.\n"
}

SHA-256: 62003637e389f37544634c7cb94ba6065f29c0f844150ca7d53b9c74ea661c5c