Skip to content

Find Inactive Substack Subscribers Before They Churn

By the newsletterapi team · Published · Updated · 6 min read

The problem: “Substack doesn't flag which paid subscribers are going quiet, so I only find out when they cancel.”

Cover image: Find Inactive Substack Subscribers Before They Churn

Short answer

To find inactive Substack subscribers, filter the Subscribers page by Activity (0 stars) or email opens, save it as a segment, and export all columns to split readers into active, cooling and inactive. Email the quiet group before removing anyone. Exclude readers in France and Italy, whose opens stopped being recorded on 14 October 2026, and never remove paid readers: removal cancels and refunds them.

The problem

"Substack does not flag which paid subscribers are going quiet." (r/Substack, April 2026)

"Want to segment subscribers by opens and clicks to protect email deliverability? You can't do that either." (@BelangerTrading on X, October 2026)

A paid reader rarely cancels out of nowhere. Usually they stop opening first, for weeks. If you can see that early, you can send a personal note, point them to the best recent post, or ask what changed. On free lists, a large block of people who never open drags down engagement and, eventually, inbox placement.

The second quote above is only half right in October 2026: Substack now has activity filters and saved segments. What it doesn't do is warn you, or split paid readers into "fine" and "going quiet". This guide shows how to build that view from what Substack gives you, and how to act on it without hurting anyone.

What does "inactive" mean on Substack?

Three signals exist, and each has blind spots:

Signal Where What it measures Blind spots
Activity stars (0–5) Subscribers page Email opens and web views "in the last month", ranked: five stars is the 80th–100th percentile (stars help) New readers start at zero; Apple Mail privacy hides opens
Email opens (last 7 days, 30 days, 6 months) Display columns and export How often your emails to this person were opened (dashboard help) Forwarding inflates it; images-off reading deflates it
Opens definition All of the above An image load in the email, or a view in the Substack app (opens help) Clicks alone don't count; scanner opens are excluded

Two caveats matter before you call anyone inactive:

  • France and Italy. Substack no longer records email opens from subscribers currently in France or Italy, for emails sent after 14 October 2026. Substack warns that filters, segments and ratings based on opens "may treat them as less active than they are" (opens help). Filter them out by country before you judge.
  • App readers are fine. One writer worried that reading "almost exclusively in the app" shows up as inactivity (r/Substack). It doesn't: an app view counts as an open.

How do I find inactive subscribers in the dashboard?

  1. Filter by activity. Subscribers → Filter → choose the subscriber type → Add a filter → Activity → 0 stars (stars help). Use "Paid" as the type to see paid readers going quiet.
  2. Add an age condition. Add a start-date filter so people who joined in the last few weeks aren't included; they may not have received a post yet.
  3. Save it as a segment. Segments are saved filters that "update automatically" as readers match or stop matching (segments help). Name it something like "Paid, 0 stars, joined 60+ days ago".
  4. Add the opens columns. Display → Email opens (last 30 days) and Emails opened (last 6 months), then sort ascending (dashboard help).

Check the segment once a month. Because it's dynamic, someone who starts opening again drops out on their own.

How do I split my export into active, cooling and inactive?

The dashboard shows one filter at a time. To see the whole picture, export with all columns, which can include "when the subscriber last opened an email" and post views (export help), and run a small script.

This Python script uses only the standard library. It sorts every subscriber into new, active (opened in the last 30 days), cooling (opened in six months but not 30 days) or inactive (no opens in six months), and writes a CSV per segment, plus paid_quiet for paying readers who are cooling or inactive.

import csv, sys
from datetime import date, datetime

# Edit to match the header row of your "all columns" export.
EMAIL, TYPE, JOINED = "email", "subscription type", "subscription date"
OPENS_30D, OPENS_6M = "opens (last 30 days)", "opened (last 6 months)"
NEW_DAYS = 45  # too new to judge

def col(headers, want):
    for h in headers:
        if want in h.lower():
            return h
    sys.exit(f"No column matching '{want}'. Your headers: {headers}")

with open(sys.argv[1], newline="", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)
    rows, h = list(reader), reader.fieldnames
c = {k: col(h, k) for k in (EMAIL, TYPE, JOINED, OPENS_30D, OPENS_6M)}

def parse_date(v):
    for fmt in ("%Y-%m-%d", "%m/%d/%Y", "%d/%m/%Y"):
        try:
            return datetime.strptime(v.strip()[:10], fmt).date()
        except ValueError:
            pass
    sys.exit(f"Unrecognised date '{v}'; add its format to parse_date()")

def num(v):
    return int(float(v or 0))

out = {"new": [], "active": [], "cooling": [], "inactive": [], "paid_quiet": []}
for r in rows:
    joined = parse_date(r[c[JOINED]])
    o30, o6m = num(r[c[OPENS_30D]]), num(r[c[OPENS_6M]])
    t = r[c[TYPE]].lower()
    paying = any(w in t for w in ("paid", "founding", "monthly", "annual")) and "comp" not in t and "gift" not in t
    if (date.today() - joined).days < NEW_DAYS:
        seg = "new"
    elif o30 > 0:
        seg = "active"
    elif o6m > 0:
        seg = "cooling"
    else:
        seg = "inactive"
    out[seg].append(r)
    if paying and seg in ("cooling", "inactive"):
        out["paid_quiet"].append(r)

