Free
Beginner
No code needed for the common case. Open Show Settings → Feeds and paste the service’s prefix into Enclosure URL prefix — e.g. https://dts.podtrac.com/redirect.mp3/, https://op3.dev/e/, or your Podscribe…
Premium
Beginner
For core’s own pretty form you need no code. Tick Benecaster → Settings → Permalinks → Private feed URLs → Use pretty feed URLs and every subscriber URL…
Premium
Intermediate
A subscriber who holds more than one membership at once — say a “Newsletter” tier and a “Podcast” tier — does not get two feeds. Benecaster builds each…
Free
Beginner
The itunes:new-feed-url redirect tag is driven by stored post meta, but sometimes you need to suppress it for a specific tier feed without touching the settings — for…
Free
Intermediate
Two hooks work in combination here: benecaster_episode_custom_fields exposes a custom field’s value through the episode data layer, and benecaster_rss_extra_item_tags appends the corresponding XML to each RSS item. Use…
Free
Beginner
Pairing benecaster_feed_before_render with benecaster_feed_after_render gives you the real render duration for a feed request. Useful when you suspect feed generation is slow but want evidence rather than a…
Free
Beginner
Benecaster manages chapter markers natively via the episode editor. Use this recipe when you need to append a podcast:chapters tag directly — for example, to pull chapter data…
Free
Beginner
Benecaster manages chapter data natively in the episode editor. Use this recipe when your chapter data lives in an external service — Podlove, Ausha, or a custom endpoint…
Premium
Beginner
Emit podcast:transcript tags per episode by pulling transcript URLs from post meta. Supports multiple formats per episode (SRT, VTT, etc.) and works with Rev, Sonix, Descript, or any…
Free
Beginner
No code needed for the common case. In the episode editor, open Media and paste the clip’s URL into Preview clip URL — a trailer or the first…
Premium
Beginner
The default locked-content message is generic. This recipe customizes the message based on the tier required to access the episode — showing “Upgrade to Premium” for paid-only content…
Premium
Intermediate
Benecaster’s bridge system handles subscription-based access, but sometimes access should be granted based on a one-time product purchase rather than a recurring membership. This recipe uses benecaster_episode_is_accessible to…
Premium
Beginner
When a valid, unexpired token is presented but the subscription bridge returns no active tiers, Benecaster fires this hook before determining what to serve — a 403, the…
Premium
Beginner
Benecaster already does this, and for most sites that is enough. Invalid token attempts are recorded in the feed request log without any code from you, and an…
Premium
Intermediate
When a subscriber stops polling their feed for longer than the configured threshold, Benecaster marks them at_risk and fires benecaster_subscriber_feed_inactive — once, not daily. This recipe enqueues a…
Premium
Beginner
Signing up and actually listening are two different events, and the gap between them is where subscribers quietly fall away. Somebody pays, receives a feed URL, means to…
Premium
Beginner
WooCommerce’s My Account page is where subscribers naturally look for order details. Adding the Benecaster feed URL here — using benecaster_get_feed_url() — gives subscribers a familiar place to…
Premium
Beginner
If you’re not using the Email Marketing Integrations add-on, or if you need audience tagging logic that differs from what the add-on provides, you can wire Benecaster’s token…
Premium
Beginner
Benecaster relays bridge events as WordPress actions, making the same code work regardless of whether the site uses MemberPress, WooCommerce Subscriptions, Restrict Content Pro, or a custom bridge.…
Premium
Intermediate
Forward subscriber lifecycle events — join, churn, and tier change — to an external analytics or data platform (GA4 Measurement Protocol, Segment, Mixpanel, or a custom webhook). These…
Premium
Beginner
When your source of truth for subscriber counts is external — a hosting platform, payment processor, or BI tool — override benecaster_get_subscriber_count() to return the external figure. Cache…
Premium
Beginner
The availability check cron fires after each pass and reports how many tier/episode pairs just became available. When $unlocked_count > 0, new content just unlocked — use this…
Premium
Beginner
Access gets taken away for all sorts of reasons: a subscription lapses, a bridge syncs, some custom code tidies up. Most of those are routine. A person deciding…
Premium
Beginner
When an admin resets a subscriber’s token and checks “Send notification email”, this hook fires with the new plaintext token — allowing any notification channel (Slack, CRM, custom…
Premium
Beginner
benecaster_subscription_tier_changed fires on every tier change, bridge-driven or admin-triggered. Use it to send a Slack alert, CRM event, or any secondary channel alongside the built-in tier_change email.
Free
Beginner
benecaster_subscriber_access_revoked fires on every admin-initiated revocation. Use it to send a Slack alert or CRM event. There is no built-in revocation email to supplement.
Free
Beginner
Fire a webhook — to a notification service, automation platform, or custom endpoint — the moment a new episode goes live. benecaster_episode_published fires at save_post priority 20, after…
Free
Beginner
Fires when an episode leaves ‘publish’ — whether trashed, reverted to draft, or set to private. Pair with benecaster_episode_published to keep external CDN caches and search indexes in…
Free
Beginner
Fires exactly once per episode lifetime on the first save. Use to bootstrap external records — a project management task, a CMS entry, or an audit trail row…
Free
Intermediate
Fires on every episode save that is not the first creation. $changed_fields lists only the post-table columns that actually changed (title, content, post_status, post_date) — it is empty…
Free
Beginner
Fires from WordPress’s before_delete_post — the episode still exists in the database at this point, so get_post(), get_post_meta(), and get_the_title() all return valid data. Use to remove external…
Free
Beginner
Fires when episode details are edited and saved — but only when something actually changed. Opening an episode and saving without modifications does not trigger this hook. When…
Free
Beginner
Benecaster assigns max + 1 across all published episodes by default. Use this filter to suppress auto-numbering for trailers and bonus episodes, restart numbering per season, or skip…
Free
Beginner
When a show has custom episode types that need to resolve to a specific iTunes value regardless of admin configuration, use this filter to override the resolved type…
Premium
Intermediate
Three show lifecycle hooks cover the full CRUD lifecycle. benecaster_show_created fires once on first save; benecaster_show_updated fires on every subsequent save with a $changed_fields array listing post-level changes;…
Premium
Intermediate
Fires each time an admin saves a bridge selection — from both the setup wizard and the Settings → Subscription tab. Use to seed bridge-specific defaults, trigger an…
Free
Beginner
The daily cron removes expired itunes:new-feed-url redirect tags automatically. benecaster_redirect_expiry_run fires once per run with the count and affected show IDs. Use to notify show owners, update an…
Premium
Beginner
Fires when a new tier appears in the membership plugin without a matching Benecaster tier mapping. The built-in admin notice already reacts to this action; this recipe adds…
Premium
Beginner
Benecaster’s built-in welcome email covers the basics, but many podcasters have existing welcome sequences in SendGrid with branding, sequences, and conditional logic that the built-in template can’t replicate.…
Premium
Intermediate
Custom merge tags registered via benecaster_email_merge_tags are available in all Benecaster emails. With the Email Editor add-on active, these tags are also available in the drag-and-drop template builder…
Premium
Beginner
When a subscriber opts out of Benecaster emails via the unsubscribe link, propagate the opt-out to your Mailchimp audience so the preference is consistent across systems. benecaster_email_resubscribed fires…
Premium
Beginner
Benecaster generates a plain text version of every HTML email automatically by stripping tags. The result is often acceptable but sometimes the automated plain text is hard to…
Premium
Beginner
Tags every outbound Benecaster email with a SendGrid category so the SendGrid dashboard can slice open-rate, bounce-rate, and unsubscribe metrics by email type. The category is attached by…
Premium
Intermediate
The email unsubscribe endpoint is public by design, but a bad actor with a list of subscriber IDs could use it to mass-unsubscribe your audience. Return false from…
Premium
Intermediate
Any email type registered via benecaster_managed_email_types appears as an editable template in the Email Editor UI. Add-ons that send their own email types — episode notifications, community alerts,…
Free
Beginner
benecaster_episode_imported fires after each episode is saved, whether it came from a one-time import or from Feed Sync — both are core. Feed Sync also runs benecaster_feed_sync_import_data first,…
Free
Beginner
Feed Sync re-scans the source feed and drafts anything whose GUID isn’t already on the show. When the old host keeps a permanent trailer at the top of…
Free
Beginner
When Benecaster imports episodes from an existing feed, it does so on a schedule and without saying anything. That is the right default once you trust it —…
Free
Intermediate
benecaster_feed_sync_import_data fires during core Feed Sync, before the draft is created. It reshapes only the keys it documents — title, content, description_rss, post_date, audio_url, file_size, mime_type, duration, episode_number,…
Premium
Intermediate
Three hooks wrap the nightly analytics prune: a skip filter (abort if a backup is in progress), a before action (log the start), and an after action (log…
Premium
Intermediate
Benecaster registers benecaster_episode with the field system automatically. Add-ons that introduce their own CPTs (e.g. Guest Manager’s benecaster_guest) must call benecaster_register_field_cpt() inside a benecaster_boot callback so the CPT…
Free
Beginner
Fires when custom field values on an episode are saved and at least one value actually changed, whether the podcaster saved the episode editor or an importer or…
Free
Intermediate
Prepend or append field groups generated at runtime — from external data, plugin state, or computed summaries — without storing them in the database. Synthetic groups (non-integer IDs)…
Free
Beginner
Custom fields store data in whatever shape is convenient to save: a date as YYYY-MM-DD, a price in whole cents, a related record as a bare post ID.…
Free
Intermediate
When a custom field value is saved in Benecaster, this hook fires immediately with the field ID, object ID, object type slug, and new value — including when…
Free
Intermediate
The simplest way to extend the episode editor. Declare a tab with sections and fields using a PHP array — no JavaScript required. The Benecaster admin app fetches…
Premium
Advanced
For interactive UI that can’t be expressed as a field declaration — custom pickers, live previews, embedded third-party widgets — add-ons register React components directly into named extension…
Premium
Intermediate
Register the route with WordPress directly and use Benecaster’s permission callback, benecaster_rest_permission_admin(). No base class, no container, no benecaster_boot — the endpoint is a plain WordPress route that…
Free
Intermediate
Reference groups organise show-notes links into labelled sections. Groups normally come from the show’s own configuration, but an add-on can append one that exists only at render time…
Free
Intermediate
Fires before references is returned in the episode REST response. Each entry is a full reference object. Use to inject extra fields (e.g. a tracked redirect URL) or…
Premium
Advanced
Benecaster ships bridges for MemberPress, WooCommerce Subscriptions, Paid Memberships Pro and Restrict Content Pro. A bridge for any other membership plugin is written by implementing BridgeInterface and registering…
Premium
Advanced
Most membership systems assume one membership per person, and Benecaster’s bridges follow suit: asked which tiers somebody is on, a bridge answers with the one it found. If…
Premium
Intermediate
Each show is connected to one membership system — e.g. MemberPress, WooCommerce Subscriptions — and that connection is what Benecaster calls the show’s bridge. An add-on can both…
Premium
Intermediate
Benecaster calls onEpisodePublished() on every registered, configured platform when benecaster_episode_published fires. Implement this method to create a discussion thread, post an announcement, pin a notification, or update a…
Premium
Intermediate
Build a fully custom subscriber account page from benecaster_get_user_tier_for_show(), benecaster_get_feed_url(), and benecaster_get_template_part() in a theme template. This is the alternative to the built-in Blocks & Widgets account block…
Premium
Intermediate
Add-ons inject additional steps into the Setup Wizard by hooking into the steps array before the wizard runs. The wizard re-evaluates which steps are active whenever its state…
Premium
Intermediate
Add-ons that provide a non-built-in subscription bridge inject their card into the wizard’s Subscription step. The slug must match the bridge’s get_plugin_slug() return value so POST /bridge/activate can…
Premium
Beginner
Fires once when the Setup Wizard is completed. Use to seed default add-on settings for the new show, send a welcome notification, or trigger an external onboarding webhook.…
Premium
Intermediate
Add your add-on’s data to any Benecaster Analytics Digest (daily, weekly, or monthly) by injecting a data payload via benecaster_analytics_digest_data and registering a custom section via benecaster_analytics_digest_sections. This…
Free
Beginner
Trigger a Benecaster feed cache clear from any plugin, mu-plugin, or WP-CLI cron job using the benecaster_clear_feed_cache action. Supports global, show-scoped, and tier-scoped clears. benecaster_feed_cache_cleared fires after any…
Premium
Beginner
Change the wording of the upgrade prompt a logged-in subscriber sees when they land on an episode above their tier, or add a link to it, using benecaster_upgrade_prompt_html.…
Free
Beginner
Use benecaster_after_show_episode_list to inject HTML below the episode listing without overriding a template file. Each show page action hook fires with $show_id as its only argument. Swap to…
Premium
Beginner
Use benecaster_after_account_qr_code to append a section after all built-in account content. The action fires with ( int $show_id, int $user_id ). To insert before a built-in section instead,…
Free
Intermediate
Podcasting 2.0 is a set of extra tags that modern podcast apps understand — a funding link, a lock against unauthorised copying, a licence declaration. Benecaster fills in…
Free
Intermediate
The episode-level half of Podcasting 2.0: transcripts, soundbites, season numbers, per-episode artwork, and credits. Benecaster fills these in from the episode’s own settings, and benecaster_feed_podcast_episode_tags hands the set…
Premium
Intermediate
Inject read-only Podcasting 2.0 credits into an episode’s Feed Credits section without writing to post meta. Benecaster calls benecaster_podcast2_episode_auto_feed_credits after loading meta-stored credits, merges the returned array into…
Premium
Beginner
The current-tier shortcode drops a subscriber’s tier name onto a page. That is deliberately plain, and often not quite what a podcaster wants — they would rather greet…
Free
Intermediate
Use benecaster_episode_page_blocks when you need to add, remove, or reorder blocks per render based on episode or show context without touching the Show → Episode Page panel. Runs…
Free
Intermediate
Use benecaster_episode_nav_prev and benecaster_episode_nav_next to change which episode “prev” or “next” points to — for example, skipping bonus episodes, enforcing season boundaries in the Episode Page block, or…
Free
Advanced
Use benecaster_related_episodes_query_types to add a custom query strategy to the benecaster_related_episodes shortcode and the related_episodes Episode Page block. Any add-on can register one or more strategies; they appear…
Free
Beginner
Use benecaster_related_episodes to filter the resolved episode list before the shortcode or Episode Page block renders it. Return a modified array to inject specific episodes, enforce premium-only results,…
Free
Beginner
Filter the resolved social links array before [benecaster_social_links] or the episode page social block renders them. Each item is ['platform' => string, 'url' => string, 'label' => string].…
Free
Beginner
Filter the final HTML string produced by [benecaster_social_links] or the episode page social block. Use to swap in a custom icon set, wrap the list in additional markup,…
Free
Beginner
Filter the final output of [benecaster_rss_link]. Use to wrap the link in additional markup, swap in a custom SVG icon, conditionally suppress the link on certain pages, or…
Free
Beginner
Filter the final output of [benecaster_platform_links]. Use to wrap in additional markup, inject custom badge HTML for a specific platform, suppress the block on certain pages, or replace…
Free
Advanced
Return a non-null array from benecaster_search_pre_results to skip Benecaster’s own query entirely and substitute your own results — Elasticsearch, Typesense, or a custom DB query. Return null to…
Free
Beginner
Return false to remove an episode from every search response regardless of tier or query term. Useful when an episode is published but should not be discoverable —…
Free
Beginner
Override the per-result excerpt returned by the search endpoint. Useful to substitute transcript snippets, chapter titles, or custom-formatted highlights. The Transcription Service add-on uses this pattern to surface…
Free
Intermediate
Use when your add-on stores searchable content outside of wp_posts — transcripts, chapter titles, guest notes — and you want those episodes to appear in the standard [benecaster_search]…
Premium
Beginner
Benecaster fires benecaster_installed_addons during admin bootstrapping to build the list of loaded add-ons. Each add-on plugin should hook this filter inside its benecaster_boot callback and append its fully-qualified…
Premium
Intermediate
Connecting a show to a Benecaster account is a one-time moment, and a good one for an add-on to do its own first-run work: create whatever it needs,…
Premium
Intermediate
When a show’s daily licence check comes back unauthorized, Benecaster does not act on the first failure — it counts. Authentication fails transiently often enough that one rejection…
Premium
Intermediate
An add-on that adds screens to the Benecaster admin can also add a guided walkthrough of them, using the same tour system as the built-in ones — so…
Premium
Intermediate
Benecaster picks the audio URL for a given subscriber tier in three steps: it looks for a variant matching that tier exactly, then cascades down to broader tiers,…
Free
Advanced
Podcast apps read far more than the standard RSS fields. Podcasting 2.0, iTunes, and Podping each define their own tags, and new ones keep appearing. An add-on that…
Free
Beginner
Use the benecaster_psc_chapters filter to supply a structured chapters array for each episode. The compiler injects psc:chapters and psc:chapter elements inline into the feed item.
Premium
Beginner
Benecaster records every authenticated episode download. Those records are what the analytics screens are built from, but they are only read on a schedule — so if you…
Premium
Intermediate
benecaster_download_log_entry is the last chance to change a download record before it is written. Use it to attach something of your own — a campaign the listener arrived…
Premium
Beginner
The Top apps breakdown in download analytics works by looking for known fragments in what each podcast app calls itself, and grouping the matches under a friendly name.…
Premium
Intermediate
Benchmark data refreshes on a 24-hour cron cycle. Add-ons that need to drive a refresh in response to their own events can trigger one directly via the service…
Free
Intermediate
Benecaster issues a token to three different populations: paying subscribers, free-tier bridge members (a [Free] MemberPress level mapped into Benecaster, say), and direct followers who came in through…
Free
Intermediate
The follower signup shortcode creates a WordPress user, issues them a follower token, and then fires benecaster_follower_signed_up( int $user_id, int $show_id, string $tier_slug ). The hook means one…
Free
Intermediate
Resolving “who would this broadcast go to?” into a concrete list of WordPress user IDs is the starting point for a custom send — your own email queue,…
Premium
Beginner
benecaster_account_page_url() returns the permalink of the /podcast-account/ page Benecaster creates on activation. Every plugin-generated link to a subscriber’s account — token emails, QR code screens — goes through…
Premium
Beginner
Benecaster’s own account page is a WordPress page, which is no use to a headless front end or a native app. This endpoint returns the same information as…
Free
Beginner
Archiving a show retires it without destroying anything. Benecaster stops serving its feed — podcast apps get an HTTP 410, which tells them the show is gone for…
Free
Beginner
The three outer plugin templates call benecaster_get_header() / benecaster_get_footer() instead of WP core get_header() / get_footer(). The helpers dispatch to block_template_part( 'header'/'footer' ) on block themes, fall back…
Premium
Beginner
This is for add-ons that display Benecaster’s own plan and add-on prices — an upgrade prompt, a plan comparison, an add-on browser inside wp-admin. If you are not…
Premium
Beginner
Benecaster names add-ons two different ways, and the two do not match. The pricing catalogue — what the marketing site and the in-plugin add-on browser display — uses…
Premium
Intermediate
The outbound webhook system POSTs subscription/token events with a sha256= HMAC header. benecaster_webhook_payload runs once per event after the dispatcher assembles the payload, before signing. Add custom keys,…
Premium
Beginner
Fires when a transferred subscriber’s grace period elapses without re-authorization. By the time the action fires the subscriber’s token has already been revoked and a promote_grace_expired email has…
Premium
Intermediate
The Promote-to-Bridge wizard moves a show’s subscribers from one membership system to another. benecaster_bridge_promote_complete fires when it has finished, and reports how it went: how many subscribers were…
Premium
Advanced
The Promote-to-Bridge wizard moves a podcaster’s subscribers from wherever they are now into a membership plugin. Every bridge can be the source of that move — the place…
Free
Intermediate
A show’s episode pages can be hidden from the public site independently of anything to do with feeds or subscriptions. Two separate switches control it: one hides the…
Premium
Beginner
Tier badges are picked from a set of built-in icons — a crown, a star, a microphone. benecaster_badge_icons lets an add-on add its own to that picker, so…
Premium
Beginner
When a badge definition is deleted, Benecaster quietly removes the tier-auto rules and detaches manual grants — but anything outside of Benecaster doesn’t know it happened. If you’ve…
Premium
Intermediate
Badges are assembled from tier assignments and manual grants, then passed through benecaster_user_badges before rendering. Hook into this filter to change what a subscriber sees — hide a…
Premium
Beginner
benecaster_render_user_badges() returns a subscriber’s badge chips as ready-made HTML, so a theme can show them anywhere — a comment byline, an author box, a members directory — without…
Premium
Beginner
A subscriber who has not uploaded a photo, on a site with Gravatar switched off, has no picture at all — and WordPress’s stock placeholder is not something…
Premium
Beginner
Appearing on the Supporter Wall is a subscriber’s own decision, and it is a consent decision — they are agreeing to be shown publicly. If you keep that…
Premium
Beginner
Turning a show’s Supporter Wall on or off changes what its public pages contain. Under a full-page cache, those pages keep serving the old version — a wall…
Premium
Beginner
When the Supporter Wall has no opted-in subscribers to show, it displays a default empty message — “No supporters yet — be the first!” Use this filter to…
Premium
Intermediate
Fires after the default markup is assembled for both the populated and empty branches of the benecaster_supporter_wall shortcode. $html is the complete rendered output. $subscribers is the raw…
Premium
Beginner
A subscriber removing their photo is deleting something about themselves from your site, and they expect it to be gone. If your add-on copied that image anywhere —…
Premium
Intermediate
When a subscriber manages their own subscription in Benecaster’s billing portal, two different kinds of event describe it, and mixing them up is the usual source of bugs…
Premium
Beginner
A buy-up is an optional extra a subscriber adds to an existing subscription — bonus content, a physical perk, early access. When one is bought, you often want…
Premium
Beginner
Buy-ups are priced in US dollars by default. benecaster_buyup_currency lets a podcaster selling into one market charge in that market’s currency instead. Set it before the buy-up’s first…
Premium
Beginner
Buy-ups are optional add-ons subscribers can purchase on top of their existing plan — things like transcripts, bonus content, or extended access — without upgrading to a higher…
Premium
Intermediate
Three actions track the lifecycle of a buy-up grant. Normal customer flow: _purchased (subscriber clicks Add to my plan) → _cancelled (subscriber clicks Remove; cancel-at-period-end is set but…
Premium
Intermediate
Fires inside templates/account/buyups.php only when a buy-up has subscriber_cap set, live grants are at or above the cap (including lame-duck cancel_at_period_end = 1 rows), and the current user…
Premium
Beginner
Benecaster ships with a curated set of languages available in the Settings → Language tab and the setup wizard’s language picker. This filter lets you extend or trim…
Premium
Beginner
Anything cached per language goes stale the moment the set of supported languages changes. Adding a language leaves the new one with nothing prepared; removing one leaves caches…
Premium
Intermediate
These actions fire after each successful tier create, update, delete, and reorder. Create and update receive the full hydrated tier array (tier_slug, tier_name, monthly_price, annual_price, is_free, is_active, description,…
Free
Intermediate
When a listener completes a donation, you probably want to do something with that — log it to a CRM, add the donor to an email list, push…
Premium
Beginner
Some tiers are meant for a specific group rather than the public: a founding-supporter rate that is closed to newcomers, a capped cohort, a price offered to a…
Premium
Intermediate
If you collect email addresses through Gravity Forms — for a live event, a manual enrollment flow, or a waitlist — you can have each submission automatically create…
Premium
Advanced
Implement PodcastPaymentGateway and register your instance through the benecaster_payment_gateways filter. The filter is applied lazily, on first read rather than at plugin load, so registering from a benecaster_boot…
Premium
Intermediate
Benecaster exposes a single shared endpoint at POST /benecaster/v1/stripe-webhook that verifies the Stripe-Signature header once and dispatches to per-event handlers. Add-ons register additional handlers via benecaster_stripe_webhook_handlers rather than…
Premium
Intermediate
Benecaster registers four handlers on the shared Stripe webhook and re-emits each Stripe event as a normalized Benecaster action carrying (string $stripe_subscription_id, \Stripe\Event $event). Add-ons should hook these…
Free
Beginner
If you store donor information in an external system — a CRM, a mailing list, or your own database — you need to remove it there when a…
Premium
Beginner
Benecaster protects a fixed set of transactional types from broadcast opt-out suppression. Add-ons that send time-sensitive operational emails (access-expiry warnings, billing notifications) should add their type here so…
Premium
Intermediate
Benecaster resolves locale from benecaster_subscriber_locale user meta before locating any template file. Hook benecaster_email_template_locale to normalize locale codes, map unsupported locales to a fallback, or force a specific…
Premium
Intermediate
The tier change email fires on every benecaster_subscription_tier_changed action — both bridge-initiated and admin-initiated. Use type-specific filters to suppress it for specific tier combinations or to add tier-specific…
Premium
Intermediate
By default {{unsubscribe_url}} points to the WordPress site’s query-string endpoint. Override it to redirect subscribers to a custom opt-out center. Use priority 20 (runs after Benecaster’s inject_unsubscribe_url at…
Premium
Intermediate
When you test on a staging site, Benecaster fires the same hooks as on production — which means any integration you’ve built (CRM sync, Slack notification, mailing list…
Premium
Intermediate
An erasure request is only honoured if the data is erased everywhere. Benecaster clears its own records, but it cannot reach a CRM, an email platform, or an…
Premium
Advanced
The sheets filter fires twice per export request: once when the React UI renders checkboxes and once when the XLSX file is generated (only checked sheets are written).…
Premium
Beginner
Use benecaster_feed_sync_completed instead of benecaster_feed_sync_after when you need the feed URL, timing, or error message. The action fires on both success and failure with a $result array containing…
Free
Beginner
When migrating episodes from Seriously Simple Podcasting (SSP), Benecaster creates a draft episode for each imported post. This filter runs just before each draft is saved, giving you…
Premium
Beginner
Both hooks have identical signature ( int $show_id, int $imported, int $skipped ) so a single callback can handle both importers. Wire it to both action hooks using…
Free
Beginner
Theme developers can replace any single template part by placing a matching file in their child theme’s benecaster/ directory — the full plugin templates/ path is mirrored exactly.…
Premium
Intermediate
Register a directory once at boot and every Benecaster template lookup can find your parts — both ones that replace a core default and ones core has never…
Premium
Intermediate
For an add-on that bundles a companion template and installs it on first activation, a CLI installer, or a migration bringing a template across from another site. Same…
Free
Beginner
Use benecaster_teaser_content to replace the default word-count or description teaser with any custom preview — for example the first chapter heading from the Chapter Markers add-on. The filter…
Premium
Beginner
Use the public access-check functions to conditionally render premium content in any PHP context. benecaster_user_can_access_episode() returns true for public episodes regardless of subscription status. benecaster_get_user_tier_for_show() returns the tier…
Free
Beginner
The default episode/share.php renders X, Facebook, and LinkedIn share links. Replace the whole set or inject additional platforms via benecaster_episode_share_links. Each entry is an associative array with label…
Free
Beginner
Use benecaster_after_episode_card_title to append markup after the episode title inside each card — without overriding the whole archive/episode-card/title.php template. Useful for adding a listen button, a tier badge,…
Free
Beginner
Return false from benecaster_archive_show_filters to suppress the sort/filter bar entirely. Useful when the archive is embedded in a page layout where external filtering is handled by JavaScript or…
Premium
Beginner
Use the per-section before/after hooks to inject contextual help content, notices, or UI elements around a specific account section without touching the template file. The hook fires with…
Premium
Intermediate
The locked-episode prompt is the most valuable piece of copy on a podcaster’s site. Somebody has arrived wanting a specific episode and found they cannot have it —…
Premium
Advanced
The [benecaster_member_thanks] shortcode features a list of subscribers on any page or episode — recent joiners, top-tier members, or other built-in selections. The query type controls which subscribers…
Premium
Advanced
Some problems an add-on can detect are invisible until something breaks — an API key that stopped working, a setting left half-configured, a dependency that went away. A…
Premium
Intermediate
A health check that only runs when someone opens the WordPress admin has a blind spot: the podcaster who does not log in for three weeks. If the…
Premium
Intermediate
Benecaster shows notices in two places: the bell panel in the corner of the admin, and the banner across the top of the screen. The same notice can…
Premium
Beginner
Benecaster’s Support Mode raises its own log verbosity for the next 7 days and auto-disables on a one-shot WP-Cron event. Add-ons that have their own logger or diagnostic…
Premium
Beginner
When an admin clicks “Send diagnostic log to Benecaster support”, Benecaster bundles the most recent log entries into a compressed snapshot and sends it to the license server.…
Premium
Intermediate
Two situations call for this recipe. First: your add-on registers a REST endpoint that legitimately receives higher traffic than the default bucket allows, and your clients are getting…
Premium
Beginner
A podcaster who has to visit benecaster.com to see what their referrals have earned mostly does not look. Putting the number where they already are — a dashboard…
Free
Intermediate
Use benecaster_credit_before_stamp to pull the current sponsorship copy from an external source — a custom options page, a remote API, or a post meta field — and merge…
Free
Intermediate
Use benecaster_credit_options to reorder or mark a specific credit template as default based on episode metadata — for example, always pre-select the guest interview credit template when the…
Free
Beginner
Use benecaster_credit_applied to send a record to an external system — a webhook, Slack notification, analytics endpoint, or spreadsheet — each time a credit template is stamped onto…
Free
Advanced
Auto-apply the default credit template when a new episode is created so the podcaster never has to click Apply manually. Uses benecaster_apply_default_credit() — the public helper that resolves…
Premium
Intermediate
The Supporter Wall lets subscribers write a short “Why I support” message that is displayed publicly alongside their name. It is the one place on a podcaster’s site…
Premium
Beginner
Start a downstream aggregation job — an Analytics Dashboard add-on reaggregate, a custom BI export, or an external analytics warehouse push — immediately after the nightly feed-request-log rollup…
Premium
Beginner
Route the feed request log emergency-purge guardrail firing to PagerDuty, Sentry, Slack, or any external monitoring channel. When the raw log row count exceeds the configured hard cap,…
Free
Beginner
Use the anonymous public endpoint GET /wp-json/benecaster/v1/shows/{id}/qr.png to embed a show’s public signup QR code on any marketing page, press kit, or static site. The endpoint returns raw…
Premium
Intermediate
A failed payment on the podcaster’s own Benecaster subscription opens a 30-day grace window. Three actions mark its start, its expiry, and its recovery — enough to drive…
Premium
Beginner
When somebody cancels, their podcast app does not know. It carries on politely asking for a feed it can no longer have, sometimes for weeks. That is a…
Free
Beginner
Subscribes a newly enrolled follower to an external newsletter platform (ConvertKit shown here) the moment their donation opt-in is confirmed. The benecaster_donor_enrolled_as_follower action fires only when a brand-new…
Free
Beginner
Replaces the default mailing-list opt-in checkbox text on the donation form with a custom label — useful for localisation or to set clearer send-frequency expectations. The filter receives…
Premium
Intermediate
Tags every outbound Benecaster email with a SendGrid category and custom arguments when WP Mail SMTP is configured with the SendGrid API mailer (Settings → WP Mail SMTP…
Premium
Intermediate
Renders the AI Search widget for subscribers whose active tier meets or exceeds a configurable tier slug, and falls back to the Benecaster’s own search for everyone else.…
Free
Beginner
The front-end chapter list renders timestamp and title per row but omits the optional chapter image by default — podcast apps display images via the JSON chapters endpoint,…
Free
Intermediate
The chapter editor shows an “Auto-suggest chapters” button when a Transcription Service–style add-on is installed. Clicking it POSTs to the auto-suggest REST endpoint, which defers to the benecaster_chapter_autosuggest…
Premium
Beginner
When a subscriber requests cancellation through the built-in billing portal, Benecaster sends a cancellation_confirmation email whose Resume CTA defaults to the subscriber account page. Hook this filter to…
Premium
Beginner
The two manual-grant lifecycle actions form a symmetric pair — one fires when a subscriber is comped via the admin “Add subscriber manually” flow, the other when the…
Premium
Advanced
By default, Benecaster’s “Add subscriber manually” admin action is only available on shows using the built-in membership bridge. Bridge add-ons can unlock this for their bridge by implementing…
Premium
Beginner
On a multi-show installation every show sends through the same email wrapper, so without intervention all three of your podcasts arrive looking identical. benecaster_email_wrapper_args receives the show ID,…
Premium
Intermediate
benecaster_license_payment_grace_hard_cutoff fires once, at the end of a 30-day unpaid grace window. At that moment every subscriber on the site has just lost their private feed. For anyone…
Premium
Intermediate
The other half of Route license hard cutoff to PagerDuty. benecaster_license_payment_grace_recovered fires only when a day-30 cutoff is cleared and tokens are actually restored — never on the…
Premium
Intermediate
Three filters shape a tenure badge, and they fire in a fixed order: milestones → label → output. Each one hands its result to the next, so they…
Premium
Beginner
The built-in show-limit banner appears only on the React Shows portfolio screen (/#/shows). Use this recipe to surface the same alert on every wp-admin page — useful when…
Free
Beginner
By default Benecaster renders locked episodes with a “Subscriber only” badge so the episode is still discoverable. This recipe hides locked items entirely — nothing renders in their…
Free
Intermediate
Where the hide-locked recipe removes locked items entirely, this recipe replaces them with a teaser card that shows the episode title, the first 40 words of the episode…
Free
Beginner
Prepend a “Top supporter” badge to donor-wall cards for donations at or above a configurable amount threshold, without replacing the built-in card markup for lower rows.
Free
Beginner
Restrict a public donor wall to Stripe-only donations, hiding link-mode reference rows that were logged manually, on a per-show basis.
Free
Beginner
Replace the default “No donations yet” empty state with a bespoke call-to-action block that links to your Listener Support checkout page.
Free
Beginner
Use benecaster_donor_wall_item to append a bronze/silver/gold tier message inside each donor-wall card based on the donation amount, so the wall visibly acknowledges giving level without manual notes.
Free
Beginner
Use benecaster_donation_webhook_rejected to fire a non-blocking Slack webhook alert whenever a Ko-fi, PayPal, or Buy Me a Coffee signature check fails, so credential drift surfaces in real time…
Premium
Beginner
Benecaster sends a single-use password-reset email to anyone whose WordPress account was created for them rather than by them — an admin bulk enrollment, a subscriber added by…
Premium
Beginner
Data exports contain subscriber email addresses and token records, so Benecaster does not keep them lying around: a nightly sweep deletes any export file older than seven days.…
Premium
Beginner
Benecaster transitions a token to never_accessed when the subscriber received a feed URL, the grace window elapsed (default 7 days), and the URL was never polled. The action…
Premium
Intermediate
A podcaster-triggered Remove / Revoke Access sets revocation_reason = 'admin_revoked' on the token row. If a membership plugin later fires an activation event for that subscriber — they…
Premium
Intermediate
Two things make the buy-up purchase endpoint different from a plain authenticated POST, and both are easy to get wrong from outside Benecaster’s own UI. You have to…
Premium
Intermediate
A membership tier is one Stripe Product with N attached Prices, and those Prices are a collection hanging off the tier rather than a fixed monthly/annual pair on…
Free
Beginner
The episode-level Explicit flag is a three-value override — 'inherit', 'yes', or 'no' — never a bool. 'inherit' is the default and falls back to the show’s Explicit…
Free
Beginner
The Explicit badge is rendered by one class — Benecaster\Episode\ExplicitBadgeRenderer — from every surface it appears on: the episode single page, archive cards, the [benecaster_episodes] list, the [benecaster_player]…
Premium
Intermediate
When a podcaster’s own Benecaster licence reaches Day-30 hard cutoff, Benecaster pauses collection on every built-in-membership Stripe subscription so nobody is charged for a feed that has stopped,…
Premium
Advanced
Implement CommunityPlatformInterface in your add-on and register the instance through the benecaster_community_platforms filter. The Community Integrations add-on routes all subscription events to every registered platform automatically — including…
Premium
Intermediate
Spam on the Supporter Wall does not usually look like the message board spam you are picturing. It arrives as a wall of characters in a script your…
Premium
Advanced
A staging site is usually a byte-for-byte copy of production, live payment credentials included, so an automated path — a renewal cron, a replayed webhook, a manual retry…
Free
Advanced
Most channel-level feed tags are made of show metadata — a licence, a GUID, a funding link — and need nothing but the show ID to build. A…
Premium
Intermediate
Some subscribers never fill in a signup form. An admin bulk-enrolls them from a list, adds them by hand, or a donation completes and the webhook creates their…
Free
Beginner
Registering a type with benecaster_managed_email_types makes it discoverable and editable in the Email Editor. It does not make it send. To actually dispatch one, call benecaster_send_email(). Always pass…
Free
Intermediate
[benecaster_follower_signup] is the built-in form. When you want a popup overlay, a Gutenberg block, a custom landing page or a WP-CLI command instead, call benecaster_follower_signup() — it is…
Free
Intermediate
There are three different questions here and add-ons reliably reach for the wrong one. StagingManager::is_staging() asks “is this a non-production environment?” and is the answer core applies its…
Premium
Intermediate
A migration importing an established audience arrives holding a join date per subscriber. Without carrying it across, every imported token is stamped at import time and TenureBadgeCalculator —…
Premium
Intermediate
The Promote to Bridge wizard collects a single grace-period length and applies it to everyone. That is usually right, but not always: a podcaster migrating a $2/month tier…
Premium
Advanced
By default, Promote-to-Bridge already checks this for you, for the four core bridges: every daily cron tick asks the destination bridge’s is_user_active( $user_id, $show_id ) before deciding whether…
Premium
Intermediate
Clearing and extending a grace period are decisions a human makes in the Promotion History panel, one subscriber at a time — the podcaster has checked the destination…
Free
Intermediate
Benecaster mails single-use signed links in two places today: the welcome email a new follower receives carries a Set your password link, and the you already follow this…
Free
Intermediate
[benecaster_follower_signup] is a public form that always reports success and sends an email on every submission. It collects no password either, so nothing costs a submitter any effort.…
Free
Intermediate
Use this when your code extends one of Benecaster’s add-ons — adding a section to the Analytics Dashboard’s digest, contributing rows to a Sponsor Manager export, reading transcripts…
Free
Intermediate
benecaster_addon_activation_changed fires after a podcaster switches an add-on on or off for one show, from Settings → Add-ons. The constraint is the recipe, not the hook. This is…
Free
Intermediate
Benecaster does not require an account or a password to make a donation — the endpoint is open on purpose, so an anonymous listener can tip without signing…
Free
Intermediate
⚠ The action is the only way to observe a declined donation. Nothing is written to benecaster_listener_support_donations on a failure, deliberately: that table is money received, and every…
Free
Beginner
Core’s Privacy\PrivacyPolicyContent (registered on admin_init) contributes suggested privacy-policy paragraphs under Settings → Privacy → Policy Guide, one per Benecaster feature that is actually active on the install —…
Free
Beginner
Default false — a follower signup mints its token immediately, exactly as before. Return true for a show and a follower signup instead sends a confirmation email (reusing…
Free
Beginner
Resolving whether an episode’s enclosure URL gets substituted for a redirect-proxy URL (and therefore counted) happens in two steps: the episode’s own three-state override (_benecaster_episode_download_tracking) wins when explicitly…
Premium
Beginner
When a podcaster changes a buy-up’s price, existing holders are grandfathered at their old price by default. The podcaster can instead choose to migrate them onto the new…
Premium
Beginner
benecaster_license_plan_upgraded fires synchronously the moment a podcaster confirms a one-click plan upgrade in Settings → Account → Plan changes — before the next daily validation cron would otherwise…
Free
Beginner
benecaster_register_addon() replaces the manual any_show_addon_is_active() check add-ons previously wrote inline in their own benecaster_boot handler. Call it once, passing your slug and a bootstrap callback — core invokes…
Premium
Intermediate
Filters the complete payload the plugin POSTs to the license server once a day, including the nested telemetry sub-array. Use it to remove or adjust a field before…
Premium
Beginner
Added feature/security-diagnostics-hardening (Batch 3), 2026-09-11. The hidden Support Diagnostics panel (an admin with manage_options reaches it by appending &bc_support_diag=1 to any Benecaster admin page URL — deliberately undiscoverable,…
Premium
Intermediate
min_tier expresses exactly one condition: “at or above this tier”. Anything else — a buy-up, a WordPress role, a date — goes through benecaster_tier_gate_passes, which fires before either…
Free
Intermediate
Core counts failed lookups per show only — deliberately, since a per-IP counter would let an attacker rotating IPs create unbounded storage. The IP hash travels in the…
Free
Beginner
The “Unusual failed feed access” alert defaults to 10 unknown-token requests in 60 minutes, per show. A show with a large audience and a lot of mis-copied URLs…
Free
Beginner
Record which admin dismissed a notice and when, for an audit trail or an ops channel. benecaster_notice_dismissed fires once per real dismissal — never for a repeat, a…
Free
Beginner
When a person opens a valid private feed URL in a web browser (a camera-scanned QR code, a tapped email link), core serves a small landing page with…
Free
Intermediate
Add a list of email addresses as free followers from an external system or your own code. Subscribers → Bulk enroll → Add as: Followers is the admin…
Free
Intermediate
Benecaster’s importer (Feed\FeedBulkImporter) is a stable API. An add-on that guides a podcaster through migration should call it, not copy it. It then gets deduplication by GUID, benecaster_episode_imported,…
Free
Beginner
Tell the site owner how a one-time episode import went, since it can still be running after they leave the setup wizard. The import runs in the background…
Premium
Beginner
Free followers stay on the Supporter Wall alongside paying subscribers — core only labels them (a muted Follower chip) and classifies the markup so your theme decides how…
Free
Intermediate
Both core import paths — the setup wizard’s one-time import and Feed Sync — store each RSS <item><link> (the episode’s page on the old host) as _benecaster_source_link, validated…
Free
Intermediate
The Migration Wizard’s reconciliation report, an add-on’s own “what came across?” screen, or a WP-CLI audit all need the same thing: one row per imported draft with the…
Free
Intermediate
The write half of Flag imported episodes your own way. A migration add-on that has just imported 400 episodes, or a WP-CLI script staging a back catalogue for…
Free
Intermediate
Benecaster’s Delete all data on uninstall switch doesn’t work from a list — it discovers benecaster_-namespaced data by prefix and removes it. That means an add-on’s tables, options,…
Free
Intermediate
Core’s Podcasting 2.0 auto-detection scans an episode’s attached media for a single .vtt, .srt or .txt file and writes the one it finds to the Transcript URL field.…
Free
Intermediate
Do something once, at the moment an episode acquires a Podcasting 2.0 transcript, whatever produced it. The companion to Supply a transcript URL from your own service: that…
Free
Beginner
Exempt specific people from the subscriber wp-admin redirect, with benecaster_block_subscriber_wpadmin. Signature: benecaster_block_subscriber_wpadmin( bool $should_block, int $user_id ): bool. Free, never licence-gated. Default true. Why a recipe rather than…
Free
Beginner
Keep an external list in step with a subscriber’s email address, using benecaster_email_changed. Signature: benecaster_email_changed( int $user_id, string $old_email, string $new_email ). Free, never licence-gated. It fires on…
Free
Beginner
Recognise an account whose password Benecaster generated, with \Benecaster\Support\GeneratedPasswordMarker. ⚠⚠ WordPress records nothing that tells these accounts apart, and it cannot be inferred from the hash — every…
Free
Intermediate
benecaster_availability_datetimes fires before any availability row is written for an episode, so a callback can give one tier an earlier unlock than the editor typed, or drop a…
Free
Beginner
$tier_slug makes the per-tier feed a structured edit instead of string surgery on the finished XML. The public feed compiles as tier public. Set all three keys. Apps…
Free
Beginner
The artwork key moves both the plain RSS <image> and <itunes:image> — the one Apple Podcasts reads. Apple caches show artwork aggressively; a listener may not see new…
Free
Beginner
[benecaster_latest_episode] and benecaster_get_latest_episode_id() both resolve through this filter, so one callback changes the shortcode, the function and anything built on either. Return null to hide the shortcode entirely.…
Free
Beginner
Give a preview or trial add-on the same access to the show notes that it gives the player, instead of unlocking one and leaving the other showing the…
Free
Beginner
A lapse (a fixed term ran out, renewals gave up) and a cancellation are different conversations. benecaster_subscription_cancelled fires for both; benecaster_subscription_expired fires only for the lapse, straight after…
Free
Beginner
With Show a download link on episode pages switched on, the “Download episode” link shows to everyone who can play the episode, including every visitor on a public…
Free
Intermediate
The episode page shows “Read the transcript” to everyone who can access the episode. To keep it for holders of a “Transcripts” buy-up, narrow the link with benecaster_user_has_buyup().…
Premium
Beginner
Anyone who signs up through your referral link earns you credit, but only if they see it. The benecaster_referral_link shortcode prints your link and drops into any page…
Premium
Intermediate
A grant is non-tier access: a named set of episodes somebody holds outside any membership tier. Core keeps the record and adds the slug to the listener’s feed;…
Free
Intermediate
Give an add-on’s listeners their own token type, so core classifies them correctly everywhere. A token’s type answers who a listener is: one value per person per show.…
Free
Intermediate
There are two ways to give a listener access that is not part of their tier, and choosing between them is the first decision an add-on developer makes.…