Skip to main content

Third-party plugin integrations

Burst Statistics v3.4.0 ships with built-in integrations for popular WordPress plugins. Each integration is loaded automatically when the corresponding plugin is detected. This document describes every supported integration, the goals each one provides, and how developers can register their own.


How integrations work

During plugin bootstrap (on plugins_loaded at priority 9) Burst iterates the integrations registry and checks whether each plugin is active by testing a constant, function, or class name. When a match is found, Burst loads the corresponding integration files from includes/Integrations/plugins/{plugin-slug}/. If the integration defines goals, those goals become available in the Goals UI.

Changed in v3.4.0: integration loading moved from a plugins_loaded action callback to a synchronous call inside Integrations::init(), so integration files now run at plugins_loaded priority 9 instead of the default priority 10. Each integration is now a directory containing one or more script files, split by execution context.

php_scripts schema

Changed in v3.4.0: the admin_only boolean flag has been replaced by a php_scripts array with explicit admin_scripts and frontend_scripts keys. Burst loads admin scripts only when has_admin_access() is true and frontend scripts on all requests.

Show code
'php_scripts' => [
'admin_scripts' => [ 'admin.php' ],
'frontend_scripts' => [ 'frontend.php' ],
],

Each entry is a filename resolved relative to includes/Integrations/plugins/{plugin-slug}/. Dependent integrations (those with required_plugins) are loaded after their dependencies have been confirmed active.

:::caution Breaking change

The admin_only key is no longer read. If your code registers integrations via the burst_integrations filter and relies on admin_only => true, migrate to php_scripts => [ 'admin_scripts' => [ ... ] ]. Integrations without a php_scripts key will still be detected for goal registration but no PHP files will be loaded.

:::


Built-in integrations

Complianz GDPR/CCPA

Loaded from plugins/complianz/frontend.php. Registers Burst's tracking script with Complianz's blocked-scripts list so that consent is correctly requested and honoured.

  • When the WP Consent API (wp_has_consent) is present, Complianz defers entirely to it and the script-blocking logic is skipped.
  • When cookieless tracking is enabled in Burst, the script is never blocked regardless of consent state.
  • Any existing burst entry added by Complianz itself is removed and replaced with Burst's own entry to avoid duplicates.

Script categories registered: statistics Script URLs matched: assets/js/build/burst.js, assets/js/build/burst.min.js


Page builders

Elementor Website Builder

Goals available:

Goal IDTypeTrigger
elementor_pro_forms_form_submittedhookelementor_pro/forms/form_submitted
submit_button_clickclicks.elementor-field-type-submit .elementor-button

eCommerce plugins

WooCommerce

Loaded from plugins/woocommerce/frontend.php. Fires Burst's unified order and cart actions and resolves the checkout/products page IDs.

Goals available:

Goal IDTypeTrigger
woocommerce_add_to_carthookwoocommerce_add_to_cart
woocommerce_checkout_order_createdhookwoocommerce_checkout_order_created
woocommerce_payment_completehookwoocommerce_payment_complete
woocommerce_add_to_cart_clickclicks.add_to_cart_button
woocommerce_click_checkout_buttonclicks.wc-block-cart__submit-button

When an order is created (via the classic checkout or the Store API block checkout), Burst fires both burst_order_created and burst_woocommerce_order_created with a normalized data array. Cart changes (add, remove, restore, quantity update) fire burst_cart_updated.

WooCommerce Payments

Loaded from plugins/woocommerce-payments/frontend.php. Detected via WCPAY_PLUGIN_FILE. Requires WooCommerce to also be active. Applies the Stripe multi-currency exchange rate to WooCommerce order data via the burst_woocommerce_order_data filter.

WooCommerce Subscriptions

Added in v3.4.0. Detected via the WC_Subscriptions class. Requires WooCommerce to also be active. Loads plugins/woocommerce-subscriptions/admin.php on admin requests and plugins/woocommerce-subscriptions/event-listener.php on all requests.

The event listener translates WooCommerce Subscriptions lifecycle events (creation, status changes, renewals, date updates) into a single burst_subscription_update_today action so that the subscriptions aggregation engine can refresh today's numbers.

Pro - BusinessAvailable in the Business tier

Subscription integrations surface in the Subscriptions dashboard tab, which requires the Business tier. Learn more about revenue & sales tracking

