1. Auto-optimize ad spend with a human guardrail
Your Google Ads / Meta Ads campaigns drift: cost-per-acquisition creeps above target overnight and nobody catches it until the daily standup.
Trigger: Webhook (scheduled Ads report, or Ads API push via Zapier/Make)
How the workflow runs
- Trigger
Ad platform posts performance. A Webhook trigger receives the daily spend/CPA/ROAS payload for each campaign. Google/Meta Ads have no first-party connector — you feed them in via Webhook (or a Tool/MCP node that calls their API).
- Agent
Analyst agent evaluates each campaign. An Agent node compares CPA/ROAS against the target you set in its system prompt, and drafts a recommendation (pause, cut budget 20%, or scale winners).
- Condition
Only act when it's material. A Condition node branches: if CPA is within tolerance, log and stop; if it breaches the threshold, continue to the change path.
- Approval
Media buyer signs off. An Approval node pauses the run and sends the proposed budget change to a human — nothing touches live spend without a click. This is the core guardrail.
- Tool (MCP)
Apply the change. On approval, a Tool (MCP) node calls the Ads API to pause/adjust the campaign; without a connector, it posts the instruction to your ops queue instead.
- Output
Report to the team. An Output node posts a summary to Slack/Email — what changed, why, and the projected saving.
Channels & connectors
- Webhook
- Tool (MCP)
- Slack
- Approval / HITL
Outcome
Runaway campaigns get caught within the hour instead of the next morning, and every budget change is human-approved and logged.
Why it helps
Turns an overnight blind spot into a same-hour, reviewed decision — the value is speed of detection plus an audit trail, not a hands-off spend bot.
Build spec
1 agent — 1 analyst agent. The Condition, Approval and Tool nodes are workflow steps, not extra agents.
System prompt (paste-ready)
You are a paid-media performance analyst. For each campaign row you receive (name, spend, CPA, ROAS, conversions), compare against the target CPA of ₹{{target_cpa}} and target ROAS of {{target_roas}}. Recommend exactly ONE action: KEEP, CUT_BUDGET_20, PAUSE, or SCALE_15. Reply as strict JSON {campaign, action, reason}. Never propose a single-step budget change larger than 20%. If data is missing, return action=KEEP with reason='insufficient data'.MCP connectors
- Google/Meta Ads — via a Tool (MCP) node (no first-party connector)
- Slack (MCP) for the summary
Built-in tools
- http_request (pull campaign detail)
- knowledge_search (target-threshold doc)
Guardrails
- Hard cap: no budget change >20% — stated in the prompt AND re-checked at the Condition node
- No live spend touched without the Approval node (human media buyer clicks)
- Scope-locked to campaigns in the payload — the MCP tool can't read other accounts
Output & delivery
Agent emits per-campaign JSON → Condition routes only material breaches → on Approval, a Tool node applies the change via the Ads MCP → Output posts a plain-English summary to Slack and stores the JSON for audit.