The always-on operator for your ad accounts.
SpendSignoff plugs an operator into the AI client you already use. It connects over MCP, reads your ad accounts read-only, and drafts the changes worth making. You approve them in two steps. It never spends on its own.
The flow, end to end
Three stages take you from a cold AI client to a live, audited change. You are read-only until you decide otherwise.
- OAuth 2.1
Stage 1
Connect your AI client
Add the SpendSignoff MCP server to Claude, ChatGPT, or Cursor. It speaks Streamable HTTP and authenticates over OAuth 2.1 — no API keys pasted into a config file.
- One URL
- https://mcp.spendsignoff.com/mcp — the same endpoint for every client.
- Two scopes only
- mcp.read and mcp.draft. There is no mcp.approve scope to issue.
- No spend path
- The connection cannot move money — that authority never reaches the model.
- Google Ads + Meta live
Stage 2
Link an ad account — read-only
OAuth into Google Ads or Meta. The first authorization grants read access only: the operator reads spend, structure, and performance so it can find money. Nothing in the account changes.
- Live today
- Google Ads and Meta. LinkedIn and TikTok are coming soon.
- Reads are free
- Reading is ungated on every plan, including Free — see what the operator would do first.
- Write stays dormant
- Write access is never granted on link; it is gated behind a specific approved draft.
- Two-step + audit
Stage 3
Draft → two-step approve → audit
The operator stages every spend-affecting change as a draft with a before → after diff. Going live is a deliberate two-step control — Approve & push live, then Confirm — and only a signed-in human can run it.
- Arm, then confirm
- The first click arms the change; the second commits it. No one-tap toggle moves money.
- KMS-signed ledger
- Every read, draft, approval, push, and rollback is appended to a tamper-evident audit log.
- One-click rollback
- The prior state is captured in the diff, so an approved change reverts in a single click.
What the operator does between your prompts
You do not have to be in the chat for it to work. The autonomy loop runs on its own — and stops at the approval line every time.
It drafts, it does not spend
Between your prompts the operator keeps watching every linked account. When it spots a stalled budget, a pacing miss, or a bid that is leaving conversions on the table, it writes a draft and waits. The draft sits inert in your approval queue until you push it live.
A hard 24-hour spend envelope
Even the drafts the operator can produce are bounded. Each account carries a 24-hour spend envelope — a hard daily ceiling on the total change the operator may propose. It is a server-enforced limit, not a guideline, and it cannot draft past it.
A worked example
One prompt in. One reviewable draft out. Zero spend until you approve.
You type
> Find budget I'm wasting on Google Ads and fix the pacing.The operator drafts
draft #4172 · google-ads · status: AWAITING APPROVAL
campaign Brand — Search
change daily_budget $120.00 → $96.00 (−20%)
reason 7-day pacing at 41% of cap; spend not
converting above target CPA
campaign Prospecting — Performance Max
change daily_budget $80.00 → $104.00 (+30%)
reason ROAS 3.4x over 14 days, budget-capped 6 of 7 days
net daily spend unchanged ($200.00 → $200.00)
envelope used 12% of today's 24h limit
→ run "Approve & push live" then "Confirm" to apply
→ nothing changes in your account until you doThe draft is a proposal, not a pending action. It touches the live account only after you run the two-step Approve & push live → Confirm control, and every step lands in the audit log.
Connect a read-only account and watch it draft.
Free reads on every plan. Google Ads and Meta are live today. You see exactly what the operator would change before a cent moves.