Easy Digital Downloads

Loaded from plugins/easy-digital-downloads/frontend.php. Fires Burst's unified order and cart actions and resolves the checkout/products page IDs. Stripe-gateway orders are handled via edds_order_complete instead of edd_complete_purchase to avoid double-counting.

Goals available:

Goal IDTypeTrigger
edd_complete_purchasehookedd_complete_purchase
edd_add_to_cartclicks.edd-add-to-cart
edd_go_to_checkoutclicks.edd_go_to_checkout
edd_click_purchaseclicks#edd-purchase-button

Easy Digital Downloads Pro

Loaded from plugins/easy-digital-downloads-pro/frontend.php, which re-requires the core EDD integration file. The slug differs because EDD Pro is a separate plugin install that must be detected independently.

Easy Digital Downloads – Multi Currency

Loaded from plugins/edd-multi-currency/frontend.php. Detected via EDD_MULTI_CURRENCY_FILE. Requires Easy Digital Downloads to also be active. Applies the EDD multi-currency exchange rate to EDD order data via the burst_edd_order_data filter.

Easy Digital Downloads – Recurring Payments

Changed in v3.4.0: the integration slug was renamed from easy-digital-downloads-recurring to edd-recurring and it now loads both an admin and an event-listener file. Detected via EDD_RECURRING_VERSION. Requires Easy Digital Downloads to also be active.

:::caution Breaking change

If you extended Burst via the burst_integrations filter or the burst_integration_path filter for the old easy-digital-downloads-recurring slug, update your callbacks to use the new edd-recurring slug. Existing goal IDs (edd_subscription_post_create, edd_subscription_cancelled) are unchanged.

:::

Goals available:

Goal IDTypeTrigger
edd_subscription_post_createhookedd_subscription_post_create
edd_subscription_cancelledhookedd_subscription_cancelled

The event listener forwards subscription create, renew, cancel, expire, complete and status-change hooks to burst_subscription_update_today.

Subscriben

Added in v3.4.0. Detected via SUBSCRIBEN_VERSION. Requires WooCommerce to also be active. Loads plugins/subscriben/admin.php on admin requests and plugins/subscriben/event-listener.php on all requests. The event listener forwards Subscriben lifecycle events (meta save, payment applied, status change, renewal order created, failed payment) to burst_subscription_update_today.

Give – Donation Plugin

Goals available:

Goal IDTypeTrigger
give_click_donation_open_modalclicks.givewp-donation-form-modal__open
give_click_donationclicks.givewp-donation-form__steps-button-next
give_donation_hookhookgive_process_donation_after_validation

Contact form plugins

Contact Form 7

Goal IDTypeTrigger
wpcf7_submithookwpcf7_submit
wpcf7_submit_clickclicks.wpcf7-submit

WPForms

Goal IDTypeTrigger
wpforms_process_completehookwpforms_process_complete
wpforms_click_submitclicks.wpforms-submit

Fluent Forms

Goal IDTypeTrigger
fluentform_submission_insertedhookfluentform/submission_inserted
fluentforms_click_submitclicks.ff-btn-submit

Happyforms

Goal IDTypeTrigger
happyforms_submission_successhookhappyforms_submission_success

WS Form

Goal IDTypeTrigger
wsf_submithookwsf_submit

Gravity Forms

Goal IDTypeTrigger
gform_post_submissionhookgform_post_submission
gform_click_submitclicksinput[type="submit"].gform_button

Formidable Forms

Goal IDTypeTrigger
frm_submit_clickedclicks.frm_button_submit

Ninja Forms

Goal IDTypeTrigger
ninja_forms_after_submissionhookninja_forms_after_submission

Caching plugins

WP Rocket

Loaded from plugins/wp-rocket/frontend.php. Excludes Burst's inline JavaScript from WP Rocket's combine/minify pass and excludes timeme and burst JS files from minification. This prevents Burst's tracking code from being broken by asset optimization.

No goals are registered for this integration.


Remote-management integrations

MainWP

Added in v3.4.0. Exposes a single REST endpoint (burst/v1/mainwp-auth) that the MainWP dashboard calls during a full page load. The handler verifies the asymmetric signature sent by the dashboard, resolves the admin user named in the request, issues (or reuses) a WP Application Password for that user and returns the token, a REST root URL and the localization payload needed to bootstrap the dashboard React app.

