The website platform with A/B testing built in.
Build your marketing site, put experiments right in the page, and publish. Every variant is pre-rendered to fast HTML, each visitor sees theirs with no flicker, and the results stay trustworthy however often you check.
Free to start. No credit card required.
import { Experiment, Page, Variant } from "mockly";import { Nav, Product, Quote, Stats } from "../components/site"; export default function Home() { return ( <Page title="Duebird"> <Nav /> <Experiment name="headline" goal="signup"> <Variant name="control"> <h1>Invoicing for small studios</h1> </Variant> <Variant name="benefit"> <h1>Get paid in days, not weeks</h1> </Variant> </Experiment> <p>Send an invoice in a minute. Stop chasing clients.</p> <Experiment name="cta" goal="signup" variants={["control", "trial"]}> {(v) => ( <a href="/signup" track="signup"> {v === "trial" ? "Start free trial" : "Get started"} </a> )} </Experiment> <Experiment name="proof" goal="signup"> <Variant name="control"><Stats /></Variant> <Variant name="quote"><Quote /></Variant> </Experiment> <Product /> </Page> );}Invoicing for
small studios
Get paid in
days, not weeks
Send an invoice in a minute. Stop chasing clients.
benefit converts better than control+24.4% (+4% to +49%)Example
- of flicker. Each visitor's variant is chosen on the server.
- 0 ms
- of JavaScript on pages without interactive parts.
- < 1.25 KB
- false winners, however often you check the results.
- < 5%
- third-party trackers. Your server counts your visitors.
- 0
What is Mockly
Build, test, and learn in one place. Not three tools that don't know about each other.
Build
A studio for your site.
Pages and components in TSX, the markup developers already know, with a live preview, type checking as you type, and every version kept.
Learn moreTest
Experiments in the page.
Wrap any part of a page in an experiment, or vary one value inline. The server picks each visitor's variant, so nothing flickers.
Learn moreLearn
Answers you can trust.
Visitors, sources, goals, page speed, and where people click, all first party. Each experiment ends in a plain verdict that holds however often you look.
Learn moreHow it works
Write it. Publish it. Let the visitors decide.
- 01
Put the test in the page
Wrap a section in an <Experiment> with a <Variant> for each version, or vary one value inline. The compiler checks every name, goal, and type as you write, so a typo never reaches visitors.
pages/index.tsx <Experiment name="hero" goal="signup" secondary={["demo"]}> <Variant name="control" weight={50}> <Hero title="Ship faster" /> </Variant> <Variant name="proof" weight={50}> <Hero title="Launch in an afternoon" /> <CustomerQuotes /> </Variant></Experiment> - 02
Publish: every variant becomes HTML
Publishing compiles each variant of each page to static HTML, with small scripts only for the parts that are interactive. When a visitor arrives, the server picks their variant and sends it. Nothing is computed per request.
publish- index.htmlcta: control
- index.htmlcta: green
- pricing.htmlno experiment
Pre-rendered: the server only picks and sends
Trafficctacontrol 70%green 30% - 03
Get a verdict you can act on
Every visitor keeps their variant across pages and visits. Goals are recorded by the server, and the results say in plain words whether a variant wins, loses, or needs more visitors, and how long that will take.
ctaRunningExamplegreen converts better than control
+18% (+3% to +34%) in conversion rate. The interval stays valid however often you check, so you can decide now.
Variant Visitors Conversions Rate Lift control 9,100 925 10.2%9.6%–10.8% Baseline green 9,100 1,089 12.0%11.3%–12.7% +18%+3% to +34%
Why built in
Testing tools bolt on. Mockly is built in.
Most A/B tests run in a script that rewrites the page after it loads. Because Mockly builds the page, it can test without the trade-offs.
| Topic | The usual wayScript-based testing tool | Mockly |
|---|---|---|
| Where the variant is chosen | Where the variant is chosenIn the visitor's browser, after the page arrives | On the server, before the first byte is sent |
| Flicker | FlickerThe original shows, then changes, unless an anti-flicker snippet hides the page while the script loads | None. The page arrives as the visitor's variant |
| Added JavaScript | Added JavaScriptA testing script on every page, plus its variant code | Under 1.25 KB on pages without interactive parts |
| Where variants live | Where variants liveIn a visual editor, apart from your site's code | In the page's code, checked by a compiler as you type |
| Checking results early | Checking results earlyDepends on the tool: fixed-sample statistics mislead if you check before the end | Results stay valid however often you check |
| Analytics | AnalyticsUsually another tag, sending data to another company | Counted by the server that serves your pages, no IP addresses stored |
| Heatmaps | HeatmapsAnother tool's script on every page, which can also record what visitors type | Built in, only on the pages you choose; clicks and scrolling, never what's typed |
The product
Everything a growth team needs, in one studio.
Write and preview side by side.
The editor checks your code as you type; the preview shows any variant, on any device size.

