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
Select a stage
The same loop, in depth
- 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/
- 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
- 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)
- 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
- 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)
- 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.
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.
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