Email Types Reference
Every email Benecaster sends carries a type string — a stable identifier used to target that one email through the filter and action families below. This page is the developer-facing index of those strings. For what each email says and when a podcaster would turn it off, see Automated Emails.
Type strings are stable public API. They will not change between minor versions.
Benecaster Types
Sent from the podcaster’s WordPress site via EmailQueue.
| Type string | Sent when |
|---|---|
welcome |
A subscriber’s feed token is generated for the first time |
token_reset |
A feed token is reset, by admin or by the subscriber |
feed_link |
A podcaster uses Email feed link on a subscriber to re-send the feed URL they already have. Nothing is reset, so the subscriber’s podcast app keeps working — the whole difference from token_reset |
tier_change |
A subscriber’s tier is updated — upgrade, downgrade, or admin change. For a built-in membership upgrade from the account page, it is sent when the payment succeeds, and it is the only email for that move |
donation_thank_you |
A Listener Support donation is logged and a donor email address is available |
subscription_receipt |
A built-in membership payment is confirmed by Stripe — initial activation and every renewal |
renewal_reminder |
A configurable number of days before a built-in membership subscriber’s renewal |
payment_failed |
The first time Stripe fails to charge a built-in membership renewal |
cancellation_confirmation |
A built-in membership subscriber requests cancellation through their account page |
price_change_notice |
A podcaster changes a built-in membership price and moves existing subscribers to it after a notice period. States the old and new price and the date of the first renewal at the new price. Always sent — it is the notice itself |
price_change_reminder |
Optional, a chosen number of days before the first charge at a new price (after the notice, before the charge). Can be switched off per show |
price_change_cancelled |
A podcaster cancels a price change before it takes effect, to every subscriber who was told about it |
cadence_switch_scheduled |
A built-in membership subscriber schedules a self-service switch to another billing period of their tier (e.g. monthly to annual) from their account page |
tier_switch_scheduled |
A built-in membership subscriber schedules a move down, or to a tier at the same price, from their account page. tier_change is sent separately when the move lands. Never sent for an upgrade, which is charged and lands at once |
free_tier_switch_scheduled |
A built-in membership subscriber chooses the show’s free plan from their account page. Confirms the date their paid plan ends, that they will not be charged again, and that they stay a member with the same feed address. tier_change is sent when the move lands; subscription_cancelled is not |
tax_address_needed |
Stripe Tax can no longer work out the tax for a built-in membership subscriber’s billing address, so their renewals are charged without tax. Sent once when it happens. Links to the account page’s Billing address form. Always sent; no per-show switch |
tax_threshold_nudge |
A show’s built-in membership sales pass US$1,000, or about the same in other currencies, in the calendar year, after tax and refunds. Sent to the site admin email address, not a subscriber, at most once a year per show, and not while Stripe Tax is active in the show’s Stripe account |
subscription_cancelled |
Any bridge’s membership reaches a terminal ended state — not built-in membership only. Sent for a deliberate cancellation and, since 2026-09-18, for a lapse (a fixed term ran out, renewals gave up) too; the email wording says “cancelled” either way |
manual_grant_expired |
An admin-comped access grant expires |
promote_grace_reminder |
About 7 days before a promote-to-bridge grace period expires |
promote_grace_expired |
A promote-to-bridge grace period elapses without re-authorization |
guest_password_set |
A WordPress account is created for someone rather than by them — bulk enrollment, a subscriber added by hand, or a completed donation. Not sent for [benecaster_subscribe] signups, where the subscriber chooses a password on the form |
already_following |
Someone submits the follower signup form with an address that already follows |
follower_confirm |
Someone signs up to follow a show that asks followers to confirm their address. Carries the link that confirms the signup and delivers their feed URL |
email_verification |
A subscriber changes their email address on the account page. Goes to the NEW address with a single-use link that promotes it; the account keeps the old address until the link is clicked, so a typo can’t lock anyone out |
donor_data_erasure |
A Listener Support donor asks, by email address, for their donation details to be removed. Carries a single-use link that confirms the request. Donors usually have no account, so it goes to the address they typed |
broadcast |
A podcaster sends a one-off message to chosen listeners of one show (paying subscribers, followers, everyone, or particular tiers), from Benecaster → Broadcasts or through benecaster_send_broadcast(). Marketing: either opt-out level stops it, and it carries a List-Unsubscribe header. Every send supplies its own subject and body; the registered subject News from {{show_title}} and the broadcast.php template are only what a preview shows with no message |
Every type carries a default subject and template. On benecaster_managed_email_types, each Benecaster type has default_subject (with its {{tags}} unfilled, such as Your {{show_title}} receipt — {{amount_formatted}}) and default_template_path. They are what the type sends with when nothing overrides them, and what an email editor starts from.
The email log records a send as queued, sent, failed, suppressed (stopped by an opt-out), or test (a test send, which has no queue row).
benecaster_token_revoked is an action hook, not an email type. It fires whenever a token is revoked (see benecaster_token_revoked), but there is no corresponding token_revoked email — it is not registered in EmailTypeRegistry and does not appear in the table above.
Add-on Types
Not registered, and not present in email settings, unless the add-on is active.
| Type string | Add-on |
|---|---|
episode_notification |
Email Editor |
analytics_digest_daily |
Analytics Dashboard |
analytics_digest_weekly |
Analytics Dashboard |
analytics_digest_monthly |
Analytics Dashboard |
Add-ons may register further types through benecaster_managed_email_types. Those follow the same snake_case convention and are documented by the add-on that owns them.
Not Plugin Types
License server emails are dispatched from benecaster.com, not through the plugin’s EmailQueue. They fire none of the hooks below, never appear in the queue, and cannot be filtered or templated. If a filter you expect to fire never does, check whether the email actually originates on the site.
Filter Families
Every filter below has a shared form and a type-specific variant. The pattern is {filter}_{$email_type} — so benecaster_email_subject_welcome targets only the welcome email.
| Shared filter | Type-specific variant | Filters |
|---|---|---|
benecaster_email_should_send |
benecaster_email_should_send_{type} |
Whether the email dispatches at all |
benecaster_email_subject |
benecaster_email_subject_{type} |
Subject line |
benecaster_email_body_html |
benecaster_email_body_html_{type} |
HTML body |
benecaster_email_body_text |
benecaster_email_body_text_{type} |
Plain-text body |
benecaster_email_from_name |
benecaster_email_from_name_{type} |
Sender name |
benecaster_email_from_address |
benecaster_email_from_address_{type} |
Sender address |
benecaster_email_merge_tags |
benecaster_email_merge_tags_{type} |
Resolved merge tag map |
Type-specific variants take one fewer parameter — $email_type is omitted, since it’s encoded in the hook name. Everything else, including return type, is unchanged.
Use the type-specific variant when your callback targets one template. Use the shared filter when one callback handles several types differently.
Actions
| Shared action | Type-specific variant | Fires |
|---|---|---|
benecaster_before_email_send |
benecaster_before_email_send_{type} |
Immediately before dispatch |
benecaster_after_email_send |
benecaster_after_email_send_{type} |
Immediately after dispatch |
Suppression and Transactional Status
benecaster_email_should_send will suppress any type, but that does not make suppressing any type advisable.
Transactional emails should never be suppressed by your own code. welcome and token_reset are the delivery mechanism for feed URLs — suppress them and subscribers simply never receive access, with nothing surfaced to explain why. Billing emails carry the same weight for compliance reasons: price_change_notice, price_change_reminder, price_change_cancelled, and cadence_switch_scheduled each state what the subscriber is about to be, or was just, charged.
A subscriber’s own unsubscribe choice is a separate mechanism from this filter, and it has three tiers:
| Type | Stopped by a broadcast opt-out | Stopped by a full opt-out |
|---|---|---|
broadcast and other non-transactional types |
Yes | Yes |
episode_notification (Email Editor add-on) — answers to its own new-episode opt-out (episode_notifications), which stops nothing else |
No | Yes |
Transactional types (listed in UnsubscribeManager::TRANSACTIONAL_TYPES, filterable via benecaster_transactional_email_types) |
No | Yes |
Types registered with 'unsubscribable' => false |
No | No |
broadcast is the only genuinely marketing-class type in the list. follower_confirm is neither transactional nor exempt, so a subscriber who opted out of broadcasts on that show does not get it. A broadcast opt-out is a marketing preference, so a subscriber who opted out of broadcasts still receives their feed URL and their billing emails; only a full opt-out stops those.
guest_password_set, already_following, email_verification, feed_link and donor_data_erasure are registered with unsubscribable: false, and are delivered through both opt-out levels. Each is a one-shot reply to something the person or their podcaster just did: the password for an account created for them, the response to a signup form they submitted, the link that completes an address change they asked for, the feed URL a podcaster re-sent them with Email link, and the link that confirms a donor’s request to have their details removed. They also carry no List-Unsubscribe header, since a one-click button would record a preference that is then ignored for that type.
The flag is read from the benecaster_managed_email_types catalogue, so an add-on can give its own type the same protection by registering it with 'unsubscribable' => false. Absent means suppressible: the exemption has to be declared. It is a much stronger claim than being transactional, so reserve it for mail a person cannot do without. benecaster_email_should_send still runs for these types like any other — the exemption covers the subscriber’s opt-out, not your own code.
If your goal is to route an email through your own service rather than stop it, suppress with this filter and send it yourself in the same callback — don’t suppress and assume something else will deliver it.
Merge Tags
Available tags vary by type. See Email Merge Tags for the full catalog, including the global set available to every type and how to register your own.
See Also
Need this built rather than just documented? See our services →