Skip to main content

Telemetry Fields Reference

When a podcaster opts in to anonymous usage sharing (Settings → Account → Telemetry), the daily license validation ping includes a telemetry block. This page documents every field in that block, its source, and when it is included.

Manage opt-in state via:

  • POST /benecaster/v1/license/telemetry-preferences — write telemetry_opted_in and revenue_telemetry_opted_in
  • GET /benecaster/v1/license — read current values

Base Telemetry Fields

Always included when benecaster_telemetry_opted_in is true.

Field Type Source Description
avg_episode_duration_sec int Episode post meta Average audio duration in seconds across all published episodes
total_content_hours float (2dp) Episode post meta Total hours of content across all published episodes
show_age_days int Show CPT post_date Days since the earliest published show was created
setup_wizard_completed bool benecaster_setup_wizard_completed option Whether the setup wizard has been completed at least once
web_player_plays int benecaster_web_player_plays option Cumulative site-wide count of [benecaster_player] render events; incremented by POST /analytics/player-play
active_addons string[] LicenseManager::get_active_addons() Add-on slugs the license grants, exactly as the license server’s last addons list said. What the site holds, not what is installed
enabled_addons string[] LicenseManager::get_enabled_addons_site_wide() Of the granted add-ons, those not switched off on at least one connected show. What the site uses. Sorted, deduplicated. An empty array means every held add-on is switched off everywhere; the field is omitted when the plugin cannot tell (no connected show, or an all-add-ons plan with no slug list)
installed_addons string[] AddonsRegistry::get_installed_slugs() Benecaster add-on plugins installed and active on the site, in benecaster-addon-{name} form, sorted and deduplicated. Read from the site, so it can name an add-on the license does not grant. An empty array means none; never omitted while opted in
deactivated_addons string[] AddonsRegistry::get_deactivated_slugs() Add-on plugins installed but deactivated, recognised by the Benecaster Add-on: plugin header, since a deactivated plugin runs no code. Never overlaps installed_addons. An add-on without the header is never listed
addon_switch_off_feedback object[] Addons\SwitchOffFeedback::queue() (benecaster_addon_feedback_queue option) Answers to the optional “Why did you switch off {add-on}?” question on Settings → Add-ons, asked only when an add-on is switched off on its last show. Each entry is { addon_slug, reason, comment, answered_at }: addon_slug in entitlement-slug form; reason one of temporary, not_working, hard_to_use, missing_feature, not_needed, other; comment up to 500 characters of free text the podcaster typed, possibly empty; answered_at UTC Y-m-d H:i:s. Omitted, not [], when nothing is queued. Each answer is sent once: it is cleared after a status: "valid" response, before the next show’s payload is built, so a multi-show install sends it on one show’s ping only. Not protected from benecaster_telemetry_payload
core_files_modified bool Release baseline manifest (checksums.json) comparison Whether any of the plugin’s own PHP files differ from the release baseline. Detection only — always false on a dev checkout with no manifest
core_modified_file_count int Release baseline manifest comparison True count of differing files, uncapped — may exceed the length of core_modified_files
core_modified_files string[] Release baseline manifest comparison Up to 10 of the differing relative paths
revenue_telemetry_opted_in bool benecaster_revenue_telemetry_opted_in option Whether revenue telemetry is also enabled; always false when base telemetry is off

Revenue Telemetry Fields

Included only when both telemetry_opted_in and revenue_telemetry_opted_in are true.

Field Type Source Description
estimated_mrr_cents int Bridge tier price × subscriber count Estimated monthly recurring revenue in US cents; this is an estimate derived from configured tier prices and token counts — no actual payment processor data is accessed
estimated_mrr_is_estimate bool Always true Signals to the license server that this value is a floor estimate, not a verified figure

Transcription Sub-block

Appended to the telemetry block when:

  1. LicenseManager::addon_is_active('transcription-service') returns true, AND
  2. benecaster_telemetry_opted_in is true

When the Transcription Service add-on is inactive, the entire sub-block is silently omitted — no error, no null fields.

Field Type Source Description
transcription_provider string benecaster_transcription_provider option Provider slug (e.g. openai, deepgram). Never the API key.
transcription_minutes_api_30d int Transcript records — duration and provider Sum of transcription minutes processed via API (not file upload or paste) in the last 30 days
transcription_episodes_30d int Transcript records — completion date Count of episodes with a completed transcript in the last 30 days
import_method_distribution object Transcript records — import method Count per method over last 30 days: { api, file, paste, rss_feed }
transcript_edit_rate_distribution object Transcript records — proportion of segments edited Count per edit-rate bucket: { never_opened, opened_no_edits, low_0_5pct, medium_5_20pct, high_20pct_plus }
has_custom_prompt bool benecaster_transcription_prompt_is_modified option true if the operator has customized the transcription prompt. The prompt text is never transmitted.

Privacy Guarantees

No telemetry block ever contains:

  • Subscriber identities, email addresses, or user IDs (the one free-text field, addon_switch_off_feedback[].comment, is whatever the podcaster typed, and the dialog asks them to leave out personal details)
  • Episode titles, descriptions, or content
  • Transcript text or segment data
  • API keys or credentials
  • Raw IP addresses

The full data-handling disclosure is at Privacy and Data Handling.

See Also

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

Last updated