Skip to main content

// campaign specialist

Automate Google Ads bids and budgets for Shopify.

Magistry manages your Google Ads account against Shopify margin data, not just platform ROAS. Budgets move within clamps you set, tROAS targets shift only on evidence, PMax runs feed-only, RSAs get rewritten, and negative keywords are mined from search terms every cycle. Eight specialist skills run as one planner-judge-executor loop, and every change lands as a scored ad_decision_log row you can read — and reverse in one click.

Google Ads · execution Meta · proposals TikTok · proposals Pinterest · proposals
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 budgets inside hard ±20% clamps and steers tROAS targets within policy windows. Reasons cited by anomaly headroom — never pace-blind raises.

// writes

ADJUST_BUDGET · TARGET_ROAS

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 — on-brand RSA copy, generated images, and video — naming conventions enforced, stored and 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

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

// the real product

Campaigns, spend, and results in one view.

A real screenshot of the dashboard — demo store data. Spend, conversions, and ROAS per campaign, straight from the connected ad accounts.
app.magistry.io/dashboard/ads
The Magistry ads view — campaigns listed with spend, conversions, and ROAS per campaign

// channels

Google executes. The rest propose.

On Google Ads, Magistry writes to your real account — OAuth in, native API, every mutation idempotent and rate-limited. Meta, TikTok, and Pinterest are connected as proposal-only today: the agent drafts the move with the evidence, and you apply it.

Google Ads

Google Ads API · live execution

  • Budgets (±20% clamps) + tROAS targets
  • Feed-only PMax: asset groups, search themes, audience signals
  • Branded search + RSA, extensions
  • Negative mining from search terms
  • Dayparting, device/geo modifiers
  • Campaign experiments

Meta

Connector · proposal-only

  • Account + pixel connection
  • CAPI conversion events
  • Agent drafts the move
  • You apply it — proposal-only today

TikTok

Connector · proposal-only

  • Account connection
  • Events API conversions
  • Agent drafts the move
  • You apply it — proposal-only today

Pinterest

Connector · proposal-only

  • Account connection
  • CAPI conversion events
  • Agent drafts the move
  • You apply it — proposal-only today

// 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,
               confidence=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