{"id":88483,"plugin_id":"plugin_asdk_app_694a52cfaa3c819192bea84eaa254968","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-10T06:07:59.564Z","digest":"70c1428695c83519ef4478f8108778786771f0db5b9d3d6084c4b8eb5e87801a","against":null,"payload":{"description":"Check budget pacing and reallocate ad budgets across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads and Amazon Ads through Windsor.ai. Use when the user asks if campaigns are on track to spend their monthly budget, will overspend or underspend, which campaigns are limited by budget, how to split or shift budget between campaigns or platforms, or to plan next month's budget. Projects month-end spend, proposes budget changes with the expected effect, and changes budgets only after explicit approval.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":352}],"name":"budget-pacing","skill_md_contents":"---\nname: budget-pacing\ndescription: \"Check budget pacing and reallocate ad budgets across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads and Amazon Ads through Windsor.ai. Use when the user asks if campaigns are on track to spend their monthly budget, will overspend or underspend, which campaigns are limited by budget, how to split or shift budget between campaigns or platforms, or to plan next month's budget. Projects month-end spend, proposes budget changes with the expected effect, and changes budgets only after explicit approval.\"\n---\n\nExplicit instructions from the user take priority over this skill.\n\n# Budget pacing and allocation\n\nAnswer two questions: are the accounts on track to spend the planned budget, and where should the next euro or dollar go. Read first, propose second, change budgets only after an explicit yes.\n\n## 1. Get the plan\n- The platforms hold daily or lifetime budgets, not a monthly plan. Ask for the planned amount: per account, per platform, or one total, and for which month. If the user has no plan, use the sum of current daily budgets x days in the month as the implied plan and say so.\n- Ask for a target if they have one (cost per conversion or ROAS). Without one, rank by cost per conversion.\n- Call `get_connectors` for the connected ad accounts; ask which to include if there are several.\n\n## 2. Read spend and budgets\nFor each ad connector, read field ids from `get_fields`, then call `get_data` at campaign level (campaign name and id, status, spend, conversions, conversion value where available, and the budget fields) for month to date (`this_monthT` includes today; use `this_month` if today's data is still incomplete) and for the last 7 days.\n\nBudget fields and units, checked 2026-11-09:\n- Google Ads: `budget_amount` is the daily budget in the account currency (it does not multiply by the date range). `search_budget_lost_impression_share` is a fraction (0.25 = 25%) of Search impressions lost to budget. `recommended_budget_amount` is returned in micros despite its name (1,700,000,000 = 1,700.00) and is empty when Google has no recommendation.\n- Meta Ads: `campaign_daily_budget`, `adset_daily_budget`, `adset_lifetime_budget` and `campaign_budget_remaining` are in cents (200 = 2.00); `campaign_lifetime_budget` is documented in normal currency units. Currencies without cents (JPY, KRW and others) use whole units. Budgets sit on the campaign (Advantage campaign budget) or on the ad set, never both; read both and use whichever is set.\n- TikTok Ads: `campaign_budget` / `campaign_budget_mode` and `ad_group_budget` / `ad_group_budget_mode`, in the normal currency amount. Modes are daily, dynamic daily (`BUDGET_MODE_DYNAMIC_DAILY_BUDGET`, a weekly average, so one day can spend more; treat it as daily), lifetime, or unlimited.\n- LinkedIn Ads: `campaign_daily_budget_amount`, `campaign_total_budget_amount`, `campaign_group_total_budget` (LinkedIn \"campaigns\" are ad sets; the two campaign amounts come back as text, so convert them to numbers).\n- Microsoft Ads: `budget_amount` (daily cap) and `impression_lost_to_budget_percent` (a fraction, 0.10 = 10%, despite the name) can be read with spend. `monthly_budget` and `month_to_date_budget_spend` cannot be read with `spend`: read them together in a separate call that includes `date`, and use the values on the latest date. Without `date` the server adds up the daily values, which is wrong for both (`month_to_date_budget_spend` is already a running total). Use `conversions_qualified` for conversions.\n- Amazon Ads: `sponsored_products_campaign__campaigndailybudget` and the Sponsored Brands budget fields with their `_budget_type`.\n- Read units are not verified for LinkedIn and Amazon. Sanity-check every budget against average daily spend before using it; if a budget is 100x the daily spend, it is probably in cents or micros.\n\n## 3. Pacing\n- Days elapsed = completed days this month; days left = days in the month minus days elapsed.\n- Projected month-end spend = month-to-date spend + (last 7 days spend / 7) x days left. Use the 7-day rate, not the month-to-date average, so a slow start does not skew it; say which rate you used.\n- Pacing = projected spend / planned budget. Flag over 110% as overspending and under 90% as underspending, per account and per campaign with a meaningful share of spend.\n- Google Ads can spend up to 2x the daily budget on a single day and caps a month at about 30.4x the daily budget, so one high day is not overspending.\n- Skip campaigns paused for the whole period. Note campaigns that started or stopped mid-month, because their 7-day rate does not represent the month.\n\n## 4. Where budget is limited and where it is wasted\n- Limited by budget: Google Ads campaigns with `search_budget_lost_impression_share` above 0.10, Microsoft Ads with `impression_lost_to_budget_percent` above 0.10, or any campaign spending 95% or more of its daily budget on most of the last 7 days. These can take more budget only if their cost per conversion is at or below the account average or the user's target.\n- Weak: campaigns whose cost per conversion is more than 1.5x the account average or target over the last 30 days, or that spent with no conversions. These are where budget comes from.\n- Ignore campaigns with too little data to judge (for example fewer than 10 conversions and under 1,000 clicks in 30 days) and say so. Conversions from the last few days can still arrive, so recent cost per conversion looks worse than it will be.\n\n## 5. Propose\nOne table per account: campaign, current daily budget, month-to-date spend, projected month-end spend, pacing %, cost per conversion, lost to budget, and the proposed new daily budget with the reason.\n- Keep the total within the plan. Moves between platforms need a total plan from the user, and never add amounts in different currencies.\n- Give the expected effect from current efficiency, for example \"+50.00/day at a cost per conversion of 25.00 is about 2 more conversions a day\", and say it assumes efficiency holds at the higher budget, which it often does not.\n- Prefer changes of 20% or less per step on campaigns using automated bidding, so the platform's learning is not reset; say when a bigger move is proposed.\n- Never touch brand campaigns or campaigns the user marked as fixed.\n\n## 6. Apply only what is approved\n- Wait for an explicit yes to the exact list. Partial approval is fine.\n- Call `list_actions` for each connector and build params from the returned schema (budget actions such as `set_campaign_budget`; the live set is what `list_actions` returns). Budgets are absolute values, not deltas. Convert to the unit the action schema expects and show both values in the confirmation: Google Ads takes micros (50.00 = 50000000), Meta takes cents (50.00 = 5000, whole units for currencies without cents such as JPY), LinkedIn, Microsoft Ads and Amazon Ads take the normal amount (50.00 = 50), and TikTok takes whole numbers only (50). Meta allows at most 4 budget changes per ad set per hour.\n- Call `execute_action` once per approved change and report the budget before and after, and anything the platform rejected.\n- If write actions are not enabled for the account, send the user to https://onboard.windsor.ai/app/settings/account and retry after they confirm.\n\n## Limits to state\n- Projections use the recent daily rate; they cannot see seasonality, planned launches, or campaigns scheduled to end.\n- The plan is not stored between conversations; the user gives it each time. For a regular pacing check, offer the scheduled-exports skill for a scheduled report.\n\n## Hand-offs\n- Reporting only -> the marketing-performance-review skill\n- Cutting non-converting spend, search terms and negative keywords -> the wasted-spend-audit skill\n- Pausing, enabling or other changes -> the campaign-management skill\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}