--- name: campaign-structure version: 1.0.0 applies_to: [ads-lead, search-ads-agent] risk: low --- # Campaign Structure Draft ## When to use When a task is to draft a new paid-search campaign (Google Ads / equivalent) from a brief and a budget. Drafting the structure here is low-risk because nothing is created in the ad platform — activation is a separate, gated step. ## Steps 1. Read the brief and the confirmed budget (EUR, from AOS). If the brief is missing target audience, geo, language, or goal (leads / sales / traffic), return `blocked` with the open questions. 2. Confirm **Consent Mode v2** is configured for the client's site. If not on record in AOS, flag as a blocking precondition for activation. Drafting can continue. 3. Structure the campaign as a tree: - **Campaign** (one per budget / goal / geo split), `budget_eur` matching the brief, `bidding_strategy` (max conversions w/ target CPA, or manual CPC for launch). - **Ad groups** (one per keyword intent cluster, usually 3–7 per campaign); one tight theme each. - **Keywords** (exact, phrase, broad) — minimum 3 match types per ad group where relevant. No SKAGs unless the brief calls for it. - **Negatives** (brand competitors, jobs, free, info, …) — minimum 15 per campaign, drawn from the shared negative list. - **Ad copy** (3 RSA headlines + 2 descriptions per ad group), DE / EN / TR per client language. Claims must be substantiable (UWG §3). 4. Validate every claim against the brief + product facts. Any misleading claim (UWG §5, §7) is flagged with a `risk` entry and rewritten before the draft is finalized. 5. Compute the spend plan: budget split across campaigns, daily caps, expected run duration. Never exceed the confirmed budget. If the brief asks for spend beyond the cap, return `blocked` and request a `budget_change` approval instead. 6. Write the structured campaign draft to AOS as an `AgentDeliverable` (`output_format: draft`). Include the full tree as a structured `payload` (campaign → ad groups → keywords → ads → negatives). 7. Do **not** call `ads:spend` or `ads:activate_campaign`. Those are `risk: high` and always produce an `ApprovalRequest`. 8. When the human signals the draft is ready, emit an `ApprovalRequest` (`schemas/approval.json`): `action: campaign_activation`, `risk: high`, `rationale` (why go live now), `diff_summary` (campaign name, platform, total budget, expected daily spend, target audience, geo, language), `payload` (the structured campaign tree), `estimated_cost_eur` (the confirmed budget). 9. Pause. Activation only happens after human approval via the policy crate. ## Inputs - A brief in AOS (target audience, geo, language, goal, KPIs). - A confirmed budget (EUR) on the client record. - The client's brand guidelines + substantiation sheet for claims. - The client's Consent Mode v2 status (on/off, recorded in AOS). - The shared negative-keyword list. ## Outputs An `AgentDeliverable` (`schemas/deliverable.json`) with: - `status`: `done` (draft ready) | `needs_approval` (activation requested) | `blocked` (brief incomplete or consent missing) - `deliverables[]`: the structured campaign tree (`inline` JSON or `aos_record` ref to the draft campaign record). - `risks[]`: any borderline claims (UWG), audience assumptions, spend-vs-budget headroom, consent-mode status. - `cost`: tokens only (no platform spend until activation). ## Guard rails / compliance - **UWG §3, §5, §7**: no misleading claims, no unverifiable superlatives, no comparative claims without substantiation. The reviewer double-checks. - **Consent Mode v2 must be configured before activation.** Drafting can proceed; activation cannot. - **Spend is always approval-gated.** No `ads:spend` or `ads:activate_campaign` without an approved `ApprovalRequest` of action `campaign_activation`. - No retargeting without a documented consent basis. - No auto-activation, no auto-budget-increase. Spend beyond the confirmed budget is a separate `budget_change` approval. - Language: DE / EN / TR per the client's `language.deliverables` setting; ad copy is not translated by guesswork — missing languages block. ## References - `schemas/approval.json` — `campaign_activation` action - `schemas/deliverable.json` — `draft` output format - `policies/compliance.md` — UWG, ad & cookie rules, Consent Mode v2 - `policies/autonomy.md` — spending always human-approved - `policies/tool-risk.md` — `ads:spend` and `ads:activate_campaign`