Optimize · Personalization at Scale

Personalize 50 Cold Emails Using a CSV of Prospects

Take a base cold email and a CSV of 50 prospects and generate 50 personalized variants in one pass — with skips for low-signal rows.

managerrepIntermediate~3 hrs per 50-prospect batch
When to use
Use when your SDR has pulled a 25-100 row prospect list (from Apollo, Clay, LinkedIn Sales Nav export) and you have a proven base email but no time to rewrite 50 first lines by hand. This prompt forces specific, verifiable personalization from each row and skips rows where there's no real signal — protecting deliverability and your reply rate.
The prompt
You are an outbound operator at a digital marketing agency who runs personalized cold email batches without sounding like a mail-merge bot. You'd rather skip a row than send a generic line.

Agency: [AGENCY_NAME] — [SERVICES]
Offer / angle: [OFFER]
Base email (do not rewrite the body — only swap the personalized opener): [BASE_EMAIL]
Prospect CSV (columns include name, title, company, website, recent_news, linkedin_headline, role_tenure):
[PROSPECT_CSV]

For every row in the CSV, generate a personalized 1-2 sentence opener that references a SPECIFIC, VERIFIABLE detail from that row, then drop it into the base email. Output 50 send-ready emails (or fewer if rows are skipped).

- The opener MUST reference a specific detail from the row (a named product, a named hire, a specific page on their site, a specific number in recent_news). Never invent.
- Banned generic phrases: "I saw your post about leadership", "impressed by your work", "loved your recent post", "congrats on the growth", "hope you're well".
- If a row has no usable signal (only name + title, no recent_news / no headline detail), output exactly: "SKIP — no usable personalization" and DO NOT fabricate one.
- Keep the base email body byte-identical across rows. Only the opener sentence(s) change.
- Match the agency's tone in [BASE_EMAIL]. Don't escalate to flattery.

For each row, output:

Row #: [n]
Prospect: [name], [title] @ [company]
Signal used: [the exact CSV cell text you pulled from]
Personalized opener: [1-2 sentences]
Final email:
---
[full send-ready email with opener swapped into BASE_EMAIL]
---

At the end, print: "Sent: X | Skipped: Y" and a 1-line note on which CSV columns were most useful.
Variables
  • [AGENCY_NAME] — Your agency's name
  • [SERVICES] — What you sell (e.g., SEO + paid social for DTC brands)
  • [OFFER] — The specific offer / CTA in this campaign
  • [BASE_EMAIL] — Your proven cold email template with a placeholder for the opener
  • [PROSPECT_CSV] — Pasted CSV (or markdown table) of prospects with enrichment columns
Example input
AGENCY_NAME: Northpoint Digital
SERVICES: SEO + content for B2B SaaS
OFFER: free 20-min teardown of their top 3 ranking pages
BASE_EMAIL: "{{OPENER}}\n\nMost SaaS sites we audit are leaking traffic on category pages that should be ranking. We'd record a 20-min teardown of your top 3 — free, no pitch. Worth a look?\n\n— Jim"
PROSPECT_CSV:
name,title,company,website,recent_news,linkedin_headline
Sara Chen,Head of Growth,Latchpad,latchpad.io,"Hired a Director of Content in March","Growth @ Latchpad | ex-Webflow"
Mike Ortiz,VP Marketing,Brillo,brillo.com,,"VP Marketing"
Priya Shah,CMO,Quotient HR,quotienthr.com,"Launched /resources/ hub in Feb","CMO @ Quotient | building category"
Example output
Row #: 1
Prospect: Sara Chen, Head of Growth @ Latchpad
Signal used: "Hired a Director of Content in March"
Personalized opener: Noticed Latchpad brought on a Director of Content in March — usually means SEO is finally getting a budget line.
Final email:
---
Noticed Latchpad brought on a Director of Content in March — usually means SEO is finally getting a budget line.

Most SaaS sites we audit are leaking traffic on category pages that should be ranking. We'd record a 20-min teardown of your top 3 — free, no pitch. Worth a look?

— Jim
---

Row #: 2
Prospect: Mike Ortiz, VP Marketing @ Brillo
Signal used: none
SKIP — no usable personalization

Row #: 3
Prospect: Priya Shah, CMO @ Quotient HR
Signal used: "Launched /resources/ hub in Feb"
Personalized opener: Saw Quotient stood up the /resources/ hub in Feb — curious if any of those posts are pulling organic yet or still warming up.
Final email:
---
[full email]
---

Sent: 2 | Skipped: 1
Most useful column: recent_news.
Pro tips
  • Run the CSV through Clay or Apollo first to fill recent_news / role_tenure — quality of input is the whole game.
  • Eyeball the SKIP rate. If >40% of rows are skipped, your enrichment is weak, not the prompt.
  • Add a second pass that rewrites any opener that contains a banned phrase — Claude self-policing beats human QA at this scale.
Works with
ClaudeChatGPTGemini
Done with prompts? Time to install the system
Book a STAOS call
Related prompts