Changed in v3.4.2: MainWP integration is now opt-in. Set the enable_mainwp_integration option to true (under Settings → Advanced → Scripts) before the proxy will initialize. When the option is off, the MainWP_Proxy class is never constructed and no REST routes are registered.

update_option( 'burst_enable_mainwp_integration', true );

Changed in v3.4.2.1: the enable_mainwp_integration settings field is now rendered conditionally. When the MainWP Child plugin (mainwp-child/mainwp-child.php) is not present in WP_PLUGIN_DIR, the field type is forced to hidden so the toggle no longer appears in the Burst UI. The option itself still exists and remains writable via update_option(), which lets headless or programmatic setups pre-enable the integration before MainWP Child is installed.

Added in v3.4.2.1: a new setup-reminder task surfaces in the Burst dashboard when MainWP Child is active on the site but enable_mainwp_integration is empty. The condition is driven by Tasks::should_show_mainwp_integration_task(), which returns true only when all of the following hold:

  • The file WP_PLUGIN_DIR/mainwp-child/mainwp-child.php exists.
  • MainWP Child is active for the current site, or active network-wide on multisite.
  • burst_options_settings['enable_mainwp_integration'] is empty.

The task links to #settings/advanced and exposes burst_option_enable_mainwp_integration as its fix handler, so dismissing or actioning it enables the integration option. The task is dismissible.

if ( \Burst\Admin\Tasks::should_show_mainwp_integration_task() ) {
// MainWP Child is installed and active, but the Burst integration is off.
}

Security model:

  • The dashboard holds an RSA private key; the child site stores the matching public key in the mainwp_child_pubkey option.
  • Every request is signed over $function|$nonce|$user. Changed in v3.4.2: the legacy $function.$nonce payload format is no longer accepted — dashboards must sign the pipe-delimited triple.
  • Nonces are 32-character cryptographically random hex strings generated by the dashboard per request and consumed atomically server-side via add_option(). A second request reusing the same nonce is rejected even when the signature is still mathematically valid.
  • The dashboard must include a nonce_issued_at Unix timestamp alongside the nonce. Nonces older than 300 seconds (5 minutes) are rejected regardless of cryptographic validity, so captured request bodies cannot be replayed once the window closes. Consumed nonce records are purged via a scheduled burst_purge_mainwp_nonce event shortly after the TTL expires.
  • Requests authenticated via the dashboard path must send the X-BURSTMAINWP: 1 header. The custom header forces a CORS preflight that a cross-origin browser request cannot pass without an explicit allow, providing structural CSRF protection for the dashboard call. Cookie-authenticated admins calling the same endpoint must instead present a valid burst_nonce, and Application Password / HTTP Basic Auth callers are admitted on the credential alone.
  • Application Passwords issued for this integration are named Burst MainWP and the plain-text token is cached for one hour via a transient — the token itself is never stored long-term.

No goals are registered. Integrators that want to gate REST routes for the MainWP dashboard can call MainWP_Proxy::is_mainwp_authenticated() inside a permission_callback.


Database table schema

burst_sessions

Changed in v3.3.0: the following columns were moved from burst_statistics into burst_sessions and are now the authoritative source for per-session device and visitor attributes.

ColumnTypeDefaultDescription
browser_idint0Foreign key into burst_browsers.
browser_version_idint0Foreign key into browser versions lookup.
platform_idint0Foreign key into burst_platforms.
device_idint0Foreign key into burst_devices.
first_time_visittinyint01 if this is the visitor's first ever session.
bouncetinyint11 if the session contained only one pageview.

Indexes are created for browser_id, platform_id, device_id, first_time_visit, and bounce.

burst_statistics

:::caution Breaking change

In v3.3.0 the columns browser_id, browser_version_id, platform_id, device_id, first_time_visit, and bounce were removed from burst_statistics. The indexes on bounce and first_time_visit were also removed.

Any integration or custom query that reads or writes these columns on burst_statistics will fail silently or produce a database error after upgrading. Rewrite such queries to join burst_sessions on burst_statistics.session_id = burst_sessions.ID and read the columns from burst_sessions instead.

