Newsletter Subject Lines
Generate scored subject line options that get opens — not 5 random guesses. Every line is built from a real, named framework with a proven pattern.
Automation level: AUTONOMOUS (subject lines are low-risk; user picks the final one from the scored list)
Setup Required
| Placeholder | What to replace it with |
|---|---|
[YOUR_NEWSLETTER_DATABASE_NAME] |
The exact name of your Notion newsletter database (used to find and update the page in routine mode) |
Standalone mode (calling this skill directly without a /content routine) requires no Notion setup — it skips the Notion update step entirely.
Mode Detection (do this first)
Check whether today's newsletter exists:
ls inbox/outputs/md/$(date +%Y-%m-%d)-acquisition-content-newsletter-repurpose.md 2>/dev/null
- Found → Routine Mode (running as the final /content step)
- Not found → Standalone Mode (user called this skill directly)
Mode affects two things only:
| Mode | Newsletter source | Notion update |
|---|---|---|
| Routine | Auto-read from today's file | Update existing newsletter page |
| Standalone | Ask user for paste / file path | Skip Notion update |
Everything else in this skill works identically.
Step 1: Read Context
Read these files before anything else:
context/my-voice-dna.md— voice rules and strong opinions/beliefs that should colour the angle
These are non-negotiable for content skills.
Step 2: Get the Newsletter Draft
Routine Mode:
- Read
inbox/outputs/md/YYYY-MM-DD-acquisition-content-newsletter-repurpose.md(today's date) - The Notion page ID was logged by the upstream skill — capture it from the session context for Step 8
Standalone Mode:
- Ask: "Paste the newsletter draft, or give me the file path."
- If the user gives a path, read it
- No Notion page exists — skip the Notion update at Step 8
Extract from the draft:
- Core topic (1 phrase)
- Lead story / hook moment (1 sentence)
- Key result, number, or specific claim (if any)
- One-line lesson the edition lands on
Step 3: Identify Edition Intent
Pick ONE primary intent for the edition:
| Intent | When it applies |
|---|---|
| Educational | Teaching a system, framework, or how-to |
| Story-based | Personal moment, struggle arc, lesson from experience |
| Authority | Establishing credibility, sharing internal data, calling out bad practice |
| Roundup | Multiple items curated with commentary |
| Launch | New offer, cohort, deadline, or product announcement |
Then map intent → framework categories using this table:
| Edition Intent | Best Categories (load these from references/frameworks.md) |
|---|---|
| Educational | Curiosity, Quick Win, Contrarian |
| Story-based | Story, Pain Point, Curiosity |
| Authority | Authority, Results, Contrarian |
| Roundup | Curiosity, Value, Quick Win, Trend |
| Launch | Action, Empowerment, Urgency |
Step 4: Load Frameworks
Read ONLY the matched category sections from references/frameworks.md. Do not load the whole file — that wastes context.
Each framework in the file has:
- Pattern — the template to instantiate
- When to use — situational fit
- Example — voice anchor
Use the Pattern as the structure. Use the Example as the voice/style reference. Never invent a new framework — pick one of the 100 by name.
Step 5: Generate 8-10 Subject Lines
For each subject line:
- Pick a framework that genuinely fits the newsletter content (not just one that sounds clever)
- Instantiate the Pattern using real specifics from the draft (numbers, names, the actual lesson)
- Write a complementary Preview Text (40-90 chars) — extends the subject, doesn't repeat it
Distribution rule: Spread across at least 3 different frameworks. Don't generate 8 variants of "Confession" — variety lets the strongest framework stand out.
Step 6: Score Each Line
Score every subject line silently on 4 criteria (1-4 each, max 16):
| Criterion | What it means |
|---|---|
| Curiosity pull (1-4) | Does it open a loop? Does the reader need to click to close it? |
| Specificity (1-4) | Real number, real name, real moment > vague claims |
| Voice fit (1-4) | Sounds authentic (lowercase, direct, no fluff) > sounds like every other newsletter |
| Length efficiency (1-4) | Under 50 chars = 4. 50-65 = 3. 65-80 = 2. Over 80 = 1. |
Step 7: Build the Output
# Newsletter Subject Lines — YYYY-MM-DD
**Source:** YYYY-MM-DD-acquisition-content-newsletter-repurpose.md (or "user-pasted draft")
**Edition intent:** [intent]
**Framework categories used:** [list]
---
## ⭐ Recommended Pick
**Subject:** "[winning line]"
**Framework:** [name] ([category])
**Preview:** "[preview text]"
**Score:** [N]/16 (curiosity [X], specificity [X], voice [X], length [X])
**Why this one:** [1 sentence — what makes it the strongest match for this edition]
### A/B Variants of Pick
| Variant | Subject | Preview | Different angle |
|---|---|---|---|
| A | "[variant 1]" | "[preview]" | [what makes A different from pick] |
| B | "[variant 2]" | "[preview]" | [what makes B different from pick] |
---
## All Options
| # | Subject | Framework | Preview | Score |
|---|---|---|---|---|
| 1 | [line] | [name] | [preview] | [N]/16 |
| ... | | | | |
(Sorted highest score first)
---
## Style Audit
- Lowercase: [N]/[total]
- Under 50 chars: [N]/[total]
- No banned words (unlock, transform, game-changer, revolutionary, breakthrough, level up, paradigm, mindset shift, leverage, optimize, crush it, life-changing, next level, skyrocket, utilize, implement, facilitate, synergy, don't miss, discover): [N]/[total]
- No em dashes (—): [N]/[total]
- Specific (number / name / moment present): [N]/[total]
If any audit row is below 80%, regenerate the failing lines before saving.
Step 8: Update Notion (Routine Mode Only)
Skip this step entirely in Standalone Mode.
In Routine Mode:
- The newsletter page in
[YOUR_NEWSLETTER_DATABASE_NAME]was created by the upstream newsletter skill with a placeholder Subject Line - Update that page using
mcp__claude_ai_Notion__notion-update-page - Patch the Subject Line field with the recommended pick (the winner from Step 7, not the variants)
- Confirm: "Notion newsletter page Subject Line updated to: '[pick]'"
If the Notion page ID is not in session context, search Notion for the most recent page in [YOUR_NEWSLETTER_DATABASE_NAME] matching today's date; if no match, skip update.
Step 9: Save Output
Save to inbox/outputs/md/YYYY-MM-DD-acquisition-content-newsletter-subject-lines.md
Then tell the user:
"Subject lines ready. Recommended: '[pick]'. Two A/B variants saved if you want to test."
Edge Cases
| Situation | Action |
|---|---|
| Newsletter draft not found in routine mode | Fall back to Standalone Mode behaviour — ask user to paste |
| Newsletter is shorter than 200 words | Generate 5-6 options instead of 8-10; less material = less variation worth producing |
| No clear edition intent (mixed signals) | Default to "Story-based" if a personal moment is present, else "Educational" |
| All generated lines fail style audit (banned words, length) | Regenerate the failing batch — never save lines that failed audit |
| Notion MCP unavailable | Log "Notion update skipped — MCP unavailable", save locally, surface to user |
| User pastes draft that's not a newsletter (random text) | Ask: "This doesn't look like a newsletter draft. Want me to proceed anyway, or paste the right file?" |
What good looks like
A scored, voice-tuned shortlist where the recommended pick is obviously the strongest, the A/B variants give a real testing option, and every line in the table could plausibly be sent. No "filler" options. No banned words. Every line backed by a real framework name from references/frameworks.md.