Typos caught before visitors see them.
Variant names are types, so a misspelled one is an error in the editor.
class={v === "gren" ? "a" : "b"}TS2367 This comparison appears to be unintentional because the types '"control" | "green"' and '"gren"' have no overlap.
Clicks, forms, and thank-you pages.
Any of them can be a goal, recorded on the server.
- cta-clicktrack="cta-click"/
- waitlist<Form>/
- signupgoal="signup"/thanks
Every publish, one click from live.
Compare versions, see their pages, and restore any of them.
- v42New pricing headline2 min agoLive
- v41Hero copy experimentYesterdayRestore
- v40Fresh CMS dataMonRestore
Speed, measured where it counts.
Core Web Vitals from real visitors, and each page's weight.
- LCP0.9 s
- FCP0.6 s
- CLS0.01
Good at the 75th percentile, from real visits
Analytics without a tag.
Visitors, sources, pages, devices, and goals, from the server.
Visitors
14,071
+68%
- google.com30%
- Direct36%
- newsletter10%
See where visitors click.
Heatmaps of clicks, rage and dead clicks, and scrolling, for the pages you choose, and for each variant of a test.
- LinkStart free412
- LinkPricing188
- LinkSee how it works131
- ImageProduct picturedead64
Statistics
Check results whenever you like. They stay valid.
Classic A/B statistics assume you look once, at the end. Look every day and stop at the first good result, and a change that does nothing can "win" a third of the time. Mockly's intervals hold at every look, so a refresh can't manufacture a winner.
- Mockly, checked after every visitor
- 1–5%
- false winners in simulation
- A classic test, checked as often
- 32–60%
- false winners in simulation
Lift of green over control, with its 95% interval
Example
The interval narrows as visitors arrive. On day 11 it clears zero, and green is the winner: decide then, or keep going. Either way, the call is sound.
For developers
A real language, with a real compiler.
Mockly pages are a strict subset of TSX where experiments are part of the language. The compiler turns them into HTML and small scripts at publish time, and explains every mistake.
Diagnostics are an API. Every error has a stable code, the exact place, and a hint. The CLI prints them, or returns them as JSON for CI.
Islands, not a framework. Interactive parts compile to small scripts that load when needed. The rest of the page is plain HTML.
Nothing is interpreted. No eval and no template engine at request time. The compiler emits real JavaScript once.
$ mockly check ./sitepages/index.tsx:7:8 error MK4005 Experiment "cta" needs exactly one variant named "control". 6 | <h1>Launch pages that learn</h1>> 7 | <Experiment name="cta" goal="signup" | ^^^^^^^^^^ 8 | variants={["blue", "green"]}> hint: Name the baseline variant "control". 2 file(s): 1 error(s), 0 warning(s)Solutions
Made for pages that have a job to do.
Frequently asked questions
Something else? Ask us.
What is Mockly, in one sentence?
A platform for building and hosting marketing websites where A/B testing is part of the code, so every page can run experiments without a separate testing tool, analytics tag, or flicker.
Do I need to know how to code?
Today, pages are written in TSX, the markup React developers use, in Mockly's studio. If someone on your team can edit a React component, they can build and test with Mockly.
We're building the Mockly Agent for everyone else: describe the change you want to test, and it writes the variant, checks it, and reports back.
How is this different from a testing tool I add to my site?
Script-based tools change the page in the visitor's browser after it loads, which means extra JavaScript and either a flash of the original or a blank page while the script runs. Mockly compiles every variant to HTML when you publish and picks one on the server, so the page arrives as the variant. See the comparison.
Will experiments slow my site down?
No. Pages are pre-rendered when you publish, and serving one means picking a variant and sending HTML that's already built. Pages without interactive parts load less than 1.25 KB of JavaScript, and Mockly measures page speed from real visits so you can check.
Can I check results every day?
Yes, as often as you like. Mockly's intervals are confidence sequences, which stay valid at every look. In our simulations, checking after every single visitor still produced false winners under 5% of the time. A classic test checked that often produced them 32–60% of the time. How it works.
What do you record about visitors?
Pages served, the goals visitors reach, and how fast pages load. Mockly keeps each visitor's variant in a first-party cookie, stores no IP addresses, adds no third-party trackers, and leaves bots out of the counts. More on data.
How do I get started?
Mockly is in early access. Create an account to try it, or book a demo to see it with your own pages.
Run your first experiment this week. Build it, test it, ship the winner.
Free to start. No credit card required.