Show code
// Before v3.3.0 — broken after upgrade:
$wpdb->get_results(
"SELECT browser_id, device_id, first_time_visit, bounce
FROM {$wpdb->prefix}burst_statistics
WHERE time > %d",
$start
);

// v3.3.0 and later — correct:
$wpdb->get_results(
$wpdb->prepare(
"SELECT sess.browser_id, sess.device_id, sess.first_time_visit, sess.bounce
FROM {$wpdb->prefix}burst_statistics AS st
INNER JOIN {$wpdb->prefix}burst_sessions AS sess ON st.session_id = sess.ID
WHERE st.time > %d",
$start
)
);

:::

The INSERT statement for new pageviews no longer includes first_time_visit, bounce, browser_id, browser_version_id, platform_id, or device_id. These values are written exclusively to burst_sessions at session-creation time.

Archive / restore (Burst Pro)

Pro - CreatorAvailable in the Creator tier

The archive export (Archive_Pro) now joins burst_sessions when building the CSV so that the session-level columns (browser_id, browser_version_id, platform_id, device_id, first_time_visit, bounce, referrer) are preserved alongside each statistics row.

On restore, those session columns are split out from the CSV and applied to the corresponding burst_sessions row via UPDATE. If the session row no longer exists it is re-created via INSERT. Custom restore logic that previously read these columns from the statistics portion of the CSV must be updated to read them from the session portion. Learn more about data management


Filters and actions reference

burst_integrations

Filters the complete integrations registry before Burst processes it. Use this to add, remove, or modify integrations.

Parameters:

ParameterTypeDescription
$integrationsarray<string, array>Associative array of integrations keyed by plugin slug.

Example:

Show code
add_filter( 'burst_integrations', function( array $integrations ): array {
$integrations['my-plugin'] = [
'constant_or_function' => 'MY_PLUGIN_VERSION',
'label' => 'My Plugin',
'php_scripts' => [
'admin_scripts' => [],
'frontend_scripts' => [ 'frontend.php' ],
],
'goals' => [
[
'id' => 'my_form_submitted',
'type' => 'hook',
'hook' => 'my_plugin_form_submitted',
],
],
];
return $integrations;
} );

burst_integration_path

Filters the file path Burst resolves for an integration before requiring it. Useful when shipping an integration file in your own plugin.

Changed in v3.4.0: the resolved path now points to a specific file inside the plugin directory (for example plugins/my-plugin/frontend.php) rather than a single plugins/my-plugin.php file. Update custom callbacks to return the correct per-script path.

Parameters:

ParameterTypeDescription
$pathstringAbsolute path to the integration PHP file.
$pluginstringThe plugin slug being loaded.

Example:

Show code
add_filter( 'burst_integration_path', function( string $path, string $plugin ): string {
if ( 'my-plugin' === $plugin ) {
return plugin_dir_path( __FILE__ ) . 'integrations/burst-my-plugin.php';
}
return $path;
}, 10, 2 );

burst_load_ecommerce_integration

Filters whether Burst should activate its eCommerce feature set. By default this returns true when any integration that has load_ecommerce_integration => true is active.

Parameters:

ParameterTypeDescription
$should_loadbooltrue to enable eCommerce features, false to disable.

Example:

add_filter( 'burst_load_ecommerce_integration', '__return_true' );

burst_subscription_integrations_enabled

Added in v3.4.0. Filters whether Burst should treat at least one subscription integration as active. WooCommerce Subscriptions, EDD Recurring and Subscriben all return true from their admin-side integration files, which enables the Subscriptions dashboard tab and the subscription aggregation engine.

Parameters:

ParameterTypeDescription
$enabledbooltrue when at least one subscription integration is active. Defaults to false.

Example:

add_filter( 'burst_subscription_integrations_enabled', '__return_true' );

The companion helper \Burst\burst_loader()->integrations->has_subscription_integrations_enabled() returns the filtered value and is the canonical way to check for active subscription integrations from your own code.


burst_abilities_rate_limit_window

Added in v3.4.1. Filters the rate-limit window (in seconds) used by the WordPress Abilities API integration. Defaults to 60.

Parameters:

ParameterTypeDescription
$windowintLength of the rate-limit window in seconds.
$abilitystringAbility name without the burst/ prefix, e.g. 'live-visitors'.

Example:

