Home› Blog› Lead Generation› How to Write Cold Emails: A 6-Step B2B Guide
Lead Generation

How to Write Cold Emails: A 6-Step B2B Guide

How to write cold emails in six steps, with sender rules from Gmail and the FTC, a tested lint script, and an honest look at our own outbound.

Vance Moore
Vance Moore
October 22, 2026
9 min read
1,984 words
How to Write Cold Emails: A 6-Step B2B Guide
Quick answer. How to write cold emails: pick a recipient who fits your profile, find one real reason to write now, use a short plain subject, state one benefit in a few sentences, make a single ask, and add an opt-out and your postal address. Then send small batches and measure replies before you scale.

How to write cold emails that follow the rules

Rules come first, because a clever email that lands in spam does nothing. Google’s sender guidelines tell senders to “keep spam rates reported in Postmaster Tools below 0.10% and avoid ever reaching a spam rate of 0.30% or higher,” and say that marketing messages “must support one-click unsubscribe, and include a clearly visible unsubscribe link in the message body” (Gmail Help, Email sender guidelines). The US Federal Trade Commission’s CAN-SPAM guide adds three plain rules: “Don’t use false or misleading header information.” “Your message must include your valid physical postal address.” “You must honor a recipient’s opt-out request within 10 business days” (FTC, CAN-SPAM Act compliance guide for business).

The deliverability setup under all of this, SPF, DKIM and DMARC, has its own guide: email authentication setup for B2B SaaS. MV3 Marketing sells outbound services, so we have a commercial interest in this topic. We also run outbound on ourselves, and we tell you where we have no results yet.

Diagram of six steps for writing a cold email: recipient, reason, subject, body, ask, opt-out and follow-up
The six steps in this guide. Diagram: MV3 method.
Sender rules from the two sources cited above
Rule Source What to do
Keep spam rate below 0.10% Gmail sender guidelines Send only to fit recipients and watch Postmaster Tools
One-click unsubscribe and a visible link Gmail sender guidelines Add an opt-out line to every message
No false or misleading header information FTC CAN-SPAM guide Send from a real name on a domain you own
Valid physical postal address FTC CAN-SPAM guide Put the address in the footer
Honor opt-outs within 10 business days FTC CAN-SPAM guide Suppress the address at once, not on day ten

Not legal advice. These are summaries of two public sources. Check the rules for the countries you send to before you start.

Step 1: Pick a recipient who fits your profile

Most cold email fails before the first word, because the list is wrong. Write your ideal customer profile and score every address against it. We staged 45 companies in our CRM and scored them. Sixteen failed our profile and were excluded, and a further 7 needed enrichment before we could score them (MEASURED, crm_companies, queried 2026-10-21, n = 45). Had we emailed that whole list, over a third of it would have gone to people who should never have received it, which is how spam rates climb.

Expected result: a scored list with a refuse group. Common mistake: buying a large list and writing to all of it.

Step 2: Find one real reason to write now

A reason is a dated fact about the recipient: a role they posted, a launch, a funding round, a published talk. Without one, the email is a template. We have a test drafted for this question. Our experiment, signal versus fit-only targeting, will compare reply rates between two arms that share the same offer and copy, and differ only in whether the recipient shows a dated signal. It needs at least 100 sends per arm before we call it more than directional, and it is still a draft with no sends (MEASURED, crm_experiment_results, queried 2026-10-21).

So we cannot tell you that signals double replies, or that they help at all. We do not have the data, and we will not borrow someone else’s number to fill the gap.

Expected result: one sentence about the recipient that you could verify. Common mistake: flattery that anyone could have received.

Step 3: Write a short, plain subject line

Describe the topic in a few lowercase-friendly words, as a colleague would. Skip all-caps, urgency and tricks. A subject that misleads about the content also runs against the header rule quoted above. In our lint script below, we cap the subject at 6 words. That cap is our own working rule, not a published benchmark.

Step 4: Write a body a busy reader can finish

Use three or four short sentences: why you are writing to them, what you do in one line, and what you propose. Cut adjectives you cannot back with evidence. Our working cap is 100 words. Again, that is a house rule and not a finding.

We wrote a script that checks an email against our rules. The data in it is ILLUSTRATIVE: the recipient, company and address are invented.

import re

# Working rules from our own checklist, not published benchmarks.
def lint(subject, body):
    issues = []
    if len(subject.split()) > 6:
        issues.append("subject longer than 6 words")
    if any(w.isupper() and len(w) > 2 for w in subject.split()):
        issues.append("subject has an all-caps word")
    words = len(body.split())
    if words > 100:
        issues.append(f"body is {words} words, over 100")
    if body.count("?") != 1:
        issues.append(f"{body.count('?')} question marks, want exactly 1 ask")
    if not re.search(r"unsubscribe|opt out|opt-out", body, re.I):
        issues.append("no opt-out line")
    if not re.search(r"d+s+w+.*(Street|St.|Avenue|Ave|Road|Rd|Suite)", body):
        issues.append("no postal address line")
    if len(re.findall(r"https?://", body)) > 1:
        issues.append("more than one link")
    return issues

good_subject = "Tracing pipeline to source"
good_body = """Hi Dana,

I saw your team posted two RevOps roles this month, so attribution may be on your list.
We help B2B SaaS teams tag every account by source at entry so results can be traced.
Would a 15 minute walkthrough of how that works be useful?

Sam
Reply "stop" to opt out of future messages.
Example Co, 100 Example Street, Springfield"""
bad_subject = "AMAZING OPPORTUNITY TO GROW YOUR PIPELINE TODAY"
bad_body = "Hi, we are the best agency. Want to talk? Free audit? Visit https://a.example and https://b.example now."

