Storyblok AB testing options compared: native, VWO plugin, and the Optimize app
At Croct, we have always admired Storyblok’s vision. Their component-based approach to content management is exactly how modern digital experiences should be built. Recently, Storyblok took another exciting step forward by launching its native AB testing feature as part of Storyblok Labs.
Storyblok recently launched a native AB testing feature for Premium and Elite plans. This article explores the architectural differences between building your own testing engine and using an out-of-the-box solution. It compares integration times, developer dependency, and the path to full personalization.
We share a core belief with the Storyblok team: content creation and experimentation should happen in the same place. Marketers should not have to jump between disjointed tools to validate their ideas.
The three options at a glance
With Storyblok’s new release, teams now have three distinct paths to bring experimentation into their headless CMS: using Storyblok's native AB testing feature, the VWO plugin, or the Optimize app.
While all solutions share the goal of enabling experimentation, they take fundamentally different architectural approaches in how much of the experimentation pipeline your team assembles, which plans you need to be on, and what happens after your first winning test. Here is a transparent, objective comparison to help your team choose the right path.
| Native AB testing | VWO plugin | Optimize app | |
|---|---|---|---|
| Variant content in Storyblok | ✅ | ✅ | ✅ |
| Variant assignment and bucketing | You build it | VWO | Croct |
| Cross-device stickiness | You build it | VWO | Croct |
| Statistical engine | External analytics | VWO | Croct |
| Server-side, zero-flicker delivery | Depends on your build | Depends on setup | ✅ |
| Real-time behavioral personalization | ❌ | ✅ | ✅ |
| Built-in user profiles and CDP | ❌ | Partial | ✅ |
| Storyblok plans supported | Premium and Elite only | Premium and Elite only | All plans |
| Additional subscription required | Analytics platform | VWO Enterprise or Developer Plus | Croct Scale plan |
| Launch a new test without a developer | ❌ | ✅ | ✅ |
Add native personalization and AB testing to your blocks.
Experimentation workflow
The most significant difference between the three approaches lies in how much of the experimentation pipeline your team is required to build and maintain.
| Steps | Native AB testing | VWO plugin | Optimize app |
|---|---|---|---|
| Experiment and variants configuration | ✅ | ✅ | ✅ |
| Variants content definition | ✅ | ✅ | ✅ |
| Variant assignment and bucketing | ❌ | ✅ | ✅ |
| Same-device variant stickiness | ❌ | ✅ | ✅ |
| Cross-device variant stickiness | ❌ | ⚠️ | ✅ |
| Built-in analytics | ❌ | ✅ | ✅ |
| Statistical engine | ❌ | ✅ | ✅ |
Optimize app
Croct is a complete, end-to-end optimization engine. When you use the Optimize app for Storyblok, it handles the entire lifecycle of the experiment.
- Content: Marketers enable dynamic content on Storyblok blocks using the visual interface, without relying on developers.
- Decisioning: Our server-side engine automatically handles bucket assignment and cross-device stickiness.
- Analytics: We process data using our native Bayesian statistical engine, calculating performance per goal in real time without requiring third-party analytics tools.
VWO plugin
Storyblok and VWO launched an official plugin in August 2025, letting marketers run VWO experiments from inside the Visual Editor. It closes the main gap in the native feature: VWO handles bucketing, tracking, and statistical analysis, so your team is not building a decision engine from scratch.
- Content: Marketers create content variations in the Storyblok Visual Editor.
- Decisioning: VWO's SDK evaluates flags and assigns variants. Your code maps the returned variant to the corresponding Storyblok story.
- Analytics: Results are computed and reported in VWO's platform.
Cross-device stickiness depends on the user identifier you pass into the VWO user context. If you supply a stable account ID for logged-in users, assignment follows them; for anonymous visitors, you manage the identifier yourself.
Native AB testing
Storyblok’s native feature provides a fantastic UI for content editors. It allows marketers to create story variants, assign traffic weights, and define a control version directly in the visual editor.
However, it is a content-only feature. Your engineering team must absorb the operational heavy lifting of experimentation. To run an AB test, your developers need to:
- Build the logic to randomly assign users to a bucket.
- Implement custom routing to fetch the correct story variant.
- Manage first-party cookies to ensure variant stickiness across sessions.
- Integrate an external analytics platform to track goals, calculate statistical significance, and push the results back to Storyblok via their Management API.
Integration and code customization
Agility in marketing is directly tied to the complexity of your tech stack. How much custom code is required actually to launch an experiment?
| Integration requirements | Native AB testing | VWO plugin | Optimize app |
|---|---|---|---|
| Lines of code per implementation | High (custom logic) | Medium (routing glue) | Low (~3 lines) |
| One-time SDK/API setup | ❌ | ❌ | ✅ |
| No custom code for variant routing | ❌ | ❌ | ✅ |
| No custom code for event tracking | ❌ | ❌ | ✅ |
| No custom code for statistical analysis | ❌ | ❌ | ✅ |
| Time to integrate | Days or weeks | Hours or days | Minutes |
Optimize app
Croct requires a one-time integration. Your developers install the SDK, and that is it.
import {storyblokInit, apiPlugin} from '@storyblok/js';import {withCroct} from '@croct/plug-storyblok/js';
storyblokInit(withCroct({ accessToken: 'YOUR_DELIVERY_API_TOKEN', use: [apiPlugin], components: {},}));After this initial setup (which takes minutes), marketing achieves total autonomy. They can launch dozens of new AB tests, change variants, and track conversion goals directly from the UI without a single new line of code or developer request.
VWO plugin
VWO removes the statistical work, but your application still has to connect the variant decision to Storyblok content. The Storyblok and VWO demo uses the VWO SDK for this.
SDK setup
import {init} from 'vwo-fme-node-sdk';
const vwoClient = await init({ accountId: 'YOUR_VWO_ACCOUNT_ID', sdkKey: 'YOUR_VWO_SDK_KEY',});Variant assignment
// You are responsible for producing and persisting a stable visitor IDconst userContext = {id: visitorId};
const flag = await vwoClient.getFlag('homepage_hero_test', userContext);
// The variable value tells you which Storyblok story variant to renderconst variantSlug = flag.isEnabled() ? flag.getVariable('storyblok_variant_slug', 'home') : 'home';Variant rendering
import {storyblokInit, apiPlugin} from '@storyblok/js';
const {storyblokApi} = storyblokInit({ accessToken: 'YOUR_DELIVERY_API_TOKEN', use: [apiPlugin],});
const {data} = await storyblokApi.get(`cdn/stories/${variantSlug}`, { version: 'published',});
const story = data.story;Conversion tracking
vwoClient.trackEvent('signup_completed', userContext, { plan: 'growth',});You still write and maintain the mapping between VWO flags and Storyblok slugs, the visitor identity layer, and a tracking call for every goal. What you no longer build is bucketing and statistics.
Native AB testing
Because the decision and tracking logic must be handled on your end, integration is an ongoing process. Implementing your first experiment requires writing significant custom code to handle the API response, calculate weights, manage state, and trigger webhooks.
Experiments fetch
import { storyblokInit, apiPlugin } from '@storyblok/js';
const { storyblokApi } = storyblokInit({ accessToken: 'YOUR_DELIVERY_API_TOKEN', use: [apiPlugin],});
// Fetch storyconst { data: storyData } = await storyblokApi.get('cdn/stories/home', { version: 'published',});
let story = storyData.story;
// Fetch experimentsconst { data: experimentsData } = await storyblokApi.get('cdn/experiments');
const experiments = experimentsData.experiments;
// Determine whether an active experiment includes the fetched storyconst experiment = experiments.find((experiment) => experiment.story_ids.includes(story.id),);
Variant assignment
const pickVariant = (variants) => { const total = variants.reduce((acc, variant) => acc + variant.weight, 0); let random = Math.random() * total; for (const variant of variants) { random -= variant.weight; if (random <= 0) return variant; } return variants[variants.length - 1];};
Variant rendering
if (experiment) { const chosenVariant = pickVariant(experiment.variants);
// Unless the chosen variant is the control, its slug differs from the main story if (!chosenVariant.is_control) { const mapping = chosenVariant.story_mappings.find( (mapping) => mapping.original_slug === story.full_slug, ); if (mapping) { // Fetch the variant story const { data: variantData } = await storyblokApi.get( `cdn/stories/${mapping.variant_slug}`, { version: 'published' }, ); // Overwrite the main story data with the variant story data story = variantData.story; } }}Variant persistence
You should persist the variant ID for each experiment in your system, using a cookie or any other method.
Developer dependency
A successful culture of experimentation relies on marketing autonomy. If every test requires a developer ticket, you simply will not run enough tests.
With Storyblok Native, whenever marketing wants to launch a new test on a different story, developers must intervene to ensure that routing, state management, and event tracking are correctly mapped. With VWO, marketers configure the experiment in VWO's dashboard, but a developer still maps each new flag to the right Storyblok story and adds tracking calls for new goals. After the initial integration of the Optimize app, marketers can independently launch dozens of tests.
| Marketing autonomy | Native AB testing | VWO plugin | Optimize app |
|---|---|---|---|
| Initial setup requires engineering | ✅ | ✅ | ✅ |
| Traffic weights adjustments without developers | ✅ | ✅ | ✅ |
| Launch new tests without developers | ❌ | ⚠️ | ✅ |
| Conversion tracking without developers | ❌ | ❌ | ✅ |
Availability across plans
Budget and stage of growth are critical factors when designing your tech stack.
- Native AB testing: The new AB testing feature is part of Storyblok Labs and is exclusively available to customers on their Premium and Elite enterprise plans.
- VWO plugin: included at no extra cost for Storyblok Premium and Elite customers. Running experiments additionally requires a VWO Enterprise account, or another VWO plan with the Developer Plus add-on.
- Optimize app: works with every Storyblok plan, including the lower tiers, and requires a Croct Scale plan.
Beyond AB testing: the path to personalization
AB testing is usually the first step toward a more mature growth strategy.
Eventually, you will want to move from finding the "average winner" to delivering targeted 1-to-1 experiences.
Storyblok's native feature is strictly designed for AB testing story variants. VWO offers personalization, though visitor data lives in VWO's platform rather than alongside your content. The Optimize app unlocks our full real-time personalization engine, where your marketing team can instantly transition a winning AB test into a personalized experience and explore visitor profiles and the event timeline. You can target users based on their real-time behavior, firmographic data (such as Clearbit or 6sense), geolocation, or custom profile attributes, all seamlessly integrated with your existing Storyblok components.
| Features | Native AB testing | VWO plugin | Optimize app |
|---|---|---|---|
| AB testing | ✅ | ✅ | ✅ |
| Feature flag | ❌ | ✅ | ✅ |
| Real-time audience segmentation | ❌ | ✅ | ✅ |
| User profile explorer | ❌ | ⚠️ | ✅ |
| Visitor events timeline | ❌ | ⚠️ | ✅ |
| Dashboards and analytics | ❌ | ✅ | ✅ |
| Real-time behavioral personalization | ❌ | ✅ | ✅ |
| Zero-party data and custom attribute targeting | ❌ | ✅ | ✅ |
| Geolocation and contextual targeting | ❌ | ✅ | ✅ |
| B2B firmographic integrations | ❌ | ⚠️ | ✅ |
| Profiles stored alongside your content | ❌ | ❌ | ✅ |
Which should you choose?
If you are on a Storyblok Premium or Elite plan, have a large engineering team with the bandwidth to build and maintain a custom decision engine, and want to keep your tech stack limited to your CMS and a third-party analytics provider, Storyblok’s native testing is a beautifully designed foundation.
If VWO is already your company's experimentation platform, the VWO plugin is our best choice. The integration is official and well-supported, and running tests where your content lives is a clear improvement over toggling between tools. If you are not already a VWO customer, weigh the combined cost of a Storyblok Premium or Elite plan plus a VWO Enterprise or Developer Plus subscription.
However, if you want a plug-and-play optimization engine that gives your marketing team total autonomy, provides native Bayesian analytics, delivers server-side zero-flicker experiences by default, works on any Storyblok plan, and scales effortlessly into advanced behavioral personalization, all with virtually zero ongoing code maintenance, the Optimize app is built for you.
Ready to see how Croct and Storyblok work together? Create your free account and install the Optimize app today.