for seg, items in out.items():
    print(f"{seg:<11}{len(items):>6}")
    with open(f"segment-{seg}.csv", "w", newline="") as f:
        w = csv.DictWriter(f, fieldnames=h)
        w.writeheader()
        w.writerows(items)

Run it as python3 segments.py export.csv. Substack doesn't publish its export header names, and they can change, so the script matches column names loosely and stops with a list of your real headers if one is missing. Edit the five names at the top to fit. We tested it on a sample file shaped like the dashboard columns, not on a live export.

To track the counts over time, paste each month's totals into the Google Sheets growth dashboard.

How do I re-engage quiet subscribers?

Start with the people who matter most and the gentlest action.

  1. Paid and quiet: write personally. Select the paid_quiet readers in your saved segment and use Send email; it opens a direct email draft, not a post (segments help). Ask one question, link your two best recent posts, and remind them what the paid tier includes.
  2. Cooling free readers: give them a reason. Publish a strong post and, if you want, send it only to that segment via "Only send to a specific audience segment" in the publish settings (segments help).
  3. Inactive free readers: ask before you remove. Send a short "Still want these emails?" note with a single link to click.
  4. Check the inbox, not just the reader. In the same thread, a writer suspected "most inactive subscribers are due to emails landing in the promotions tab" (r/Substack). Ask engaged readers to move you to the primary tab.

Then watch the Retention tab. It shows net growth, cohort analysis and churn for paid and free readers, and free retention data starts on 1 January 2026 (metrics guide).

When should I remove inactive subscribers?

Removing readers who never open can help deliverability. Google's guidance to senders is to "Consider unsubscribing recipients who don't open or read your messages" and to keep reported spam rates below 0.30% (Google sender guidelines). But be careful:

  • Never bulk-remove paid readers. Removing a paying subscriber cancels the subscription "with a prorated refund" (subscription help). Re-engage them instead.
  • Use Substack's prune tool if you're offered it. It's only available to publications Substack's system flags for a high share of inactive or undeliverable readers. Substack "will never ask you to remove paying subscribers or those who have signed up to your publication manually"; it targets imported readers who never engaged, sends a re-engagement email, and "Readers who click the link in the re-engagement email will remain on your list" (prune help).
  • Export before you remove. Keep a dated copy so you can explain any later question about who was removed and why.
  • Give it time. Wait at least two or three sends after the re-engagement email before removing anyone.

If you sync subscribers to a CRM, remove the same people there too; syncing Substack unsubscribes to a CRM shows how.

Can newsletterapi find quiet subscribers for me?

newsletterapi's subscriber analytics reads the export you upload and returns engagement segments (active, cooling, inactive and paid-but-quiet), with the inactive list as a CSV for re-engagement or cleanup. You can also ask an AI assistant "How many subscribers haven't opened in 90 days, and how many of them are paid?" through the newsletterapi MCP server. It never logs in to Substack. To get access, email hello@newsletterapi.io.

For what every other dashboard number means, see Substack analytics explained, and for the wider picture of what you can automate, the Substack API guide.

Questions people ask

How does Substack decide a subscriber is inactive?
The activity stars reflect email opens and web views in the last month, ranked against your other subscribers. Zero stars can mean the reader is new, hides opens (Apple Mail privacy), or reads with images off. Treat zero stars as a prompt to look, not proof of disinterest.
Do subscribers who read in the Substack app count as active?
Yes. Substack counts an open when a subscriber views the post in the Substack app, as well as when they load the email's images.
Should I delete inactive Substack subscribers?
Only after a re-engagement email, and only free readers who have shown no activity for months. Removing a paying subscriber cancels their subscription with a prorated refund. Substack's prune tool, when offered, keeps anyone who clicks the re-engagement link.
Where do I see churn on Substack?
Stats → Retention shows net growth, cohort analysis and churn for paid and free subscribers (free data starts on 1 January 2026), and the Unsubscribes tab lists paid cancellations with reasons. Both are only visible for paid publications.

Sources

  1. Substack Help: What are the stars on my Subscribers dashboard? (accessed 2026-10-24)
  2. Substack Help: How do I use the subscriber dashboard on Substack? (accessed 2026-10-24)
  3. Substack Help: What are subscriber segments on Substack? (accessed 2026-10-24)
  4. Substack Help: How do I export my email list on Substack? (accessed 2026-10-24)
  5. Substack Help: How are "Opens" captured on Substack? (accessed 2026-10-24)
  6. Substack Help: How do I remove inactive or undeliverable readers from my publication? (accessed 2026-10-24)
  7. Substack Help: A guide to Substack metrics (accessed 2026-10-24)
  8. Substack Help: How do I make changes to a reader's subscription on Substack? (accessed 2026-10-24)
  9. Google Workspace Admin Help: Email sender guidelines (accessed 2026-10-24)
  10. r/Substack: CSV export analysis thread (2026-04-01) (accessed 2026-10-21)
  11. @BelangerTrading on X (2026-10-08) (accessed 2026-10-21)