Writing
Notes from the build.
Notes from production builds: e-commerce, SaaS billing, headless WordPress, performance and the integrations that hold it all together.

Running headless WordPress without a database server
WordPress needs MySQL, a writable uploads folder and a server that never sleeps. I stopped paying for all three and the site got faster.
Read →
Tiered B2B pricing in WooCommerce without a rewrite
A trade supplier needed six customer tiers, VAT-exclusive display and per-account overrides. Here is what held up and what I would not do again.

What actually fixed LCP on a slow storefront
Six changes, ranked by how much they moved the number. Four of the popular ones did nothing measurable.

Stripe or Paddle for a small SaaS: the VAT question
The integration effort is nearly identical. The tax liability is not, and that is the only part of the decision that is hard to reverse.

Multi-tenant Supabase: what row level security does not cover
RLS is the best tenant isolation primitive I have used. It also has four gaps that will leak data if you assume it covers everything.

Moving WooCommerce to Shopify without losing rankings
Traffic dipped 9% for eleven days and recovered. Here is the redirect work that made the difference, and the one thing I nearly got wrong.

Webhooks will be delivered twice. Design for it.
A duplicate delivery once created 300 duplicate invoices in an accounting system. The fix is four lines of SQL and one decision made early.

Caching live sports scores when the data changes every ball
Traffic multiplies by forty during a match and the payload is stale in six seconds. Standard caching advice does not apply.

Offline-first React Native: the sync is the hard part
Storing data locally takes an afternoon. Deciding what happens when the same record was edited in two places takes considerably longer.

The three Klaviyo flows that actually earn their place
Most stores I audit have fourteen flows and three that matter. The other eleven are sending email to people who already bought.