Newsletter Growth skill for Codex
Grow net active readers, not the send count. Codex diagnoses a newsletter from net growth, clicks and acquisition sources before suggesting tactics, then tightens the one-line promise, places signup forms where readers are, writes a welcome sequence and adds referral and recommendation channels. Every source is judged by the 30-day engagement of the subscribers it brings, inactive readers are re-engaged or removed with your sign-off, and sponsorships stay clearly labelled.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- newsletter-growth Installs to ~/.agents/skills/newsletter-growth/ for every project on this machine.
curl -fsSL codexskills.dev/cli.mjs -o codex-skills.mjsnode codex-skills.mjs install newsletter-growth The CLI also searches, updates and removes skills. Run it with no arguments to pick from a list. Needs Node 20.12+.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- --project newsletter-growth Installs to .agents/skills/newsletter-growth/ in the current repository. Commit it and everyone who runs Codex there gets it.
curl -fsSLO codexskills.dev/downloads/newsletter-growth.zipunzip -o newsletter-growth.zip -d ~/.agents/skills/ The archive holds the skill folder with its generated agents/openai.yaml. Unzip into .agents/skills/ to scope it to a repo.
& ([scriptblock]::Create((irm codexskills.dev/install.ps1))) newsletter-growth PowerShell 5.1 or 7. Installs to %USERPROFILE%\.agents\skills\. Add -Project for the current repo.
104-line POSIX script. No sudo, no telemetry. Read install.sh
Use it in Codex
Start a prompt with $newsletter-growth, or pick it from /skills.
You can also just describe the task: Codex reads the description below and loads the playbook when your request matches.
What Codex reads before loading it
Grows and runs an email newsletter on beehiiv, Substack, Kit (ConvertKit), Ghost or Buttondown - positioning and promise, signup forms and landing pages, lead magnets, welcome sequence, referral programs and recommendation networks, issue format and cadence, engagement-based list hygiene, sponsorships and paid tiers - and tracks net growth and active readers instead of vanity counts. Use when asked to grow subscribers, write a welcome sequence, set up a newsletter referral program, improve click rates, clean a list, or price sponsorships.
Use it when
- A newsletter's growth has stalled or clicks are falling
- New subscribers get no welcome or unsubscribe after the first issue
- You want referral programs, recommendation swaps or paid boosts
- The list needs an engagement-based cleanup or a sponsorship model
Use something else when
- You are building product lifecycle emails triggered by app events: use email-marketing
- You need a referral program for a SaaS product rather than a newsletter: use referral-programs
How to check the result
The signup flow works end to end through the welcome email, and the weekly report shows net growth and 90-day active readers by acquisition source.
The mistake it prevents
Chasing subscriber count with giveaways or cheap paid boosts, which adds readers who never click and drags inbox placement for everyone.
A newsletter is run well when one sentence explains who it is for and what they get each issue, every subscriber chose to be there (and confirmed it), new readers get a welcome that sets expectations, and growth is measured as net active readers, not total sends.
Diagnose before growing
Ask for or export:
- Total subscribers, new per week, unsubscribes and bounces per week (net growth).
- Clicks per issue and unique clickers; 30/90-day active readers if the platform reports it.
- Acquisition sources (platform source reports, UTM on signup pages, referral counts).
- Current promise: the subtitle or tagline on the signup page.
| Symptom | Likely problem | First fix |
|---|---|---|
| Signups fine, clicks falling | Content drifting from the promise, or cadence too high | Re-read the last 10 issues against the promise; survey readers |
| High unsubscribes after issue 1-2 | Welcome missing, or signup promise oversold | Write a welcome sequence; match signup copy to actual issues |
| Few signups from existing traffic | Weak or hidden forms | Signup above the fold on posts, end-of-post form, dedicated landing page |
| Growth only from one source | Fragile distribution | Add referral and recommendation channels |
| Spam folder placement | Poor engagement, no authentication, bought or bot signups | Double opt-in, sunset inactives, check SPF/DKIM/DMARC (email-marketing) |
Positioning and the signup page
- One-sentence promise:
<What> for <who>, every <cadence>, so they can <outcome>. “A 5-minute Friday brief on Postgres performance for backend engineers.” - Signup page: promise as headline, 3 bullet examples of recent issues, social proof (subscriber count only if impressive and true; named readers with permission), sample issue link, one email field.
- Embed forms where readers already are: end of every blog post, a slim inline form
mid-article, the site header or footer, and a dedicated
/newsletterpage for links. - Find existing forms in the repo before adding new ones:
rg -n "beehiiv|substack|kit.com|convertkit|ghost|buttondown|newsletter" src/ app/ components/.
Signup quality
- Double opt-in by default; it keeps bot signups and typos out and protects deliverability.
- Bot “list bombing” attacks submit thousands of real victims’ addresses: enable the platform’s bot protection, rate limit custom forms server-side, and keep double opt-in on.
- Lead magnets (template, checklist, mini-course) raise signups but attract freeloaders; track the 30-day click rate of magnet signups separately and keep the magnet on-topic.
- Never import scraped or purchased lists, and never auto-subscribe people who only bought a product or created an account without telling them clearly at signup.
Welcome sequence
Default: 2-4 emails over the first 7-10 days, then into regular issues.
| When | Content | |
|---|---|---|
| 1 | Immediately after confirm | Thanks, what to expect (cadence, topics), best past issues, ask them to reply with one question (replies help inbox placement) |
| 2 | Day 2-3 | The single most useful piece you have written; how to whitelist / move to Primary |
| 3 | Day 5-7 | Who writes it and why; invite to the referral program or community |
| 4 (optional) | Day 9-10 | Paid tier or product offer, if any, with a clear free alternative |
Growth channels (rank by fit, then work the top two)
| Channel | Mechanics | Notes |
|---|---|---|
| Content and SEO on the site | Articles that rank, each with an inline form | Slow, compounding; pair with seo-content-writing |
| Referral program | Reward readers for confirmed referrals (beehiiv built-in, SparkLoop, or custom) | Reward tiers that cost little: guide, sticker, community access; count only confirmed and active referrals |
| Recommendations | Substack Recommendations, beehiiv Recommendations, Kit Creator Network | Swap with newsletters of similar audience and size; check their open/click quality |
| Paid recommendations | beehiiv Boosts, SparkLoop Partner Network | Pay per confirmed subscriber; measure 30-day engagement of those cohorts before scaling |
| Cross-promotions and guest issues | Write for another newsletter in your niche | One of the best quality sources |
| Social | Post the best insight from each issue natively with a signup link | See social-media-content |
| Paid ads | Meta lead ads, X, Reddit | Only once you know subscriber value; expect lower engagement |
Rule: judge every source by the 30-day engagement of the subscribers it brings, not by the count.
Issue format and cadence
- Consistent day and time; consistency beats frequency.
- A recognisable structure readers can scan: one main piece, then 3-5 curated links with a sentence on why each matters.
- Subject line: specific to this issue’s best item, not “Issue #47”.
- Each issue has one primary action (read, reply, share, click the main piece).
- Plain readable HTML; most reading happens on phones. Test in Gmail and Apple Mail.
- Include a referral or share prompt in every issue, near the end.
List hygiene
- Opens are inflated by Apple Mail Privacy Protection; define “active” by clicks (or the platform’s engagement model) within 90 days.
- Re-engagement: send inactive subscribers (no clicks in 90-180 days) a short “still want this?” email; remove those who do not respond within 2 weeks.
- Removing or archiving subscribers is hard to undo: export the segment first, show the user the count, and get confirmation before deleting.
Monetisation
| Model | When | Watch |
|---|---|---|
| Sponsorships | Engaged audience in a niche advertisers want | Price on CPM of engaged readers or flat per placement; label ads clearly as sponsored |
| Paid tier | Readers rely on it for work or decisions | Keep a strong free tier; paid conversion of a few percent of free readers is typical |
| Own products / consulting | Newsletter supports a business | Do not let promotion crowd out the promise |
Disclose sponsorships and affiliate links clearly (FTC Endorsement Guides in the US; similar rules elsewhere).
Metrics to report weekly
| Week | New | Unsubs | Bounced/cleaned | Net | Active (90d clickers) | Click rate | Top source |
Net growth and active readers are the headline numbers. Investigate any issue with an unsubscribe rate well above the trailing average.
Gotchas
- Growing via giveaways: huge spikes, near-zero engagement, deliverability damage.
- Recommendation swaps with newsletters of a different audience; subscribers churn fast.
- Paying for Boosts without tracking cohort engagement; cheap subscribers can be dead weight.
- Changing sender name or address often; readers stop recognising it and filters reset.
- Sending every issue to inactive subscribers forever; it drags inbox placement for everyone.
Sending and publishing
Sending an issue, launching a referral program or importing subscribers reaches real inboxes. Prepare drafts, segments and settings; send, schedule or import only after the user confirms the final version and the recipient segment.
Verification
- Signup flow tested end to end: form, confirmation email, welcome email 1, correct tags/segments.
- Each acquisition source has its own tag or UTM and shows 30-day engagement.
- Weekly table shows net growth and active readers; trend reviewed monthly.
Output template
## Newsletter growth plan: <name>
**Promise:** ...
**Diagnosis:** metrics + symptom table rows that apply
**Signup surfaces:** list with changes
**Welcome sequence:** 3-4 emails (subject + body draft)
**Channels (next 90 days):** top two with targets and cohort-quality checks
**Hygiene policy:** active definition, re-engagement, removal schedule
**Awaiting approval:** sends, imports, deletions What the zip contains
SKILL.md plus the interface file below. Nothing runs on install.
agents/openai.yaml
Gives the Codex app a display name, a one-line description and a starter prompt for this skill.
interface:
display_name: "Newsletter Growth"
short_description: "Grow net active readers, not the send count"
default_prompt: "$newsletter-growth Our newsletter is stuck at 3,000 subscribers. Diagnose it and give me a 90-day growth plan" About this skill
Written and maintained by the Codex Skills editors to the same editorial standard as every skill here: a selective description, a real workflow, known pitfalls and a way to verify the work. First published , last updated . MIT licensed. Something wrong or out of date? Tell us.