Skip to content
esc close · switch
LYRA/ Tools/ Operations/ Budget Pacing Optimizer
Operations On-demandApproval-graduated

Monthly spend, paced daily.

Budget Pacing Optimizer reads where you are against your monthly plan, computes a daily-cap adjustment per campaign with Lyra-Agent-written reasoning, and applies the changes via the Google Ads API once you approve. Four automation levels graduate from insight-only to fully-automated. Every applied change is logged in budget_change_history and Account Diary.

Apply via Google Ads API · 4 automation levels · Diary entry on apply
What runs · the configured workflow

Two modes, four automation levels.

Each pacing run is scoped to one customer. You pick a mode (monthly_cap or redistribute) and an automation level (insight_only → fully_automated). The output is a recommendation per campaign with reasoning + confidence; the apply step is gated by your chosen automation level.

Workflow · Sample · Basalt DTC · April 2026 Live · last run 14:11 UTC
01 · Modes 2 monthly_cap · redistribute monthly_cap: one campaign, land on its monthly target. redistribute: rebalance across a shared budget envelope.
02 · Automation 4 levels Insight → fully-auto insight_only · recommendations · semi_automated · fully_automated. Pick per run; default is recommendations.
03 · Window 14 d Analysis lookback Default 14d. Configurable 7 / 14 / 21 / 30. Conversion lag (default 3d) excluded from baseline.
04 · Apply API Google Ads · direct CampaignBudgetApi.update_campaign_budget. Real Google Ads write — not a CSV export, not a recommendation queue.
Inputs
  • monthly_budget_overrideEUR
  • max_change_percent5–100
  • conversion_lag_days0–14
  • excluded_campaign_idslist
Output per recommendation
  • old / new daily budgetEUR
  • change EUR + %delta
  • reasoningLyra Agent
  • confidence0.0–1.0
Side effects on apply
  • budget_change_history rowaudit
  • Account Diary entrytool_action
  • Assessment metrics+14d backfill
Sample · monthly pacing

A pacing curve with the rebalance to land on plan.

Below is a sample pacing view from one customer, day 26 of April. The dashed line is the planned daily spend to hit €38k for the month; the solid line is actual to date. The recommendations below recommend the day-27-onward adjustments to land on plan.

PACING · basalt-dtc · April 2026 Day 26 of 30 · 87% spent v.2.0 · pacing-engine
Monthly budget €38.0k fixed target
Spent to date €33.1k ▲ on track
Daily target · day 27→30 €1.23k ▼ −€80 vs last week
Days remaining 4
Daily spend · € actual (earth) vs planned (forest, dashed)
DAY 26 · TODAY
Apr 151015202530
Actual spend Planned Plan recomputed at each run from monthly_budget − spent_to_date / days_remaining.
01 Brand · Search +€12 / day · +18% Consistent ROAS at 4.2× over the 14d window; campaign is under-spending vs share-of-search forecast. +18% lifts it inside the monthly envelope without overshooting plan. Confidence 0.84.
02 PMax · Autumn −€18 / day · −9% Pacing +5pp ahead of plan after the Apr 19 lift. Trim 9% to land on the monthly target without breaking the campaign's learning state. Confidence 0.71.
03 Generic · Search no change Within 5% of target after a brief Apr 22 spike. Recent variance below the max_change_percent threshold; hold and re-evaluate next sweep. Confidence 0.62.
04 Display · Retargeting −€6 / day · −12% ROAS dropped to 1.8× over 14d (was 2.6× prior 14d). Trim 12% while we investigate; full pause not justified yet. Confidence 0.58.
<strong>4</strong> recommendations · 0 above max_change_percent (50%) Apply via Google Ads API · diary entry on apply
How the pacing engine works

Heuristic math, Lyra Agent reasoning, Google Ads API.

The pacing math is deterministic — same inputs, same recommendation, every run. The Lyra Agent enters once a recommendation is shortlisted to write the reasoning string. Apply is a Google Ads API write.

01 · Pacing mathDeterministic

Plan vs actual, daily target.

Daily target = (monthly_budget − spent_to_date) / days_remaining. Each campaign's recommended cap is the daily-target share scaled by recent spend share, ROAS confidence, and learning-state guardrails.

Window 7 / 14 / 21 / 30 d
Lag Configurable conv lag
Floor max_change_percent
02 · monthly_capOne campaign

Land one campaign on its target.

Use when one campaign has its own monthly budget. Adjusts that campaign's daily cap to land on the target by month-end, respecting max_change_percent.

Scope Single campaign
Trigger Operator-chosen
03 · redistributeRebalance

Pull from underperformers, push to heroes.

Use when multiple campaigns share a budget envelope. Pulls cap off campaigns trailing on ROAS, pushes onto the heroes within the same envelope. Net spend stays the same; mix shifts.

Scope Multi-campaign
Constraint Net spend held
04 · Lyra AgentReasoning

Why this delta, in human language.

Once the math has shortlisted a recommendation, the Lyra Agent reads the structured signals (ROAS delta, spend share, campaign type, prior cap) and writes the reasoning string. Confidence is a separate signal — derived from data freshness + variance.

Layer Post-math · narrative
Confidence 0.0–1.0
05 · ApplyGoogle Ads API

Direct write, not a queue.

Approved recommendations write to Google Ads via CampaignBudgetApi.update_campaign_budget. Real budget change in your account, with the source field tagged so the audit log can trace which run + which user approved.

Source tag scheduled / agent / manual_ui
Latency Sub-second per cap
06 · Auditbudget_change_history + diary

Every applied change leaves a trail.

Each apply writes a row to budget_change_history with old/new caps + reasoning + confidence + mode. A nightly assessment job backfills the 14-day-after metrics (ROAS, CPA, conversions) so the change can be evaluated retrospectively. A tool_action entry lands in Account Diary on apply.

Tables budget_change_history
Diary tool_action
Assessment +14d backfill
Frequently asked

The honest answers about pacing.

Does it apply changes automatically?

It can. Four automation levels — insight_only (no apply), recommendations (default; you approve), semi_automated (you approve high-confidence; rest are insight), fully_automated (apply all approved-by-policy without manual click). Default is recommendations; most agencies leave it there.

What's the difference between monthly_cap and redistribute mode?

monthly_cap mode adjusts one campaign's daily budget to land on its monthly target. redistribute mode rebalances across multiple campaigns within a shared budget envelope — keeping net spend the same but shifting share toward better performers.

What stops a runaway adjustment?

max_change_percent is the hard cap on how much any single recommendation can move a daily budget (default 25%). Recommendations above the cap are dropped before the list is shown. Cooldown is enforced via the budget_change_history audit trail — recent changes are visible to the next run, and the Lyra Agent factors them into the reasoning.

What's the difference vs Google's automated bidding?

Different layer. Smart Bidding (tCPA, tROAS) optimises bids within a daily budget cap. Budget Pacing Optimizer adjusts the daily cap itself based on monthly pacing. They're complementary — pacing sets the envelope, Smart Bidding optimises within it.

What gets logged on apply?

A budget_change_history row (old/new daily budget, change %, reasoning, confidence, mode, source) and an Account Diary entry tagged tool_action. The diary entry has the same reasoning string. A separate nightly job backfills 14-day-after assessment metrics so each change can be evaluated retrospectively.

14-day free trial · No credit card · Cancel in one click

Run the audit.
Keep the findings.

Connect your account and let Lyra run its 18 tools for 14 days. If the projected waste recovery isn't worth at least 10× the $49, don't pay. You keep every insight either way.

Read-only connect · write access opt-in per tool · SOC 2 in progress · GDPR + CCPA compliant