The evolveAB blog
How we run A/B tests inside Next.js apps, how to read the numbers, and what we've learned letting an AI write the next variant.
A/B testing tools for the Next.js App Router, compared (2026)
Where each tool decides the variant, whether it flickers, where your data ends up, and what it costs. GrowthBook, Croct, Vercel Flags, PostHog, Optimizely, VWO, Kameleoon, AB Tasty and evolveAB, with sources.
AI CRO tools in 2026: who writes the variant, who approves it, and what stops a bad one
Coframe, Webflow Optimize, Optimizely Opal, Fibr, GrowthBook and VWO all have AI in the testing loop now. They differ most in the guardrails: who approves, what the AI is allowed to change, and what happens when a variant hurts the page.
The anti-flicker tax: what hiding your page does to LCP
Client-side A/B tools either flash the original page before swapping in the variant, or hide the page until their script is ready. Both cost you. Here's what the defaults are, what the published measurements show, and how server-side assignment on Next.js avoids the choice.
Five checks between an AI's draft and your homepage
Letting a language model write test variants is cheap. Letting it write something false on your pricing page is expensive. These are the checks every AI suggestion in evolveAB passes before a person even sees it.
Bandit or fixed split? How to pick when your site doesn't get much traffic
A fixed A/B split gives you a clean answer. A Thompson-sampling bandit sends more visitors to the better variant while it learns. Which one fits depends on the question you're asking, not on which sounds smarter.
What our autopilot is allowed to do on its own, and what makes it stop
Autopilot retires losing variants, writes new ones and approves the ones that pass every check. It only turns on under seven conditions, and it pauses itself the moment its data goes stale.
Two ways to serve an A/B variant in the Next.js App Router
Static mode gives every variant its own cached render. Dynamic mode renders per request and fits apps that are already dynamic. How each works in Next.js 16, when init picks which, and what cacheComponents changes.
Four numbers per arm: running A/B tests without sending visitor data to a vendor
evolveAB computes Bayesian results and bandit weights without ever seeing a single visitor. The trick is that the statistics only need four sums per variant, and your own database can produce them.
We set our winner bar at 95%. A simulation talked us out of it.
Our first results engine called a winner at P(beat control) ≥ 95%. Run against two identical variants with ten looks, it crowned a false winner roughly 15% of the time. Here's what we changed.