Skip to main content

July 16, 2026

Why I put Rust behind a Shopify Headless storefront

Remix renders the storefront, but the webhooks, internal microservices and marketing-API glue run on Rust — here's the reasoning, and where the ~40% pipeline win actually came from.


At Marion’s Kitchen Group I lead a Shopify Headless build: Remix and TypeScript on the storefront, Node.js services in the middle, and — the part that raises eyebrows — Rust handling Shopify apps, webhooks and internal microservices.

The webhook problem

Shopify webhooks are bursty, unforgiving, and multiplicative: a bulk product update or a flash-sale hour can turn a calm integration into tens of thousands of deliveries. Miss the response deadline and Shopify retries; retry storms amplify load exactly when you have the least to spare. A webhook consumer’s job description is “cheap, predictable latency under load” — which is a Rust job description.

The Rust services sit on the ingest edge: verify HMAC, ack fast, push work onto internal queues. Steady sub-millisecond handling with flat memory means the burst math stays boring, and boring is the goal.

Where the ~40% came from

The e-commerce pipeline optimization that showed up as a roughly 40% sales boost wasn’t one heroic rewrite. It was the compound effect of moving slow work off the purchase path: precomputed product data instead of per-request API fan-out, Klaviyo marketing events flowing through an async API instead of the storefront request cycle, and checkout-adjacent calls held to a strict latency budget. Faster paths convert better; the platform work is the conversion work.

Rust where it pays, TypeScript where it flows

The storefront stays Remix/TypeScript — that’s where iteration speed and the Shopify ecosystem live, and where hiring is sane. Rust earns its place only on hot, well-specified boundaries: webhook ingest, internal services with fixed contracts, jobs where p99 is a product feature. The boundary discipline matters more than the language choice: every Rust service has a thin, typed API and could be re-implemented in Node tomorrow without the storefront noticing.

Polyglot backends fail when languages leak into each other’s territory. Keep the seams clean and each side does what it’s best at — 99.9% uptime isn’t a slogan, it’s the absence of interesting incidents.