{"id":56472,"plugin_id":"plugin_asdk_app_69a1247fceb88191a0fde719fd50920d","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-27T00:05:41.622Z","digest":"e5f2ec8c53166c7587f9798e884a0ebe38d09972392772a2513e95dc133cb847","against":null,"payload":{"description":"The shared safety rules and payload shape for writing advertising campaigns through the Supermetrics MCP server — read before write, created paused, approval levels, per-field targeting updates, checking write_status. Use when the user wants to launch a campaign, change a budget or bid, pause or enable ads, edit targeting or manage creatives on ChatGPT Ads or Snapchat, when writing across several platforms at once, or for any campaign change on Google Ads, Meta Ads, Microsoft Advertising, TikTok Ads or LinkedIn Ads.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":255},{"relative_path":"assets/icon-small.png","size_in_bytes":2921}],"name":"campaign-management","skill_md_contents":"---\nname: campaign-management\ndescription: The shared safety rules and payload shape for writing advertising campaigns through the Supermetrics MCP server — read before write, created paused, approval levels, per-field targeting updates, checking write_status. Use when the user wants to launch a campaign, change a budget or bid, pause or enable ads, edit targeting or manage creatives on ChatGPT Ads or Snapchat, when writing across several platforms at once, or for any campaign change on Google Ads, Meta Ads, Microsoft Advertising, TikTok Ads or LinkedIn Ads.\n---\n\n# Campaign management with Supermetrics\n\nThese tools spend real money. Treat every write as consequential.\n\nPlatform payload details (Google Ads, Meta, Microsoft, TikTok, LinkedIn) are in the `marketing-data-queries` skill's `references/<platform>.md` files.\n\n## Before writing anything\n\n1. Campaign writes must be enabled per advertising account at\n   [hub.supermetrics.com/write-settings](https://hub.supermetrics.com/write-settings), where the\n   account owner also sets an approval level: no human approval, going live, budget + going live,\n   or all live changes. If a write fails with a permissions error, that is usually why.\n2. Read before you write. `campaign_and_resource_get` shows current state — campaigns,\n   ad groups, ads, keywords, audiences, budgets. Never update a campaign you have not read.\n3. Check business context with `manage_business_context` (`action=\"get\"`, plus `ds_id`\n   and `account_id`). Naming conventions, budget ceilings and excluded campaigns live there.\n\n## Safety rules\n\n- **New campaigns are always created paused.** This is enforced by the platform layer;\n  do not try to work around it.\n- **Only set `status: \"ENABLED\"` when the user has explicitly approved that specific\n  campaign going live.** Enabling starts spend immediately.\n- **Google Performance Max**: enabling the campaign is not enough — its asset groups are\n  paused too. Enabling those is a second, separately approved step.\n- **`targeting` updates per field.** On update, omitted targeting fields are kept; each field\n  you send replaces that whole list, so send its complete value (all locations, all\n  interests), and `[]` clears it (not on Snapchat). For Google and Microsoft keywords,\n  `ad_groups[].add_keywords` / `remove_keywords` append and remove without touching the rest.\n  TikTok and LinkedIn: target existing ad groups through `ad_groups[].targeting`.\n- **Confirm budgets in writing** before submitting. State the amount, the currency and\n  whether it is daily or lifetime.\n\n## Creating a campaign\n\nUse `manage_campaign` without a `campaign_id`. `budget_amount` is required. Structure:\n\n- Campaign level: name, budget, bidding strategy, dates, campaign-level targeting.\n- `ad_groups[]`: ad sets or ad groups. Omit `id` to create, include `id` to update.\n- `ad_groups[].ads[]`: each needs a name and a `creative` (headlines, descriptions,\n  `final_urls`). Meta ads additionally require `page_id` in the ad's `platform_settings`.\n\nCreatives accept, in order of preference: `asset_url` (a public URL), `asset_id` (already\nin the ad account — find them via `campaign_and_resource_get` with\n`resource_type=\"assets\"`), or `upload_ref` from `creative_picker`. If the user has no\ncreative yet, open `creative_picker` to browse, upload, AI-generate or import one.\n\nPlatform quirks worth knowing before you build the payload:\n\n- **Google Ads**: 3–15 headlines (30 chars), 2–4 descriptions (90 chars), `final_urls`\n  required. Performance Max images must be 1.91:1, 1:1 or 4:5 — 16:9 and 9:16 are rejected.\n- **Meta**: budget sits on the campaign under CBO, on each ad set under ABO. Carousels use\n  `carousel_cards`, not `assets`.\n- **TikTok**: video creatives must use `asset_id`; a URL will not work.\n- **LinkedIn**: single image only.\n\n## Updating\n\nPass `campaign_id` to update. Only the fields you send change. Campaign type and objective\nare fixed at creation and cannot be changed afterwards.\n\nPartial success is possible on multi-entity writes. Always check `write_status` and\n`failures` in the response — do not assume success and do not blindly retry, which can\ncreate duplicates.\n\nWhen adding Google Ads keywords, read the response notes: a keyword that wasn't added is named\nthere with the reason. Report those to the user rather than assuming every keyword landed.\n\n## After writing\n\nEvery change is logged at\n[hub.supermetrics.com/campaign-history](https://hub.supermetrics.com/campaign-history).\nRe-read with `campaign_and_resource_get` to confirm the final state, and tell the user\nexactly what was created or changed, including which entities are paused.\n\n## Forecasting and research\n\nBefore committing spend, `campaign_and_resource_get` also offers `resource_type` values\nfor planning: `forecast` (estimated performance at a given budget), `keyword_ideas` and\n`keyword_volumes`, `reach_estimate`, `targeting_search`, `audiences` and `recommendations`.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}