{"id":84035,"plugin_id":"plugin_asdk_app_6ac89c8242908191b1d93c7e8f43c769","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-06T07:25:45.603Z","digest":"54e322f48fed8271721659df9896388671d666e581119d00ba98d26dacca16dd","against":null,"payload":{"description":"Analyze and manage LinkedIn Ads through Windsor.ai. Use when the user asks about their LinkedIn Ads performance — spend, impressions, clicks, CTR, CPC, conversions, or leads at campaign, campaign-group, or creative level, with member demographic breakdowns — or wants to pause/enable a campaign, campaign group, or creative, or change a campaign or campaign-group budget. Do not use for LinkedIn organic company-page data (that's the LinkedIn Organic connector), other ad platforms, or GA4/web analytics.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":525}],"name":"linkedin-ads","skill_md_contents":"---\nname: linkedin-ads\ndescription: Analyze and manage LinkedIn Ads through Windsor.ai. Use when the user asks about their LinkedIn Ads performance — spend, impressions, clicks, CTR, CPC, conversions, or leads at campaign, campaign-group, or creative level, with member demographic breakdowns — or wants to pause/enable a campaign, campaign group, or creative, or change a campaign or campaign-group budget. Do not use for LinkedIn organic company-page data (that's the LinkedIn Organic connector), other ad platforms, or GA4/web analytics.\n---\n\n# LinkedIn Ads via Windsor.ai\n\nWindsor.ai exposes live LinkedIn Ads data (read) and campaign-management actions\n(write) through MCP tools. The connector id is `linkedin`. On the LinkedIn Ads\napp the connector is already scoped, so you usually do not need to pass it; when\na tool asks for a connector, use `linkedin`.\n\nGolden rules:\n\n- **Never guess field, account, action, or option names** — get them from\n  `get_fields`, `get_connectors`, `list_actions`, and `get_options`. Call those\n  first.\n- **Reads are safe; writes change live ad spend.** Only call `execute_action`\n  after the user confirms the specific change.\n- Report the numbers the user asked for, concisely.\n\n## 1. Ground yourself first\n\nCall `get_connectors` to see which LinkedIn ad accounts are connected. If none is\nconnected, help the user connect: `get_connector_authorization_url` (or\n`get_connector_connect_info`) and give them the setup link. If several accounts\nare connected and the request is ambiguous, ask which one.\n\n## 2. Reading performance data\n\n1. Call `get_fields` for `linkedin` to get valid field ids — metrics (spend/cost,\n   impressions, clicks, CTR, CPC, CPM, conversions, leads/form completions) and\n   dimensions (campaign, campaign group, creative, date, plus `member_*`\n   demographics like industry, job title, seniority, company size). Use the\n   exact ids returned.\n2. Call `get_data` with `fields`, the target `account`(s), and a date range\n   (`date_from`/`date_to` or a `date_preset`; add `date` to the fields for a\n   daily breakdown, omit it for aggregated totals).\n\nLinkedIn report specifics:\n\n- **Report levels:** campaign, campaign group, and creative. Some fields require\n  a specific level (get_fields/get_options indicate this). Including an ad/\n  creative field returns creative-level data; otherwise it defaults to campaign\n  level.\n- **Demographic fields (`member_*`)** use their own pivot — request **one\n  demographic breakdown at a time**, on its own, rather than combining several.\n- The API allows up to ~20 metrics and up to 3 pivots per query; keep field sets\n  focused.\n\n## 3. Managing campaigns (write actions)\n\nLinkedIn Ads exposes these actions via `list_actions` / `execute_action`. Always\ncall `list_actions` first to confirm the exact ids and schemas — treat the list\nbelow as guidance:\n\n- **`pause_campaign` / `enable_campaign`** — params: `campaign_id`.\n- **`pause_campaign_group` / `enable_campaign_group`** — params:\n  `campaign_group_id`.\n- **`pause_creative` / `enable_creative`** — params: `creative_id`.\n- **`set_campaign_budget`** — params: `campaign_id`, `budget_type`\n  (`daily` or `total`), `amount`. A **total** budget requires the campaign to\n  have a schedule end date.\n- **`set_campaign_group_budget`** — params: `campaign_group_id`, `amount`\n  (total budget only; the campaign group must have a schedule end date).\n- Newer actions such as `rename_campaign`, `set_campaign_schedule`,\n  `set_campaign_targeting`, and `create_creative` are also listed today; build\n  their params only from the schema `list_actions` returns, and confirm first.\n\nBudget mechanics:\n\n- `amount` is in the **account currency major unit** — e.g. `100.00` means one\n  hundred (not cents, not micros). The currency is resolved automatically from\n  the account. `set_*_budget` sets an **absolute** value, not a delta: to raise\n  by a percentage, read the current budget, compute the new absolute amount, and\n  set that.\n\nWrite workflow — every time:\n\n1. Resolve the campaign/campaign group/creative to its id (via a `get_data` read\n   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 'Q3 Leads' (id 123…)?\" or \"Set daily budget for campaign X to\n   €100.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.\n\n## 4. Reference real data, don't fabricate\n\nOn an error (unknown field/connector/account/action), call the relevant\ndiscovery tool and retry with correct ids. Never invent spend, lead counts,\ncampaign names, or ids.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}