All questions

every CRO app we evaluate says no headless support

Asked by Marcus Webb on

MWMarcus Webb

I moved a freelance client from a Liquid theme to Hydrogen earlier this year and CRO has been really tough since. Three apps in a row told us the same thing: Liquid only, or "partial" headless support that turns out to mean a client-side script you inject yourself.

Is there anything that actually works on Hydrogen without hacks? Not looking for a price-testing tool, we need content and layout experiments.

Was this helpful?

2 answers

NONathan Oduya

The reason you keep hitting this wall is architectural, not laziness on the app vendors' part. Oxygen caps workers at 128MB and does not allow third-party server processes, so any tool built around running its own engine next to your storefront simply cannot deploy there. That rules out most of the Shopify CRO app catalog, which was designed for Liquid where the app injects a script tag.

What does work is an SDK-based approach: the experimentation logic lives in your own loader code and the variant is resolved with an API call before the page renders. You own the integration, the vendor owns the assignment and stats. Croct ships a dedicated Hydrogen SDK that follows exactly this model, and it covers both React Router 7 and Remix setups. GrowthBook can also be wired into loaders but you build the content model yourself.

Anything that says "just add our script" will run client-side and you are back to flicker.

Was this helpful?
MWMarcus Webb

That explains a lot. The 128MB cap is the detail nobody at the app vendors mentioned. Will look at the loader-based route, thanks.

SLSara Lindqvist

Can confirm the loader pattern from production. We run experiments on a Hydrogen store by fetching slot content inside the loader, so the variant is already in the server-rendered HTML. No injected scripts, nothing for Oxygen to object to, and nothing swaps after hydration.

One practical note: whatever tool you pick, check that it resolves content in a single fast API call. You are adding a request to your loader, so latency matters more than it did with client-side tools.

Was this helpful?
Still have questions?