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— writetelemetry_opted_inandrevenue_telemetry_opted_inGET /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:
LicenseManager::addon_is_active('transcription-service')returnstrue, ANDbenecaster_telemetry_opted_inistrue
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