Monday morning beehiiv newsletter report to Sheets and Slack
Every Monday at 8am, log last week's newsletter numbers to Google Sheets and post a Slack digest with week-over-week deltas and top performers.
Build a code workflow that runs every Monday at 8am (in my local timezone) and produces a weekly beehiiv performance report. The trigger is cron. This is a deterministic pipeline, no drafting or judgement, so please ship it as a code workflow with discrete nodes.
Step 1. Compute the reporting window: the previous Monday 00:00 through Sunday 23:59, plus the equivalent 7-day window before that so we can calculate week-over-week deltas.
Step 2. Call beehiiv Get Post Aggregate Stats scoped to the current 7-day window to grab the top-level totals: sends, unique opens, unique clicks, unsubscribes, and subscriber growth. Call it again for the prior 7-day window so we can compute week-over-week deltas for each metric.
Step 3. Call beehiiv List Posts with the stats expansion enabled and status filter set to confirmed, scoped to the current window, so we get each issue that shipped that week with its per-post stats (recipients, opens, clicks, unsubscribes, top clicked URL).
Step 4. For each issue in the list, build a row with these columns: publish date, post title, sends, open rate, click-to-open rate, unsubscribe rate, and top clicked URL. Use beehiiv Google Sheets Append Values to write those rows to the Newsletter KPIs tab of a Google Sheet the user picks during setup. This builds a permanent historical log.
Step 5. Compose a Slack digest string that leads with the week-over-week deltas on the top-level totals (up/down arrows and percentages), then calls out the best-performing issue of the week (highest click-to-open rate) and the worst-performing issue (lowest open rate), and finishes with a link to the Google Sheet. Post it with Slack Bot Send a Message to a channel the user picks during setup.
Config the user should be prompted for at build time: beehiiv publication id, Google Sheet id and tab name (default: Newsletter KPIs), Slack channel id, and timezone. If no issues shipped in the window, still post the top-level deltas and note that no issues shipped this week.
Additional information
What does this prompt do?
- Pulls last week's beehiiv totals (sends, opens, clicks, unsubscribes, subscriber growth) and every issue that shipped in that window.
- Appends one row per issue to a Google Sheets tab so you build a permanent, historical log you can chart and filter.
- Posts a Slack digest at 8am Monday that leads with week-over-week changes, calls out the best and worst performing issue, and links back to the sheet.
- Runs on a schedule, hands-off. No manual CSV exports, no copy-paste into a thread.
What do I need to use this?
- A beehiiv account with API access on the publication you want to report on.
- A Google account with edit access to the destination Google Sheet (a tab called Newsletter KPIs works well).
- A Slack workspace and the channel you want the Monday digest posted in.
How can I customize it?
- Change the schedule (for example, Tuesday at 9am, or a bi-weekly cadence) or the timezone the 7-day window is measured in.
- Point it at a different Google Sheet, tab name, or column layout, or split free vs paid audiences into separate rows.
- Swap the Slack channel, add extra callouts (like a subscriber milestone), or route the digest to a private founder DM instead.
Frequently asked questions
Which newsletter numbers show up in the report?
Does it work if we only publish one issue a week?
Can I change the day and time it runs?
Will it overwrite my existing Google Sheet?
Can it post to more than one Slack channel?
Related templates
Stop rebuilding the newsletter report every Monday.
Connect beehiiv, Google Sheets, and Slack once and let this run every Monday at 8am.