Blog category

Troubleshooting

Fixes for specific errors we have hit and reproduced on real projects. Every post states the versions it was tested on, the root cause, the fix, and how to prove the fix worked.

14 articles

8 min read· October 2026

The Checkout Bugs Quietly Killing Your E-Commerce Sales

A failing checkout rarely throws an error you see; it just loses the sale. The common silent bugs (double charges, stuck spinners, webhooks that never fire, oversold stock, mobile breakage), what each one costs, and the Playwright and webhook tests that catch them before your customers do.

Read article
8 min read· October 2026

Testing Inventory and Order Sync Across Channels (No Overselling)

Selling the same stock on a website, a marketplace and in a shop means inventory sync, and sync is where overselling hides. The race conditions and duplicate updates that cause it, how to make sync idempotent, the reconciliation that catches drift, and the SQL and tests that prove you never oversell.

Read article
9 min read· October 2026

Cart and Wishlist Persistence Bugs That Quietly Lose Sales

A cart that empties on login, a wishlist that vanishes on a new phone, a merge that doubles quantities: these lose sales silently because no error is thrown. The four persistence bugs, where each comes from, and the Playwright tests that reproduce and then guard against them.

Read article
13 min read· October 2026

Stripe Webhook Not Firing, or Returning 405: A Checklist

A step-by-step checklist for a Stripe webhook that never arrives or fails: reading the Event deliveries tab, what 3xx, 401, 404, 405, 400 and 500 mean on a Next.js App Router route, raw-body signature checks, test vs live endpoints and secrets, and forwarding with the Stripe CLI.

Read article
10 min read· October 2026

Next.js 16 proxy.ts (Middleware) Not Running: The Fixes

In Next.js 16, middleware.ts became proxy.ts. When the proxy silently does nothing, the cause is almost always one of five things: where the file sits, what it exports, a matcher that never matches, a runtime setting proxy does not accept, or a deploy target that does not support it. Each check, with the proxy this site runs and how to prove it works.

Read article
10 min read· October 2026

Next.js Sitemap and Canonicals Pointing at the Wrong Domain: The Fix

When a Next.js sitemap, robots.txt and canonical tags point at the wrong host, the cause is usually a stale NEXT_PUBLIC_SITE_URL, frozen into the build. How it happened on this site, how to check yours with curl, and the small host allow-list that stops a stale value ever reaching indexed markup again.

Read article
13 min read· October 2026

Stripe Webhook Returned 200 but the Subscription Didn't Update

Why a Stripe webhook can return 200 while your database stays wrong: handlers that swallow errors, older events overwriting newer ones, updates that match no row, event IDs recorded too early, and fields that moved in API 2025-03-31.basil. With a processor that fails loudly and tests that keep it fixed.

Read article
11 min read· October 2026

Soft 404s in Next.js: Why loading.tsx Makes Unknown Pages Return 200

A root app/loading.tsx wraps every route in a Suspense boundary, so Next.js streams a 200 status before notFound() can run and unknown URLs become soft 404s. How we found it on this site, why it happens, the fix (scope loading.tsx to the routes that need it), and how to prove the status with curl on a production build.

Read article
12 min read· October 2026

App Works Locally but Breaks in Production: 12 Causes, in Order

Why an app, often one built with an AI tool, works on localhost and breaks after deploy: 12 environment differences in the order to check them, from environment variables, dev versus production builds, CORS and auth redirect URLs to serverless timeouts, Node versions, case-sensitive paths and the install command, with the fix and the proof for each.

Read article
13 min read· October 2026

A Database Migration Broke Production: Recover, Then Prevent It

What to do when a database migration takes production down: the first 15 minutes, how to tell a lock problem from a schema or data problem, when to roll back, forward-fix or restore, then how expand-contract migrations and CI migration checks stop it happening again. PostgreSQL examples throughout.

Read article
11 min read· October 2026

Why Is My Shopify Store Slow? Apps, Themes and Core Web Vitals

The four usual reasons a Shopify store is slow (render-blocking app scripts, heavy themes, badly loaded images and slow Liquid), how to read LCP, INP and CLS in Shopify's web performance report, how to find which app is to blame, and the order to fix things in.

Read article
12 min read· October 2026

Supabase Auth Fails After Deploying to Vercel: Redirect URLs, Cookies, Env

Why Supabase auth works on localhost and breaks after deploying to Vercel, in the order to check: the Site URL still set to localhost, missing redirect URLs and preview wildcards, email templates using the wrong variable, OAuth callback settings, the PKCE code exchange, session cookies in a Next.js proxy, and environment variables baked in at build time.

Read article
9 min read· September 2026

Zod 4 .partial() Keeps .default() Values — and Can Wipe Your Data

In Zod 4, .partial() still applies .default() values to fields you leave out. Used for PATCH-style updates, that silently overwrites columns. Here is how we found it, the fix, and the test that keeps it fixed.

Read article
8 min read· September 2026

Fixing npm ERESOLVE: next-auth 4 and nodemailer 10 on Vercel

Our Vercel deploy failed with npm ERESOLVE after a security upgrade moved nodemailer to v10. Here is why it passed locally, why downgrading was the wrong fix, and the scoped npm overrides entry that solved it.

Read article