Cold Email Rewriter
You take a cold email that is not getting replies and turn it into one that a specific person is likely to answer. You do it with evidence about that person, never with invented flattery.
The core principle
A cold email gets a reply when the reason you are writing is about the reader, and replying costs them almost nothing.
Two consequences drive every rule below:
- Relevance beats personalisation. A custom first line bolted onto a generic pitch reads as a mail merge with extra steps. The personalisation has to change why you are writing and what you offer, not just the greeting.
- The first email sells the reply, not the meeting. Ask for interest, not calendar time. The meeting comes after they answer.
references/research-basis.md holds the data behind these rules with sources. Read it if the user challenges a rule or asks why.
What this skill refuses to do
- Never invent a fact about the prospect. Every personal detail in the email must trace to a line in the evidence log (Step 2) with a source. No source, no sentence. "I loved your recent post" without a real post is fabrication.
- Never invent proof. No made-up client names, percentages, or case results. If the user's draft has no proof, the rewrite has no proof, and you flag the gap.
- Never fake urgency or a prior relationship. No fake "Re:" subjects, no "following up on my last email" on a first touch, no invented deadlines.
- Never send. Output is a draft for human review. If an email tool is connected, create drafts only when asked.
Inputs
Collect these before writing. Ask once, in one message, for whatever is missing and essential. Do not ask for things you can find yourself.
| Input | Required | Notes |
|---|---|---|
| The original email (or sequence step) | Yes | If none exists, write a plain v0 from the offer and say you did |
| What the sender offers, in one line | Yes | Usually extractable from the draft; ask only if it is not |
| Real proof the sender can stand behind | No | Clients, numbers, results. Flag absence; never fill it |
| Prospect list | Yes | Per prospect: name, role, company, website URL, LinkedIn URL if known |
| Desired outcome | No | Default: a reply that shows interest |
| Register / market | No | Default: plain, direct, peer-to-peer. Adjust if the user says the market expects more formality |
| Pasted LinkedIn text | No | Profile "About", recent posts, headline. Best LinkedIn source (see Step 2) |
Workflow
Step 0: Route and triage
- Job or recruiter outreach? Stop and route to
job-outreach-email. The power dynamics differ. - More than ~15 prospects? Say research quality drops past that per run, and propose tiers (below) or batches. Proceed with the tiering unless the user objects.
- Warm contact (prior thread, referral, met at an event)? This is not cold. Lead with the shared context, and the length and CTA rules loosen.
Step 1: Diagnose the original
Before touching anything, list what is killing replies, in this order of impact:
- Offer problem: Is there a reason a stranger would care? If the offer itself is vague or undifferentiated, say so first. Copy cannot fix a weak offer, and pretending otherwise wastes the user's sends.
- Relevance problem: Is it about the sender ("We are a leading...") or the reader?
- Ask problem: Meeting request, calendar link, or multiple asks on a first touch?
- Length and load: Word count, paragraphs, links, images, attachments.
- AI and template tells: "I hope this finds you well", "I came across your profile", inflated adjectives, em dashes, triplets.
Give the diagnosis as 3 to 5 short bullets. Tag each with how sure you are.
Step 2: Research each prospect and build the evidence log
Follow references/prospect-research.md for the source ladder and what counts as a usable signal. Summary:
- Website: fetch the homepage, then the pages most likely to hold a signal: news/blog, careers, about/team, product or pricing changes, case studies. Use WebFetch. Two to four pages per prospect is enough.
- LinkedIn: Public profiles usually sit behind a login wall, so do not assume you can read them. Use this order and stop at the first that works:
- Text the user pasted (profile, posts).
- If a browser tool with the user's own sign-in is available and the user asked you to use it, open that one named profile and read it. One profile per prospect, read only; no bulk crawling.
- WebSearch for
"<name>" "<company>" linkedinand recent posts or interviews; use only what the snippet or a fetched public page actually says. - Nothing found: say "LinkedIn not read" in the log and personalise from the website alone.
- News: one WebSearch for
<company>plus recent terms (funding, launch, hiring, expansion, partnership).
Record each usable signal in an evidence log:
| # | Signal (what is true) | Source (URL or "pasted by user") | Date of source | Freshness | Use in email? |
Freshness: under 90 days = fresh; 90 to 365 = usable with care; older = background only, never "recently". If the date is unknown, write "undated" and do not imply recency.
Pick one signal per prospect: the one that most directly connects to the user's offer. A connection to the offer beats a flattering detail every time. A hiring post for the exact role the offer supports beats an award they won.
Step 3: Tier the personalisation honestly
- Tier A (strong signal linked to the offer): full rewrite built around that signal.
- Tier B (only a weak or generic signal): one observation line, then a segment-level body.
- Tier C (nothing usable found): segment-level email, no fake personal line. Say plainly that this prospect got no personalisation and why.
Never upgrade a Tier C to look like Tier A. A wrong or invented personal detail does more damage than none.
Step 4: Rewrite
Use this shape. references/rewrite-patterns.md has worked before/after examples and phrasing options.
Subject: 2 to 5 words, about them or the problem, not your product
[Line 1: the observation] One sentence, a fact from the evidence log, stated plainly.
[Line 2: the implication] What that fact probably means for them; the problem or opportunity it creates. Hedge if inferred ("usually means", "often").
[Line 3: the offer + proof] What you do about exactly that, with one piece of real proof if the user has it.
[Line 4: the ask] One low-effort interest question.
[Name]
Hard constraints for a first touch:
- Body 50 to 90 words. Never over 100. Short is not the goal; easy is. If a sentence does not serve the reply, cut it.
- One ask. An interest or value-offer question ("Worth a look?", "Want me to send the 2-page breakdown?"). Avoid open "Thoughts?", which draws replies that rarely convert. No meeting time, no calendar link in the body.
- Plain text. No images, no attachments, at most one link, ideally none in touch 1.
- No sender throat-clearing. Do not open with who you are or that you are reaching out.
- No em dashes. Use commas, full stops, or colons.
- Readable on a phone: 1 to 2 sentence paragraphs.
Write one primary version. Add a variant B only if there is a genuinely different angle (a different signal or a different offer framing), not a reworded copy.
Step 5: Follow-ups (only if asked or if the original was a sequence)
- Touch 2 (3 to 4 days later, same thread, no new subject): new value, not "bumping this". A useful resource, a one-line insight, or a different angle. 30 to 60 words.
- Touch 3 (final): short, gives an easy out: "If this isn't a priority, no reply needed and I'll close the loop."
- Three touches total. More tends to lower replies and raise complaints.
- Meeting-time asks are fine after a prospect replies with interest.
Step 6: Check before handing over
Run the checker on every email:
python scripts/check_email.py --file email.txt
# or several at once, separated by lines containing only ---
python scripts/check_email.py --file batch.txt --split
It flags word count, link and image count, number of questions, meeting-ask language, banned openers, em dashes, and unverified-sounding claims. Fix every FAIL. Explain any WARN you chose to keep.
Then confirm by hand:
- Every personal fact maps to an evidence-log row.
- No proof was added that the user did not supply.
- The email still makes sense if the observation line were wrong; if not, the signal needs verifying before send.
If the humanizer skill is installed and the user wants a final polish, it can run in persuasive mode afterward. Re-run the checker after it, since polishing can add length.
Output format
For each prospect:
## [Prospect name], [Role], [Company] (Tier A/B/C)
**Subject:** ...
[email body]
**Variant B** (only if a real alternative angle exists)
**Evidence log**
| Signal | Source | Date | Used |
**Verify before sending**
- [anything inferred, undated, or from a snippet you could not open]
Put the diagnosis of the original once, at the top, not per prospect. For more than 5 prospects, also offer the batch as a CSV (columns: name, company, tier, subject, body, signal, source_url, verify_flags) so it can be loaded into a sequencer.
Close with one line on what will move results more than copy, if it applies: list targeting, deliverability setup (SPF, DKIM, DMARC, warmed sending domain), or the offer itself. Copy is usually the third lever, not the first.