Skip to main content

// campaign specialist

Operate your paid acquisition end-to-end.

Eight specialist skills wired into a planner-judge-executor loop — per campaign, per channel. Every move judged against policy, gated by rate limits, recorded as an ad_decision_log row with one-click reversal.

Google Ads Meta TikTok Bing
planner-judge-executor
cycle       : 2026-05-25T09:00Z
channel     : google_ads
campaign    : pmax 'EU/Linen/Throws'

planner     : 3 candidate moves
              ├─ ADJUST_BUDGET +18%
              ├─ BID_STRATEGY → target_roas
              └─ NEGATIVE_TERMS +4

judge       : score 0.91 (above 0.85 floor)
              policy_mode = autonomous
              rate_limits = within bounds

executor    : applying 1/3
              → ADJUST_BUDGET applied
              ─ BID_STRATEGY queued (24h)
              ─ NEGATIVE_TERMS queued (judge2)

logged      : ad_decision_log#21498
next_cycle  : 2026-05-25T13:00Z

// eight skills

The full operating loop, exposed.

Each skill is independently testable, independently rate-limited, and independently auditable. The planner-judge-executor wraps all eight — plan a move, judge its evidence, execute inside policy.
01

signal_collector

Reads live performance per ad-group, search-term volume, audience overlap, and conversion lag. Builds the rolling window every cycle starts from.

// writes

performance_window

02

bid_pacing

Adjusts budget caps and bid strategies inside policy windows. Reasons cited by anomaly headroom — never pace-blind raises.

// writes

ADJUST_BUDGET · BID_STRATEGY

03

creative_director

Detects creative fatigue per ad-group via decay slope. Briefs fresh angles — RSAs, image concepts, copy variants — before the budget bleeds.

// writes

CREATIVE_BRIEF

04

asset_pipeline

Turns briefs into ready assets — gpt-image-1 for images, on-brand RSA copy, naming conventions enforced. Stored in Supabase, ready for push.

// writes

creative_assets

05

asset_push

Uploads through AssetService and links via AdGroupAssetService. Idempotent — re-runs never duplicate, every push leaves an ad_decision_log row.

// writes

Google Ads · Meta

06

audience_writer

Maintains Customer Match lists via OfflineUserDataJobService — refunder exclusion, complaint cohorts, high-LTV repeaters, all rebuilt nightly.

// writes

AUDIENCE_WRITE

07

lifecycle_subscriber

Subscribes to Catalog Specialist transitions. When a SKU becomes ON_DISCOUNT, its ads update copy + bid; when DRAFTED, ads pause. No human relay.

// writes

cross-agent bus

08

anomaly_responder

Watches for spend spikes, conversion drops, MER breaks. Auto-pauses inside rate-limit bounds, files the evidence, pings the operator with the row.

// writes

PAUSE · RESUME

// channels

Four channels. One control plane.

Magistry writes to your real ad accounts — not a layer on top. OAuth in, scoped tokens, native APIs, every mutation idempotent and rate-limited at the platform-permitted ceiling.

Google Ads

google-ads-api (Python)

  • Search, PMax, Shopping
  • Customer Match writes
  • Conversion uploads
  • Asset + AdGroup mutations

Meta

Marketing API v19

  • Advantage+ shopping
  • Custom + lookalike audiences
  • Creative pushes
  • Conversion API events

TikTok

Marketing API

  • Spark Ads
  • Identity-matched audiences
  • Pixel + Events API
  • Creative variants

Bing

Microsoft Advertising

  • Search + Shopping
  • Customer Match lists
  • Negative term mining
  • Bid + budget pacing

// customer match

Audiences that rebuild themselves nightly.

The audience_writer skill maintains live Customer Match lists via the OfflineUserDataJobService — refunder exclusion, complaint cohorts, high-LTV repeaters. Segments stay in sync with your Supabase customer table, not a stale CSV.
refunder_exclusion1,284 hashed emails

Anyone refunded twice in 90d, excluded from prospecting.

high_ltv_repeaters8,932 hashed emails

Top decile LTV, repeat customers — fed as lookalike seed and lifecycle retargeting.

complaint_cohort_90d612 hashed emails

Customers who triggered escalations, suppressed from acquisition until resolved.

discount_responders3,401 hashed emails

Bought within 48h of a discount window — primed for clearance offers, suppressed from full-price.

// how it works

  1. 01Magistry queries the live customer table on the cycle schedule — never on a stale dump.
  2. 02Each cohort is hashed (SHA-256 lower-cased email) per platform spec before any network call.
  3. 03OfflineUserDataJobService writes the diff — adds and removes only, never a full replace.
  4. 04Resulting ad_user_lists row stored with cohort definition, diff size, and platform-side acceptance count.

Every list ships with a counterpart suppression list — your refunders never see a prospecting ad again.

// ad_decision_log

Every euro moved has a row.

ad_decision_log · row #21498
agent       : campaign
skill       : bid_pacing
channel     : google_ads
target      : pmax 'EU/Linen/Throws'

action      : ADJUST_BUDGET
delta       : +18% daily cap (€640 → €755)
window      : 14d perf window

reason      : MER 4.1 → 4.8 (↑17%)
              search-impr-share headroom = 38%
              competitor-overlap delta = −9%

evidence    : [signal_window#11203,
               anomaly_check#771,
               judge_score=0.91,
               policy_mode=autonomous]

rate_limit  : budget_changes_per_week 3/8 (ok)
applied_at  : 2026-05-25T09:14:02Z
applied_by  : campaign_agent.bid_pacing.v3

status      : APPLIED
reversal    : ADJUST_BUDGET delta=−18% (1-click)

// llm cost tracking

Every prompt has a price. We log it.

Generative work — creative briefs, audience reasoning, RSA copy — is metered into llm_usage with a purpose tag like 'campaign-agent:bid_pacing'. Hit the monthly cap, and Magistry degrades to read-only on that surface, never silently overspending.

// llm_monthly_cap_usd

$240

Per store, configurable per channel.

// purpose tags

18 unique

Every call attributed to a skill, never anonymous spend.

// auto-degrade

read-only

Over cap → cease generative writes, alert operator.

// campaign specialist

Hand the keyboard to a teammate that logs.

OAuth your ad accounts and the Campaign Specialist will run its first plan-judge cycle in dry-run inside an hour. Flip the policy mode to autonomous when you trust what you see.

Rate-limited · Reversible · Append-only