Pipeline overview
ROASt Engine analyses your last 91 days of daily campaign data and runs a staged pipeline to produce budget and target recommendations. The pipeline is fully deterministic — every decision is the product of signal maths, not a model that guesses.
AI is used only for the Flume assistant, Insights tab narratives, and report generation — never for budget or target decisions.
The Optimiser
The Optimiser scores each campaign in a portfolio and allocates the total budget in proportion to those scores. It also recommends target bid adjustments (tROAS / tCPA) where impression share data suggests a ranking constraint rather than a budget constraint.
Click Optimise on any portfolio to run the pipeline manually. Results are staged — every proposed change is visible before anything is pushed to your ad accounts. You can re-run and adjust as many times as you like before executing. Use Run All to stage all portfolios at once.
Portfolio controls
Presets (Conservative, Balanced, Aggressive, Turbo) provide a starting point. A Personalised option analyses your portfolio's data and suggests optimal settings.
— Signals
Every signal is computed from your last 91 days of daily campaign data. Recent days are weighted more heavily via exponential decay (configurable half-life, default 14 days).
Revenue divided by spend, with more weight on recent performance. The primary scoring signal — campaigns with stronger recent ROAS receive a proportionally larger budget share.
Impression share lost because the daily budget runs out. Campaigns with high IS Lost to Budget have proven demand going unserved — they receive a growth tilt boost proportional to their efficiency. This is where budget headroom is real, not hypothetical.
Impression share lost because bids are too low. Rather than adding budget, the engine routes these campaigns to target nudges — adjusting tROAS or tCPA to improve auction rank, where the actual constraint sits.
A composite of data coverage (40%), conversion volume (35%), and ROAS stability / coefficient of variation (25%). Low-confidence campaigns blend their signals toward the portfolio average so they are neither over-allocated nor starved. Sparse data campaigns don't get rewarded for one lucky spike.
New campaigns with limited data are guaranteed a minimum allocation — at least 50% of the portfolio average — so they can gather enough signal to score fairly. Once they exit the learning window, they compete on performance like any other campaign.
Compares recent 7-day ROAS against the prior 14-day ROAS, with winsorisation to cap one-off outliers. Dampened by ROAS volatility and conversion volume consistency — the engine avoids chasing spikes that don't reflect a real change in campaign performance.
Detects when spend has grown but ROAS has fallen over the same 14-day window — a saturation signal. Dampens allocation to these campaigns by up to 50%. Disabled during promotional events to avoid misidentifying expected promo ROAS shifts as saturation.
The most recent days have incomplete conversion data — attribution windows are still open. Revenue contribution from recent days is scaled by a completeness curve so the engine doesn't over-index on partial data. Default lag: 7 days, configurable per portfolio.
A pre-pass flags tracking outages (spend with zero revenue for 3+ consecutive days), ROAS spikes (daily ROAS > 3× campaign median), and data ceiling breaches. Flagged rows are downweighted by 80% before scoring so one bad data day doesn't distort a portfolio's allocation.
— Cumulative change tracking
The engine tracks how much each campaign's budget has changed over a rolling window to prevent excessive flickering. An asymptotic throttle reduces change velocity as cumulative changes approach the platform maximum — changes slow down but never fully lock.
If the portfolio budget itself changes by more than 5%, the change history resets to give the engine fresh room to move.
The Pacer
The Pacer tracks your portfolio's monthly budget and distributes what's remaining across the rest of the month, recalculating every time you run the Optimiser. It ensures spend is shaped intentionally — not just front-loaded by default or left to pace however the platforms feel like.
Equal daily allocation for every remaining day.
More spend in the first half of the month, ramping down toward month-end.
Reserves more budget for the second half of the month.
Weights future days using your portfolio's own historical day-of-week and week-of-month patterns, combined with impression share data. Days that historically perform better get more.
You can pin individual days with a custom multiplier — click any future bar in the Pacing chart — to override the mode weight for that day. Pins persist across mode changes.
Platform Adapters
After the core pipeline scores and allocates budget, platform-specific adapters apply constraints appropriate to each platform's learning mechanics and API behaviour. The pipeline itself is platform-agnostic — adapters are the final safety layer that make recommendations actually safe to execute.
Google Ads
- Learning phase lock — campaigns in Google's learning phase are capped at a 5% budget step to avoid disrupting smart bidding
- Spend capacity ceiling — if a campaign is only spending a fraction of its budget, recommendations are capped at 1.15× recent average spend. Prevents allocating budget that would never be used (especially important for Performance Max)
- Compound stepping — large recommended increases are broken into sequential steps, one executed per run
- Confidence-based velocity — high-confidence campaigns receive the full configured step; low-confidence ones are dampened
Meta Ads
- ASC dwell lock — Advantage+ Shopping campaigns have a 48-hour lock between budget changes. The engine enforces this minimum dwell period to protect Meta's learning phase
- Learning stage awareness — campaigns in learning or learning_limited status have their budget step reduced (10–15% for learning, 5% for learning_limited)
- Audience saturation guard — ad frequency data is used to detect audience saturation. When frequency exceeds the threshold for the campaign type, increases are capped and reserve is vetoed
- Creative quality dampening — campaigns with low quality or engagement rate rankings from Meta's API have budget increases dampened
Microsoft Ads
- Ghost budget prevention — campaigns spending less than 50% of their budget over the last 14 days are frozen at their current budget rather than increased. Prevents "ghost budget" that inflates portfolio totals without driving results
- Conservative velocity — Microsoft's smaller auction volume means target changes have proportionally larger impact. The adapter uses more conservative dampening than Google
- Compound stepping — same as Google: large increases are broken into sequential steps
Budget Modeller
The Modeller is a what-if planning tool for portfolio-level budget allocation. It answers: given a total budget across these portfolios, what's the optimal split to maximise revenue?
Select an objective, choose the portfolios to include, set a total budget, and click Model. The Modeller computes an optimal allocation using a marginal ROAS greedy algorithm — each budget increment is given to whichever portfolio has the highest marginal return at its current level. This is provably optimal for concave revenue curves.
Current vs optimised split across a range of budget levels. Three modes: Revenue, ROAS, Marginal ROAS. The marginal view shows where each additional unit of spend hits diminishing returns.
Per-portfolio revenue change from current to optimised allocation — so you can see exactly where the gain comes from.
Each portfolio's addressable ceiling is estimated from impression share data. The Modeller won't recommend pushing beyond what the portfolio can productively absorb.
Apply changes immediately or use Step Over N Days to ramp budgets gradually — the nightly scheduler applies one step per night until the target is reached.
Goals & Conversion Mapping
By default, every campaign's optimisation is based on its total platform-reported revenue and orders. Custom Goals let you define the specific conversion actions that matter for each portfolio — and the engine scores entirely against those.
Conversion actions are synced from your ad platforms during account connection. You create named goals that group one or more actions across platforms — for example, a "Qualified Leads" goal might combine Google's "Form Submit" action and Meta's "Lead" action.
When a portfolio has a custom goal assigned, all engine signals — ROAS, trend, confidence, diminishing returns — are computed from the filtered conversion data. A campaign that has strong overall ROAS but poor performance on your specific goal actions will be scored accordingly.
Events & Promotions
The Events system lets you schedule promotional periods and settings changes on a calendar, with automatic activation and deactivation managed by the scheduler. Drag an event template onto the calendar, set the dates, and the engine handles the rest.
Activates the engine's full promotional lifecycle: snapshots current settings, applies turbo-optimised settings, sets a promo data window, enables intraday runs (2-hour interval), and on deactivation restores the snapshot with a 4-day post-promo cooldown.
Merges a preset and/or specific setting overrides onto portfolio settings for the duration. Simpler than promo mode — useful for seasonal adjustments, testing a different strategy, or temporarily tightening guardrails.
While an event is active, affected portfolios' settings are locked — manual changes are blocked and the UI shows a clear banner with the event name and dates. This prevents accidental interference with event-managed settings.
Automation & Scheduling
The scheduler automates optimiser runs without manual intervention. Each portfolio can be configured independently — nightly runs, intraday runs, auto-execute on or off. Nothing is global unless you want it to be.
Each portfolio can be configured with a nightly run time (default 23:50). The scheduler stages recommendations and optionally auto-executes them, then logs the results. A configurable kill switch halts all automated execution globally, and dry run mode stages but never executes.
For portfolios that need faster reaction times, intraday runs can be enabled with a configurable interval (minimum 1 hour). Intraday runs always auto-execute — they're designed for time-sensitive scenarios where manual review would be too slow. An optional time window restricts runs to business hours.
When you apply a budget change via the Modeller's Step Over N Days option, the scheduler creates a transition plan. Each night, one step is applied toward the target budget — then the optimiser distributes the new budget across campaigns normally.
- 🛑 Kill switch — immediately halts all automated execution across all portfolios
- 🧪 Dry run mode — stages recommendations and logs results, but never pushes to ad platforms
- 🔒 Concurrency guard — only one sync or optimiser job per user per platform at a time
- 📧 Failure alerts — email notifications when batch runs, syncs, or backups fail
- 💾 Automatic backups — database backup before each nightly batch (local 7 days, remote 30 days)
Calibration
The engine maintains a per-portfolio feedback loop that compares its predictions against actual outcomes and adjusts parameters over time. Calibration is fully automatic and runs as part of the nightly scheduler — each portfolio develops its own calibration profile.
When recommendations are staged, the engine records predicted ROAS, spend utilisation, IS Lost to Budget, and confidence
Waits for attribution to complete. Dynamic window: small changes use base lag; large increases add days for smart bidding to ramp
Compares predicted vs actual and updates calibration biases via exponential moving averages. Spend ceiling, ROAS floor, confidence dampening
Ready to see it in action?
Connect your ad accounts and ROASt will show you exactly what it would recommend — before you execute anything.
Open ROASt Engine