Skip to content

Substack Attribution: Which Channels Bring Paying Readers

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

The problem: “I spend on ads and posts across channels, but I can't tell which ones bring subscribers who actually open and pay.”

Cover image: Substack Attribution: Which Channels Bring Paying Readers

Short answer

Substack attribution has three layers. Tag every link with UTM parameters and connect GA4 in Settings → Analytics, so sign-ups and paid subscriptions are credited to a source and campaign. Read Substack's Sources page for subscribers and revenue by source. Then group your subscriber export by its source column to see which sources open and pay. GA4 and pixels never tell you who signed up.

The problem

"better analytics to figure out where subscribers come from" (the top API-adjacent wish in an r/Substack feature thread, July 2025)

"Substack makes it basically impossible to track social media that goes to Substack and subscribes." (r/Substack, December 2025)

"Substack shares very little information with its facebook pixel." (r/Substack, July 2026)

Counting sign-ups per channel isn't enough. A cheap ad that brings readers who never open is worse than a pricier one that brings readers who pay. Agencies that run newsletter ads on other platforms close this loop with the platform's API; one explains, "We use your email platform’s API to pull subscriber opens." (@_May_Ham on X, October 2026). Substack has no such API, so people improvise. One operator tracked campaigns with referral links: "you can have each campaign with its own referral sign up" (r/Substack). That muddies your real referral data, and you don't need it.

This guide builds the loop from three official pieces: UTM tags read by GA4, Substack's Sources page, and the source column in your own export.

What attribution data does Substack give you?

Where What you get Per person?
Sources page (Analytics → Sources) "Unique visitors, New subscribers, and New revenue (paid publications) by source", with categories such as Direct, Email clicks, Trackbacks and Import (metrics guide) No
Stats → Network Subscribers split into Substack App, Other Substack Network, saved cards, existing accounts, imports and new accounts (metrics guide) No
Post stats Traffic sources for the post and new free and paid subscribers it drove (post sources help) No
Export, "Subscription source (free)" "A tag explaining how a subscriber arrived at your publication before becoming a free subscriber (e.g. from the Substack app or Google)" (dashboard help) Yes
GA4, GTM, Meta and X pixels Page views, sign-ups and paid subscriptions sent to those tools (Analytics settings) No

Only the export joins a source to a person, and through them to opens and payments. Everything else is aggregate.

How do I track Substack sign-ups by campaign with UTM and GA4?

  1. Connect GA4. Copy your Measurement ID (it starts with G-) and paste it into Settings → Analytics. Substack says "Events for page views, sign ups, and paid subscriptions should begin to show up in your Google Analytics account after 24 hours" (GA4 help).

  2. Tag every link you control. Google says to "always use utm_source, utm_medium, and utm_campaign" (Google URL builders). For example:

    https://yourpub.substack.com/subscribe?utm_source=facebook&utm_medium=paid_social&utm_campaign=oct-lead-magnet&utm_content=video-a
    

    Use utm_content to tell ad variants apart. Keep a short naming sheet so "facebook" and "Facebook" don't split your reports.

  3. Mark the sign-up and purchase events as key events. In Substack's page code (observed October 2026) these reach GA4 as sign_up and purchase. In GA4, Admin → Events, find each and click the star to mark it as a key event (Google key events).

  4. Read the Traffic acquisition report. Reports → Acquisition → Traffic acquisition, then switch the dimension to Session source / medium or Session campaign (Google traffic acquisition). The key events column now shows sign-ups and purchases per campaign.

  5. Test once. Open a tagged link in a private window, subscribe with an address you own, and check GA4's real-time view. If the campaign doesn't appear, the tags were lost on a redirect; link straight to the page readers land on.

Google Tag Manager goes in the same settings page (Analytics settings). In Substack's page code (observed October 2026), the container is told to allow Google-built tags only, so GA4 and Google Ads tags fire but custom HTML and non-Google pixels are blocked unless Substack exempts the publication. Don't plan a webhook or a Meta tag inside GTM.

Meta and X ads have their own native fields. Paste your Meta pixel ID in Settings → Analytics and give Substack a pixel of its own; What the Meta pixel tracks on Substack covers events and testing. Still add UTM tags to the ad's destination URL so GA4 can compare Meta with everything else.

How do I see which sources bring readers who open and pay?

GA4 tells you how many signed up from a campaign. It can't tell you whether they opened next month. For that, use the export.

  1. Export your subscribers with all columns (export help).
  2. Run this script. It groups subscribers by the source column and reports how many are opening and how many pay.
import csv, sys
from collections import defaultdict

# Header names vary; check your file's first row and edit these if needed.
EMAIL, SOURCE, TYPE, OPENS = "email", "source", "type", "opens (last 30 days)"

def col(headers, want):
    for h in headers:
        if want.lower() 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:
    rows = list(csv.DictReader(f))
h = list(rows[0].keys())
src, typ, opens = col(h, SOURCE), col(h, TYPE), col(h, OPENS)

