Generate Personalized Outreach at Scale
You'll end up with: A repeatable outreach system: 2–3 segments, merge-field schema, template variants per segment, a generated batch (TSV-ready), and a short QA pass before sending
Treating "personalization" as mail-merge tokens without truth anchoring—batch outputs that cite irrelevant facts, or identical bodies with swapped {{first_name}}. Fix: in step 2, every merge field maps to a **verified column** or a spelled-out empty rule; in step 5, **sort by segment** and read **fallback rows** before any blast.
- Prospect list export or Sheet columns you actually have (name, company, role, and at least one verifiable signal column—or honest "no signal" intent)
- One-line **offer** and who it is **not** for
- Rough segment guesses (OK if wrong)
- Sending constraints you'll honor (**daily cap**, compliant sourcing—no scraping personal emails against policy)
- **Claude** open + **Google Sheets** (`https://sheets.google.com`) ready for a paste
Mirror your list and propose segments (no copy yet)
Paste headers and sample rows so Claude names your columns, flags thin fields, and proposes 2–3 segments—still zero email copy.
1. Open https://claude.ai and start a **new chat** (stay in this single thread through step 4). 2. Paste either (a) your real column headers plus **5–10 anonymized sample rows**, or (b) headers plus **5 real rows** if this stays private. 3. Paste this prompt and fill the brackets: ``` I'm running segmented outbound — batch prep only. Do NOT draft subject lines, email bodies, or CTAs in this step. Mirror and plan only. My role / offer (one line): [...] Who this is NOT for (one line): [...] Industry / geography focus: [...] Compliance / ethics boundary (opt-outs, no scraped personal emails, daily send cap): [...] Spreadsheet columns + sample rows (paste below): ... Reply with ONLY: (A) A bullet list of columns you can see and what each is good for. (B) "Thin" columns (too empty or noisy to personalize on) — name them. (C) 2–3 proposed **segments** with plain-English **inclusion rules** (who belongs in each bucket). (D) One paragraph on what we should NOT pretend to know about prospects given these columns — no invented facts. ``` 4. Read the output. If segments feel mushy, reply: "Tighten inclusion rules so a row can only match one primary segment; flag overlaps."
Lock merge fields and truth rules
Turn columns into approved {{variables}}, each with a fallback when empty—nothing inferred or fabricated.
1. In the **same chat**, paste: ``` Using the segments and column assessment from your last message, build a merge-field contract for this campaign. Output a markdown table with columns: - merge_token (literal {{like_this}}) - source_column - example_non_empty_value - when_empty_rule (omit sentence / use neutral fallback / skip row) - proof_required (yes/no) Rules: - Every token must map to a column I actually pasted OR to an explicit segment label I control — no {{pain_point}} unless there is a real column. - Add one row for hook_angle: it may ONLY draw from columns tagged proof_required=yes. - Add a final section: BANNED — inferring funding, stack, hiring, or news not present in the sheet. ``` 2. Scan the table. If any token lacks a real column, delete that row and ask Claude to regenerate only the table.
Draft segment templates with placeholders
For each segment: two subject pairs, two openers, one CTA—same approved {{tokens}}—plus banned LinkedIn-bro phrases.
1. Same chat. Prompt: ``` Using ONLY merge tokens from the contract table (same spelling), draft **per segment**: - **Subject variants:** 2 options, each ≤60 characters, meaningfully different angles. - **Opener variants:** 2 options, each ≤90 words, different structure—not just synonym swaps. - **One CTA:** binary or low-friction (reply yes/no, book 15 min, link click). - **Banned phrases** for this campaign (always reject if seen): "I hope this finds you well", "touch base", "synergy", "quick question", "circling back", "I came across your profile". Segments to cover (repeat the block for each): [List segment names from step 1] Constraints: - Tokens stay as literal {{snake_case}} — do not resolve them to example values here. - Openers must differ by **job-to-be-done per segment**, not by adjectives alone. ``` 2. Read aloud one opener per segment. If two segments sound interchangeable, ask Claude to rewrite so the **problem frame** differs.
Generate the batch as TSV for Sheets
Produce tab-separated rows (subject, body, notes) from your sheet data—chunked when the list is long.
1. Same chat. Paste your **segment assignment** (rules or a `segment` column) and either: - The **full prospect table** if ≤50 rows, OR - **Rows 1–50 only** with a note that more chunks follow. 2. Paste: ``` Generate outreach rows using ONLY the templates + merge contract from above. Do not invent facts; follow when_empty_rule exactly. Output **TSV** (tab-separated) with header row: segment\tprospect_id_or_email\tsubject\tbody\tpersonalization_notes Rules: - personalization_notes must cite the **exact column name** used for the hook (or say "segment-default" if no proof column fired). - Keep body length within reasonable cold-email bounds for your channel. - If a row lacks data for a proof-required hook, apply the empty rule—never fabricate. After the TSV block, output a **QA tally**: counts per segment + count of rows using fallback vs proof hooks. ``` 3. For **51+ rows**, repeat with "Rows 51–100", etc., keeping the **same header** each time. Append chunks bottom-up in Sheets later. 4. Copy Claude's entire TSV block(s) — you'll paste into Google Sheets next.
QA in Sheets and set send discipline
Import TSV, sort by segment, spot-check edge rows, fix stragglers—then document daily caps before any send.
1. Open a new Google Sheet → paste the TSV starting at **cell A1** → Data → **Split text to columns** only if tabs didn't auto-columnize. 2. Insert columns: `qa_ok` (Y/N), `send_date`, optional `esp_batch_id`. 3. **Sort** by `segment`, then `prospect_id_or_email`. 4. QA protocol: - Read **5 random rows** aloud from different segments. - Read **every row** where `personalization_notes` shows fallback or empty-hook logic. - Fix copy directly in the sheet OR return to Claude once with: "Rewrite only rows [list] using the segment templates from this thread—do not change other rows." 5. Add a one-line **send-cap note** at the top (Notes cell or row 1 comment): max sends per day + test-send-to-self rule before the real batch. 6. Optional: send yourself row 2 as a real test from your ESP before wider sending.
All done!
You now have: A repeatable outreach system: 2–3 segments, merge-field schema, template variants per segment, a generated batch (TSV-ready), and a short QA pass before sending
Explore more guidesWant this workflow built for your business?
Book a free audit