add_filter( 'burst_abilities_rate_limit_window', function( int $window, string $ability ): int {
return $ability === 'live-traffic' ? 30 : $window;
}, 10, 2 );

burst_abilities_rate_limit_max

Added in v3.4.1. Filters the maximum number of ability calls allowed per rate-limit window. Defaults to 30.

Parameters:

ParameterTypeDescription
$maxintMaximum number of calls allowed in the current window.
$abilitystringAbility name without the burst/ prefix.

Example:

add_filter( 'burst_abilities_rate_limit_max', function( int $max, string $ability ): int {
return $ability === 'data' ? 10 : $max;
}, 10, 2 );

burst_checkout_page_id

Filters the page ID Burst treats as the checkout page. WooCommerce and EDD both hook into this to return their configured checkout page.

Parameters:

ParameterTypeDescription
$page_idintThe current checkout page ID.

Example:

add_filter( 'burst_checkout_page_id', function( int $page_id ): int {
return (int) get_option( 'my_plugin_checkout_page_id', $page_id );
} );

burst_products_page_id

Filters the page ID Burst treats as the main products/shop page. WooCommerce and EDD both hook into this to return their configured shop page.

Parameters:

ParameterTypeDescription
$page_idintThe current products page ID.

Example:

add_filter( 'burst_products_page_id', function( int $page_id ): int {
return (int) get_option( 'my_plugin_shop_page_id', $page_id );
} );

burst_base_currency

Filters the store's base currency code. WooCommerce returns get_woocommerce_currency(); EDD returns edd_get_currency(). Both also invalidate a burst_base_currency transient when their currency option changes.

Parameters:

ParameterTypeDescription
$currencystringISO 4217 currency code, e.g. 'USD'.

Example:

add_filter( 'burst_base_currency', function( string $currency ): string {
return 'EUR';
} );

burst_woocommerce_order_data

Filters the normalized order data array before Burst fires burst_order_created for a WooCommerce order.

Parameters:

ParameterTypeDescription
$dataarrayNormalized order data (see structure below).
$orderWC_OrderThe WooCommerce order object.

$data structure:

KeyTypeDescription
currencystringISO 4217 currency code.
totalfloatOrder subtotal before tax.
taxfloatTotal tax amount.
platformstringAlways 'WC'.
productsarrayArray of {product_id, amount, price} entries.

Example:

Show code
add_filter( 'burst_woocommerce_order_data', function( array $data, WC_Order $order ): array {
$data['custom_field'] = $order->get_meta( '_my_field' );
return $data;
}, 10, 2 );

burst_edd_order_data

Filters the normalized order data array before Burst fires burst_order_created for an Easy Digital Downloads order.

Parameters:

ParameterTypeDescription
$dataarrayNormalized order data (see structure below).
$order_idintThe EDD payment/order ID.
$paymentEDD_PaymentThe EDD payment object.

$data structure:

KeyTypeDescription
currencystringISO 4217 currency code.
totalfloatOrder subtotal before tax.
taxfloatTotal tax amount.
platformstringAlways 'EDD'.
productsarrayArray of {product_id, amount, price} entries.

Example:

Show code
add_filter( 'burst_edd_order_data', function( array $data, int $order_id, EDD_Payment $payment ): array {
$data['license_key'] = get_post_meta( $order_id, '_license_key', true );
return $data;
}, 10, 3 );

burst_order_created (action)

Fired whenever any supported eCommerce plugin creates a completed order. Both WooCommerce and EDD fire this action with the same normalized structure, making it platform-agnostic.

Parameters:

ParameterTypeDescription
$dataarrayNormalized order data. See burst_woocommerce_order_data / burst_edd_order_data for the full structure.

Example:

Show code
add_action( 'burst_order_created', function( array $data ): void {
// $data['platform'] is 'WC' or 'EDD'.
error_log( 'Order created. Total: ' . $data['total'] . ' ' . $data['currency'] );
} );

burst_woocommerce_order_created (action)

Fired specifically when a WooCommerce order is created, in addition to burst_order_created. Provides the same $data array.

Parameters:

ParameterTypeDescription
$dataarrayNormalized WooCommerce order data.

Example:

add_action( 'burst_woocommerce_order_created', function( array $data ): void {
// WooCommerce-specific handling.
} );

burst_edd_order_created (action)