stats = defaultdict(lambda: {"subs": 0, "opening": 0, "paid": 0})
for r in rows:
    s = stats[r[src].strip() or "(blank)"]
    s["subs"] += 1
    s["opening"] += int(float(r[opens] or 0)) > 0
    t = r[typ].lower()
    s["paid"] += any(w in t for w in ("paid", "founding", "monthly", "annual")) and "comp" not in t and "gift" not in t

print(f"{'source':<24}{'subs':>6}{'opening %':>11}{'paid %':>8}")
for name, s in sorted(stats.items(), key=lambda kv: -kv[1]["subs"]):
    print(f"{name[:23]:<24}{s['subs']:>6}{100*s['opening']/s['subs']:>10.0f}%{100*s['paid']/s['subs']:>7.0f}%")

Run it as python3 source_quality.py export.csv. We tested it on a sample file shaped like the dashboard columns, not a live export; Substack doesn't publish its header names, so edit the four names at the top if it stops and lists your headers. Comps and gifts are not counted as paying.

For each source you get the number of subscribers, the share who opened in the last 30 days and the share who pay. Combine it with GA4's campaign counts and your ad spend, and you have cost per subscriber and a feel for quality per channel. Paste the monthly numbers into the Google Sheets growth dashboard to watch the trend.

The limit: the export's source column uses Substack's categories, not your UTM campaigns. To tie a specific ad to a specific person, collect the email on a landing page you host, with the reader's consent, record the UTM alongside it, and then hand the reader to Substack to subscribe. Using your own signup form with Substack shows the consented way to do that.

Adding GA4 or a pixel means cookies and similar technologies on your readers' devices. Under the UK's PECR, the ICO says "You must also get the user’s consent" unless storage is strictly necessary for a service the user asked for (ICO). EU rules are similar. Check how your publication handles consent before you add tracking, mention the tools in your privacy notice, and expect consent choices to lower your measured numbers.

Don't upload your subscriber list to an ad platform as a custom audience unless your privacy notice and your readers' consent cover it.

Is there a faster way?

newsletterapi's subscriber analytics reads the export you upload and reports source quality: subscribers, engagement and paid conversion by signup source, as JSON or CSV. Ask "Which subscriber source is worth the most to me?" from an AI assistant through the newsletterapi MCP server. It doesn't send pixel or Conversions API events; Substack's own pixel does that. To get access, email hello@newsletterapi.io.

For every other dashboard metric, see Substack analytics explained; for what you can automate overall, see the Substack API guide.

Questions people ask

Does Substack support UTM parameters?
You can add UTM parameters to any link that points to your Substack, and GA4 reads them from the landing page URL once your Measurement ID is in Settings → Analytics. Substack's own Sources page uses its own categories, so read UTM campaigns in GA4.
Can I see which subscriber came from which ad?
Not from GA4 or the Meta pixel; they report anonymous events. Your export has a free-subscription source column, but it uses Substack's categories, not your campaigns. For per-person campaign data, collect the email on your own consented form and record the UTM there.
Does Google Tag Manager work on Substack?
You can paste a GTM container ID in Settings → Analytics. In Substack's page code (observed October 2026), the container runs Google-built tags only unless a publication is exempted, so GA4 and Google Ads tags work but custom HTML and non-Google pixels don't.
How long until GA4 shows Substack sign-ups?
Substack says events for page views, sign-ups and paid subscriptions should appear in Google Analytics after 24 hours.

Sources

  1. Substack Help: How do I use the Analytics section on Substack? (accessed 2026-10-24)
  2. Substack Help: How do I connect Google Analytics 4 to my Substack publication? (accessed 2026-10-24)
  3. Substack Help: A guide to Substack metrics (accessed 2026-10-24)
  4. Substack Help: Where can I see how readers got to my Substack post? (accessed 2026-10-24)
  5. Substack Help: How do I use the subscriber dashboard on Substack? (accessed 2026-10-24)
  6. Substack Help: How do I export my email list on Substack? (accessed 2026-10-24)
  7. Google Analytics Help: URL builders, collect campaign data with custom URLs (accessed 2026-10-24)
  8. Google Analytics Help: Mark events as key events (accessed 2026-10-24)
  9. Google Analytics Help: Traffic acquisition report (accessed 2026-10-24)
  10. ICO: Cookies and similar technologies (PECR guide) (accessed 2026-10-24)
  11. r/Substack: What feature would you request now? (comment 2025-07-18) (accessed 2026-10-21)
  12. r/Substack: Substack shares very little information with its Facebook pixel (2026-07-29) (accessed 2026-10-21)
  13. r/Substack: automating leads into Substack (comments, Dec 2025 to Jan 2026) (accessed 2026-10-21)
  14. r/Substack: company Substack and Facebook lead ads (2025-04-13) (accessed 2026-10-21)
  15. @_May_Ham on X (2026-10-14) (accessed 2026-10-21)