5 Steps to Flag Underpacing Campaigns Before Month End 2026
The last week of every month looks the same at most agencies: someone checks the Google Ads dashboard at 4 PM on the 24th, realizes three clients are 22% behind pace, and the team spends the next four days scrambling to push spend — often into suboptimal placements that tank performance metrics just to hit the budget number. Or worse, the month closes with unused budget and the client asks why you didn't spend what you were hired to spend.
Average client tenure at digital agencies: 22 months — according to the SoDA 2024 Digital Outlook Report. Retention that short is partly a relationship problem, but it's also an operations problem. Clients who feel managed proactively stay longer. Clients who get surprised by underspend or overspend in the same month start shopping.
This recipe shows how to detect underpacing automatically across every client account, surface the right alert at the right time, and take the corrective action — without waiting for someone to manually check dashboards.
Key Takeaways
Underpacing detection works on a simple formula: (spend to date / days elapsed) vs. (total budget / total days). When the actual pacing rate falls below 90% of the target rate, flag it.
The critical detection window is day 20–22 of the month, not the final 3 days. By day 25, corrective options are limited.
Five steps: pull spend data daily, calculate pacing rate per campaign, compare to threshold, route alerts by severity, and trigger corrective actions — or at minimum a human escalation task.
The recipe works across Google Ads, Meta, LinkedIn, and any platform with an API.
The Underpacing Problem, Defined
Underpacing occurs when a campaign's actual spend trajectory will fall short of its authorized budget by the end of the billing period. Agencies operating on managed-spend retainers — where the client pays an agency fee plus ad spend — face the greatest exposure: underspend can trigger contract disputes or require make-good spend in the following month.
The detection problem is not that agencies lack data — every platform publishes daily spend. The problem is that no one is systematically comparing daily actuals to expected pacing on a per-campaign basis, per client, every day, with an alert that routes to the right person before the situation is unsolvable.
A 10% underpacing warning on day 20 is manageable. The same warning on day 28 is a crisis.
Who This Is For
This automation recipe is written for digital agencies managing paid media for 10–80 clients with a total managed spend above $500K/month. The workflow assumes you have API access to at least one ad platform (Google Ads, Meta Ads Manager, or LinkedIn Campaign Manager) and a project management or notification tool (Slack, ClickUp, Asana, or similar).
Red flags — skip this if:
You manage fewer than 5 paid media clients — manual dashboard checks remain practical.
All your clients are on flat-fee creative retainers with no media spend component.
Your existing reporting tool (e.g., AgencyAnalytics) already includes pacing alerts with per-campaign granularity.
Step 1 — Pull Daily Spend Data by Campaign
The first step is establishing a daily data pull from each ad platform. This isn't a once-a-month report — it's a scheduled API query that fires every morning at 7 AM and writes the previous day's spend to a central data store.
Google Ads: Use the Google Ads API GoogleAdsService.SearchStream with the query:
SELECT campaign.name, campaign.id, metrics.cost_micros, segments.date
FROM campaign
WHERE segments.date DURING LAST_7_DAYSMeta Ads Manager: Use the Marketing API act_{ad_account_id}/insights endpoint with time_range set to the current month start and date_preset = this_month.
LinkedIn Campaign Manager: Use the adAnalyticsV2 endpoint with dateRange spanning month-to-date.
Store results in a structured format — a simple table per client with columns: date, campaign_id, campaign_name, spend_today, spend_mtd, budget_total, budget_remaining.
If you're running 40 clients across three platforms, that's up to 120 API calls per morning job. Most platforms allow 10,000+ API calls per day on a developer token, so rate limits are not a concern at this scale.
Step 2 — Calculate Pacing Rate Per Campaign
The pacing calculation is straightforward and should run immediately after the daily pull.
Pacing formula:
Expected spend through today =
(total_monthly_budget / days_in_month) × days_elapsedActual spend through today =
spend_mtdPacing rate =
(spend_mtd / expected_spend_through_today) × 100
A pacing rate of 100% means the campaign is spending exactly on track. A rate of 85% means it's 15% behind. A rate of 115% means it's ahead of pace and risks overspending.
The threshold triggers should be calibrated to your agency's SLA, but a reasonable starting point:
| Pacing Rate | Status | Alert Level | When to Trigger |
|---|---|---|---|
| 95–105% | On track | None | — |
| 85–94% | Watch | Yellow (Slack DM to AM) | Day 15+ |
| 70–84% | Warning | Orange (Slack channel + PM) | Day 10+ |
| <70% | Critical | Red (Slack + email to client lead) | Day 7+ |
| >115% | Overpacing | Blue (immediate) | Any day |
Apply this calculation across every campaign in every client account, every morning. Do not aggregate to the account level first — campaigns within the same account can pace very differently, and an overpacing search campaign can mask an underpacing display campaign.
Step 3 — Compare to Threshold and Route Alerts
The routing step is where most homegrown setups fail. A single Slack message to a general #pacing-alerts channel that fires every day with 40 campaigns creates noise, not signal. The routing logic needs to:
Suppress alerts for campaigns that are on track (95–105%).
Group alerts by client account, not by platform.
Route to the account manager responsible for that client, not to a general channel.
Include the actionable context: campaign name, pacing rate, days remaining, estimated end-of-month underspend in dollars.
The alert message format that works best in practice:
[ORANGE] Acme Corp — Search Brand (Google Ads)
Pacing: 81% | Day 21 of 30
MTD spend: $14,200 | Expected: $17,500
Est. month-end gap: -$3,800
Action: Increase bids or expand targeting by Day 24
Owner: @sarah.mThis format gives the account manager everything needed to take action in under 10 seconds. The "action" line is the key addition — it should be pre-populated based on the campaign type and gap size (bid increase for search, budget reallocation for display, creative refresh for social).
Step 4 — Trigger Corrective Actions or Escalation Tasks
For campaigns in the Yellow zone, the alert alone is sufficient — the account manager handles the adjustment. For Orange and Red campaigns, the workflow should also create a task in your project management tool (ClickUp, Asana, or Monday.com) with a due date of "today" and a standard SOP checklist attached.
For agencies running US Tech Automations as their orchestration layer, the corrective step can go further: the platform connects to the Google Ads API directly and can execute a bid adjustment or budget increase automatically when the pacing rate drops below a defined threshold and the account manager has pre-approved an auto-correct window (e.g., "auto-increase daily budget by up to 15% if pacing falls below 85% between days 20–28").
This is not fully autonomous media buying — the account manager sets the guardrails, and any adjustment above a dollar threshold requires human approval. But it closes the gap between "we detected a problem" and "we fixed the problem" from 4 hours to 4 minutes.
Worked Example: A 28-Client Agency Running 340 Active Campaigns
Consider an agency managing $2.1M in monthly ad spend across 28 clients and 340 active campaigns on Google, Meta, and LinkedIn. Before automation, their media team did a weekly manual pacing check every Monday — which meant problems that emerged on Tuesday went undetected for six days. In a 30-day month, that's a structural 20% detection lag.
After implementing a daily pacing automation that queries campaign.budget_remaining_micros from the Google Ads API, calculates pacing rates against each campaign's campaign.campaign_budget.amount_micros, and routes alerts through Slack to named account managers, the agency caught 19 underpacing campaigns in the first full month — 11 of which were in the Yellow zone before day 20, giving the team 10+ days to adjust. End-of-month underspend fell from an average $47,000/month (2.2% of managed spend) to $8,200 (0.4%), and client satisfaction scores on the agency's quarterly NPS survey improved by 14 points on the "proactive communication" question.
Pacing Rate Benchmarks by Campaign Type
Not all campaigns pace identically. Search campaigns burn budget predictably day-over-day; social and display campaigns pace erratically based on audience saturation and creative fatigue. Calibrate your pacing thresholds by campaign type:
| Campaign Type | Expected Pacing Variance | Typical Day-20 Rate | Flag Threshold |
|---|---|---|---|
| Google Search (branded) | ±5% | 96–104% | <88% |
| Google Search (non-branded) | ±10% | 90–108% | <82% |
| Meta Awareness (CPM) | ±18% | 84–112% | <72% |
| Meta Conversion (CPA target) | ±22% | 78–116% | <68% |
| LinkedIn Sponsored Content | ±15% | 86–108% | <75% |
| Display / Programmatic | ±25% | 76–118% | <65% |
Google Search branded campaigns pace within ±5% of target at day 20, making them the most reliable early-warning signal in a mixed-channel portfolio.
Step 5 — Monthly Threshold Review
Pacing thresholds should be reviewed monthly, not set once and forgotten. Two adjustments are common after the first 60 days:
Tighten the window for high-spend clients. A $200K/month client with 15 campaigns across 3 platforms may need detection to start at day 10 rather than day 15, because the dollar exposure at day 20 is too large to course-correct quickly.
Adjust for seasonal spend patterns. Campaigns running in November–December often overpace deliberately (higher CPCs, holiday demand). Your pacing thresholds should account for seasonality — either by using rolling 30-day actuals as the expected baseline instead of a flat budget/day formula, or by having a separate seasonal threshold configuration per client.
According to Forrester Research (2024 B2B Marketing Agency Operations Survey), agencies that implement automated pacing monitoring reduce client-reported "spend surprises" by 68% within the first quarter. Spend surprises — whether under or over — are among the top three cited reasons for agency contract non-renewal.
Automated pacing monitoring reduces client spend surprises by 68% — according to Forrester Research (2024 B2B Marketing Agency Operations Survey).
Pacing Monitoring: Build vs. Buy Comparison
| Approach | Setup Time | Monthly Cost | Platform Coverage | Alert Granularity |
|---|---|---|---|---|
| Manual dashboard review | 0 hours | $0 | Limited to checked platforms | Whoever checks |
| Native platform alerts | 2 hours | $0 | Per-platform only | Campaign level |
| AgencyAnalytics / Whatagraph | 4 hours | $130–$350 | Multi-platform | Account level |
| Custom script + Slack | 8–12 hours | $20–$60 | API-supported platforms | Campaign level |
| Orchestration platform (full recipe) | 6 hours | $150–$400 | API-supported platforms | Campaign + owner-routed |
The build vs. buy decision turns on two questions: how many campaigns do you need to monitor, and how much of the corrective action do you want to automate (not just alert)?
Reporting tools like AgencyAnalytics surface underpacing visually but require a human to check the dashboard. Orchestration platforms push alerts proactively and can execute adjustments within guardrails. For agencies above 100 active campaigns, the daily human-check model breaks down — the volume of potential alerts exceeds anyone's bandwidth to review.
According to Gartner (2024 Marketing Technology Survey), 58% of digital agencies report that manual media monitoring is their highest-volume operational task, averaging 11 hours per week per media buyer. Automation of the detection and routing steps recaptures the majority of that time for strategic work.
Manual media monitoring: 11 hours per week per media buyer — according to Gartner (2024 Marketing Technology Survey).
Underpacing Cost by Detection Day
How much does a late detection actually cost? The table below models the dollar impact of catching an underpacing campaign at different points in the month, for a $50,000/month client campaign running on Google Search:
| Detection Day | Days Remaining | Underspend Gap | Recoverable? | Estimated Month-End Underspend |
|---|---|---|---|---|
| Day 7 | 23 days | $11,667 | Yes — full recovery | $0 |
| Day 14 | 16 days | $23,333 | Yes — likely recovery | $2,000–$5,000 |
| Day 20 | 10 days | $33,333 | Partial — limited options | $8,000–$15,000 |
| Day 25 | 5 days | $41,667 | Poor — suboptimal placements | $18,000–$28,000 |
| Day 28 | 2 days | $46,667 | Minimal — mostly lost | $38,000–$46,000 |
Day-7 detection recovers 100% of underspend vs. $38,000–$46,000 lost when the same campaign isn't caught until day 28 — the case for early thresholds is purely financial.
US Tech Automations configures the detection-day trigger per client account, so high-spend accounts ($50K+/month) start alerting on day 7 while smaller accounts start on day 15 — keeping the alert volume manageable without losing early-warning coverage where it matters most.
Common Mistakes in Pacing Automation
Alerting on account-level pacing instead of campaign-level. A client account that's 100% on pace at the account level can contain 3 campaigns that are 50% underpacing offset by 2 campaigns that are 150% overpacing. You won't see either problem until you look at campaign granularity.
Not accounting for flight dates. Campaigns with non-month-aligned flight dates (starting on the 8th, ending on the 22nd) need pacing calculated against their actual flight window, not the calendar month. Build flight-date awareness into your pacing formula.
Sending the same alert twice. If the Yellow alert fires daily for a campaign that's been Yellow for 5 days and the account manager already escalated on day 1, they're now getting noise. Set a "suppress after first acknowledgment" rule — once an AM marks the alert as "actioned," silence it for 48 hours unless the status degrades to Orange.
TL;DR
Underpacing automation fires a daily API query across every platform, calculates a per-campaign pacing rate against expected spend, routes color-coded alerts to the named account manager with dollar context and a recommended action, creates a PM task for Orange/Red campaigns, and optionally executes a pre-approved budget or bid adjustment automatically. The detection window needs to open by day 7–10 for high-value campaigns, not day 20.
Frequently Asked Questions
How do I handle clients on shared budgets across campaigns?
Some Google Ads campaigns run on a shared budget (one budget pool allocated across multiple campaigns by the algorithm). For these, calculate pacing at the shared budget level and attribute the alert to all campaigns in the pool. Split-campaign pacing rates are meaningless when the budget is shared — aggregate first, then alert.
What if a client has deliberately front-loaded spend?
Some media strategies call for aggressive early-month spend (e.g., pushing spend before CPCs rise mid-month). Flag these campaigns at setup as "front-loaded" and set a custom pacing curve: 60% by day 15, 80% by day 22, 100% by day 30. The formula should use the custom curve instead of the linear flat-rate formula.
How do I handle multiple currencies across international clients?
Normalize all spend to your reporting currency at the daily pull step using that day's exchange rate. Store both the native currency amount and the converted amount. Alerts should display the native currency amount (the client's currency) with the converted equivalent in parentheses.
What's the best tool to store the daily pacing data?
A simple PostgreSQL table or Google Sheet (for lower volume) works. For agencies above 100 campaigns, a time-series database (InfluxDB or BigQuery) handles the daily query load more efficiently and makes historical pacing trend analysis easier to build. BigQuery is the most common choice for agencies already in the Google ecosystem.
Can the automation adjust bids or budgets automatically?
Yes, with guardrails. The Google Ads API allows budget and bid updates via MutateAdGroupBidsRequest and MutateCampaignBudgets. The safest approach: pre-define an "auto-adjust window" per client (e.g., ±15% of daily budget, days 20–28 only) and require the account manager to sign off on the window in writing before enabling it. Log every automated adjustment with a timestamp and the pacing rate that triggered it.
What reporting should I send the client on pacing?
Send a mid-month pacing update on day 15 showing MTD spend, projected month-end spend, and any campaigns flagged this month. This trains clients to expect proactive communication and reduces end-of-month surprise calls. According to the SoDA 2024 Digital Outlook Report, clients who receive proactive mid-month reporting retain at 2.1x the rate of clients who only see end-of-month reports.
Next Steps
Start with a single platform and a single client account to prove the formula before scaling. Most teams spend 6–8 hours building the initial script, 2 hours connecting the Slack routing, and then an hour per additional client account to configure thresholds.
If you want the full recipe — including the multi-platform API connections, the corrective action branching, and the account-manager routing logic — the agentic workflow builder at US Tech Automations packages these steps into a configurable template. For agency-scale pricing, see ustechautomations.com/pricing.
Related reading for agency operators:
About the Author

Helping businesses leverage automation for operational efficiency.
Related Articles
From our research desk: sealed building-permit data across 8 metros, updated monthly.