Skip to main content

Paid-media campaign lifecycle

Erdo can read a connected ad account in full — campaigns, spend, status, keywords — and it can also act on a campaign: pause it, enable it, or change its daily budget. The lifecycle endpoints expose exactly those three actions over /v1 (and the matching MCP tools), so an external product or script can drive a decision the evidence argues for instead of someone performing it by hand in the provider’s console. Every lifecycle call goes through the same approval gate that governs agent-proposed changes. There is one gated path into a customer’s ad account, not two: the /v1 call files the very action an agent’s tool would file — same action key, same input, same deduplication — and a caller with an API key is never more trusted than an agent. Supported providers: google_ads. Any other provider is rejected with an unimplemented error rather than silently ignored.

The two outcomes

What happens depends on whether your organization has granted a standing always-approve policy for the action (the same standing grant you create by choosing “always allow” when deciding an agent’s approval):
  • No standing policy — propose. The call does not touch the provider. It files a pending approval request and returns status: "pending_approval" with the approval_request_id — accepted, not performed (202 semantics, expressed in the body). The approval appears in the activity feed and on GET /v1/approvals, stamped with subject_resource_type: "paid_media_campaign" and the campaign’s external id so you can list everything awaiting decision about one campaign. When a human approves it — feed, CLI, or POST /v1/approvals/{id}/decide — the exact stored action executes, under the approver’s identity. A rejection is terminal and nothing reaches the provider.
  • Standing policy — execute. The call executes immediately through the same integration handler an agent-run approval would execute, and returns status: "executed" with the provider’s result.
Re-proposing the same change while one is pending folds onto the existing request instead of filing a duplicate — including a budget change with a different amount, which is still “the same decision to review” and updates the pending card rather than stacking a second one.

Set campaign status

  • externalID (path) — the provider’s campaign id.
  • providergoogle_ads.
  • customer_id — the provider account the campaign belongs to (campaign ids are only unique within an account). Required.
  • statuspaused or enabled. Removal is deliberately not exposed: deleting a campaign is destructive, not lifecycle.
  • reason (optional) — shown on the approval card as the why beside the what, so the approver reads the evidence, not just the action.

Set campaign daily budget

  • daily_budget_micros — the new daily budget in micros of the account currency (50000000 = $50.00). Must be positive.

Response

or, when a standing policy covers the action:

Following up on a pending action

List what is awaiting decision about one campaign:
Decide it:
Approving with a broader scope (always_org, with parameter constraints) creates the standing policy that makes subsequent identical calls execute immediately — see Approvals and Autonomy.

What a new campaign starts with

When Erdo builds a paid-search campaign for you it does not start from a blank sheet. Two things go in before the first click is bought — one of them learned about your kind of business, the other read from your own account:
  • Exclusions. A library of search terms a business in your vertical should never pay for — someone looking to rent when you are selling, someone price-fishing well below your offer, someone searching a different product class entirely. It is grouped by vertical and by language, so a campaign running Spanish and Portuguese angles gets the Spanish and Portuguese exclusions too: a new-development condo tower selling in Miami excludes rental intent in all three languages from day one, because that is the single biggest source of wasted clicks in that market. These are on top of, not instead of, what your own campaigns have already learned — a new campaign inherits the exclusions your existing campaigns already carry. Once it is running, the traffic quality monitor tells you when off-offer traffic is climbing, and the exclusions that answer it are proposed for your approval like any other change to your account.
  • Cost expectations, taken from your own account. A new campaign needs an expected conversion rate to know whether its budget is big enough to ever accumulate the conversions Google’s bidding needs to learn from. Erdo establishes that from your history — your other campaigns matched on the same offer, audience geography and language, and the leads they actually produced — and says in the plan which of your campaigns it read and how many clicks and conversions sit behind the figure. Where you have no comparable history, your first campaign in a new language for instance, it plans on a deliberately conservative standing assumption and labels it as an assumption rather than a measurement. Either way, once you have roughly 30 conversions of your own, the plan is re-made on your measured rate, because a rate you have measured always outranks an assumption.
No other customer’s numbers reach your campaign. What a campaign cost and what it converted is that advertiser’s own trading data, and Erdo does not publish it — not by account, and not as a per-market, per-month table with the account’s name taken off, because a vertical plus a market plus a month is often enough to say whose it was. The exclusions library is the one thing that does transfer, and it holds general intent — the word “rental”, the word “cheap” — never another advertiser’s campaign, account, keywords, competitor names, or the neighbourhoods they target. Erdo’s engineers write and update it; nothing reads across customer accounts to fill it. A term specific to one business — a competitor’s name, a street, a neighbourhood — deliberately never enters it, because the next customer may be in that neighbourhood, and excluding it for everyone would block their best search term. Erdo does separately publish aggregate experiment-effect priors pooled across organizations, but that is a different mechanism with its own publication thresholds and its own opt-out — see cross-customer priors.

MCP tools

The same capability is available as MCP tools:
  • erdo_set_paid_media_campaign_status — provider, customer id, campaign id, paused/enabled, optional reason.
  • erdo_set_paid_media_campaign_budget — provider, customer id, campaign id, daily budget in micros, optional reason.
Bidding is not on this surface. How a campaign bids — and, in particular, which of an organization’s campaigns share a bidding strategy so their conversions pool — is decided when the campaign is created or promoted, through approval cards rather than a lifecycle call. See How Erdo bids.