Updated on October 20, 2026
A 0.1-second improvement in mobile speed increased conversion rates by 8.4% on retail sites studied by Deloitte for Google, and form submissions by 21.6% on lead generation sites. This figure raises an awkward question for any CRO team: is your A/B testing tool causing you to lose, through latency, some of the gain you're trying to measure?
Server-side testing addresses this question by moving the "who sees which version" decision out of the browser. However, this architecture comes with its own costs: developer involvement, a need to redesign the CDN cache, and more complex visitor counting. This guide compares the three possible locations for this decision (browser, server, edge), explains the role of feature flags, and provides a framework for choosing, test by test.
Server-side testing: the short answer
Server-side testing is an A/B testing method in which the server chooses the variant for each visitor and returns a page already built, without further modification in the browser: therefore there is no flicker or test script that delays display. In return, each variant must be coded and deployed by the technical team.
In practice, the server reads a stable identifier (cookie, logged-in user ID), calculates the assignment, and then renders the corresponding template. Variant B is not "a version A modified by JavaScript": it is a different page, or a different application behavior, served from the very first byte.
This difference opens up a scope that client-side testing cannot properly cover: recommendation algorithms, pricing rules, search result order, number of steps in a funnel, and the logic of an API consumed by both the website and the mobile application. For basic definitions (variant, allocation, sample), the glossary of A/B testing sets out the vocabulary used in the rest of this article.
Client, server, edge: where is the decision made?
All A/B testing boils down to an allocation decision and a rendering. What distinguishes architectures is where this decision is made and when the rendering takes place.
On the client side: the decision is made in the browser
The server returns the original page. A test script loads, selects the variant, and then modifies the DOM (text, color, block order). This is the model used by visual editors: a marketer creates a variant in minutes, without a development ticket. The price to pay is a time window between displaying the original and applying the variant.
Server-side: the decision within the application
The application (PHP, Node, Python, Java, etc.) incorporates an SDK or assignment logic. The decision is made before the HTML rendering. The test resides in the code: one deployment to create the variant, and cleanup at the end.
At the edge: the decision in the CDN
A function running on the delivery network (Cloudflare Workers, Vercel Routing Middleware, Lambda@Edge, Fastly Compute) intercepts the request before it reaches the origin server. It reads or sets an assignment cookie, then rewrites the URL to either version A or B, both of which are pre-generated and cached.
| Criteria | Client-side | Server-side | Edge |
|---|---|---|---|
| Place of the decision | Browser | Application Server | CDN Node |
| Flicker possible | Yes, to be hidden | No | No |
| Who created the variant | Marketing, product | Developers | Developers (often static variants) |
| Online publication time | Minutes to hours | A deployment cycle | Deployment followed by code-free settings |
| Testable perimeter | Interface, content | Everything, including business logic | Full pages, routing, templates |
| Impact on the cache | Neutral | To manage | Native if the variant is in the cache key |
The cost of milliseconds
Speed is not a secondary technical issue: across 37 brand sites and more than 30 million sessions, a gain of 0.1 seconds on four speed indicators improved progress throughout the entire purchase funnel. The study Milliseconds Make Millions, published on web.dev, details the results by sector: +8.4% conversion in retail, +10% bookings in travel, +21.6% forms sent in lead generation.
Compare these figures to a poorly configured client-side test. A typical anti-flicker snippet renders the page invisible until the visitor is assigned, with a security delay often set to 4 seconds: forty times the 100 milliseconds in the study. The test then measures the effect of your variant plus the effect of the delay, and there is no guarantee that this delay will be identical between A and B.
Recent client-side tools have reduced the problem. Some vendors advertise compressed scripts of 11 to 15 KB and application of the variant in a few tens of milliseconds, compared to 80 to 150 KB for legacy tools. This is exactly the logic of the ultra-fast diffusion of BlastOptimize The first approach reduces the window between the initial display and the variant to the point of being imperceptible. The server-side approach goes further by eliminating this window, at the cost of a more complex implementation. The two approaches are not mutually exclusive; they simply cover different types of testing.
The true cost of server-side development is not zero.
Eliminating flicker doesn't eliminate latency. An SDK that queries a remote API with each request to determine the assignment adds a network round trip before rendering. The best practice is local evaluation: the SDK downloads the test configuration in the background, stores it in memory, and calculates the assignment without a network call. On the edge, Vercel reports that 99% of configuration reads from its global storage take less than 15 ms. Without this precaution, you've simply shifted the latency from the browser to the server.
Feature flags: the server-side testing engine
A feature flag is a switch in the code that decides, for each user, which version of a feature to run; as soon as it offers several values distributed as a percentage, it becomes a server-side A/B test. This is why most server-side experimentation platforms are built around a flag system.
The typical scheme is simple: the code requests the value of the flag from the SDK. nouveau_tunnel for user 8214, the SDK returns "variant_b", the application renders the tunnel in two steps instead of three. The assignment is deterministic: the same identifier always gives the same variant, generally via a hash of the ID combined with the test key.
What flags bring beyond the test
- Stop immediately : if the variant degrades a guard metric (server errors, response time, average order value), you cut it off from the interface without redeploying.
- Gradual deployment : the winning variant increases traffic from 50% to 100% in stages, while monitoring for errors.
- Multi-channel consistency The same flag controls the website, the mobile application, and the API. A visitor who starts on mobile and finishes on a desktop remains in the same version if they are identified.
The debt of the flags
Every server-side test leaves conditional code behind. A team that runs ten tests per quarter without cleanup will find itself, a year later, with forty dead branches in its code. Establish a simple rule: a test flag has an end date, and deleting the failing branch is part of the definition of "done." This discipline aligns with that described in our article on... common mistakes in A/B testing : an incomplete test contaminates subsequent ones.
Edge testing: the compromise that's gaining ground
Edge testing makes the assignment decision in the CDN, before the origin server, and serves a pre-generated version of the page: it combines the absence of server-side flicker with the speed of the cache. This is the most suitable architecture for static or generated sites (Next.js, Astro, headless e-commerce sites).
The Cloudflare reference architecture for A/B testing with Workers describes the flow in five steps: visitor request, reading the configuration from a key-value store, checking the assignment cookie, routing to endpoint A or B, and then setting the cookie if it doesn't already exist. The distribution changes without redeploying the function.
Vercel takes this logic a step further: rather than making the response dependent on a cookie, the variant is encoded in the internal URL path. Each flag combination becomes a separate page in the cache, and the visitor never sees this technical path. According to its guide to A/B testing in e-commerce and Core Web Vitals, This method enabled a team to go from about one test per month to five or six per sprint, without degrading its performance indicators.
The limit to be aware of: the combinatorial explosion
Each test multiplies the number of cached versions. Three simultaneous tests with two variants on the same page produce 2 × 2 × 2 = 8 versions. Add a fourth test with three variants and you jump to 24. The cache success rate mechanically decreases. Limit the number of concurrent tests per template, or reserve this mode for high-traffic pages. If you intentionally combine several elements, the logic is more akin to a... multivariate test, with the corresponding volume requirements.
Server-side pitfalls
The server-side eliminates flicker but introduces three risks that the client-side does not have: a cache that serves the wrong variant, bots counted as visitors, and an assignment recorded without real exposure. These three errors distort the results without any visible signal on the page.
1. The cache that mixes the variants
The question comes up regularly in technical communities, for example on the Adobe Experience League forum: "My site is behind Akamai or Cloudflare, how do I test server-side?". If the CDN caches the first generated version, all subsequent visitors receive it, regardless of their assignment. Three workarounds exist: integrate the variant into the cache key (header Vary (using a dedicated cookie, or an internal path as with Vercel), move the decision to the edge, or exclude from the cache only the pages being tested during the test. The third solution is the simplest, but it negates some of the speed benefit.
2. Robots and preloading
A client-side script only runs in a real browser. Server-side logic, however, is applied to each request: indexing robots, monitoring tools, and speculative browser preloading. If you count visitors at the time of assignment, these requests inflate your denominator. A robot without cookies can even be reassigned on each visit. A possible result is a sample ratio mismatch between A and B, a classic sign of an invalid test. This type of bias directly feeds into the false positives in A/B testing.
3. Assignment is not exposure
The server might assign a user to variant B of a new shopping cart module upon login, even though they'll never see that cart. Including this in the analysis dilutes the measured effect. The rule: record an exposure event when the variant is actually rendered or used, and calculate your conversion rates based on those exposures. The rigorous definition of associated conversions falls under the. monitoring of objectives, which must be identical for A and B.
The BlastOptimize method: three numbers to check
Before interpreting any conversion rate from a server-side test, check three numbers. First, the exposure distribution: in a 50/50 split of 20,000 visitors, a difference greater than approximately 1.5 points (i.e., fewer than 9,700 or more than 10,300 in one arm) warrants investigation, as it represents a difference of more than four standard deviations. Second, the proportion of requests without cookies or executed JavaScript, which reveals bots. Third, the cache success rate per variant. If any of these three is abnormal, correct it before analyzing. These checks are more easily displayed in a analytics dashboard than in a gross export.
Server-side testing and SEO: Google's rules
Google accepts A/B testing, both client-side and server-side, on one condition: Googlebot must be treated like any other visitor, without a specific version. Serving a variant specifically for robots is cloaking, which is punishable regardless of the technique used.
The documentation Google Search Central on the impact of A/B testing sets four rules. No cloaking, including by server logic. A temporary redirect (302) and not a permanent one (301) if the variant lives on another URL. A tag rel="canonical" on variant URLs pointing to the original, preferred to noindex. And a test that stops as soon as there is enough data, with the URLs and test code then being deleted.
Corollary: since the variant is in the original HTML, a crawler can index version B during the test. If it changes the title of a well-ranked page, limit its duration.
When to choose what: the decision grid
Choose the client side to quickly test what is seen, the server side to test what is calculated, and the edge to test entire pages on a heavily cached site. Most mature teams use all three depending on the test, not depending on the tool.
Ask four questions, in this order:
- Does the change affect a business logic? Price, algorithm, eligibility rule, number of steps, API response: server-side, no discussion.
- Does the test need to cover multiple channels? Site and application, or site and transactional emails: server-side with shared flags.
- Is the page served from a cache or statically generated? Edge, with the variant in the cache key.
- Is the change visual and does it have to go this week? Title, tagline, visual, block order, button label: client-side with a visual editor and a lightweight script. Waiting for a sprint to test a label costs more than the milliseconds saved.
Three concrete examples
An e-commerce merchant wants to test free delivery from €49 instead of €60. The threshold is factored into the shopping cart, shipping cost calculation, confirmation email, and the application: server-side. The specifics of this sector are detailed on our page about A/B testing in e-commerce.
A SaaS vendor wants to compare two complete price pages, including structure and rationale, on a cached Next.js site: edge, with two pre-generated templates.
A lead generation marketing team wants to test three form hooks before a campaign that starts on Monday: client-side. The autopilot mode then takes over to continue the following iterations.
If you're comparing platforms based on this criterion, look closely at what each offer covers: some separate the client-side experimentation and the feature flags module into two products billed separately. Our comparisons BlastOptimize vs AB Tasty and BlastOptimize vs Kameleoon detail these differences in scope, and the pricing grid shows what is included.
Checklist before launching a server-side test
- The assignment identifier is stable (long-lived first-party cookie or logged-in user ID) and identical across all relevant channels.
- The SDK evaluates the flags locally, without blocking network calls on every request.
- The variant is part of the cache key, or the tested pages are excluded from the cache for the duration of the test.
- An exhibition event is recorded at the actual rendering, separate from the assignment.
- Robots and preloads are excluded from the analysis (user-agent filter, JavaScript execution, presence of cookie).
- The distribution of presentations is controlled from the first 24 hours.
- Googlebot receives the same treatment as a visitor; variant URLs with 302 redirects and canonical redirects to the original.
- A guard metric (errors, server response time) is monitored, with possible shutdown without deployment.
- The date the code for the losing variant was removed is recorded in the backlog.
FAQ
Does server-side testing really eliminate flicker?
Yes, for elements tested server-side: the page arrives already in its final version; nothing is modified after display. If you mix a server-side test and a client-side test on the same page, the latter can still cause flickering.
Can server-side testing be done behind a CDN like Cloudflare or Akamai?
Yes, provided the variant is part of the cache key, or the decision is made at the edge. Otherwise, the CDN serves the first cached version to everyone, and the test no longer measures anything.
Is client-side flicker still a real problem in 2026?
It is significantly reduced with lightweight scripts loaded early, which apply the variant in a few tens of milliseconds. It remains a real risk with heavy scripts, loaded asynchronously, or anti-flicker snippets with a security delay of several seconds.
Can a marketer launch a server-side test without a developer?
Not to create the variant: it must exist in the code. However, once the flags are in place, the marketing team can modify traffic distribution, targeting, or stop the test from the interface, without redeployment.
Is server-side testing risky for SEO?
No, if it complies with Google's rules: same treatment for Googlebot and visitors, 302 redirects, canonical link to the original, and a limited duration. It's even more readable for search engine crawlers, since the variant is in the original HTML.
Should we choose between client-side and server-side?
No. The hybrid approach is the norm: client-side for quick visual tests, server-side for business logic and multi-channel, and edge for cached pages. The key is to share the same identifier and conversion definitions across all three.
Key takeaways
- Server-side testing moves the assignment decision before rendering: no more flicker, no more script delaying display.
- Feature flags are the driving force behind this, with a code debt to clean up.
- Edge testing combines flicker-free operation and caching, provided that the explosion in the number of versions is monitored.
- Three specific traps: cache which mixes variants, robots counted as visitors, assignment confused with exhibition.
- Choose by test: visual and urgent on the client side, business logic on the server side, entire pages cached at the edge.
For your visual tests, the challenge remains to keep the application window of the variant below the perceptible threshold. This is the purpose of the ultra-fast variant delivery, and the glossary BlastOptimize revisits each technical concept discussed here.















Comments are closed.