Fired specifically when an Easy Digital Downloads order is created, in addition to burst_order_created. Provides the same $data array.

Parameters:

ParameterTypeDescription
$dataarrayNormalized EDD order data.

Example:

add_action( 'burst_edd_order_created', function( array $data ): void {
// EDD-specific handling.
} );

burst_cart_updated (action)

Fired when the cart changes in any supported eCommerce plugin (item added, removed, restored, or quantity updated). Both WooCommerce and EDD fire this action.

Parameters:

ParameterTypeDescription
$dataarrayCart data containing an items key.

$data['items'] entries:

KeyTypeDescription
product_idintProduct or download ID.
quantityintCurrent quantity in cart.
pricefloatUnit price excluding tax.
added_atstringMySQL timestamp of when the item was added (EDD only).

Example:

Show code
add_action( 'burst_cart_updated', function( array $data ): void {
foreach ( $data['items'] as $item ) {
error_log( 'Cart item: product #' . $item['product_id'] . ' qty ' . $item['quantity'] );
}
} );

burst_subscription_update_today (action)

Added in v3.4.0. Fired by the subscription integration event listeners (WooCommerce Subscriptions, EDD Recurring, Subscriben) whenever a subscription lifecycle event occurs. Burst Pro listens to this action to refresh today's subscription aggregates through a debounced cron event.

Parameters:

ParameterTypeDescription
$plugin_sourcestringIntegration identifier, e.g. 'woocommerce_subscriptions', 'edd_recurring', 'subscriben'.

Example:

Show code
add_action( 'burst_subscription_update_today', function( string $plugin_source ): void {
// Invalidate your own subscription cache when Burst detects a change.
wp_cache_delete( 'my_subscription_summary_' . $plugin_source );
} );

Adding a custom integration

Step 1 — register the integration

Use the burst_integrations filter to add your plugin to the registry.

Show code
add_filter( 'burst_integrations', function( array $integrations ): array {
$integrations['my-crm'] = [
// Required. A constant, function, or class name that indicates the plugin is active.
'constant_or_function' => 'MY_CRM_VERSION',

// Required. Human-readable label shown in the Burst UI.
'label' => 'My CRM Plugin',

// Optional. Changed in v3.4.0 — replaces the old admin_only flag.
'php_scripts' => [
'admin_scripts' => [ 'admin.php' ],
'frontend_scripts' => [ 'frontend.php' ],
],

// Optional. Load Burst's eCommerce feature set when this integration is active.
'load_ecommerce_integration' => false,

// Optional. Other integration slugs that must also be active.
'required_plugins' => [],

// Optional. Goals this integration contributes.
'goals' => [
[
// Unique goal identifier.
'id' => 'my_crm_form_submitted',
// 'hook' goals fire when a WordPress action fires server-side.
'type' => 'hook',
'hook' => 'my_crm_form_submitted',
],
[
'id' => 'my_crm_submit_click',
// 'clicks' goals fire when the user clicks a matching DOM element.
'type' => 'clicks',
'selector' => '.my-crm-submit',
],
],
];

return $integrations;
} );

Step 2 — provide integration files (optional)

If your integration needs to run custom PHP (e.g. to hook into server-side events), ship one file per execution context and point Burst to the directory with burst_integration_path:

Show code
add_filter( 'burst_integration_path', function( string $path, string $plugin ): string {
if ( 'my-crm' === $plugin ) {
// $path ends in the requested script filename, e.g. 'admin.php' or 'frontend.php'.
return plugin_dir_path( __FILE__ ) . 'integrations/my-crm/' . basename( $path );
}
return $path;
}, 10, 2 );

Each file is included with require_once during plugin bootstrap (plugins_loaded priority 9) when the plugin is detected as active. Admin scripts only load when the current user can manage Burst; frontend scripts load on every request. No class structure is required — add your hooks directly.

Integration registry schema

Changed in v3.4.0: the admin_only boolean has been replaced by the php_scripts array.

