Weekly Recharge subscription health report in Slack

Every Monday morning, get last week's subscriber growth, cancellations, and failed payment numbers posted to Slack and logged to a running spreadsheet.

Deterministic Code
RechargeGoogle SheetsSlack BotOperationsFinanceDaily DigestsData Sync
PromptCreate

On a cron schedule, every Monday at 8am, build a deterministic weekly subscription health report for my Recharge store. This is a pure reporting workflow: no interpretation, no commentary, no AI summarization. Every figure is computed the same way every week so the numbers are directly comparable across runs.

Reporting window: the seven full days ending the day before the run, so a Monday run covers the previous Monday 00:00:00 through Sunday 23:59:59 in the store's timezone. Compute the window once at the start and reuse the exact same boundaries for every call, so subscriptions, charges, and orders all describe the same seven days.

Pull the data from Recharge with List Subscriptions, List Charges, and List Orders. Use List Subscriptions twice: once for status active filtered to subscriptions created inside the window (these are the week's new subscriptions), and once for status cancelled. Recharge does not offer a reliable cancelled_at filter, so for the cancelled pass request the window using updated_at_min and updated_at_max, then keep only records whose cancelled_at field actually falls inside the window. Use List Charges three times, once each for status success, error, and queued, scoped to the window. Use List Orders for the same window.

Pagination matters here and must be handled correctly or the numbers will be silently wrong. Recharge list responses are cursor based, returning next_cursor and previous_cursor. limit defaults to 50 and maxes at 250, so set limit to 250. Critically, a cursor cannot be combined with any other filter: send the filters only on the first request of each set, then send only cursor and limit on every following page. Keep following next_cursor until it comes back empty, and accumulate the records. The 2021-11 API version removed total record counts from list responses, so never look for a total field. Every count in this report is derived by counting the records you actually paginated through. Send the X-Recharge-Version: 2021-11 header on every request.

Compute the week's figures from the collected records. New subscriptions is the count of subscriptions created in the window. Cancellations is the count of subscriptions cancelled in the window. Net subscriber change is new subscriptions minus cancellations, and may be negative. Orders is the count of orders in the window. Successful charge revenue is the sum of the total price of every success charge. Failed charge value is the sum of the total price of every error charge. Failure rate is failed charge count divided by the count of charges actually attempted, meaning success plus error, expressed as a percentage with one decimal place. Queued charges are counted and reported separately but deliberately excluded from the failure rate, because they have not been attempted yet. If there were no attempted charges at all, report the failure rate as 0.0% rather than dividing by zero.

Recharge money fields are decimal strings in the store's currency, for example "12.99", not integer cents. Parse them as decimal numbers, sum them, and round the totals to two decimal places. Do not multiply into cents and do not assume any fixed currency symbol.

Before writing anything, get last week's figures for the comparison by reading the tracker spreadsheet with the Google Sheets Get Values operation, taking the last populated row. That row is the previous run's output, which makes the sheet the source of truth for the trend and avoids re-querying Recharge for an older window. If the sheet has only a header row, or no rows at all, treat this as the first run: skip the comparison entirely and note in the Slack post that there is no prior week yet.

Append one row per week to the Google Sheets tracker using Append Values, so the history accumulates rather than being overwritten. Columns in order: week start date, week end date, new subscriptions, cancellations, net change, orders, successful charge revenue, failed charge value, queued charges, failure rate. Use valueInputOption USER_ENTERED so dates and numbers land as real dates and numbers and stay chartable. If the sheet is empty, write the header row first, then the data row.

Then post the same figures to a Slack channel using the Slack Bot Send a Message operation. Keep it to one compact block, with each number followed by the prior week's value in parentheses and a direction indicator, up, down, or flat. Order the lines: new subscriptions, cancellations, net change, orders, successful charge revenue, failed charge value, and failure rate last so it reads as the health metric. For example: "New subscriptions: 142 (128) up" on its own line, ending with "Failure rate: 3.2% (4.1%) down". Lead with a one line header naming the date range, such as "Recharge weekly health, Mar 3 to Mar 9". No narrative, no analysis, no recommendations, just the labelled figures.

Respect the Recharge rate limit while paginating: a 40 request leaky bucket refilling at 2 requests per second on standard plans. Pace the requests so bursts stay inside the bucket, and on a 429 wait about two seconds and retry rather than failing the run. If Recharge cannot be reached at all, fail the run without appending a partial row to the tracker, so the sheet never contains a half computed week.

What does this prompt do?

  • Counts your new subscribers, cancellations, and net change for the previous week from your Recharge store
  • Adds up how much you collected in successful payments, how much failed, and what share of payment attempts failed
  • Adds one new row per week to a Google Sheets tracker so the trend builds up over time instead of being overwritten
  • Posts the same figures to a Slack channel with last week's number beside each one, so the team sees direction rather than a snapshot

What do I need to use this?

  • A Recharge store and an API token from your Recharge admin with read access to subscriptions, charges, and orders
  • A Google account with a spreadsheet to use as the weekly tracker
  • A Slack workspace and a channel where the report should be posted
  • About a minute to pick the day and time the report should run

How can I customize it?

  • Change the schedule if Monday at 8am is not when your team reviews numbers, for example a Friday afternoon wrap up instead
  • Point the report at a different Slack channel, or send it to several channels if finance and support both track churn
  • Adjust which figures appear and in what order, or add order volume and average order value alongside the payment numbers

FAQs

Do I need to build a dashboard or learn a reporting tool?
No. The numbers arrive in Slack as a short weekly message, and the same figures are saved to a spreadsheet you already own. There is nothing new to log into and nothing to remember to open.
What does the failure rate actually measure?
It is the share of attempted payments that failed during the week, calculated as failed charges divided by all charges that were actually attempted. Payments still queued for a future date are left out, because they have not been tried yet.
Will this overwrite my spreadsheet each week?
No. Each run adds one new row underneath the previous ones, so the sheet becomes a running history you can chart or hand to your accountant.
What happens on the very first run when there is no previous week to compare against?
The first report posts the week's figures on their own and notes that there is no prior week yet. Every run after that includes the comparison automatically.
Does someone need to interpret or write up the results?
No. The report is deliberately just the numbers, calculated the same way every week, so the figures are directly comparable and nobody has to draft commentary.

Related templates

Build a credential rotation checklist when someone leaves

When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.

1Password
Rippling
Slack Bot
+1
Agentic Task
Weekly Amazon S3 bucket security audit posted to Slack

Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.

Amazon S3
Slack Bot
Google Sheets
Agentic Task
Log Agorapulse social conversations to HubSpot contacts

Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.

Agorapulse
HubSpot
Slack Bot
Agentic Task
Turn procurement portal tenders into CRM deals each morning

Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.

Anchor Browser
Google Sheets
HubSpot
+1
Agentic Task
Clean up HubSpot contacts from your Amazon SES suppression list

Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.

Amazon SES
HubSpot
Slack Bot
Agentic Task
Draft polite follow-ups for emails that never got a reply

Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.

Aurinko
Google Sheets
Slack Bot
Agentic Task

Stop pulling subscriber numbers by hand every Monday.

Get growth, churn, and failed payment figures in Slack before your week starts, and a spreadsheet trend that builds itself.