Agent rule

Meta Pixel ID lives in config/analytics.jsonmetaPixel.pixelId; node scripts/sync-analytics.js regenerates assets/analytics.js. Base PageView (+ funnel ViewContent) loads immediately when analytics.js runs — do not gate Meta on /api/owner-auth (owner opt-out is Umami/Vercel only). Funnel paths under metaPixel.viewContentPaths. Razorpay fires InitiateCheckout / Purchase with value / currency: INR / content_ids; Razorpay payment_id as Meta eventID for dedupe. Do not paste raw pixel snippets into every HTML file — edit config + checkout helper.

Status: Accepted

Context: Ads need visit→purchase signal so Meta can optimize creatives, audiences, and landing pages for Ship It Week / workshops.

Decision: Browser pixel via existing analytics pipeline first; Conversions API (server) is a later hardening step if iOS/ad-block loss is material.

Consequences: Verify domains in Meta Events Manager (school.differentthandefault.com + apex if ads land there). After deploy, confirm Active + Test Events. Campaigns should optimize for Purchase (or InitiateCheckout while volume is low).