Skip to main content

benecaster_cutoff_billing_pause_complete

Action Premium

What it is for: telling something outside Benecaster that a group of your subscribers just stopped being billed, so your own records do not go on saying they are paying customers. A CRM, an analytics warehouse, a Slack channel, your own emails — anything that mirrors subscriber state needs to hear about this, because nothing else will tell it.

Why the sweep happens at all: when a podcaster’s own Benecaster license reaches Day-30 hard cutoff their feeds go dark, and Benecaster pauses collection on every built-in-membership Stripe subscription so nobody keeps paying full price for a feed that has stopped. This action reports the outcome of that sweep. It fires once per sweep, not once per subscriber.

Each subscription that paused successfully is tagged GRACE_TIMEOUT in benecaster_subscriptions.paused_reason (see PauseReasons for the full set), which is what lets the later resume restore exactly this cohort and nothing else.

Hook this for $failures and $skipped_shows, not for $paused. The count says the happy path worked; the two arrays say who is still being charged for a feed that has stopped. Benecaster already raises a dashboard notice naming the affected shows — hook this when a dashboard notice is not enough, which on a site with real subscribers it usually is not.

Pausing is not cancelling. A paused Stripe subscription keeps its history, payment method and customer relationship, and resumes cleanly if the license is brought current. Nothing here cancels or refunds anything, and closing a subscription for good stays the podcaster’s decision.

The worked example covers both sweeps, including why a resume failure is the inverse harm and what to do about $skipped_shows.

Parameters

Name Type Default Description
$paused int — Subscriptions successfully paused and tagged.
$failures array — **The argument that matters.** One entry per subscription the Stripe call failed on, each `{ subscription_id: string, show_id: int, message: string }`. Every entry is a subscriber still being charged for a feed that returns an error — the exact outcome this sweep exists to prevent. Empty on a clean run. Treat a non-empty array as an incident, not as telemetry.
$skipped_shows array — Shows the sweep could not act on at all, as `show_id => reason`. Two reasons: `test_mode` — the show is configured for test mode while holding live subscriptions, so Benecaster cannot reach them; `no_keys` — its Stripe credentials are missing or unusable. Every subscriber on a skipped show keeps paying. Empty on a clean run.

Notes

Do not write to paused_reason from a callback on this hook. The column is the only local record that a subscription is paused at all — Stripe leaves subscription.status as active while pause_collection is set — and the resume sweep selects on it. See PauseReasons.

Need this built rather than just documented? See our services →