Warmerly reads each prospect's own website, extracts factual research, and writes an opening line from it. If the opener cannot be generated, the send is refused — not sent with a blank line.
The research step runs before any writing happens. Warmerly reads the prospect's own pages and extracts specifics: what they do, roughly how big they are, what technology their site runs, what they have recently changed or announced. The opener is written from that list. A model asked to be interesting about a company name alone will invent something, and inventing is the failure mode that gets you a reply pointing out you are wrong.
You write the email. The generated part is one line, dropped into a merge variable, and you can see it rendered against a real lead before you launch. That boundary is deliberate: fully generated emails read as generated, and the parts of a cold email that need a human — the offer, the ask, the reason it matters — are exactly the parts a model is worst at.
If research is unavailable or generation fails, the message is not sent. It is not sent with an empty line where the opener should be, and it is not sent with a generic fallback pretending to be personalised. This behaviour was added after an unfunded AI account produced blank openers and thirty-five headless emails went out before anyone noticed.
Personalisation in cold email has become a synonym for merge tags, and merge tags are transparent. Everyone has received 'I loved what you're doing at {{companyName}}'. Real personalisation requires knowing something specific about the recipient's business, which requires research — which is the part that does not scale by hand.
Warmerly visits the company's own website and reads it. Not a data broker's summary, not a cached description — the pages the company publishes about itself, which is where the facts that are safe to reference actually live.
What comes back is a short list of concrete statements: the sector and what they sell, a rough size, the technology stack the site reveals, a location, and anything recent enough to be worth mentioning — a launch, a hiring push, a site migration. That list is inspectable. You can read exactly what the system believes about a company before it writes a word about it.
The same tool is available on its own. Paste a URL into Website Summary and get the research back for a single prospect, which is useful for the twenty accounts you are handling personally rather than through a campaign.
A language model asked to write a personalised opener with nothing but a company name will produce something confident and fluent and quite possibly wrong. It will guess an industry from the name, assume a growth stage, invent a plausible-sounding recent development. The output reads well, which makes it worse — the recipient does not notice the error is machine-made, only that you have written to them about something that is not true.
That is not a personalisation failure, it is an active negative. A generic email is ignored. An email confidently describing a company as something it is not gets forwarded to a colleague with a comment. Grounding the generation in retrieved facts is the difference, and it is why the research step is not optional.
The temptation when a generation fails at scale is to fall back to something generic so the campaign keeps moving. Warmerly refuses the send instead. A campaign that pauses is a problem you fix in ten minutes; two thousand headless emails is a problem you cannot un-send.
The offer. The reason you are worth a reply. The call to action. The subject line, unless you ask for suggestions. These are the parts that require knowing what your product does and who it is for, and a model that writes them produces the flat, sanded-down prose that recipients now recognise on sight.
The division is: the model handles the part that is expensive because it must differ for every recipient. You handle the part that is valuable because it is the same for all of them and had better be good.
Every AI feature in Warmerly routes through one internal registry rather than calling a provider directly from each feature. That indirection buys three things that matter operationally: a global kill switch that stops all AI spend at once, a per-workspace daily cap so no single account can run up an unbounded bill, and a single place to change models when a provider retires one.
That last point is not hypothetical. A dated model snapshot being retired by a provider has previously returned 404 across every AI feature at once, including the support chatbot. Pinning to stable aliases and keeping the registry in one file is what makes that a config change rather than an outage.
The sequence editor renders any step against a real lead from your audience, with every variable filled in — including the generated opener. This is the last honest check before a campaign goes out, and it catches the two errors that matter: a template that reads badly when the variable is short, and an opener that is grounded but not actually interesting.
The launch-readiness panel checks the structural half separately: that a campaign brief exists when the copy uses the opener, and that the leads have been researched at all. Both are blocking, because a campaign that fails either will produce nothing worth sending.
If your reply rate is near zero, the opener is unlikely to be the cause. Check placement first — mail sitting in the junk folder gets a zero reply rate regardless of how good the first line is — then check whether the list is right, and then whether the offer means anything to the people receiving it. Personalisation improves a campaign that works. It does not rescue one that does not.
One opening line, dropped into a {{ai_opener}} variable inside a template you wrote. It does not write your offer, your call to action, or the body of the email.
The prospect's own website. Warmerly reads their published pages and extracts factual statements — sector, size, stack, location, recent changes — and the opener is written only from that.
The send is refused. Not sent blank, not sent with a generic fallback. A campaign that pauses is recoverable; headless emails are not.
Yes. The sequence editor renders any step against a real lead with every variable filled in, so you read exactly what the recipient will read.
The line is grounded in specifics about their own business, which is what generated-sounding copy usually lacks. It is still worth reading a sample before launch — if the opener says something true but unremarkable, the fix is a better brief.
Research from the prospect's own site, one grounded opening line, and a hard refusal to send when it cannot be produced.