Sync
catalog_sync pulls Shopify products, variants, and cost_per_item into the products table with Tier A cost confidence. performance_sync ingests Shopify orders + Google Ads spend into performance_daily per (date, variant_id).
// catalog specialist
Sync, classify, decide, execute. Each product sits in one lifecycle state, every move is checked against ALLOWED_TRANSITIONS, and each change written to Shopify carries a decision row you can reverse.
product : "Brushed Linen Throw — Sand"
variant : 'SKU-LIN-228-SND-L'
from_state : OPTIMIZING
to_state : ON_DISCOUNT
action : DISCOUNT_TEST
delta : −15% (€89 → €76)
window : 14d, then reverted
reason : OPTIMIZE_CYCLE_FAILED (2 cycles)
margin tier = A (verified)
p75 winner floor = 2.4x ROAS
current ROAS = 1.6x (28d)
evidence : [perf#9123, cycle#771]
applied_at : 2026-05-25T08:02:14Z
applied_by : catalog_agent.discount_executor
status : APPLIED (live)
reversal : price restored on day 14// what it does
catalog_sync pulls Shopify products, variants, and cost_per_item into the products table with Tier A cost confidence. performance_sync ingests Shopify orders + Google Ads spend into performance_daily per (date, variant_id).
self_calibrator derives thresholds from your store's own performance distribution: winner floor at p75, loser floor at p25, no hardcoded ROAS rules. classifier assigns WINNER / MID / LOSER / INSUFFICIENT_DATA / SEASONAL every cycle.
decision_engine emits an Action enum per SKU: KEEP, SCALE_WINNER, OPTIMIZE_LOSER, DISCOUNT_TEST, DRAFT, VAULT, REVIVE_SEASONAL. Every state change validated against ALLOWED_TRANSITIONS before write.
action_executor mutates Shopify (draft / publish / edit). discount_executor changes prices. copy_rewriter rewrites titles + descriptions via LLM, gated by a trademark filter.
// the real product

// product deep view
Revenue, spend, ROAS, and orders per day, the same window the classifier reads.
Per-variant performance at a glance: the size that carries the product and the color that drags it.
Every lifecycle move, price change, and copy rewrite the agent made on this SKU, with its evidence.
Each generated title and description is versioned, so you can compare what shipped and roll back.
// lifecycle state machine
Fresh import, awaiting first decision.
Live on storefront, gathering signal.
Selling within range, keep cycle.
Copy or pricing under iteration.
Discount window open, time-bounded.
Unpublished, removed from catalog.
Parked off-season, republished when its season returns.
Terminal. Nothing moves a product out of it automatically.
AUDIT → PUBLISHED, ACTIVE, OPTIMIZING,
ON_DISCOUNT, DRAFTED,
SEASONAL_VAULT, ARCHIVED
PUBLISHED → ACTIVE, DRAFTED
ACTIVE → OPTIMIZING, ON_DISCOUNT,
DRAFTED, SEASONAL_VAULT
OPTIMIZING → ACTIVE, ON_DISCOUNT
ON_DISCOUNT → ACTIVE, DRAFTED
DRAFTED → ACTIVE, SEASONAL_VAULT,
ARCHIVED
SEASONAL_VAULT → PUBLISHED, ARCHIVED
ARCHIVED → (terminal)
validate(from, to) → bool
invalid → refused, nothing written// action enum
| Action | What it does | Valid from | Trigger |
|---|---|---|---|
| KEEP | Continue selling at current price. | PUBLISHED, ACTIVE | Within ROAS band |
| SCALE_WINNER | Flagged for budget lift on paid side. | ACTIVE | ROAS > p75 winner floor |
| OPTIMIZE_LOSER | Copy + image regenerate cycle. | AUDIT, ACTIVE | ROAS below the store's loser ceiling |
| DISCOUNT_TEST | 14-day price test, then reverted. Needs Tier A cost and a margin above the floor. | AUDIT, ACTIVE, OPTIMIZING | OPTIMIZE_CYCLE_FAILED |
| DRAFT | Unpublish from storefront. | ON_DISCOUNT, ACTIVE | SALES_ZERO_N_DAYS |
| VAULT | Park as seasonal candidate. | AUDIT, ACTIVE, DRAFTED | Seasonal pattern, currently off-season |
| REVIVE_SEASONAL | Republish ahead of season window. | SEASONAL_VAULT | Seasonal revive, proposed for review |
// cost confidence
// data source
Shopify cost_per_item field, confirmed per variant.
// what is allowed
All actions enabled: price changes, scale, archive, publish.
// data source
Supplier cost discovered via reverse-image match against supplier sites.
// what is allowed
Performance-based actions such as KEEP and OPTIMIZE_LOSER. No price or discount writes.
// data source
Missing or unverifiable cost, orphan SKU.
// what is allowed
No price or discount writes. Lifecycle moves can still apply.
Why this matters. Most catalog tools assume your cost data is right. Magistry assumes it isn't: every SKU is scored, every write is gated, and a product without Tier A cost never gets a discount on its own. Your margin floor is checked in code before any price write.
// catalog specialist
Connect your Shopify store and the Catalog Specialist starts in dry-run: every product classified and every proposed action explained, with nothing written to Shopify until you switch it to live.
Starts in dry-run · One owner per change · Catalog changes reversible
We use cookies to run this site, to see which pages help, and to measure which ads bring people here. You choose per category; everything except the strictly necessary is off until you say otherwise. Cookie policy · Privacy