Review what inactive beehiiv subscribers cost, then cut them
Break your audience into cohorts, see what each one costs you monthly, and unsubscribe the dead weight in bulk with a spreadsheet record of everyone removed.
Build me a list hygiene console for my beehiiv newsletter. I pay per subscriber, and beehiiv gives me nowhere good to review dead weight before I cut it. I want one screen that shows me what each slice of my audience costs me, lets me look at the actual people in it, and then lets me remove them deliberately, with a permanent record of who went.
This is an app, not an automation. Nothing may run on a schedule or in response to an event. The bulk writes are destructive and irreversible, so a human has to see the cohort and confirm before anything runs. Do not add any auto-prune behaviour anywhere in this app.
Main view: a cohort overview. Use beehiiv List Subscriptions filtered by status and by tier to build the cohorts, and use List Segments plus List Segment Members to add each of my existing segments as its own cohort. Default cohorts should cover things like unconfirmed or pending signups, subscribers whose status is inactive or invalid, free tier subscribers with no recent engagement, and every segment I already have. Each cohort row shows its name, its subscriber count, and the monthly cost of that cohort calculated as count multiplied by the per subscriber rate stored in settings. Sort by cost descending so the most expensive dead weight sits on top. Pull publication level context with Get Publication Engagements so I can see overall open and click trends next to the cohort table, and use List Publications on first load so I can pick which publication I am working on.
Cohort detail view: when I select a cohort, show a paginated sample table of the real people in it. For a status or tier cohort read from List Subscriptions with the same filters; for a segment cohort read from List Segment Members, and use List Segment Member IDs when you only need the identifiers for a bulk write. Each row should show email, status, tier, when they subscribed, and where they came from. Show the full cohort size clearly next to the sample so I never confuse a sample of fifty with the real number I am about to remove.
Mandatory export step. Before any bulk change runs, append every affected subscriber to Google Sheets using Append Values, one row per person with email, subscriber id, status, tier, the cohort name, the action taken, and a timestamp. This is not optional and there is no skip option in the UI. If no log spreadsheet is configured yet, use Create Spreadsheet to make one with a header row and save its id in app settings for every future run. If the append fails, stop and do not run the bulk write.
Primary action button: unsubscribe the cohort. After the Sheets export succeeds, run Bulk Update Subscription Status to set the selected subscribers to unsubscribed, or Bulk Update Subscriptions when the change needs more than a status field. Require a confirmation step first that restates the cohort name, the exact number of people, and the monthly cost being removed, and make me type the count to proceed. These writes are asynchronous: beehiiv returns an import id or subscription update id and the job moves from pending to processing to complete or failed. Store that job id, poll List Bulk Subscription Updates in the background, and show live progress on screen. Use Get Bulk Subscription Update to pull the detail and error log for a single job when I open it. Chunk anything over a thousand subscribers into multiple jobs and show them as one grouped operation.
Secondary action button: build a re-engagement segment instead of deleting. Use Create Segment to make a new segment from the selected cohort so I can send those readers a last chance campaign before removing them. Name it after the cohort and the date. Note in the UI that segments built from custom field rules are processed asynchronously by beehiiv and start as pending, while segments built from an explicit subscriber or email list complete straight away.
Jobs view: a history of every cleanup I have run, showing the cohort, how many people were affected, the current job status, when it started and finished, any errors, and a link to the spreadsheet rows that were written for that run. This is the audit trail I go back to when someone asks why they stopped receiving the newsletter.
Settings view: the per subscriber rate and billing period used for all cost math, the selected publication, the log spreadsheet id and tab name, the cohort definitions including which statuses and tiers count as dead weight, and the sample size for the detail table. Persist all of it so the app remembers my setup between visits.
Practical notes: beehiiv list responses are paginated with a cursor and a maximum page size of one hundred, so page through fully when counting a cohort rather than reporting the first page as the total. beehiiv allows one hundred and eighty requests per minute, so batch reads sensibly and back off on rate limit errors. Show cohort counts as loading rather than showing a wrong number early.
What does this prompt do?
- Splits your newsletter audience into cohorts by status, tier and segment, and puts a monthly dollar figure next to each one based on the per subscriber rate you enter
- Lets you open any cohort and read through a sample of the actual people in it before you decide anything
- Writes every affected subscriber to a Google Sheets log first, then unsubscribes the cohort in bulk and tracks the removal job to completion on screen
- Gives you a second option on any cohort: turn it into a re-engagement group and try to win those readers back instead of removing them
What do I need to use this?
- A beehiiv account with access to the publication you want to clean up
- A Google account so the app can keep a permanent removal log in a spreadsheet
- The per subscriber rate you actually pay, so the cost column reflects your real bill
- Someone who is comfortable deciding who gets removed, since unsubscribing is not reversible
How can I customize it?
- Change the cohort definitions: which statuses, tiers and segments count as dead weight, and how long someone has to be quiet before they qualify
- Set your own per subscriber rate and billing period so the cost figures match your plan
- Point the removal log at an existing spreadsheet, or let the app create a fresh one the first time you run a cleanup
- Adjust how many people the sample table shows before you commit to a cohort
FAQs
Can this remove subscribers without me approving it first?
What happens if I remove the wrong people?
Why does the removal take a while to finish?
Can I try to win people back instead of cutting them?
Will this work with my beehiiv plan?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
Stop paying every month for subscribers who never open anything.
See what each slice of your list costs you, review the people in it, and prune with a permanent record of every removal.