Notes Jan 21, 2026 1 min read

Why WooCommerce stays the catalogue of record

nextjswoocommercewordpresstypescript

RepositoryRun locally

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