Metric · Marketing

What is list growth rate, and how do you measure it in Metabase?

List growth rate is the net change in your email list per period — new subscribers minus unsubscribes, hard bounces, and pruned addresses, divided by list size. It's the compounding engine behind every other email metric: a list that shrinks quietly caps everything downstream. Measure it in Metabase from subscriber data synced from Klaviyo, Mailchimp, ActiveCampaign, or SendGrid.

TL;DR(new − unsubscribes − hard bounces − pruned) ÷ list size, per month, with the components broken out. Net beats gross: signups measure your forms, net growth measures the list. And gate it with a quality check — a growing list of subscribers who never open is negative growth in disguise.

What list growth rate measures

It measures whether your audience is compounding or decaying. Gross growth — raw signups — is a form-performance metric; net growth subtracts everyone who left through the exits (opt-outs, dead addresses, pruning) and tells you what actually happened to the list. Most lists lose 20-30% of subscribers a year to natural decay, so acquisition has to outrun churn just to stay flat.

Two refinements make it a real instrument. First, source attribution: tag every subscriber with the form, page, or channel that acquired them, so growth decomposes into things you can act on. Second, a quality guardrail: compare each new cohort's early engagement against tenured subscribers. Volume from a source whose subscribers never open dilutes engagement rate and drags on deliverability — the list got bigger and worse at the same time.

What data does it need?

  • A subscribers table with subscribed_at, status, and acquisition_source (form, landing page, channel, import) — synced to your warehouse via Airbyte, Fivetran, or dlt.
  • Exit events with reasons: unsubscribed, hard bounced, pruned/suppressed — each dated, so components can be trended separately.
  • A daily or monthly list-size snapshot (or a running balance modeled from the change events) for the denominator.
  • Per-subscriber engagement rollups (opens and clicks in the first 90 days) to score new-cohort quality by source.

SQL patterns

Monthly net list growth with componentsPostgreSQL
SELECT
  date_trunc('month', d.event_date) AS month,
  SUM(d.new_subscribers) AS new_subscribers,
  SUM(d.unsubscribes)    AS unsubscribes,
  SUM(d.hard_bounces)    AS hard_bounces,
  SUM(d.pruned)          AS pruned,
  SUM(
    d.new_subscribers - d.unsubscribes - d.hard_bounces - d.pruned
  ) AS net_change,
  ROUND(
    100.0 * SUM(
      d.new_subscribers - d.unsubscribes - d.hard_bounces - d.pruned
    ) / NULLIF(
      -- the month's starting balance is the earliest daily snapshot,
      -- not the smallest value the list dipped to during the month
      (array_agg(d.list_size_start ORDER BY d.event_date))[1], 0
    ), 2
  ) AS net_growth_rate_pct
FROM list_changes_daily d
WHERE d.event_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;
New-subscriber 90-day engagement by acquisition sourcePostgreSQL
SELECT
  s.acquisition_source,
  COUNT(*) AS new_subscribers,
  ROUND(
    100.0 * COUNT(*) FILTER (
      WHERE e.opens_90d > 0 OR e.clicks_90d > 0
    ) / NULLIF(COUNT(*), 0), 1
  ) AS engaged_90d_pct,
  ROUND(
    100.0 * COUNT(*) FILTER (WHERE e.unsubscribed_90d)
    / NULLIF(COUNT(*), 0), 2
  ) AS churned_90d_pct
FROM subscribers s
JOIN subscriber_engagement_90d e ON e.subscriber_id = s.id
WHERE s.subscribed_at >= CURRENT_DATE - INTERVAL '6 months'
  AND s.subscribed_at < CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1
ORDER BY engaged_90d_pct DESC;

Pitfalls

Reporting gross signups as growth.→ Signups can rise every month while the list shrinks — decay works quietly through unsubscribes, bounces, and suppression. Always subtract the exits, and show the components so you can see which door people left through.
Counting size without counting quality.→ A purchased list or an over-incentivized giveaway grows the count and rots the list: new subscribers who never engage suppress your engagement-based sender reputation. Gate every source on new-cohort engagement before celebrating its volume.
Panicking at pruning months.→ Removing chronically inactive addresses reads as negative growth, but it lifts deliverability and every engagement rate for the subscribers who remain. Annotate cleanups on the chart so nobody reverse-engineers a crisis out of hygiene.
Losing acquisition source at signup.→ Source attribution can't be reconstructed later — if the form doesn't stamp it, the analysis ends at "the list grew." Capture source on every signup path, including imports and API-created subscribers.

Where this metric applies

Metrics

Dashboards

FAQ

What's the formula for list growth rate?
(New subscribers − unsubscribes − hard bounces − pruned addresses) ÷ list size at the start of the period, per month. The subtractions are the point: gross signups tell you how your forms perform, but net growth tells you whether the list is actually getting bigger. Track the components separately so you can see whether a flat month came from weak acquisition or heavy cleanup, and read it next to unsubscribe rate.
What's a healthy list growth rate?
A few percent net growth per month is strong for an established list; most lists decay 20-30% per year without active acquisition, so flat is already an achievement. The more useful benchmark is internal: net growth by month, with the components broken out, against your own trailing year. A quality check matters more than the level — growth made of subscribers who never open is not growth.
Why did my growth rate go negative after a list cleanup?
Because pruning shows up as negative growth by construction — you removed more addresses than you added. That's usually the right trade: dead addresses drag down engagement-based sender scoring and inflate every rate's denominator, so a smaller, cleaner list often delivers better and earns more. Annotate cleanup months on the chart, and watch bounce rate and engagement rate improve afterward.
How do I know if new subscribers are worth having?
Compare the 90-day engagement of each new cohort against your tenured subscribers, split by acquisition source. A giveaway form that grows the list 10% but delivers subscribers who never open is negative growth in disguise — they dilute engagement, hurt deliverability, and eventually leave through unsubscribes or pruning. Source-level cohort quality tells you which forms and channels to double down on.
How do you track list growth rate in Metabase?
Sync subscriber and list-change data from Klaviyo, Mailchimp, or ActiveCampaign into a SQL database via Airbyte, Fivetran, or dlt — Metabase queries the database, not the platform APIs. Model a daily list-changes table with new subscribers, unsubscribes, hard bounces, and pruned counts, chart monthly net growth with components stacked, and pin it to your email engagement dashboard.