# Why WooCommerce stays the catalogue of record

Canonical: https://stevenmoriasi.com/blog/headless-woocommerce-commerce
By [Steven Moriasi](https://www.linkedin.com/in/steven-moriasi/).
Source: https://github.com/steven-moriasi/headless-woocommerce-commerce
Date: 2026-01-21

## 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](https://github.com/steven-moriasi/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](https://github.com/steven-moriasi/headless-woocommerce-commerce) · [Run locally](https://github.com/steven-moriasi/headless-woocommerce-commerce#readme)

_—by [Steven Moriasi](https://www.linkedin.com/in/steven-moriasi/)_
