
Measured, not claimed
Numbers accurate · brand names removedAbove-the-fold redesign. 3.71% → 3.83%.
US outdoor solar-lighting DTC brand
99% conf.42,716 visitors · 31 daysPDP · Next.js · ReactRack buy-box optimisation. 1.73% → 2.19%.
Global outdoor & mobile-living brand
97% (Bayesian) conf.13,682 visitors · 14 daysLead form · Shopify Plus · IntelligemsGet-a-quote form redesign. 16.9% → 30.4%.
Australian office-furniture retailer
form data conf.690 form opens · 3 weeksCourse page · WordPress · ElementorSticky course start-date banner. 6.00% → 8.38%.
UK dental education provider
99.99% conf.25,755 visitors · 22 daysLanding page · WordPressBenefit-led copy, form above the fold. 35.9% → 39.0%.
South African debt-counselling lead-gen
99.99% conf.30,389 visitors · 20 daysPLP · Headless storefrontListing declutter & navigation. 9.00% → 9.64%.
South African beauty retailer
96.7% conf.34,923 visitors · 19 daysScroll through a build
Post-add-to-bag confirmation · React storefrontControl
A product page on a React storefront. Add to bag works, but nothing tells the shopper what happened or what to do next.
// nothing injected yet
// the visitor sees the site as it isListen before React
React's synthetic events swallow the click before a normal document listener sees it. A capture-phase listener fires first.
document.addEventListener('click', onAdd, true)
function onAdd(e) {
if (!e.target.closest('.buy-box [type=submit]')) return
armed = Date.now() + 10_000 // 10s window
}Watch the cart API, not the click
The click proves nothing. Fetch is patched once, guarded, and only observed while the window is armed.
const _fetch = window.fetch
window.fetch = async (...args) => {
const res = await _fetch(...args)
if (armed > Date.now() && isCartCall(args[0]) && res.ok)
showConfirmation(await res.clone().json())
return res
}Render only on a confirmed 2xx
The card appears with the product, price and two clear next steps. The price comes from the API response, not from the page text.
function showConfirmation(cart) {
const line = cart.items.at(-1)
mount(Card({ title: line.name, price: line.price }))
document.body.classList.add('exp-12443') // class last: one paint
}Fail safe
A failed add returns a 500. The window expires, nothing renders, and the shopper sees the untouched control. No false confirmations, ever.
if (!res.ok) return res // nothing shown
// window expires on its own after 10s
// no body class → variant CSS never appliesAudit teardowns
4 audits I wrote · read the leaksCoat Defense
5 leaks found. A pet-care DTC brand losing its homepage in the first five seconds — clean design, decent products, no clarity.
Veterinary clinic · May 2026Greystone Animal Hospital
10 leaks found. A 7-day vet clinic whose booking page tells anxious pet owners their appointment "is not fully booked" — right at the finish line.
Integrative health & aesthetics clinic · May 2026Optimal Health Collective
10 leaks found. A 16-service wellness clinic that hands every visitor cold to a third-party booking app — and shows its favicon as the share image on every service page.
Driving school · Apr 2026Millennium Driving School
11 leaks found. A driving school with 300+ five-star reviews and a website that doesn't show a single one.
Human ideas. AI-built variants. Human-verified quality.
Quality was the trade-off for speed. It isn't any more.
Agencies used to choose quality over quantity because a careful build took days. I built a system where a human idea, sharpened with AI, becomes a working variant automatically, passes automated QA, and then gets my personal sign-off. More tests per month, and every one of them held to the same bar.
Idea
The hypothesis comes from research: analytics, recordings, heuristics. AI widens the idea space and drafts the spec; I decide what is worth a test.
Build
A workflow I built turns the spec into a working variant: selectors, hydration guards, tracking, and a mobile layout, in under an hour for complex builds.
QA
Playwright checks at 1440 and 390 across four browsers, tracking events verified in the dataLayer, then I review every test personally before it goes live.
Shopify first
Most of my clients run on Shopify or Shopify PlusTheme-level builds
Alternate product and homepage templates, custom sections, metafield-driven content and Liquid, so a winning test ships as real theme code, not a script patch.
Price, offer and layout tests
Intelligems and Convert experiments on Shopify and Shopify Plus, including quote forms, bundles, pack selectors and buy-box redesigns.
Checkout-aware
Working inside Shopify's checkout and cart constraints: what can be tested, what needs an app, and what breaks tracking.
My own store
GiftBaksho is a live Shopify store I run, so every idea gets tried with my own money before I recommend it to a client.
How a test gets built
Same loop, every ticketObserve
GA4 funnels, session recordings and the live DOM. Where do people hesitate, and what does the page actually do there?
Hypothesise
One sentence: if we change X for these users, Y moves because Z. Prioritised by revenue impact and build cost.
Build
The variant written in JavaScript inside the testing tool or the theme itself. Uses the site's own APIs and survives React re-renders.
QA
1440 and 390 viewports, four browsers, iOS. Tracking events verified in the dataLayer before traffic arrives.
Measure
Goals wired to the real metric. A result is called at 95% confidence with the sample size fixed up front, and losers are written up too.
Field notes
Rules earned from broken buildsRead the backend, not the screen
Prices, savings and stock come from the site's data layer or API response, never from parsing rendered text that rounds and reformats.
Survive hydration
React and Next.js sites wipe injected DOM seconds after load. Every variant re-checks itself and restores what the framework removed.
Gate everything on the element
No querySelector guesses. Each interaction waits for its target to exist, so late-loading components never break the test.
Trigger on confirmed outcomes
A popup fires on the cart API's success response or the analytics event, never on the click. Failed adds show nothing.
Decorate, don't rebuild
Wrap and restyle the native component when you can. Rebuilding a modal or carousel from scratch is where tracking silently dies.
Fail safe
If the data source is missing, abort before adding the body class. The visitor sees the untouched control, never a half-built variant.
Tools and platforms
Testing · analytics · storefronts · QABusiness software I built from scratch and sold to a large local manufacturing group.
KORI is a multi-tenant CRM and ERP: sales, purchasing, stock, accounts, quotations, HR and reporting, in English and Bangla, with a built-in AI assistant (Kori Ask), day and night themes, on web and mobile. I designed it, built it, migrated the client's years of data, and it now runs the daily operations of a multi-company manufacturing and trading group. It is sold to wholesalers and distributors under the KORI brand, alongside Kori Connect, an AI sales assistant for WhatsApp and Facebook.
- Built
- Next.js · PostgreSQL · multi-tenant
- Modules
- 13, from sales to HRM
- In production
- Daily use across 3 companies
- Also shipped
- Kori Ask AI assistant · WhatsApp sales bot
Why it matters for CRO work: I have sat on the other side, as the founder whose revenue depends on the software converting. That changes how carefully I test.
Let's run
the next test.
Hiring for an experimentation team, or need a variant built that your current dev said was impossible? Send the brief. I reply within a working day, CET or SAST hours are fine.


