Ghost members to dashboard

Ghost members, split by tier and by whether they read you.

Export members from Ghost admin and drop the CSV here. The dashboard separates free, paid and comped members rather than reporting one subscriber count, unpacks the comma-joined tiers and labels columns into usable dimensions, and uses email_open_rate per member to show what proportion of your list is genuinely reading rather than merely subscribed.

Prefer the full explorer? Open the app, or start from the generic dashboard builder.

Free, paid and comped split
Three statuses, three series, never a single misleading member count.
Tiers and labels unpacked
The comma-joined cells become real dimensions you can filter on.
Per-member open rate
email_open_rate is a whole percent per member and drives the engagement distribution.
Runs in your browser
The member list carries email addresses. It never leaves the tab.

One subscriber count hides three different businesses

Ghost writes a status column with three values: free, paid and comped. They behave nothing alike. Free members are an audience and a funnel. Paid members are revenue. Comped members are people you gave access to, often friends, press or early supporters, and counting them as either of the other two distorts both the growth story and the revenue story. A publication reporting three thousand members without that split is reporting a number that could mean almost anything.

The other useful column is email_open_rate, which Ghost maintains per member as a whole-number percentage rather than per campaign. That is unusual and it is genuinely handy, because it lets you sort your list by engagement and see the shape of it. Most lists turn out to be a small core who open everything and a long tail who opened once in 2024, and knowing the ratio changes what you do about a cleanup.

How to export from Ghost

  1. Open Ghost admin Go to your site's /ghost URL and sign in as an owner or administrator. Members exports are restricted to those roles.
  2. Go to the Members screen Members in the left navigation. The filter bar at the top decides what gets exported, so clear it unless you deliberately want a subset.
  3. Use the export option The three-dot menu at the top right offers Export members. Ghost generates the CSV immediately rather than emailing it.
  4. Confirm the status column has all three values If it only contains free, you exported a filtered view. Clear the filter and export again, or the paid growth panel will be blank.
  5. Drop it on this page status and tiers become filter chips, created_at drives the growth chart, and the open rate distribution appears alongside.

Ghost keeps deleted members out of the export rather than marking them, so the deleted_at column is usually empty. Growth here is net of anyone who removed themselves.

Try with sample Ghost data (the same columns, 100 rows, no upload needed).

What the dashboard shows

Every panel below is built from a column that is actually in the export, named the way Ghost names it.

  • Member growth by month. created_at bucketed, with free, paid and comped as separate series so a paid launch is visible against background growth.
  • Paid conversion rate. Paid members as a share of the total, which is the number that decides whether a publication is a business or a hobby.
  • Tier distribution. The tiers column unpacked, so Supporter and Insider are separate rows rather than one comma-joined string.
  • Engagement distribution. email_open_rate across the list, which almost always shows a bimodal shape rather than a bell curve.
  • Dormant members. last_seen_at against today, which identifies the segment worth a re-engagement send or a removal.
  • Labels as segments. Manual labels such as imported or early-reader unpacked and used as a cross-filter.
Sample header row
id,email,name,note,subscribed_to_emails,complimentary_plan,stripe_customer_id,created_at,deleted_at,labels,tiers,status,email_count,email_opened_count,email_open_rate,last_seen_at

Ghost export details worth knowing

  • status has three values, not two. free, paid and comped. Comped members have complimentary_plan set to true and no Stripe customer, so they look like paid members in every other respect.
  • tiers and labels are comma-joined. One cell, several values. A tier name containing a comma is indistinguishable from a separator, which is a good reason not to put commas in tier names.
  • email_open_rate is a whole percent. An integer from 0 to 100 rather than a fraction or a string. It is per member and lifetime, not per campaign.
  • stripe_customer_id is your paid join key. Present only for genuinely paid members. Its absence is the cleanest test for whether someone is comped rather than paying.
  • subscribed_to_emails is separate from status. A paid member can have unsubscribed from emails while still paying. Counting them as reachable overstates your sendable list.
  • created_at is ISO with a timezone. Pleasantly standard, unlike most of the exports on this site, so no date-format guessing is needed.

Split the three statuses, unpack the tiers, and look at the open rate distribution before you decide your list is bigger than it is. Ghost gives you an unusually clean file, and it rewards being read carefully.

Frequently asked questions

What is the difference between paid and comped members?

A comped member has complimentary_plan set to true and no stripe_customer_id: they have paid-tier access that you granted rather than bought. They belong in your reach numbers and not in your revenue numbers. Because they otherwise look identical to paying members, a dashboard that reads status alone without checking the Stripe id will overstate paid conversion, sometimes by a lot on a young publication.

How do I split the tiers column?

It is comma-joined inside a single quoted cell, so a member on more than one tier has both names in one string. This page splits on the comma and treats each tier as its own dimension value, which lets you filter and rank by tier properly. The one thing that breaks it is a tier whose own name contains a comma, which is worth avoiding when you name them.

Is email_open_rate reliable?

As a relative ranking within your own list, reasonably. As an absolute measure, no, for the same reason as everywhere else: mail clients that pre-fetch tracking pixels register opens nobody performed. What makes the Ghost version useful is that it is per member and lifetime, so the distribution across your list tells you the shape of your engagement even if the level is inflated.

Can I find members who never read anything?

Yes. Filter on email_open_rate at or near zero with a meaningful email_count, which distinguishes a genuinely dormant member from someone who joined last week and has been sent nothing. Cross-check against last_seen_at. That combination gives you a re-engagement segment, and if that fails, a removal list that will improve your deliverability.

Does the export include members who unsubscribed?

It includes members who unsubscribed from emails, marked by subscribed_to_emails being false, but it excludes members who deleted their account entirely. So your growth chart is net of deletions and the deleted_at column is usually empty. A paid member who unsubscribed from emails is still paying you, which is a state worth watching rather than ignoring.

Where does the file go when I drop it?

Nowhere. It is read by JavaScript in your browser tab and held in memory while you look at it. A Ghost member export is a full list of email addresses with payment status attached, which under most privacy regimes is personal data you are responsible for. There is no upload on this page and no account to create.

Split 100 members three ways

Free, paid and comped, with tiers comma-joined, per-member open rates and a realistic dormant tail. Load it and see the paid conversion rate honestly.

Open the sample Ghost dashboard