{"id":56470,"plugin_id":"plugin_asdk_app_69a1247fceb88191a0fde719fd50920d","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-27T00:05:41.561Z","digest":"20d4191b8c2596a0122cc9c76b8c30726342f4454084b0732b9a6f031bac1799","against":null,"payload":{"description":"Check ad budget pacing and plan reallocation from live data: month-to-date spend vs budget with a month-end forecast per channel, cross-channel ROAS benchmarking, and modelled budget shifts with diminishing returns. Use for \"are we on track\", \"where should the next euro go\" and reallocation proposals.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":245},{"relative_path":"assets/budget_reallocation_memo.md","size_in_bytes":2860},{"relative_path":"assets/budget_reallocation_plan.md","size_in_bytes":3674},{"relative_path":"assets/icon-small.png","size_in_bytes":2921},{"relative_path":"references/marketing-leader-guide.md","size_in_bytes":7473},{"relative_path":"references/performance-marketer-guide.md","size_in_bytes":7119},{"relative_path":"scripts/budget_optimizer.py","size_in_bytes":9762},{"relative_path":"scripts/budget_pacing.py","size_in_bytes":7315},{"relative_path":"scripts/roas_ranker.py","size_in_bytes":5482}],"name":"budget-pacing-allocation","skill_md_contents":"---\nname: budget-pacing-allocation\ndescription: Check ad budget pacing and plan reallocation from live data: month-to-date spend vs budget with a month-end forecast per channel, cross-channel ROAS benchmarking, and modelled budget shifts with diminishing returns. Use for \"are we on track\", \"where should the next euro go\" and reallocation proposals.\n---\n\n# Budget pacing and allocation\n\n## Workflows\n\n### Budget pacing and financial forecasting\n**When to use:** the user wants to know if monthly (or quarterly) ad spend is on track and what month-end totals will be. Often mid-month when there's still time to course-correct.\n\n**Platforms typically involved:** whichever platforms have meaningful spend. For B2B usually Google Ads, LinkedIn Ads, Facebook Ads. For ecommerce, add Pinterest and TikTok.\n\n### Step 1 — Pull month-to-date data\n> Pull the daily ad spend and total conversions for the current period across [the connected ad platforms].\n\nDaily granularity is required — the pacing script computes the run rate as the month-to-date daily average. If spend ramped mid-month, say so and project from the recent daily rate instead.\n\n### Step 2 — Forecast period-end\nUse `scripts/budget_pacing.py`. Pass in the period target budget per channel; ask the user if they haven't shared it. The script outputs period-end projections and the variance vs. target.\n\n### Step 3 — Visualize pacing\nThe question the chart needs to answer: **are we on track, and where's the risk?**\n\nThe most useful visualization for this is usually a line chart per channel: cumulative spend (solid line) vs. target trajectory (dashed line, a straight line from $0 at period start to target at period end). Channels below the dashed line are underspending; above it are overspending. Shade the gap red or green based on which side of the target the channel is on.\n\nAlternative when the user has many channels (8+): a horizontal bar chart of variance percent, sorted by absolute variance, color-coded by direction.\n\n### Step 4 — Flag pacing issues\nThe script flags channels off-pace by more than ±15% (configurable). Surface the flagged channels with their projected period-end and a one-line recommendation per channel — slow down bidding, increase daily caps, redistribute budget.\n\n### Step 5 — Output\nDefault delivery is the chart in chat plus a markdown summary. Pacing is checked repeatedly, so offer once to publish it as a live Studio dashboard (with `manage_dashboards`). If the user wants a spreadsheet for the planning team, use the `xlsx` skill.\n\n### Common variations\n- **\"What if we hold spend flat for the rest of the period?\"** — re-run the projection with the daily run rate frozen. The script supports a `--freeze-from` date.\n- **Compare to last period's pacing curve, not just the target** — pull prior-period daily data and overlay both lines on the chart. Often more useful than the abstract target line.\n- **Project conversions, not just spend** — the script does both. If conversion volume is the actual concern, lead with that visualization.\n\n---\n\n### Cross-channel ROAS benchmarking\n**When to use:** the user is deciding how to allocate next period's budget across platforms and needs a defensible cross-channel comparison.\n\n**Platforms typically involved:** Google Ads, Facebook Ads, LinkedIn Ads at minimum. For ecommerce: add TikTok, Pinterest, sometimes Amazon Ads.\n\n### Step 1 — Pull the data\n> Pull the total spend, revenue, and ROAS for the last 60 days across [the connected ad platforms].\n\nSurface the attribution model for each platform. If the user doesn't know, name the issue explicitly in the deliverable — comparing Facebook's 7-day-click / 1-day-view ROAS to data-driven ROAS in Google is apples to oranges and a finance partner will spot it.\n\n### Step 2 — Rank and compare\nUse `scripts/roas_ranker.py`. The script ranks channels, computes the best-to-worst spread, and outputs a budget-reallocation recommendation with the diminishing-returns caveat baked in.\n\n### Step 3 — Visualize the ranking\nThe question the chart needs to answer: **how different are the channels in efficiency, and what's the recommendation?**\n\nA sorted horizontal bar chart of ROAS by channel works well as the primary visualization — bars sorted descending, the top performer highlighted, a reference line at blended ROAS so the user can see which channels are pulling weight vs. dragging.\n\nIf the user wants more dimension, a scatter of spend (x-axis) vs ROAS (y-axis), dots labeled by channel, makes the \"efficient at low scale vs. efficient at scale\" distinction immediately visible. Channels in the top-right (high spend, high ROAS) are the keepers; bottom-right (high spend, low ROAS) need attention.\n\n### Step 4 — Justify the recommendation\nBuild from `assets/budget_reallocation_memo.md`. The memo must contain the size of the proposed shift in dollars (not just percent), and the caveat about diminishing returns on the receiving channel. Finance teams flag this almost reflexively; include it preemptively.\n\n### Step 5 — Output\nDefault is the chart plus the memo inline as markdown. If the ranking will be revisited, offer once to publish it as a live Studio dashboard (with `manage_dashboards`). If the user wants a Word doc to send to finance, use the `docx` skill.\n\n### Common variations\n- **CPA instead of ROAS** — pass `--metric cpa` to the ranker. The chart logic flips (lower bars are better).\n- **Compare to industry benchmarks** — Supermetrics doesn't ship benchmarks, but web search can pull recent industry data for the user's category. Overlay as a reference line on the chart.\n- **Different shift percentage** — pass `--shift-pct` to the ranker (default 20%). The memo template renders whatever percentage the script was run with.\n\n---\n\n### Budget reallocation modeler\n**When to use:** the user has current ROAS by channel and wants to model the optimal budget shift for next period, accounting for the reality that more spend on a winner doesn't produce the same ROAS at higher volume.\n\n**Platforms typically involved:** all connected ad platforms with meaningful spend.\n\n### Step 1 — Pull current performance\n> Pull the last 30-60 days of spend and revenue (or conversions × value) by channel from [the connected ad platforms]. Include daily breakdown to surface diminishing-returns signals.\n\nDaily granularity matters — the script needs it to detect whether ROAS holds at higher spend or compresses.\n\n### Step 2 — Get the target spend\nAsk the user (with a multiple-choice question tool if available): what's the total budget for next period? Same as current, ±10%, or a specific number?\n\n### Step 3 — Run the optimizer\nUse `scripts/budget_optimizer.py`. The script:\n1. Computes current channel ROAS and spend\n2. Estimates a diminishing-returns dampening factor per channel from the daily data (channels with higher spend variance and stable ROAS get dampened less; channels with ROAS that already shows compression get dampened more)\n3. Models reallocation toward higher-ROAS channels, but applies the dampening so the model doesn't naively dump all budget into the single winner\n4. Outputs proposed spend per channel and projected total revenue\n\nThis is a model, not a prediction. The script's output is \"given these assumptions, here's the math\" — not \"this will happen.\"\n\n### Step 4 — Visualize the recommendation\nThe question the chart needs to answer: **what's the proposed shift, and what's the projected impact?**\n\nTwo visualizations work well together:\n- A paired bar chart per channel: current spend vs proposed spend. Sorted by absolute shift magnitude.\n- A waterfall chart showing the projected revenue impact: starting from current total revenue, adding contributions from spend increases and subtractions from spend decreases, ending at projected new total.\n\n### Step 5 — Frame the assumptions\nBuild from `assets/budget_reallocation_plan.md`. The plan must include:\n- Specific dollar amounts per channel (current vs proposed)\n- Projected revenue impact with the assumption disclosure\n- The dampening logic (so finance can challenge the model intelligently)\n- A 2-week checkpoint date — when to verify whether the projection is tracking\n\n### Step 6 — Output\nDefault delivery: chart + plan inline as markdown. If the deliverable is going to finance for approval, use the `docx` skill.\n\n### Common variations\n- **Constrained channels** — if some channels have fixed budgets (e.g. a contracted minimum spend on a platform), pass them as `--locked` to the script. The optimizer will only reallocate the unconstrained portion.\n- **Aggressive vs conservative shifts** — pass `--max-shift-pct` (default 25%) to cap how much any single channel can move. Conservative finance teams want smaller shifts.\n- **Goal: total conversions, not revenue** — pass `--metric cpa`. The optimizer flips to minimizing CPA-weighted spend rather than maximizing revenue.\n\n---\n\n## Ad hoc analysis\n\nThe bundled scripts handle the repeatable patterns above. When the user asks something the scripts weren't designed for — \"is there a time-of-day effect on this campaign?\", \"does ad copy length correlate with CPA?\", \"what's the spend distribution across ad sets — concentrated or spread?\" — write fresh analysis code, run it, and build whatever visualization fits the question.\n\nThe \"Choosing the right visualization\" framework in the SKILL.md gives you the decision tree for which chart family fits which type of question. Apply it case by case.\n\n---\n\n## A note on data freshness\n\nPlatforms report with different delays. Facebook is close to real time; LinkedIn can lag up to 24 hours. Google Ads and Meta credit conversions back to the click or impression date, so the last few days keep filling in until the attribution window closes. When the user is making same-day decisions, surface this so they know what \"yesterday's data\" actually means.\n\n## Background\n\nChart choices, principles and gotchas for this area: [references/marketing-leader-guide.md](references/marketing-leader-guide.md), [references/performance-marketer-guide.md](references/performance-marketer-guide.md).\n\n## Before you analyze\n\n- Load saved targets, budgets and known context with `manage_business_context` (`action: get`) and judge results against them, not generic benchmarks.\n- Query correctly: follow the `marketing-data-queries` skill for discovery, field IDs and platform quirks.\n- Check tracking first. If platform conversions and GA4 or backend numbers disagree by more than 20%, or spend continues with zero conversions, say so before any optimization advice.\n- Pull, then analyze, as separate steps. Run one heavy query at a time.\n- Evidence discipline: treat changes on fewer than ~10 conversions as noise, ignore items under 1,000 impressions, don't call learning-phase campaigns failures, check for shared budgets before budget advice, and re-pull before conceding a disputed number.\n- Answer shape: conclusion, business impact, next actions, then \"How I got this\" (one line per data pull).\n- Helper scripts in `scripts/` take a CSV and print a table. Run them if you can execute code; otherwise compute the same thing directly. Templates in `assets/` shape the final deliverable.\n\n## After the analysis\n\n- Analysis only recommends. If the user wants to act (pause, budget shift, negatives), use the `campaign-management` skill, with explicit approval for each change.\n- For a recurring or shareable result, offer once to publish it as a live Supermetrics Studio dashboard with `manage_dashboards` (static preview first, then the live upload).\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}