Create campaigns paused across every platform, edit budgets, targeting and copy with previews, and put approvals in front of anything that spends. AI does the click-work; humans keep control of money.
A multi-platform launch is the same structure rebuilt three or four times in three or four ad managers — campaigns, ad sets, naming, budgets, targeting — where one slipped digit becomes real spend. Opera builds it once from your conventions, everywhere, paused.
Opera doesn't flatten platforms into a lowest common denominator — it builds each one natively:
Naming is applied identically across all of them — US_Prospecting_Meta_Jun26 and its siblings — because consistent naming is what makes prefix-scoped reporting work later.
Every campaign Opera creates starts paused. Budgets are set, targeting is set, creatives are attached — and nothing can spend until a human flips it on. There is no configuration in which Opera launches live campaigns autonomously.
"Create paused prospecting campaigns across Meta, TikTok and Google using this creative pack — $150/day each, JO naming, broad targeting."
Changing live campaigns is riskier than creating paused ones, so every edit shows a diff first:
You review the preview, approve, and only then does it execute. Bulk edits ('raise all JO prospecting budgets 20%') preview as the full list of affected campaigns.
Sensitive actions route through an approval step — and you define sensitive:
Each approval is one click in Slack or the log — with the full diff attached, so the approver sees exactly what they're authorizing.
Campaign names look cosmetic until you try to automate around them — then they're the schema of your ad account. A held convention ({GEO}_{Objective}_{Platform}_{MonthYear}) is what makes prefix-scoped reporting possible, what lets a bulk edit target "all JO prospecting" without a hand-built list, and what makes the audit log readable six months later. Opera enforces the convention at creation time: every object it builds is named from the stored pattern, which means the account stays grep-able as it grows. Teams that have lived through a season of freestyle naming — where finding last quarter's Germany tests means archaeology — tend to treat this as the quiet headline feature. The convention also survives staff changes: the pattern is configuration, not tribal knowledge, so the next buyer's launches match the last one's without a handover document trying to enforce it. When an exception is genuinely needed — a partner campaign with its own naming, a platform beta with different constraints — it ships as a documented exception in the log rather than a silent precedent, which is the difference between a convention and a suggestion.
The Friday classic — "raise all JO prospecting budgets 20% and pause anything with CAC over $19" — is two ad-manager sessions by hand. As a previewed bulk edit it's one table:
| Campaign | Action | Current | Proposed |
|---|---|---|---|
| US_Prosp_Meta_Jun26 | budget | $150/d | $180/d |
| US_Prosp_TikTok_Jun26 | budget | $150/d | $180/d |
| US_Prosp_Snap_May26 | pause | active (CAC $19.40) | paused |
New client daily total computed at the bottom, against the cap. One approval executes the lot; the audit log records each change individually. The same mechanism handles end-of-month pacing pulls, promo-window boosts and the Sunday-night "pause everything in market X" — previewed, capped, reversible by the same path.
Approval routing is per action class and per client: launches and go-lives to the account lead, threshold-crossing budget changes to whoever owns the P&L, routine copy edits auto-approved and logged. Approvers see the diff inline — in Slack or the log — and approve with one click. The system's stance is simple: money-touching actions get a named human in the loop, and the loop is fast enough that nobody is tempted to route around it.
What the worked version looks like — one brief, three platforms:
"Create paused prospecting campaigns for the US market across Meta, TikTok and Google — $150/day each, JO naming, broad targeting, the June creative pack."
Opera resolves the convention and previews the full object list before anything exists:
| Platform | Object | Name | Budget | State |
|---|---|---|---|---|
| Meta | Campaign | US_Prospecting_Meta_Jun26 | — | Paused |
| Meta | Ad set ×2 | US_Prosp_Broad_18-44 / 45+ | $75/day each | Paused |
| TikTok | Campaign | US_Prospecting_TikTok_Jun26 | $150/day | Paused |
| Campaign | US_Prospecting_Google_Jun26 | $150/day | Paused |
Plus the ads themselves, creative-attached and copy-paired. You read the list the way you'd read a launch checklist — because it is one — fix anything in the preview, approve, and the structures are created exactly as listed. Still paused. Go-live is Monday morning, one click per market, by a human.
Caps and thresholds turn "be careful" into configuration:
The result is delegation with a hard floor: the worst case of a misunderstood instruction is a paused structure or a refused edit — never runaway spend.
The guarantees that make delegation possible:
Opera is built to touch production reports and live ad accounts without breaking anything:
See this running on your own reports.A 45-minute workflow audit maps your current process and shows exactly what Opera automates — step by step.
A 45-minute teardown of how you report today: we map every step, mark what Opera automates, and send you the written spec — useful whether or not you buy.