for name, s, b in [("good", good_subject, good_body), ("bad", bad_subject, bad_body)]:
    found = lint(s, b)
    print(name, "->", "PASS" if not found else "; ".join(found))

What this does: the function returns a list of rule breaks, and the loop prints PASS for a clean email. Output from our run on 2026-10-21:

good -> PASS
bad -> subject longer than 6 words; subject has an all-caps word; 2 question marks, want exactly 1 ask; no opt-out line; no postal address line; more than one link

A common error is to treat a PASS as proof that the email will work. It only proves the email follows our rules. Whether it earns a reply depends on the list and the reason, which is why steps 1 and 2 come first.

Bar chart of rule breaks found by the linter: good email 0, bad email 6
The linter found no breaks in the good draft and six in the bad one. Source: lint_email.py run, 2026-10-21, illustrative emails.

Reading the good draft line by line

The good draft in the script follows a simple order. The first line gives the reason for writing: a dated fact about the recipient’s team. The second line says what we do, in one sentence and without superlatives. The third line asks one question that a busy person can answer with a word. The footer holds the opt-out line and the postal address. Nothing in it claims a result, because we have none to claim.

Tip. Read the email aloud as if you were the recipient. If any sentence makes you ask “so what?”, cut it or replace it with a fact.

Notice also what the draft leaves out: no link in the first message, no attachment, no tracking tricks and no pretended familiarity. We keep the first message free of both so the reader has one thing to do, which is answer. You can add a link in the follow-up once someone has replied.

Step 5: Make one ask

Ask a single question that is easy to answer. Two asks halve the chance of either being answered, so the script flags any email with more than one question mark. A call is a large ask for a stranger. A question about whether the problem exists on their side is smaller and still gets you useful information.

Expected result: one sentence that ends in a question mark. Common mistake: asking for a call and a reply to a survey in the same message.

Step 6: Add the opt-out, then follow up and measure

Put a plain opt-out line and your postal address in the footer of every message. Suppress anyone who opts out immediately. If you follow up, send one or two short messages that add something new, such as a relevant link or a different angle, and stop there.

Table of the two sender rule sets cited in this guide and the action each requires
The five rules to check before any send. Sources: Gmail Help and FTC, read 2026-10-21.

Measure by batch. Send small groups, record replies, and read each one. We keep seven draft sequences for our own outbound, and none has been sent. Our own pre-send checks must pass first (MEASURED, mv3_csmo_outbound_sequences, queried 2026-10-21). Of the 45 staged companies, 0 have been contacted and we have found a buyer at 3 (MEASURED, crm_lead_funnel_by_source, queried 2026-10-21). That is why this guide has no reply rate in it.

Large number 0 showing how many of our 7 draft outbound sequences have been sent
Zero sent, so no reply rate yet. Source: mv3_csmo_outbound_sequences, 2026-10-21, n = 7.

What does the ranking content look like?

We pulled the pages that rank for this keyword. Five ranked, and four could be read by our crawler. They ran 1,874, 2,674, 4,776 and 1,231 words, with 9, 7, 23 and 0 images. None had an HTML table or FAQ schema, and none used a first-party phrase such as “our data” (MEASURED, seo_competitor_pages, fetched 2026-10-11, n = 4 readable pages of 5).

Vertical bar chart of word counts for four ranking pages for how to write cold emails: 1,874, 2,674, 4,776 and 1,231
Ranking pages range from 1,231 to 4,776 words. Source: seo_competitor_pages, 2026-10-11, n = 4.

None of the four readable pages published a tested checker or its own results. For the bigger question of when to use outbound at all, see our post on inbound vs outbound for B2B SaaS, and for the list behind the email, our guide to buyer persona vs ICP.

Troubleshooting cold emails

Symptoms, likely causes and fixes
Symptom Likely cause Fix
Messages land in spam Weak authentication or poor list quality Check SPF, DKIM and DMARC, then tighten the list
Opens but no replies No clear ask Reduce the email to one question
Replies that say “wrong person” Role not matched to the profile Rewrite the target roles in the profile
Spam complaints No reason to write now Cut recipients without a dated reason
  • Recipient scored against a written profile.
  • One dated reason in the first sentence.
  • Subject and body pass the lint script.
  • One question, an opt-out line and a postal address.

If you want outbound run with these checks, book a call with MV3 Marketing.

FAQ

In the US, CAN-SPAM allows commercial email if you follow its rules, including honest headers, a postal address and honoring opt-outs. Other countries have stricter laws, so check where your recipients live.

How long should a cold email be?

Short enough to read in under a minute. Our house rule is no more than 100 words, but that is a working rule and not a published benchmark.

How many follow-ups should you send?

One or two that each add something new. Stop when there is no response, and never contact someone who has opted out.

What is a good reply rate for cold email?

We do not have our own figure yet, since we have sent none. Treat any benchmark with caution unless the source shows its sample, list quality and dates.

Do you need SPF, DKIM and DMARC before sending?

Yes. Large mailbox providers expect authenticated mail, and the setup guide linked above walks through it.

Vance Moore
Vance Moore LinkedIn
Chief Growth Officer, MV3 Marketing

Vance Moore is Chief Growth Officer at MV3 Marketing and leads its team of SEO professionals, engineers and auditors.

Ready to audit your organic growth opportunity?

$2,500 flat. 5 business days. Six deliverables tied to pipeline , not rankings. No retainer required.

Get the Organic Growth Audit →

Turn Your Organic Channel into a Revenue Engine.

The MV3 SEO Audit maps your full organic opportunity in 5 business days.

Get the Audit →