Client-Side vs Server-Side A/B Testing Compared
Client-side vs server-side testing explained: how each works, the flicker problem, SEO and Core Web Vitals impact, and when to choose which.

📚 This article is part of the guide What Is a Feature Flag? The Complete Guide for Product Teams.
Client-side vs server-side testing is the most consequential architecture decision a team makes before running its first experiment: where does the decision about which variation to show actually happen, in the visitor’s browser or on your server. It matters more than which vendor you pick, because it shapes what kinds of tests you can run at all. We touch on this briefly in the complete guide to feature flags; this piece goes deep on both approaches, the real problem one of them solves (flicker), and how it connects to feature flags vs A/B testing, the layer that now runs most server-side experiments in production.
What client-side A/B testing is
In client-side testing, the page loads normally and a piece of JavaScript (the testing tool’s “snippet”) runs in the visitor’s browser, decides which variation that visitor sees, and modifies the already-loaded HTML to apply it, whether that means swapping a headline, hiding an element, or reordering a layout. This is the original model of web A/B testing, popularized by tools like Optimizely, VWO, and Kameleoon, and it is still the most common choice for marketing and CRO teams.
The central advantage is setup speed: a single snippet pasted into the site’s <head>, or injected through a tag manager like Google Tag Manager, and the tool can build visual variations directly in a point-and-click editor, no engineering team required for every test. That is why client-side testing dominates landing page and ecommerce optimization, where testing velocity matters more than architectural robustness.
The central disadvantage has a name: flicker, also called FOOC (flash of original content). Because the browser always renders some version of the page before the testing script finishes running, there is a window, anywhere from tens of milliseconds to a couple of seconds, during which a visitor can see the original page before the variation appears. VWO describes this behavior directly in its own help center: flicker happens because the variation is applied via JavaScript after the original page has already started loading, and the delay is inherent to any test that manipulates the DOM client-side (VWO help center, now Wingify).
What server-side A/B testing is
In server-side testing, the decision about which variation to show happens before any HTML leaves the server headed for the browser. The backend, or an edge layer as we’ll see below, evaluates which variation a given visitor falls into and assembles the response with the final content already in place, with no client-side script needed to rewrite anything afterward. There is no “original version” to flicker, because the server never sends the version that will not be shown.
This model is standard in feature flag and experimentation products like Statsig, GrowthBook, LaunchDarkly, and Split.io. GrowthBook’s own documentation is direct about why: server-side testing allows for complex experiments that span many parts of an application’s code, and it avoids the flicker problem that shows up on the client side (GrowthBook docs). The tradeoff is engineering cost: running a server-side test typically requires a server SDK, a way to evaluate the variation before rendering (server-side rendering, or an API call ahead of render), and discipline to keep visitor attribution stable across sessions. That is not the work of configuring a visual editor, it is the work of writing code.
The flicker problem, in real numbers
Flicker is not just an aesthetic annoyance, it is measurable, and it costs real performance budget. Anti-flicker snippets increase Largest Contentful Paint (LCP), a Core Web Vitals metric that feeds Google’s page experience ranking signal, according to an analysis by performance monitoring firm DebugBear of anti-flicker patterns used by A/B testing and personalization tools. The mechanism is blunt by design: because the snippet does not know in advance which parts of the page a given test will change, most implementations hide the entire body with opacity: 0 until the client-side script finishes running and reveals the page, which is a drastic fix for what is often a small visual change (DebugBear, “Anti-Flicker Snippets From A/B Testing Tools And Page Speed”).
DebugBear’s own tooling can now automatically flag pages that hide content this way, surfacing a “Don’t hide page content using CSS” recommendation whenever an anti-flicker pattern is detected. Their guidance for teams that keep an anti-flicker snippet is to scope the hiding as narrowly as possible: if a test only changes headlines, hide only h1 elements; if it changes a call-to-action button, hide only the button, not the entire page body. Scoping the hide reduces how much of the perceived load the snippet delays, without giving up the flicker protection entirely.
The tradeoff is structural, not a configuration mistake anyone can fully engineer away. A snippet with no timeout risks a blank page forever if the testing script fails to load; a snippet with an aggressive timeout risks the original flicker it was built to prevent; and a snippet that hides too broadly delays LCP more than necessary. Every client-side testing vendor, including Optimizely and Kameleoon, documents its own version of this same tuning problem, because it is inherent to running the decision in the browser after the page has already started rendering.
Comparison table: client-side vs server-side
| Criterion | Client-side | Server-side |
|---|---|---|
| Setup speed | Fast: single snippet, visual editor, no deploy required | Slower: requires a server SDK, evaluation endpoints, and sometimes a code deploy |
| Flicker (FOOC) risk | Real, mitigated (not eliminated) with an anti-flicker snippet | None by construction: the variation ships already baked into the HTML |
| SEO / performance impact | Depends on implementation; a misconfigured anti-flicker snippet can hurt LCP and CLS | Neutral for SEO/performance when implemented well; no extra render-blocking script |
| Who can implement it | Marketing and CRO teams, no engineering dependency | Requires an engineering team with backend or rendering-layer access |
| Best-fit use cases | Landing page visuals, copy, layout, fast-iteration ecommerce conversion tests | Product logic, pricing, onboarding, access permissions, mobile/native apps |
No single row in this table decides anything on its own. A marketing site that only tests a headline and a button rarely justifies building server-side infrastructure; a SaaS product testing checkout flow or pricing logic rarely survives the risk of a third-party script deciding that in the customer’s browser.
When to choose client-side
Client-side is the right call when the test is essentially visual (headline, CTA, image, section order), when the team running the test does not have, or does not need, a developer for every variation, and when test volume is high enough that the speed of a visual editor outweighs the residual flicker risk. This is the natural territory of landing pages, ecommerce, and content sites, where CRO teams need to iterate fast and a well-mitigated, brief flicker is an acceptable cost against the agility gained.
When to choose server-side
Server-side is worth the engineering investment when a test involves logic that is not purely visual: pricing, access to a feature, an entire business rule, or any flow that also needs to work on mobile and native apps, where there is no browser DOM for a snippet to manipulate. It is also the right choice when the experience cannot tolerate even a millisecond of flicker, such as in products where perceived stability is itself part of the value delivered, or when a test needs to coexist with access rules that should never, for security reasons, be decided client-side. LaunchDarkly’s own SDK documentation makes this point explicitly: a server-side SDK key should never run in the browser, because segmentation rules can contain sensitive data that a client-side context should not expose (LaunchDarkly docs).
Hybrids and edge computing as a middle ground
Between the two extremes there is a real, not just theoretical, middle ground: evaluating the variation at the edge, rather than in the browser or on a distant central server. The idea is simple: the decision about which variation to show still happens before the HTML is assembled, so there is no flicker, but it happens at a network node geographically close to the visitor instead of a central data center, cutting the latency that traditional server-side testing can add. Statsig documents this directly through support for Cloudflare Workers, Fastly Compute, and Akamai EdgeWorkers (Statsig docs), plus a separate integration that syncs flag and experiment definitions into Vercel’s Edge Config (Statsig docs), aiming to evaluate the flag as close to the user as possible so that both flicker and the round trip to a distant decision point disappear.
A second, more common kind of hybrid is organizational rather than architectural: use client-side testing for fast marketing tests and reserve server-side, or a feature flag layer, for the product tests that genuinely need the robustness. GrowthBook, for example, offers a “remote evaluation” mode that keeps segmentation rules off the client even in an otherwise client-side context, borrowing part of server-side security for a lighter-weight implementation (GrowthBook docs). There is no single right answer, there is only the right question: what does this specific test need, and what can it afford to pay in engineering to get it.
SEO: what actually matters and what does not
Client-side testing does not hurt SEO by default, but sloppy implementations do. Google Search Central’s official guidance on website testing lays out the core rules: use rel="canonical" on any alternate test URL pointing back to the original, so search engines understand every variation is the same underlying page, not duplicate content; never serve search crawlers a different experience than real visitors get, a practice Google treats as cloaking regardless of whether it happens through server logic, JavaScript, or any other mechanism; and if a test redirects users to a variation URL, use a temporary 302 redirect, never a permanent 301, so search engines keep indexing the original (Google Search Central, “A/B Testing Best Practices for Search”). Google also recommends removing all test infrastructure, alternate URLs, scripts, markup, as soon as a test concludes, rather than leaving it running indefinitely once you already have a winner.
None of those rules depend on whether the test runs client-side or server-side. What does correlate with architecture is Core Web Vitals: an anti-flicker snippet that hides the whole page body is a client-side-specific failure mode, and it is the most common way a well-intentioned test quietly drags down LCP and, when the revealed content shifts layout, Cumulative Layout Shift too. Server-side testing sidesteps this specific risk by construction, since there is no intermediate hidden state to reveal. That is a real, measurable SEO-adjacent advantage for server-side testing on pages where performance is already tight, not a claim that client-side testing is inherently bad for search.
Tools by approach (a neutral view)
| Approach | Examples | What their own docs emphasize |
|---|---|---|
| Client-side | VWO, Optimizely, Kameleoon | Visual editor, fast snippet-based install; each vendor’s own documentation acknowledges the flicker risk and ships anti-flicker mitigation |
| Server-side / feature flag | Statsig, GrowthBook, LaunchDarkly, Split.io | Server SDK, evaluation before render, avoids flicker by construction; requires more engineering integration |
| Edge | Statsig (Vercel Edge Config, Cloudflare Workers, Fastly, Akamai) | Evaluates the variation at the network edge, close to the visitor, combining low latency with no flicker |
This table is a snapshot of what each category of tool says about its own approach, not a ranking. Always check current official documentation before deciding, since product capabilities change.
How this connects to feature flags
Server-side testing and feature flags are, in practice, the same infrastructure used for two different jobs. A feature flag decides, on the server, whether a feature is visible to a given user; a server-side A/B test uses that exact mechanism to decide which variation of a feature that user sees, then measures the effect. That is why tools like LaunchDarkly, GrowthBook, and Statsig sell both capabilities together: the same rule evaluation that turns a feature on or off also allocates traffic across an experiment’s variations. If this ecosystem is new to you, the complete guide to feature flags explains the concept from the ground up, and feature flags vs A/B testing goes deeper on the specific difference between “turning a feature on” and “testing which variation converts better”, which is exactly the pair of questions behind the client-side vs server-side decision. For the statistics that decide any test, client-side or server-side, once it is running, see our guide to A/B testing statistical significance.
Do this automatically on Donnu
Donnu A/B is, on purpose, a client-side tool: a lightweight snippet built to install in minutes without requiring an engineering team, with the same flicker concern you just read about handled inside the product itself rather than left for you to configure from scratch. That is not the right answer for every test, a pricing test or an access-control experiment still needs the robustness of server-side, but it is the right answer for the slice of tests that comes up most often in day-to-day marketing and CRO work: visual changes that need to go live fast, without opening an engineering workstream.
If your next test fits that shape, start a free 14-day trial and see the snippet in action. If your case calls for more robustness, start with the complete guide to feature flags and feature flags vs A/B testing to map what your stack already has before adopting a new tool.
References
- VWO (Wingify). Why Do I Notice a Page Flicker When the Wingify Test Page is Loading? help.wingify.com.
- GrowthBook. Running Experiments on GrowthBook. docs.growthbook.io/experiments.
- Statsig. CDN Edge Testing for Cached Resources. docs.statsig.com/guides/cdn-edge-testing.
- Statsig. Vercel Integration. docs.statsig.com/integrations/vercel.
- GrowthBook. Remote Evaluation. docs.growthbook.io/self-host/remote-evaluation.
- LaunchDarkly. Choosing an SDK type. launchdarkly.com/docs/sdk/concepts/client-side-server-side.
- DebugBear. Anti-Flicker Snippets From A/B Testing Tools And Page Speed. debugbear.com/blog.
- Google Search Central. A/B Testing Best Practices for Search. developers.google.com/search.
Frequently asked questions
- What causes flicker (FOOC) in client-side A/B tests?
- The browser renders the original page first, and only afterward does the testing script load, decide the variation, and rewrite the DOM to apply it. In that gap, however small, a visitor can see the original version flash before the variation appears. This is why the effect is also called FOOC, "flash of original content", a term client-side testing vendors like AB Tasty use explicitly in their own documentation to describe the same behavior VWO documents as "flicker" in its help center.
- Does server-side A/B testing always avoid flicker?
- Yes, by construction: the decision about which variation to show happens before any HTML is sent to the browser, so there is no "original state" to flash. What server-side testing does not automatically remove is network latency between the visitor and the server making the decision, which is why tools like Statsig and Vercel push that decision to the edge, as close to the visitor as possible.
- Does client-side A/B testing hurt SEO?
- Not from testing itself, but from how many implementations are built. Google recommends using rel="canonical" pointing at the original URL, avoiding cloaking (showing search crawlers something different from what visitors see), and not running a test longer than necessary, per Google Search Central official guidance on website testing. The factor that matters most in practice is performance: a poorly configured anti-flicker snippet can inflate Largest Contentful Paint, a Core Web Vitals metric that feeds into ranking.
- Can a team migrate from client-side to server-side testing later?
- Yes, and it's a common path: many teams start with a lightweight client-side tool for page-level tests and move parts of their experimentation program to the server once tests start touching product logic, pricing, or access permissions rather than just visual appearance. The migration costs real engineering (evaluation endpoints, server SDKs, stable cross-session attribution), so it's worth mapping early which parts of the roadmap genuinely need server-side.
- Can client-side and server-side testing run in the same product at once?
- Yes, and in practice this is a common setup: client-side for fast marketing and landing page tests, server-side or a feature flag layer for product, pricing, and onboarding tests. This is not a research finding, it is the pattern that emerges from looking at what each category of tool is built and sold to do. The question is never "which approach is better" in the abstract, it is "what does this specific test need": setup speed or infrastructure robustness.