Context
A storefront that invents price or stock becomes a second, silent catalogue. Headless commerce fails at that boundary, not at the component library.
Headless WooCommerce Commerce keeps WordPress and WooCommerce authoritative for products, prices, stock, customers, and orders.
Decision
Next.js renders the catalogue. Meilisearch is a rebuildable projection with drift detection. Redis holds a seven-day cart, not the price. Checkout creates a pending WooCommerce order, reserves stock, and takes a signed payment event — simulator by default, Stripe test mode optional. Live keys are rejected. If search is down, the storefront filters the live WooCommerce response rather than serving a stale document as truth.
What I rejected
A storefront database that owns catalogue and orders “for speed,” with WooCommerce synced later. The sync lag is a second inventory system.
Failure scenario
Search is down or drifted. The browse path degrades to live WooCommerce. The command path still revalidates price and stock before the pending order exists. A cached card cannot invent a discount the till never saw.
Evidence
Next.js storefront, command path that revalidates against WooCommerce, and documented projection boundaries.
Inspect: Repository · Run locally