KeyTypeRequiredDescription
constant_or_functionstringYesConstant name, function name, or class name used to detect whether the plugin is active.
labelstringYesDisplay label shown in the Burst dashboard.
php_scriptsarrayNoPer-context script filenames resolved inside includes/Integrations/plugins/{plugin-slug}/. See schema below.
admin_onlyboolNo@deprecated v3.4.0 — use php_scripts.admin_scripts instead. No longer read by the integrations loader.
load_ecommerce_integrationboolNoWhen true and the plugin is active, Burst's eCommerce feature set is enabled. Default false.
required_pluginsstring[]NoIntegration slugs (keys in the registry) that must also be active for this integration to load.
goalsarrayNoGoals made available in the Goals UI. See goal schema below.

php_scripts schema:

KeyTypeDescription
admin_scriptsstring[]Filenames loaded only when has_admin_access() is true.
frontend_scriptsstring[]Filenames loaded on every request where the detected plugin is active.

Goal schema

KeyTypeRequiredDescription
idstringYesUnique identifier for the goal.
typestringYesEither 'hook' (server-side WordPress action) or 'clicks' (client-side DOM click).
hookstringYes (hook type)The WordPress action hook name to listen on.
selectorstringYes (clicks type)CSS selector for the element whose clicks trigger the goal.
caution

Goals must be triggerable by the site visitor (i.e. they must fire during a normal page request or user interaction). Goals that fire only during background processes or WP-CLI commands cannot be attributed to a visitor session and will not be recorded.


Burst registers itself with the WP Consent API during Integrations::init() via the wp_consent_api_registered_{plugin} filter. When the WP Consent API is present, all consent routing is handled by it and plugin-specific consent bridges (e.g. the Complianz script-blocking logic) are bypassed automatically.


WordPress Abilities API

Added in v3.4.1. Burst registers a burst-statistics ability category and a set of read-only abilities for use with AI agents and automation tools that consume the WordPress Abilities API. The integration is opt-in and exposes only data the calling user is already allowed to view through the Burst dashboard.

Prerequisites

  • WordPress with the Abilities API available (wp_register_ability function present)
  • The enable_abilities_api Burst option set to true
  • A logged-in user with the view_burst_statistics capability — anonymous and lower-privileged callers receive burst_abilities_forbidden (HTTP 403)

Enabling

The integration is disabled by default. Toggle "Enable Abilities API (for AI agents and automation)" under Settings → Advanced → Scripts, or set the option programmatically:

update_option( 'burst_enable_abilities_api', true );

When the option is off, no category or abilities are registered, and the action hooks are never attached.

Registered abilities

Every ability is registered in the burst-statistics category, declared readonly, idempotent, and non-destructive, and gated by a per-user, per-ability rate limit (default 30 calls per 60-second window).

AbilityDescription
burst/live-visitorsCurrent number of live visitors
burst/live-trafficActive visitors and pages from the live traffic feed; accepts an optional limit (1–100)
burst/today-summaryToday's live, pageviews, top page, top referrer and average time on page; accepts optional date_start and date_end Unix timestamps
burst/tasksCurrent Burst task list with id, label, status, icon and optional URL
burst/tracking-statusTracking transport status and last test timestamp
burst/license-noticesLicense state and notices for Burst Pro; returns license_status: "unavailable" when Burst Pro is not installed
burst/dataInsights timeseries or datatable rows for arbitrary metrics, filters, group_by and limit. Requires a type of "insights" or "datatable"
burst/sales-dataEcommerce sales metrics (Burst Pro only)
burst/subscriptions-dataEcommerce subscriptions metrics (Burst Pro only)

Pro-only abilities return a burst_abilities_pro_required error with HTTP 503 when called from Burst free.

Pro - BusinessAvailable in the Business tier

The burst/sales-data and burst/subscriptions-data abilities surface ecommerce metrics that require the Business tier. Learn more about revenue & sales tracking

Error codes

CodeHTTP statusMeaning
burst_abilities_forbidden403Caller lacks the Burst view capability or is unauthenticated
burst_abilities_invalid_input400The input payload failed validation (wrong type, missing required type parameter, etc.)
burst_abilities_rate_limited429Per-user rate limit exceeded for this ability
burst_abilities_pro_required503Ability requires Burst Pro and the constant BURST_PRO is not defined
burst_abilities_unavailable503Burst admin services could not be bootstrapped for this request
burst_abilities_execution_failed500The underlying statistics call threw an exception

Adjusting rate limits

Both the window length and the call ceiling are filterable per ability. See burst_abilities_rate_limit_window and burst_abilities_rate_limit_max in the filters reference above.