Third-Party Plugin Integrations
Burst Statistics v3.3.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
On plugins_loaded, 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 file from includes/Integrations/plugins/. If the integration defines goals, those goals become available in the Goals UI.
Integration files are plain PHP files; no class is required. They hook into WordPress actions and filters to bridge the third-party plugin with Burst's own hooks.
Built-in integrations
Consent plugins
Complianz GDPR/CCPA
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
burstentry 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 ID | Type | Trigger |
|---|---|---|
elementor_pro_forms_form_submitted | hook | elementor_pro/forms/form_submitted |
submit_button_click | clicks | .elementor-field-type-submit .elementor-button |
eCommerce plugins
WooCommerce
Fires Burst's unified order and cart actions and resolves the checkout/products page IDs.
Goals available:
| Goal ID | Type | Trigger |
|---|---|---|
woocommerce_add_to_cart | hook | woocommerce_add_to_cart |
woocommerce_checkout_order_created | hook | woocommerce_checkout_order_created |
woocommerce_payment_complete | hook | woocommerce_payment_complete |
woocommerce_add_to_cart_click | clicks | .add_to_cart_button |
woocommerce_click_checkout_button | clicks | .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
Detected via WCPAY_PLUGIN_FILE. Requires WooCommerce to also be active. No additional goals; relies on WooCommerce's own order hooks.
Easy Digital Downloads
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 ID | Type | Trigger |
|---|---|---|
edd_complete_purchase | hook | edd_complete_purchase |
edd_add_to_cart | clicks | .edd-add-to-cart |
edd_go_to_checkout | clicks | .edd_go_to_checkout |
edd_click_purchase | clicks | #edd-purchase-button |
Easy Digital Downloads – Multi Currency
Detected via EDD_MULTI_CURRENCY_FILE. Requires Easy Digital Downloads to also be active. No additional goals.
Easy Digital Downloads – Recurring Payments
Goals available:
| Goal ID | Type | Trigger |
|---|---|---|
edd_subscription_post_create | hook | edd_subscription_post_create |
edd_subscription_cancelled | hook | edd_subscription_cancelled |
Give – Donation Plugin
Goals available:
| Goal ID | Type | Trigger |
|---|---|---|
give_click_donation_open_modal | clicks | .givewp-donation-form-modal__open |
give_click_donation | clicks | .givewp-donation-form__steps-button-next |
give_donation_hook | hook | give_process_donation_after_validation |
Contact form plugins
Contact Form 7
| Goal ID | Type | Trigger |
|---|---|---|
wpcf7_submit | hook | wpcf7_submit |
wpcf7_submit_click | clicks | .wpcf7-submit |
WPForms
| Goal ID | Type | Trigger |
|---|---|---|
wpforms_process_complete | hook | wpforms_process_complete |
wpforms_click_submit | clicks | .wpforms-submit |
Fluent Forms
| Goal ID | Type | Trigger |
|---|---|---|
fluentform_submission_inserted | hook | fluentform/submission_inserted |
fluentforms_click_submit | clicks | .ff-btn-submit |
Happyforms
| Goal ID | Type | Trigger |
|---|---|---|
happyforms_submission_success | hook | happyforms_submission_success |
WS Form
| Goal ID | Type | Trigger |
|---|---|---|
wsf_submit | hook | wsf_submit |
Gravity Forms
| Goal ID | Type | Trigger |
|---|---|---|
gform_post_submission | hook | gform_post_submission |
gform_click_submit | clicks | input[type="submit"].gform_button |
Formidable Forms
| Goal ID | Type | Trigger |
|---|---|---|
frm_submit_clicked | clicks | .frm_button_submit |
Ninja Forms
| Goal ID | Type | Trigger |
|---|---|---|
ninja_forms_after_submission | hook | ninja_forms_after_submission |
Caching plugins
WP Rocket
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.
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.
| Column | Type | Default | Description |
|---|---|---|---|
browser_id | int | 0 | Foreign key into burst_browsers. |
browser_version_id | int | 0 | Foreign key into browser versions lookup. |
platform_id | int | 0 | Foreign key into burst_platforms. |
device_id | int | 0 | Foreign key into burst_devices. |
first_time_visit | tinyint | 0 | 1 if this is the visitor's first ever session. |
bounce | tinyint | 1 | 1 if the session contained only one pageview. |
Indexes are created for browser_id, platform_id, device_id, first_time_visit, and bounce.
burst_statistics
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.
// 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
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:
| Parameter | Type | Description |
|---|---|---|
$integrations | array<string, array> | Associative array of integrations keyed by plugin slug. |
Example:
add_filter( 'burst_integrations', function( array $integrations ): array {
$integrations['my-plugin'] = [
'constant_or_function' => 'MY_PLUGIN_VERSION',
'label' => 'My Plugin',
'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.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$path | string | Absolute path to the integration PHP file. |
$plugin | string | The plugin slug being loaded. |
Example:
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:
| Parameter | Type | Description |
|---|---|---|
$should_load | bool | true to enable eCommerce features, false to disable. |
Example:
add_filter( 'burst_load_ecommerce_integration', '__return_true' );
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:
| Parameter | Type | Description |
|---|---|---|
$page_id | int | The 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:
| Parameter | Type | Description |
|---|---|---|
$page_id | int | The 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:
| Parameter | Type | Description |
|---|---|---|
$currency | string | ISO 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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Normalized order data (see structure below). |
$order | WC_Order | The WooCommerce order object. |
$data structure:
| Key | Type | Description |
|---|---|---|
currency | string | ISO 4217 currency code. |
total | float | Order subtotal before tax. |
tax | float | Total tax amount. |
platform | string | Always 'WC'. |
products | array | Array of {product_id, amount, price} entries. |
Example:
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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Normalized order data (see structure below). |
$order_id | int | The EDD payment/order ID. |
$payment | EDD_Payment | The EDD payment object. |
$data structure:
| Key | Type | Description |
|---|---|---|
currency | string | ISO 4217 currency code. |
total | float | Order subtotal before tax. |
tax | float | Total tax amount. |
platform | string | Always 'EDD'. |
products | array | Array of {product_id, amount, price} entries. |
Example:
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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Normalized order data. See burst_woocommerce_order_data / burst_edd_order_data for the full structure. |
Example:
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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Normalized 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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Normalized 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:
| Parameter | Type | Description |
|---|---|---|
$data | array | Cart data containing an items key. |
$data['items'] entries:
| Key | Type | Description |
|---|---|---|
product_id | int | Product or download ID. |
quantity | int | Current quantity in cart. |
price | float | Unit price excluding tax. |
added_at | string | MySQL timestamp of when the item was added (EDD only). |
Example:
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'] );
}
} );
Adding a custom integration
Step 1 — Register the integration
Use the burst_integrations filter to add your plugin to the registry.
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. Set true to load this integration on admin requests only.
'admin_only' => false,
// 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 an integration file (optional)
If your integration needs to run custom PHP (e.g. to hook into server-side events), provide a file and point Burst to it with burst_integration_path:
add_filter( 'burst_integration_path', function( string $path, string $plugin ): string {
if ( 'my-crm' === $plugin ) {
return plugin_dir_path( __FILE__ ) . 'burst-integration.php';
}
return $path;
}, 10, 2 );
The file is included with require_once on plugins_loaded when the plugin is detected as active. No class structure is required — add your hooks directly.
Integration registry schema
| Key | Type | Required | Description |
|---|---|---|---|
constant_or_function | string | Yes | Constant name, function name, or class name used to detect whether the plugin is active. |
label | string | Yes | Display label shown in the Burst dashboard. |
admin_only | bool | No | When true, the integration file is loaded only for users with admin access. Default false. |
load_ecommerce_integration | bool | No | When true and the plugin is active, Burst's eCommerce feature set is enabled. Default false. |
required_plugins | string[] | No | Integration slugs (keys in the registry) that must also be active for this integration to load. |
goals | array | No | Goals made available in the Goals UI. See goal schema below. |
Goal schema
| Key | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique identifier for the goal. |
type | string | Yes | Either 'hook' (server-side WordPress action) or 'clicks' (client-side DOM click). |
hook | string | Yes (hook type) | The WordPress action hook name to listen on. |
selector | string | Yes (clicks type) | CSS selector for the element whose clicks trigger the goal. |
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.
WP Consent API
Burst registers itself with the WP Consent API on plugins_loaded 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.