Skip to content
BlogDocsRSSSign in

← All posts

AI CRO3 min read

Five checks between an AI's draft and your homepage

AI suggestion cards pass through five numbered gates (schema, lock, forbidden claims, duplicates, a second model). Some drop out; one reaches a person who approves it.

A suggestion run costs us roughly $0.0021. We measured it: one run writes three variants and has a second model review them, and the bill comes to about a fifth of a cent. At that price, writing isn't the hard part of AI copywriting. Keeping the AI from putting something on your site that you'd have to apologize for is.

Models make things up. Sooner or later one promises a refund you don't offer, or calls you "#1" in a category nobody ranks. A tool that publishes AI copy has to assume this will happen and catch it before a visitor sees it, so every suggestion passes five checks, in order, before it reaches your Proposals queue.

#1. It has to fit the component

A developer marks a component as a region and declares a Zod schema next to it: title is a string of up to 60 characters, badge is one of a fixed set of values, showTrial is a boolean. The AI receives that schema, and we validate its output against it, so a 140-character headline for a 60-character slot never makes it through, and neither does a prop the component doesn't have.

That schema is the developer's contract with the marketing team and with the AI at the same time. Anything it allows is fair game; anything else is out of reach.

#2. Locked fields stay locked

Some props should never change: the legal disclaimer, the plan price, the product name. Developers mark those locked, and a locked field always renders the value from the code. The AI never sees locked fields in its prompt, and if a suggestion tries to set one anyway, we drop it. Links and images aren't AI-writable at all.

Locks bind people too. Nobody can edit a locked field from the dashboard, which keeps "just this once" edits off the pricing card.

#3. No forbidden claims

Each site keeps a list of words and phrases a suggestion must never contain. We ship defaults you can switch off (guarantees, "#1", competitor names and similar), and you add your own. When a suggestion contains one, it moves to the filtered list with the reason attached.

String matching only catches the literal phrase. Paraphrases are check five's job.

#4. No duplicates

Ask a model for three options at once and it will happily repeat itself. Anything identical to control or to an existing variant gets dropped, so you never spend traffic testing the same sentence twice.

#5. A second model reads every claim

The judge comes from a different model family than the writer. Right now Claude Haiku writes and Gemini Flash Lite judges, both routed through Vercel AI Gateway. The judge reads each suggestion against your brand profile, meaning your voice, your audience and the facts your site actually states, and flags forbidden or unsupported claims, paraphrases included. Check three catches "Results guaranteed"; the judge catches "you can't lose".

It's on by default. You can switch it off per site, but we never auto-approve a suggestion the judge skipped, autopilot or not.

#Then a person decides

Suggestions that pass all five land in Proposals → Waiting, laid out field by field against control with the changes marked. Each card also explains why the AI thinks the variant might win and lists the checks it passed. Filtered ones get their own list with the reason, which is handy for tuning your forbidden claims.

You approve, edit and then approve (the edit runs through the same checks), or reject. Rejecting needs a reason, and the next round of suggestions sees it.

An approved variant starts at no more than 20% of the experiment's traffic until it has enough data. If it turns out slower than control on enough page views (LCP 20% worse, CLS up by 0.05, INP 50 ms slower), auto-rollback pauses it and its visitors go back to control.

#What the checks can't do

They don't make the AI's copy good; they make it safe to test. Whether "Ship tests without the flicker" beats "A/B testing that runs in your app" is a question for your visitors, and answering it is the experiment's job.

Trust the checks enough to let the AI approve its own suggestions and you're using autopilot, which has conditions of its own.