ReplyLabs
FeaturesPricingCompareFAQUse casesBlogHelpSetup
Sign inGet started free
Get started

Product

  • Features
  • Pricing
  • Compare
  • Roadmap

Resources

  • Use cases
  • Blog
  • Glossary
  • Cost calculator

Support

  • Setup Guide
  • Help Center
  • Contact Support
  • Report an Issue
  • Feature Requests

Company

  • Opt Out of Testing

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie list
  • Subprocessors

Empra Consultancy LTD
hello@replylabs.io

ReplyLabs|PrivacyTermsCookiesSubprocessors

© 2026 Empra Consultancy LTD. All rights reserved.

All articles
Cold email outbound

Personalised cold email at scale: how to write specific mail for thousands of rows

Personalised cold email at scale means writing a genuinely specific message for every prospect without writing each by hand. Here is how to do it in a spreadsheet.

By Hugo Dupont · 8 min read

Personalised cold email at scale means writing a genuinely specific message for every prospect on a list without writing each one by hand. You do it by enriching every row with a real fact (what the company does, a recent hire, a line from their homepage), then running one AI prompt across the whole list so each row gets its own opener built from its own data. The hard part is not the writing. It is the data underneath the writing, because a model can only personalise on the facts you put in front of it. This guide covers how to get those facts, write a prompt that uses them, and run it across thousands of rows in a spreadsheet.

What does personalised cold email at scale actually mean?

It means every recipient gets a message that could only have been written for them, produced by a repeatable process rather than by hand. The distinction that matters is between two kinds of personalisation. The shallow kind inserts a company name and an industry into a template. The deep kind references a specific trigger: a funding round, a new hire, a product launch, a sentence from the prospect's own site.

That difference is not cosmetic. Industry benchmarks across 2026 put generic name-and-industry personalisation at roughly a 1% reply rate, while messages that reference a specific signal land closer to 9%, and signal-based campaigns as a whole report reply rates of 15 to 25% against a baseline near 3.4%. The gap between an average campaign and a top one is mostly the depth of the data the message is built on, not the cleverness of the copy.

Why most personalisation fails

Most personalisation fails because it runs on data that is not specific enough to be true of one company. A prompt handed only "Acme Corp" writes something true of every company: "I noticed Acme Corp is growing fast." The recipient has read that exact sentence a hundred times and deletes it. The problem is upstream of the writing. You cannot personalise on facts you do not have.

The second failure is doing it by hand. Genuine per-prospect research does work, but a person can research maybe thirty prospects a day, and outbound needs hundreds. So teams either send shallow merge-tag mail to everyone or send deep mail to almost no one. Scale and specificity look like they trade off against each other.

They do not have to. If the specific fact for each row lives in a column, the model can write a specific message for every row in one pass. That is the whole technique: move the research into the data layer, then let one prompt read it.

How to personalise cold email at scale in a spreadsheet

A spreadsheet is the natural place to do this because the data is already there in columns and each step writes its result back as a new column you can inspect and filter. The workflow has three stages: enrich, then write, then run. ReplyLabs runs all three inside Google Sheets, and it prepares the list rather than sending it, so the output is a set of columns you hand to your own email sender. The full end-to-end version is in the guide to cold email from Google Sheets.

Stage one: enrich every row with a real fact

The opener is only as specific as the column it reads. Before any AI runs, each row needs a fact worth referencing. You scrape the company website or LinkedIn company page and pull the content into a new column, so a row that started as just a name and a domain now also carries an "About" column with real text in it. Scraping a page costs from $0.005 per URL depending on the engine, and you are only charged for rows that return content. The mechanics are covered in lead enrichment in Google Sheets. This stage is the one that decides whether your personalisation is the 1% kind or the 9% kind.

Stage two: write one prompt that reads the enriched columns

A good prompt references the enriched columns by header, not just the name. For example:

Write a one-line cold-email opener for {{First name}} at {{Company}}. Reference one specific detail from this about text: {{About}}. One sentence, no greeting, under 25 words. If the about text is empty, write a warm generic opener that mentions {{Company}} and nothing else.

Each row substitutes its own values for the merge fields, so the prompt runs once but produces a different sentence per row.

Stage three: sample, then run the full list

Run the prompt on twenty rows first. Read all twenty. Most prompt problems (a tone you dislike, a fact the model invents, an opener that is too long) surface in the first twenty. Fix the prompt, then run the full list. Because the AI runs server-side rather than as a spreadsheet formula, the six-minute Apps Script limit never applies, so one prompt can fill an opener for fifty rows or fifty thousand.

What makes a good personalisation prompt?

A good prompt is specific about its inputs, its format, and its failure behaviour. Four habits carry most of the quality:

  • Reference columns by header. Use merge fields like {{Company}} and {{About}} so each row gets its own value rather than one hard-coded answer baked into the prompt.
  • Give a fallback rule. Tell the model exactly what to do when an input cell is empty, so it writes a safe generic line instead of inventing a fact. Invented facts are worse than no personalisation, because they are confidently wrong.
  • Constrain the format tightly. One sentence, no greeting, a hard word limit. Tight output drops cleanly into a template and is easy to scan when you review the column.
  • Sample before you commit. Twenty rows, read every one. This is the cheapest quality control you will ever run.

Personalise after you target, not before

Personalisation is the last preparation step, not the first. There is no point writing a brilliant opener for a company that was never going to buy. The order that works is: fix deliverability, clean the list, target against your ideal customer profile, then personalise the survivors. Scoring each row against your ideal customer profile before you personalise means you never spend an AI opener on a company outside your ICP, and it keeps the final list small enough to respect the low per-inbox volume limits that modern deliverability demands.

This ordering also saves money. Every personalised opener costs a fraction of a cent, but on a list of fifty thousand rows the fractions add up, and there is no reason to spend them on rows you will filter out anyway.

What does it cost to personalise at scale?

In ReplyLabs the AI step is priced at the provider's raw cost times 1.25 plus a small base fee per succeeded row, and the exact figure for your row count shows in a cost preview before the run starts. You are only charged for rows that return a result. New accounts get $20 of free credit, which is enough to take a real list all the way through enrichment and personalisation. On higher tiers you can bring your own AI key and pay only the raw provider rate. To set up a first run, see getting started.

Common questions

Is AI personalisation just mail merge with extra steps?

No. Mail merge drops a stored value into a slot in a template, so every recipient gets the same sentence with one word swapped. AI personalisation reads a column of real, enriched facts and writes a new sentence per row. The output is different for every row because the input is different for every row, which is exactly what mail merge cannot do.

Can ReplyLabs send the personalised emails?

No. ReplyLabs prepares the list inside Google Sheets: enrich, score, and personalise. You export the finished columns and send through your own email service provider or sequencer. Sending, warm-up, and reply handling live in your sending platform, not in ReplyLabs.

How many rows can one prompt handle?

There is no spreadsheet-formula ceiling, because the AI runs server-side rather than as an Apps Script function. One prompt can fill an opener for fifty rows or fifty thousand. The practical limit is your budget and your row count, both shown in the cost preview before the run.

Will personalised email at scale read as automated?

Not if the personalisation is real. Recipients spot shallow merge tags instantly, but a line built from a genuine fact about their own company reads as researched, because it was. The work is in the enrichment column, which is why that stage comes first.

Is ReplyLabs affiliated with reply.io?

No. ReplyLabs is a separate product, built by Empra Consultancy LTD, and is not affiliated with reply.io. You can read more on the ReplyLabs home page.

Keep reading: Cold email outbound
Read the full guide: Cold email from Google Sheets
  • Cold email deliverability checklist
  • ICP scoring for outbound lists
Definitions
ICP (Ideal Customer Profile)Spintax

Try it on your own list

ReplyLabs runs from a sidebar inside Google Sheets. Start free with $20 credit, no card needed.

Get started free