VWO developer for hire
I build VWO variation code as a single minified JS and CSS bundle from my own build rig, with single-page-app handling, anti-flicker, and accessibility solved in code before it ever reaches VWO. In VWO itself I set the audience and targeting and drop the bundle into the code editor, and conversion tracking runs through GA4. The hard parts are handled in code, not left to the tool, so the build ships clean and passes engineering review. Available for direct briefs and as overflow capacity for CRO agencies running VWO programmes.
Why most VWO variation code breaks, and how I avoid it
Most VWO tests that fail in production fail for the same reasons: the variant assumes the DOM is ready when it runs, it never re-applies after a single-page-app route change, it sets a React input in a way the framework ignores, or it shifts layout after first paint and wrecks Core Web Vitals. These are not VWO problems. They are client-side engineering problems that show up on every testing tool, and they are where a marketer-led build or a generalist falls down.
I solve them before VWO is involved. The variant is built and tested as real code, so by the time it goes into VWO it already survives a hostile DOM, re-applies on route changes, sets framework inputs correctly, and ships with the accessibility patterns the brief leaves out. VWO then does the one job it is good at: deciding who sees the test and where.
What I actually touch in VWO
Deliberately little, and that is the point. VWO holds the audience, the targeting, and the SmartCode that loads on the page. My variant is one minified JavaScript file and one CSS file that go into VWO's code editor for the variation. I set the segmentation and URL targeting, map the goal, and let conversion tracking run through GA4 rather than rebuilding measurement inside the tool. The less bespoke logic lives in VWO's UI, the less there is to break on a publish, and the easier the test is to hand over and reason about.
The engineering baked into every variant
Single-page-app route changes
VWO's SmartCode evaluates on load. On a React, Vue, or Next.js site, a route change after that happens client-side with no fresh page load, so a naive variant either persists onto pages it should not or breaks because the elements it expected are gone. My bundle watches for URL changes and re-runs the variant logic on each one, with a short settle so the framework's render pass finishes before the variant mounts. I cover the failure mode in why experiments stop firing on SPA route changes.
Anti-flicker without tanking Core Web Vitals
The variant hides only the elements it is about to change, with a timeout failsafe, rather than blanking the whole page. That stops the flash of original content without the page-wide hide that most setups reach for and that wrecks LCP. The full tradeoff is in stopping A/B test flicker without tanking Core Web Vitals.
React and framework-controlled inputs
Setting input.value directly does not fire React's onChange, so form
state and visual state drift apart and the test measures nothing useful. The bundle uses the native
input descriptor so the framework registers the change. The pattern is below, and explained in full
in setting a React controlled input from an A/B
test.
// Bypass React's overridden value setter so onChange actually fires
const setReactInputValue = (input, value) => {
const nativeSetter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype,
"value"
).set;
nativeSetter.call(input, value);
input.dispatchEvent(new Event("input", { bubbles: true }));
};
Late-rendering elements and accessibility
Targets that mount late (lazy carousels, async recommendations) are handled with an element-wait utility rather than a fixed delay, so the change applies whenever the element appears. See targeting elements that render late. Any new modal or interactive component ships with a focus trap, ARIA roles, and keyboard parity by default, so the variant passes accessibility review instead of failing it on handover. The patterns are in accessible A/B test variants.
Built with my own rig
The reason VWO only ever sees a single clean bundle is that I do not author variants by hand in the tool. I build them in a CRO-specific rig that turns out one minified JS and one CSS per experiment, with a shared helper library for the patterns above, sub-200ms builds, and a stack mode for testing how multiple experiments interact. It is the same output regardless of platform, which is why a VWO build, a Convert build, and an Optimizely build all reach the same engineering bar. The full write-up is in abtestrig, the CRO build tool I built.
How I work on VWO projects
Briefs start with a short intake: scope, hypothesis, audience, expected lift, leading indicator. The variant is built to your engineering conventions where they exist and to pass review where they do not, self-QA'd cross-browser, and run through an accessibility pass before handover. The handover doc covers the VWO segmentation and targeting, the goal and GA4 mapping, and how the bundle is organised.
I work UK and EU business hours, every business day, live on Slack and email through your working day. For North American clients, UK afternoons overlap with morning standups on the East Coast.
Other CRO platforms I ship on
Hire a VWO developer
For VWO variation builds, overflow capacity for CRO agencies, or to discuss a specific test idea. I respond within one UK business day.