Use when writing or auditing a cold outbound email - subject line, opener, body, and a single call-to-action - or a short cold-email sequence. Covers the one-ask principle, proven copy frameworks (PAS, BAB, AIDA), relevance-based personalization that isn't creepy, length, spam-trigger avoidance, and CTA design. For inbox/domain setup see email-deliverability; for cadence architecture see multichannel-sequences.
Install
npx skillscat add nadavshanun-design/opengtm/cold-email-writing Install via the SkillsCat registry.
Cold email writing
Overview
A cold email earns a reply in ~5 seconds of attention from a stranger. It wins
by being short, relevant, about them, and asking for exactly one easy thing.
Clever is optional; relevant and clear is mandatory.
The one-ask rule: every email drives to a single CTA. Two asks = zero replies.
Anatomy of one that works
- Subject (1-4 words, lowercase ok): curiosity or relevance, never hype.
Good:question about {{company}} onboarding. Bad:🚀 Boost Revenue 300% Now!!! - Opener (1 line, about them): a specific, true observation - a trigger
event, a role change, something from their site/post. Not "Hope you're well." - Body (2-4 lines): connect their situation to a problem you solve, with a
concrete proof point (a number, a peer, a result). No feature dump. - CTA (1 line, low-friction): an interest-check beats a calendar demand.
"Worth a quick look?" / "Open to a 10-min chat next week?" - Signature: real name, real company, plain. (Chronos appends this after
generation - don't hand-bake it into the body.)
Target 50-125 words. If it needs scrolling, it's a blog post, not a cold email.
Copy frameworks (pick one per email)
| Framework | Shape | Best for |
|---|---|---|
| PAS | Problem → Agitate → Solution | A pain the buyer already feels |
| BAB | Before → After → Bridge | Selling an outcome / transformation |
| AIDA | Attention → Interest → Desire → Action | Longer, more persuasive touches |
Personalization that isn't creepy
Three tiers - match effort to account tier (see ideal-customer-profile):
- Relevance (always): industry/role/stack framing. Scales to everyone.
- Research line (A-tier): one true, specific observation about them.
- Deep (top accounts): tied to a trigger event or their own words.
Creepy = personal-but-irrelevant ("saw you ran a 10k Saturday!"). Relevant =
tied to their work and your value. Stay on the right side of that line.
Spam-trigger avoidance (copy side)
Deliverability is mostly infrastructure (see email-deliverability), but copy
matters too: avoid ALL CAPS, exclamation!!!, "free", "guarantee", "act now",
money emoji, link shorteners, heavy HTML/images, and more than one link. Plain-
text-feeling email in a known thread-style lands better than a designed template.
Example - before / after
Before (template, 0 replies):
Subject: Revolutionize Your Sales Today!
Hi there, We are a leading platform that helps companies like yours boost
revenue by 300%. Can I book 30 minutes to walk you through our full suite?
After (one-ask, relevant):
Subject: {{company}} + SOC 2
Hi Dana - saw {{company}} is hiring two SREs; usually means the SOC 2 audit
is looming. We cut evidence collection from ~6 weeks to ~1 for teams your size
(e.g. Acme). Worth a quick look, or is this already handled?
Do / Don't
- Do write to one person about their situation; send at most one link.
- Do make the CTA something answerable in one line.
- Don't open with yourself ("We are…"). Open with them.
- Don't reuse an identical body across a list - personalize the real lines.
Common mistakes
- Two or more asks; the reader picks "none."
- A paragraph of features before any relevance to the reader.
- Fake personalization tokens that misfire (
Hi {{FirstName}},). - Writing great copy on a cold domain that lands in spam (fix infra first).
Go live with Chronos (optional)
geo_draft_message- generate per-recipient copy from real facts (never a template).geo_schedule_emails- queue the email/sequence to send from your connected inbox.geo_set_personality/geo_add_personalization_rule- keep every draft on-brand.geo_reply_to_email_thread- continue the thread when they respond.
Connect in ~30s → `CONNECT-CHRONOS.md`. Free, no card.
See also: email-deliverability, multichannel-sequences, outreach-personalization.