[01/07]The Engine / the product tour

Average ROAS flatters.
Marginal ROAS pays.

Rule-based optimisers compare yesterday’s averages — so they plateau. ROASt fits a response curve to every campaign’s own history and moves each pound to its highest marginal return. Then it checks its own predictions against what actually happened, every night.

  • 91-day weighted signal
  • Curves refit nightly
  • 0 LLM calls in the money path
[01]The plateau / why rules stall

Rules read averages. Budgets move at the margin.

Every rules engine eventually hits the same wall — and it’s mathematical, not a missing feature.

// 01

Rules compare averages

“If ROAS > 4, add 20%.” Yesterday’s average decides tomorrow’s budget — but an average says nothing about what the next pound will do.

// 02

Returns diminish

Every campaign saturates. The first £100 buys cheap conversions; the last £100 fights for expensive ones. Two campaigns with identical averages can hide wildly different headroom.

// 03

Money moves at the margin

The real question is never “which campaign is best” — it’s “where does the next pound return most”. That’s a calculus problem, not a rules problem.

So we built a calculator. The engine fits Hill response curves to each campaign’s own spend-vs-return history and allocates along marginal ROAS — shifting budget toward genuine headroom and away from saturation, even when raw ROAS looks identical.
[02]Signals / how it learns

Fifteen signals. Ninety-one days. Zero guesswork.

Every signal is computed from your last 91 days of daily campaign data, recent days weighted more heavily. The pipeline is fully deterministic — every decision is the product of signal maths, not a model that guesses.

Signals Score Constrain Allocate Marginal reallocation Reserve handshake Platform adapter Staged recommendations
// signal 01

Recency-weighted ROAS

The primary scoring signal. Revenue over spend, with more weight on recent performance — exponential decay, half-life configurable (default 14 days).

// signal 02

Hill-curve marginal value

Response curves fitted nightly from your spend-vs-revenue history. The blend weight ramps with curve confidence — low-confidence curves are ignored, never trusted.

// signal 03

IS lost to budget

Impression share lost because the daily budget ran out — proven demand going unserved. These campaigns earn a growth tilt proportional to their efficiency.

// signal 04

IS lost to rank

Bids too low, not budget too small. These campaigns get target nudges (tROAS / tCPA) to improve auction rank — not more money.

// signal 05

Confidence

Data coverage (40%), conversion volume (35%), ROAS stability (25%). Low-confidence campaigns blend toward the portfolio average — neither over-allocated nor starved.

// signal 06

Trend momentum

Recent 7-day ROAS against the prior 14 days, winsorised to cap outliers and dampened by volatility — so spikes get verified, not chased.

// signal 07

Diminishing returns

Spend up while ROAS falls is a saturation signal — allocation dampened by up to 50%. Disabled during promos so expected demand shifts aren’t misread.

// signal 08

Attribution-lag discounting

The latest days are always incomplete. Recent revenue is scaled by a completeness curve so the engine never over-indexes on partial data.

// signal 09

Day-of-week

Each campaign carries per-day multipliers learned from its own history — scored against tomorrow’s day, because a change staged today takes effect tomorrow.

No black box. Every campaign’s score decomposes into its constituent signals — you can see exactly how much ROAS, confidence, trend, impression share and every other signal contributed to every decision.
// the pacer

It paces the month, not just the day

The Pacer distributes what’s left of the monthly budget across the remaining days — recalculated on every run, with pinnable per-day multipliers. Spend is shaped intentionally, not front-loaded by default.

Flat Front-loaded End-loaded Modelled
// flex reserve

A reserve campaigns must earn

A configurable slice of the daily budget (default 10%) is held back, and campaigns bid for it on signal strength. A sigmoid liquidation curve deploys it — strict early in the month, relaxing toward month-end so nothing underspends.

Promo-aware: during events the engine normalises the expected demand uplift, widens its anomaly thresholds, and cools down for four days afterwards — a sale reads as a sale, not as genius.

[03]Calibration / how it stays honest

It checks its own work. Every night.

Most optimisers never look back. ROASt records what it predicted, waits for attribution to complete, then scores itself against what actually happened — and adjusts.

01

Snapshot

When recommendations are staged, the engine records its predictions — ROAS, spend utilisation, impression share lost to budget, confidence.

02

Observe

It waits for attribution to complete. The window is dynamic: small changes use the base lag; large increases get extra days for smart bidding to ramp.

03

Tune

Predicted-vs-actual updates the engine’s calibration biases — spend ceilings, ROAS floors, confidence dampening, saturation steepness.

Shrinkage

Learned values blend toward safe defaults until evidence accumulates (5–20 observations). The engine earns its confidence — it doesn’t assume it.

Staleness decay

Dormant portfolios revert toward defaults with a 14-day half-life, so automation that’s been off restarts cautiously instead of acting on stale beliefs.

[04]Guardrails / how it’s kept safe

Engineered to be hard to break.

The engine is pure math with no LLM involvement — wrapped in safety layers trained on how each ad platform actually behaves.

// safety 01

Staged before executed

Every recommendation is staged and visible before anything is pushed. Review, adjust and approve — or let trusted portfolios run nightly. Nothing happens behind your back.

// safety 02

Read-back verified

After every push, ROASt reads the values back from the platform API to confirm the changes actually landed. Discrepancies are logged and surfaced — never assumed away.

// safety 03

Velocity caps

Per-run step limits plus rolling cumulative caps, with an asymptotic throttle as changes approach the platform maximum — no budget flicker.

google 60% / 7d meta 45% / 10d microsoft 60% / 7d
// safety 04

Platform-native locks

Google learning-phase locks. Meta ASC 48-hour dwell. Microsoft ghost-budget freezes. Platform adapters are the final safety layer, tuned to each platform’s learning mechanics.

// safety 05

Kill switches & dry-run

A per-workspace kill switch halts automation instantly — and repeated failures trip it automatically. Dry-run mode stages everything and pushes nothing.

// safety 06

No LLM near the money

AI writes briefs and answers questions. Every budget and target decision is deterministic signal math — reproducible, auditable, explainable.