How It Works

The loop behind every decision

Not a dashboard you interpret. A loop that reads your accounts, forms a hypothesis, checks it against nine gates, hands it to you to execute, confirms what actually happened, and remembers it for next time.

Ctrl PPC

Decision Loop

Runs continuously

Select a stage

The same loop, in depth

  1. 01

    Signal

    Every account, every channel, read automatically.

    Google Ads, Meta, and LinkedIn sync into a single structure, alongside GA4 where it is connected. Expert layers scan what comes in for the things a standard report does not separate out: impression share lost to budget versus rank, CPA drift by segment, pacing against forecast.

    lib/api/google-ads.ts, lib/sync/orchestrator.ts, lib/analysis/expert-layers.ts, lib/rai/

  2. 02

    Hypothesis

    A concrete, measurable prediction. Not a vague suggestion.

    Every hypothesis carries an expected result, a measurement metric, and a timeframe before it goes anywhere else in the loop -- a specific, testable claim, not "consider raising bids."

    sprint_hypotheses (expected_result, measurement_metric, timeframe), hypothesis-discovery.ts

  3. 03

    Quality Gate

    Every hypothesis clears 9 named gates before it reaches you.

    Data Quality, Math, Evidence, Causal Chain, Contradiction, Step Purity, Coverage, Sprint Readiness, Publish. One failure is enough to block it. Nothing reaches your inbox as a recommendation without clearing all nine.

    lib/decision/quality-gates.ts (GATES)

  4. 04

    Execution

    You execute. We never touch your accounts.

    An accepted hypothesis becomes a sprint task with an expected result and a measurement window. Whoever runs the account makes the actual change themselves, in Google Ads, Meta, or LinkedIn.

    sprint_hypotheses, sprint_items, task_completions

  5. 05

    Attribution

    Change history, not a coincidence, confirms what happened.

    The platform's own change history is matched against the measurement window. Executed and on target, executed and missed, or never executed at all -- three different outcomes, not one blended "did it work."

    ads_change_history, lib/decision-terminal/lifecycle.ts (outcome)

  6. 06

    Agency Memory

    Every outcome is recorded, for the next decision.

    What worked and what did not is stored against the hypothesis and stays visible on the Decision Board. That closes the loop back to the next signal -- a person deciding with the last result in view, not a blank slate.

    lifecycle.ts (learning field), components/terminal/hypothesis-board.tsx

Stage 6 closes back into stage 1: the next signal is read with this outcome already on record.

Stage 01, in practice

Every signal carries where it came from, not just what it says.

Meta APIGSC TrendShopify Data

Stage 03, in practice

The nine gates a hypothesis has to clear, running against a real example.

Quality Gate: Validation Run

Every hypothesis clears this before it reaches you. No check, no execution.

[Check 1:Evidence Gate]
PASS
[Check 2:Causal Chain Gate]
PASS
[Check 3:Coverage Gate]
Halt ExecutionFAIL

One failed check is enough. A hypothesis with a real blocker never reaches your inbox as a recommendation.

See the loop run against your own accounts.

Request a demo