shiftzero

Edge experimentation infrastructure

A/B test any site at the edge. Zero flicker.

Experiments are applied in the HTML stream at the CDN — before the browser sees a byte. No client SDK, no flash of the control, clean React hydration, and statistics that stay honest while you watch them.

Start experimenting — free →

Self-hosted · consent-first by default · GPC & DNT honoured · your data never leaves your stack

Open ↗

Random visitor: a fresh edge-assigned visit — you get whatever a real visitor would. This is a real page behind the real product — flip between A and B and reload as often as you like: every version arrives fully formed, because the change is made at the edge before the browser sees anything.

0

flashes of the control

the variant is in the first byte of HTML — there is nothing to swap

0.55ms

edge transform, p50

p99 2.08ms on a 38 KB document, measured on the streaming rewriter

1.6 KB

browser tag, gzipped

async, non-blocking — legacy client SDKs ship 25–80 KB that block paint

100%

on your infrastructure

your edge, your data, your keys — no third-party data path

How it works

assignedge

deterministic bucketing before a byte of HTML leaves the CDN

transformedge

HTML + hydration data + RSC Flight patched in one streaming pass

measurebrowser

conversions ride your existing dataLayer — GA4 events just work

decidedashboard

peek-safe stats, guardrails, one-click ship-the-winner

Why the edge

The browser should never see the control

Client-side testing tools load JavaScript, wait for the DOM, then swap content — users watch the original flash into the variant, and on React sites the swap fights hydration. ShiftZero moves the mutation to the CDN edge: assignment happens on the request, the HTML is rewritten as it streams, and the hydration data is patched to match. What arrives is simply… the variant.

It works the same on every stack — because it operates on the one thing every stack has in common: the HTML response.

Next.jsReactNuxtRemixShopifyWordPressRailsDjangoStatic HTML
the whole measurement install — one line on your site
<script async src="https://cdn.shiftzero.dev/sz.js"
  data-endpoint="https://collector.yourco.com/events?wk=YOUR_KEY"></script>
one command puts the edge in front of your origin
npx shiftzero deploy

Or skip the worker entirely with the managed proxy: point a CNAME at ShiftZero and your install is a DNS record.

Versus client-side testing

The honest comparison legacy tools won’t print

Client-side toolsShiftZero
Where variants are appliedIn the browser, after paint — users see the control flash into the variantIn the HTML stream at the CDN edge — first paint is the variant
React / Next.js hydrationDOM swaps fight hydration: mismatches, warnings, re-render flickerHydration data (__NEXT_DATA__, JSON islands, RSC Flight) patched with the HTML — React mounts into the variant
Page-weight cost25–80 KB of blocking JavaScript before the page can settleNo client SDK. Optional 1.6 KB async tag for measurement only
Watching results dailyFixed-horizon p-values — peeking inflates false positives past 30%Always-valid confidence sequences — peek-safe by construction, labelled on every readout
Your dataEvents shipped to the vendor's cloudSelf-hosted end to end — collector, results and identity stay on your stack
Pricing“Talk to sales” — 3 of the 4 big vendors publish no prices at allSelf-hosted and free in early access. No sales call to run your first test

What’s in the box

Built like infrastructure, honest like a statistician

Zero flicker, by architecture

Legacy tools mutate the DOM after paint — users see the control flash, Core Web Vitals tank. ShiftZero rewrites the HTML stream at the edge, so the browser's first paint is already the variant.

Safe for hydrated React

Client-side tools corrupt hydration. ShiftZero patches the framework's hydration data — __NEXT_DATA__, JSON islands, even RSC Flight payloads — in the same pass as the HTML, so React mounts straight into the variant.

No client SDK, no app changes

Assignment never runs in the browser and your application code never changes. Install is a script tag for measurement plus an edge worker in front of your origin — or a managed CNAME flip.

Statistics you can watch live

Always-valid confidence sequences make peeking safe. CUPED cuts variance so experiments conclude sooner. Winsorization stops one whale order flipping a revenue test. SRM guardrails catch broken splits before you trust a winner.

A visual editor that tells the truth

Point and click on your live site — the selector comes from the same engine the edge validates. Serve-time diagnostics flag selectors that stop matching after a redesign, with one-click self-healing proposals.

The whole lifecycle, not just the split

Runtime estimates at authoring time, winner notifications, honest auto-stop rules, one-click ship-the-winner, and a decision log so your program keeps its memory.

The statistics engine

Watch results all day without lying to yourself

Fixed-horizon p-values are only valid at one pre-committed sample size — checking them daily inflates false positives past 30%. ShiftZero’s live view runs on always-valid confidence sequences, so the dashboard is peek-safe by construction, and it says so on the tin: every readout is labelled with the inference regime it came from.

  • Always-valid sequencesstop the moment the interval excludes zero — validly
  • CUPEDpre-exposure behaviour regressed out; same effect, less noise, faster calls
  • Winsorizationrevenue metrics capped at p99.5 so one whale can't flip the result
  • Holm correctionA/B/n arms keep the promised family-wise error rate
  • SRM guardraila broken split is flagged before any winner is claimed
  • Bayesian companionprobability-to-beat and expected loss, for decision meetings

live scoreboard

variant_b ▲ +14.2% [+3.1%, +26.4%]

◈ always-valid · peek-safe · SRM ✓

92% to beat control · risk if shipped 0.4%

CUPED −31% variance · outliers capped · 3

A real readout from the demo experiment — every number is explained in the analytics docs.

Questions engineers actually ask

FAQ

Do I need to change my application code?+

No. The edge worker is a reverse proxy in front of your origin — assignment and content changes happen in the HTML stream. The only thing that touches your pages is an optional 1.6 KB script tag that mirrors the analytics events you already fire.

Does it really work with Next.js / React hydration?+

Yes — that's the point. ShiftZero patches the framework's hydration data (__NEXT_DATA__, JSON islands, even RSC Flight payloads) in the same pass as the HTML, so React mounts directly into the variant. No mismatch, no re-render, no flicker.

What does it do to my page speed?+

The streaming transform measures p50 0.55 ms / p99 2.08 ms on a 38 KB document, running at the CDN edge. There is no render-blocking client SDK — the browser tag is 1.6 KB gzipped and loads async. Client-side testing tools this replaces typically ship 25–80 KB of blocking JavaScript.

What about GDPR and consent?+

Consent-first by default: before analytics consent, visitors are served a consistent variant with an ephemeral id — no cookie set, no events recorded. GPC and DNT are honoured as denial signals. And it's your infrastructure end to end: no data ever touches a third party.

Can I trust the statistics?+

The live scoreboard runs on always-valid confidence sequences, so watching it continuously can't inflate false positives. CUPED, winsorization, Holm correction, and SRM guardrails are built in — and every readout is labelled with the inference regime it came from. When there isn't enough data, it says so.

What if my site isn't on a framework?+

ShiftZero operates on the HTML response — the one thing every stack shares. Shopify themes, WordPress, Rails, Django, static sites: same edge, same editor, same statistics.

Five minutes to your first flicker-free experiment

Create an experiment in the dashboard, pick an element on your live page, and start it. The edge does the rest. Self-hosted and free in early access — no sales call, no credit card.