Ecommerce tracking
Pro - BusinessAvailable in the Business tier
All features on this page require Burst Pro. Learn more about WooCommerce Funnel Analytics.
Burst Pro includes ecommerce tracking for WooCommerce and Easy Digital Downloads. It records cart activity, order data, and visitor behaviour, then surfaces that data through five dashboards: Sales, Subscriptions, Funnel, Quick Wins, and Top Performers.
Overview
When ecommerce tracking is active the plugin adds a should_load_ecommerce flag to the frontend tracking options, which instructs the JavaScript tracker to listen for cart and order events. Backend integrations (WooCommerce, EDD) fire two WordPress actions — burst_order_created and burst_cart_updated — which write to dedicated database tables.
Database tables
| Table | Purpose |
|---|---|
{prefix}burst_orders | One row per completed order |
{prefix}burst_order_items | One row per line item in an order |
{prefix}burst_cart | One active cart per visitor |
{prefix}burst_cart_items | Items currently in a cart |
{prefix}burst_subscription_daily | One row per day per integration with aggregated subscription metrics |
{prefix}burst_subscription_product_daily | One row per product per day with per-product subscription metrics |
All monetary values stored in burst_orders and burst_order_items carry a conversion_rate column so that multi-currency stores can be normalised to the store's base currency in reports.
Changed in v3.4.2.1: burst_orders.statistic_id and burst_order_items.burst_order_id are now stored as INT UNSIGNED instead of varchar(255) so they can be used as indexed integer foreign keys. Additional indexes are added on burst_orders.statistic_id, burst_order_items.burst_order_id, burst_cart.updated_at, the composite burst_cart (uid, updated_at, converted), and burst_cart_items (cart_id, added_at) and burst_cart_items.added_at. Existing installs are migrated automatically by the pro_order_foreign_keys upgrade routine; custom integrations that wrote non-numeric values into either column must be reconciled before upgrading.
Actions
burst_order_created
Fired when a completed order should be recorded. The ecommerce integration (WooCommerce, EDD, or a custom integration) fires this action and passes the full order payload. Burst uses it to write rows to burst_orders and burst_order_items, then marks the visitor's active cart as converted.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$data | array | Order data (see fields below) |
$data fields:
| Key | Type | Required | Description |
|---|---|---|---|
currency | string | Yes | ISO 4217 currency code (e.g. 'USD') |
total | float | Yes | Order total before tax |
tax | float | No | Tax amount (default 0.0) |
platform | string | Yes | Integration identifier (e.g. 'WooCommerce', 'EDD') |
conversion_rate | float | Yes | Exchange rate relative to the store base currency (use 1.0 for single-currency stores) |
products | array | Yes | Array of product line items (see below) |
Each item in products:
| Key | Type | Required | Description |
|---|---|---|---|
product_id | int | Yes | WordPress post ID of the product |
amount | int | Yes | Quantity purchased |
price | float | Yes | Unit price of the product |
Example:
Show code
do_action( 'burst_order_created', [
'currency' => 'USD',
'total' => 49.99,
'tax' => 4.50,
'platform' => 'WooCommerce',
'conversion_rate' => 1.0,
'products' => [
[
'product_id' => 42,
'amount' => 1,
'price' => 49.99,
],
],
] );
The action silently returns without recording if platform, total, currency, or conversion_rate are empty, or if any product item is missing product_id, amount, or price. Check your integration logs if orders are not appearing in reports.
burst_cart_updated
Fired whenever the visitor's cart changes (items added, removed, or quantity changed). Pass an empty items array to delete the cart. Burst reconciles the full item list on every call — it replaces all existing cart items with the supplied array.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$data | array | Cart data (see fields below) |
$data fields:
| Key | Type | Description |
|---|---|---|
items | array | Full current contents of the cart. Pass an empty array to clear the cart. |
Each item in items:
| Key | Type | Required | Description |
|---|---|---|---|
product_id | int | Yes | WordPress post ID of the product |
quantity | int | Yes | Item quantity (must be > 0) |
price | float | Yes | Unit price excluding tax (must be >= 0) |
Example:
Show code
// Add or update items in the cart.
do_action( 'burst_cart_updated', [
'items' => [
[
'product_id' => 42,
'quantity' => 2,
'price' => 24.99,
],
],
] );
// Clear the cart (e.g. after order is placed through a custom flow).
do_action( 'burst_cart_updated', [ 'items' => [] ] );
burst_subscription_update_today
Added in v3.4.0. Fired by subscription integrations whenever a subscription event occurs (creation, status change, renewal payment, cancellation, etc.). Burst debounces these calls into a single same-day aggregation run, refreshing today's row in burst_subscription_daily and burst_subscription_product_daily with provisional data (is_complete = 0). The next daily cron run finalizes the row with is_complete = 1.
Custom subscription integrations should fire this action whenever their data changes within the current day.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$plugin_source | string | Integration identifier (e.g. 'woocommerce_subscriptions', 'edd_recurring', 'subscriben') |
Example:
do_action( 'burst_subscription_update_today', 'woocommerce_subscriptions' );
The integration must be registered with the Subscription Aggregator (via the burst_subscription_aggregator_integrations filter) for the action to have any effect. Unknown plugin sources are silently ignored.
burst_subscription_day_finalized
Added in v3.4.2.1. Fired by the Subscription Aggregator after each historical day finalizes during a backfill batch (and after the daily cron run that finalizes today's row). The payload identifies which integration finalized the day so each registered provider can release its per-request subscription row cache without losing rows that another integration just paid to fetch.
Built-in providers hook into this action to flush their in-memory subscription cache when the source matches their own. Custom providers that maintain a similar per-request cache should follow the same pattern.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$plugin_source | string | Source key of the aggregator that finalized a day (e.g. 'woocommerce_subscriptions') |
$day_start | int | Unix timestamp for the start of the finalized day |
Example:
Show code
add_action( 'burst_subscription_day_finalized', function( string $plugin_source, int $day_start ): void {
if ( 'my_custom_subscriptions' !== $plugin_source ) {
return;
}
My_Custom_Subscription_Provider::instance()->reset_subscription_cache();
}, 10, 2 );
Filters
burst_tracking_options
Burst adds a should_load_ecommerce key (value true) to the tracking options array passed to the frontend JavaScript tracker. You can inspect or override this behaviour using the existing burst_tracking_options filter.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$options | array | Tracking options passed to the frontend tracker |
Example:
Show code
add_filter( 'burst_tracking_options', function( array $options ): array {
if ( is_page( 'staging-preview' ) ) {
$options['should_load_ecommerce'] = false;
}
return $options;
} );
burst_quick_wins_configs
Filters the full array of Quick Wins rule configurations before they are evaluated. Use this to add custom rules, modify thresholds, or remove built-in rules.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$quick_wins | array | Associative array of Quick Wins configs keyed by a unique string identifier |
Each config entry supports the following keys:
| Key | Type | Description |
|---|---|---|
type | string | Priority level: 'critical', 'recommended', or 'opportunity' |
data | callable|mixed | Callable that receives $args (date_start, date_end, filters) and returns a numeric value, or a static value |
conditions | array | Condition definition with keys compare (>, >=, <, <=, ==, !=) and value (float threshold) |
title | string | Translated title shown in the dashboard. Use %d or %f as a placeholder for the actual metric value |
message | string | Translated description of the issue |
recommendation | string | Translated recommended action |
url | string|null | Optional URL to related documentation or article |
Example:
Show code
add_filter( 'burst_quick_wins_configs', function( array $configs ): array {
$configs['high_homepage_bounce'] = [
'type' => 'critical',
'data' => function( array $args ): ?float {
return my_plugin_get_homepage_bounce_rate( $args );
},
'conditions' => [
'compare' => '>',
'value' => 80.0,
],
'title' => __( 'Homepage bounce rate is %f%%', 'my-plugin' ),
'message' => __( 'A high homepage bounce rate may indicate a poor first impression.', 'my-plugin' ),
'recommendation' => __( 'Review your homepage hero section and calls to action.', 'my-plugin' ),
'url' => null,
];
return $configs;
} );
:::caution Breaking change
Changed in v3.3.0: All built-in Quick Wins queries now JOIN burst_sessions to resolve device_id, browser_id, and first_time_visit. Custom data callables that reference statistics.first_time_visit directly in SQL must be updated to sessions.first_time_visit. Similarly, any direct references to statistics.device_id or statistics.browser_id must be updated to sessions.device_id / sessions.browser_id.
:::
Quick Wins are only evaluated after ecommerce tracking has been active for at least 7 days. Rules with a data callable that throws an exception are skipped and logged, but do not halt other rules.
burst_subscription_aggregator_integrations
Added in v3.4.0. Filters the array of registered subscription aggregator integrations. Use this to register a custom subscription provider so its daily metrics get aggregated into burst_subscription_daily and burst_subscription_product_daily.
Each entry must be an instance of Burst\Pro\Admin\Ecommerce\Subscriptions\Aggregators\Base\Subscription_Aggregator_Base.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$integrations | array | Array of Subscription_Aggregator_Base instances |
Example:
Show code
add_filter( 'burst_subscription_aggregator_integrations', function( array $integrations ): array {
$integrations[] = new My_Custom_Subscription_Aggregator();
return $integrations;
} );
burst_subscription_integrations_enabled
Added in v3.4.0. Returns true when at least one subscription integration is active (WooCommerce Subscriptions, EDD Recurring, or Subscriben). Custom integrations should hook in and return true to enable the Subscriptions tab and aggregator.
Example:
add_filter( 'burst_subscription_integrations_enabled', '__return_true' );
burst_subscription_cache_max_rows
Added in v3.4.2.1. Filters the cumulative row-count ceiling for the per-request in-memory subscription cache used by every built-in subscription provider. Each provider walks its underlying tables once per range via keyset pagination on the subscription primary key, then caches the full row set so multiple aggregation methods (MRR, churn, distribution, retention, product metrics) reading the same shape share a single database pass.
The default ceiling is 25000 rows, sized for the cheapest commonly-deployed PHP memory limit (128 MB). Once the cumulative count would exceed the ceiling, additional row sets are dropped from the cache and callers fall back to a fresh keyset re-fetch — correctness is unaffected, only the cache-hit rate across the request. Hosts with memory_limit >= 512M can raise this value to keep more row sets resident across aggregation calls; lowering it below ~5000 will negate most of the per-request batching benefit.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$ceiling | int | Default cumulative row-count cap (25000) |
$plugin_source | string | The provider source key (e.g. 'woocommerce_subscriptions', 'edd_recurring', 'subscriben') |
Example:
Show code
add_filter( 'burst_subscription_cache_max_rows', function( int $ceiling, string $plugin_source ): int {
// Only loosen the cap for the WooCommerce Subscriptions provider on a 512 MB host.
if ( 'woocommerce_subscriptions' === $plugin_source ) {
return 75000;
}
return $ceiling;
}, 10, 2 );
Each cached row carries roughly 2.5× its on-the-wire size in PHP object/zval/HashTable overhead — Subscriben rows in particular are inflated by a serialized products_multiple payload plus a GROUP_CONCAT of every related order ID. Benchmark before raising the ceiling above 100000 on shared hosts.
Sales analytics
The Sales dashboard shows four key metrics for the selected date range, each compared to the equivalent previous period of the same length.
| Metric | Description |
|---|---|
| Conversion Rate | Percentage of unique visitors who completed a purchase (converted / visitors × 100) |
| Abandoned Carts | Percentage of carts that were not converted and have been inactive for more than 30 minutes (abandoned / total_carts × 100) |
| Average Order Value | Mean revenue per order in the store's base currency, normalised using each order's conversion_rate |
| Revenue | Total revenue across all orders in the base currency, normalised using each order's conversion_rate |
Each metric is returned with current, previous, and rate_change keys. rate_change is null when either period has no data.
A cart is classified as abandoned only when its updated_at timestamp is more than 30 minutes in the past and converted = 0. Carts updated within the last 30 minutes are still considered active and excluded from the abandonment count.
The data layer functions that assemble Sales and Top Performers payloads (modify_product_data() and get_ecommerce_data()) both guard with user_can_view_sales() and return the unmodified data array immediately if the check fails. Changed in v3.3.0: this capability check is enforced at the data layer in addition to the REST API permission callback.
Changed in v3.4.2.1: the SQL used to compute revenue and avg_order_value joins a pre-aggregated derived order_items table that sums amount and price * amount per burst_order_id before the outer GROUP BY, instead of fanning out one row per line item. Queries that do not select product or adds_to_cart and do not filter by product_id automatically use the pre-aggregated form. The SQL itself moved from SUM(((order_items.price/COALESCE(orders.conversion_rate, 1))*order_items.amount)) to SUM(order_items.revenue / COALESCE(orders.conversion_rate, 1)). Custom code that referenced order_items.price directly in queries built through burst_available_joins must select order_items.revenue instead, or filter on product_id to fall back to the raw line-item join shape.
:::caution Breaking change
Changed in v3.3.0: view_sales_burst_statistics is no longer automatically granted to burst_viewer on share-link access. Share-link visitors can only see ecommerce/sales data if the share link was created with the Sales tab explicitly included in its shared tabs. Existing share links that were generated before v3.3.0 will silently block sales data unless they are regenerated with the Sales tab enabled.
:::
Subscriptions analytics
Added in v3.4.0. The Subscriptions dashboard surfaces recurring revenue metrics for stores that use a supported subscription plugin. Built-in support covers WooCommerce Subscriptions, Easy Digital Downloads Recurring Payments, and Subscriben.
Architecture
Subscription data is computed in two layers:
- Per-integration providers (in
includes/Pro/Admin/Ecommerce/Subscriptions/Providers/) — each subscription plugin has a provider that knows how to query its underlying tables and normalise the result into a common shape. - Daily aggregators (in
includes/Pro/Admin/Ecommerce/Subscriptions/Aggregators/) — each integration also has a daily aggregator that runs onburst_dailyand stores per-day metrics inburst_subscription_dailyand per-product breakdowns inburst_subscription_product_daily.
The Subscription_Aggregator orchestrator handles backfill (in batches of 10 days per cron run), real-time updates for the current day, and serving cached data back to the dashboard.
Changed in v3.4.2.1: providers walk their underlying tables once per range via keyset pagination on the subscription primary key (no OFFSET) and cache the full row set in-memory keyed by query args, so multiple aggregation methods reading the same range share a single database pass. The cache is bounded by burst_subscription_cache_max_rows and is automatically released after each finalized day during a backfill via the burst_subscription_day_finalized action.
Summary metrics
| Metric | Description |
|---|---|
| Monthly Recurring Revenue | Sum of normalised monthly recurring revenue across all active and trialling subscriptions at the end of the period |
| Active Subscriptions | Count of subscriptions in the active state at period end |
| Canceled Subscriptions | Count of subscriptions that ended within the period |
| Revenue Churn | (churned MRR / MRR at period start) × 100, with absolute churned MRR also returned |
| Average Lifetime Value | Total revenue from all related orders for active subscriptions, divided by the active subscription count |
Each metric is returned with current, previous, and rate_change keys, mirroring the Sales dashboard.
Permissions
Viewing subscription data requires the view_sales_burst_statistics capability. The Subscriptions admin menu item is registered by the same routine that filters the menu list, alongside the Sales menu item.
:::caution Breaking change
Changed in v3.4.2: the Subscriptions tab is no longer shareable via share links. Share links created in earlier versions that included the Subscriptions tab will no longer expose subscription data to share-link viewers. To grant access to subscription metrics, users must be assigned a role with the view_sales_burst_statistics capability instead of using a share link.
:::
Date range overrides
Changed in v3.4.0: the ecommerce date_start override no longer applies to subscription data types (subscriptions, subscriptions-revenue-chart, subscriptions-distribution, subscriptions-retention) or to the subscription_products datatable. Subscription queries use the requested date range directly so they can return historical periods predating ecommerce tracking activation.
Endpoints
The Subscriptions dashboard requests data via the existing burst/v1/get/<type> REST endpoint with the following type values:
| Type | Description |
|---|---|
subscriptions | Summary metrics (MRR, active, canceled, churn, LTV) |
subscriptions-revenue-chart | New vs renewal revenue or sales series, bucketed by group_by (auto, day, week, month) and chart_mode (revenue or sales) |
subscriptions-distribution | Distribution by gateways, currencies, or countries (selected via the distribution_view arg) |
subscriptions-retention | Monthly cohort retention, optionally filtered by product_id |
The subscription_products datatable id returns per-product subscription metrics filtered to the requested column metrics.
Abilities API
Added in v3.4.1. Burst registers two read-only ecommerce abilities with the WordPress Abilities API for use by trusted AI agents and automation tools. Abilities are registered only when the enable_abilities_api option is enabled and the host WordPress install exposes wp_register_ability().
Both abilities require Burst Pro (the underlying execute callback returns a 503 burst_abilities_pro_required error when BURST_PRO is not defined), require the Burst view capability, and are subject to a per-user rate limit (default 30 calls per 60 seconds, filterable via burst_abilities_rate_limit_max and burst_abilities_rate_limit_window).
Changed in v3.4.2: both abilities now accept additional filters and limit parameters, and route through the granular datatable endpoints (sales_products and subscription_products). Requested metrics are intersected with a per-datatable metric allow-list; metrics outside the allow-list are silently dropped, and a request with no valid metrics returns a 400 burst_abilities_invalid_metrics error.
burst/sales-data
Returns ecommerce sales metrics from the sales_products datatable, grouped by the requested dimensions. Internally proxies to the datatables data layer with a type = 'purchase' filter applied.
Input schema:
| Key | Type | Default | Description |
|---|---|---|---|
date_start | int | 0 | Unix timestamp for the start of the range |
date_end | int | 0 | Unix timestamp for the end of the range |
metrics | string[] | ['product', 'sales', 'revenue'] | Metric column ids to retrieve. Restricted to the sales_products allow-list: product, adds_to_cart, sales, revenue |
filters | object[] | [] | Additional filter objects (each with key and value) merged with the built-in type = 'purchase' filter |
group_by | string[] | ['product'] | Grouping column ids. utm_source is normalised to source; an empty array falls back to ['page_url'] |
limit | int | 100 | Maximum number of rows to return. Clamped to the range 1–500 |
Returns an object with type = 'datatable', an array of dimensions and metrics (each with id and label), rows (raw datatable rows), and row_count.
Example:
Show code
$result = wp_get_ability( 'burst/sales-data' )->execute( [
'date_start' => strtotime( '-30 days' ),
'date_end' => time(),
'metrics' => [ 'product', 'sales', 'revenue' ],
'group_by' => [ 'product' ],
'filters' => [
[
'key' => 'country_code',
'value' => 'NL',
],
],
'limit' => 50,
] );
burst/subscriptions-data
Returns ecommerce subscription metrics from the subscription_products datatable, grouped by the requested dimensions. Internally proxies to the datatables data layer with a type = 'subscription' filter applied.
Input schema:
| Key | Type | Default | Description |
|---|---|---|---|
date_start | int | 0 | Unix timestamp for the start of the range |
date_end | int | 0 | Unix timestamp for the end of the range |
metrics | string[] | ['plan', 'active_subscribers', 'canceled_subscribers', 'trialling_subscribers', 'monthly_recurring_revenue', 'product_churn_value'] | Metric column ids to retrieve. Restricted to the subscription_products allow-list: plan, active_subscribers, canceled_subscribers, trialling_subscribers, monthly_recurring_revenue, product_churn_value |
filters | object[] | [] | Additional filter objects (each with key and value) merged with the built-in type = 'subscription' filter |
group_by | string[] | ['plan'] | Grouping column ids. utm_source is normalised to source; an empty array falls back to ['page_url'] |
limit | int | 100 | Maximum number of rows to return. Clamped to the range 1–500 |
Returns the same shape as burst/sales-data.
Example:
Show code
$result = wp_get_ability( 'burst/subscriptions-data' )->execute( [
'date_start' => strtotime( '-30 days' ),
'date_end' => time(),
'metrics' => [ 'plan', 'active_subscribers', 'monthly_recurring_revenue' ],
'group_by' => [ 'plan' ],
'limit' => 25,
] );
Both abilities return WP_Error with status 503 when Burst Pro is not active, 403 when the caller lacks the Burst view capability, and 429 once the per-user rate limit is exceeded. They also return 400 burst_abilities_invalid_metrics when none of the requested metrics are valid for the underlying datatable. Handle these responses defensively when integrating with agent frameworks.
Funnel tracking
The Funnel dashboard visualises the five stages of the purchase journey. Each stage returns the count of unique visitors (uid) who reached that stage within the selected date range.
| Stage | ID | Description |
|---|---|---|
| Visitors started session | visits | All unique visitors in the date range |
| Viewed a product | product_page_views | Visitors who viewed a page with page_type = 'product' or page_type = 'download', or the configured product archive page |
| Added to cart | add_to_cart | Visitors who have at least one burst_cart_items row with added_at within the range |
| Started checkout | checkout_visits | Visitors who viewed the configured WooCommerce/EDD checkout page |
| Purchased | conversions | Visitors who have at least one row in burst_orders linked to their statistics record |
Drop-off between stages is calculated on the frontend from the raw counts.
Quick wins
Quick Wins are automated insights that surface when a metric crosses a configured threshold. They are calculated once per day via a WordPress cron chain and cached in the burst_quick_wins option.
Each rule examines data from the last 31 days (31 days ago 00:00:00 through yesterday 23:59:59). If the ecommerce activation date falls within that window, the window is trimmed to start at the activation date.
Built-in metrics evaluated by Quick Wins
The following metrics are computed internally and can also be re-used in custom rules via the burst_quick_wins_configs filter. All methods accept an $args array with date_start (int, Unix timestamp), date_end (int, Unix timestamp), and filters (array).
Changed in v3.3.0: all underlying queries for these metrics JOIN burst_sessions on statistics.session_id = sessions.ID to resolve device_id, browser_id, and first_time_visit. The first_time_visit condition is now evaluated against sessions.first_time_visit rather than statistics.first_time_visit.
| Method | Return type | Description |
|---|---|---|
get_cart_abandonment_rate( $args ) | float|null | Cart abandonment rate as a percentage |
get_checkout_completion_rate( $args ) | float|null | Percentage of checkout page visitors who converted |
get_avg_checkout_completion_time( $args ) | int|null | Average time spent on the checkout page in seconds |
get_safari_checkout_abandonment_delta( $args ) | float|null | Difference in abandonment rate between Safari and all browsers combined (percentage points) |
get_cart_drop_off_rate( $args ) | float|null | Percentage of visitors who did not add anything to their cart |
get_cart_to_checkout_rate( $args ) | float|null | Percentage of cart starters who did not convert (cart exit rate) |
get_average_order_value( $args ) | float|null | Average order value in the store currency (not normalised) |
get_email_campaign_conversion_rate( $args ) | float|null | Conversion rate of visitors arriving via email campaigns |
get_returning_customer_rate( $args ) | float|null | Percentage of orders from customers who had a prior converted cart |
get_new_visitor_conversion_rate( $args ) | float|null | Conversion rate of first-time visitors |
get_returning_vs_new_visitor_cr_ratio( $args ) | float|null | Ratio of returning-visitor CR to new-visitor CR |
get_home_page_bounce_rate( $args ) | float|null | Bounce rate on the homepage (/) |
get_product_page_exit_without_add_to_cart_rate( $args ) | float|null | Percentage of product/download page visitors who left without adding to cart |
get_single_product_exit_rate( $args ) | float|null | Percentage of visitors who viewed exactly one product/download page and left without adding to cart |
get_avg_session_duration( $args ) | float|null | Average session duration in seconds |
get_mobile_vs_desktop_conversion_ratio( $args ) | float|null | Ratio of mobile+tablet CR to desktop CR |
Dismissing and snoozing Quick Wins
Users can dismiss or snooze individual Quick Wins from the dashboard. Dismissed IDs are stored permanently in burst_quick_win_dismissed_wins. Snoozed IDs are stored in burst_quick_win_snoozed_wins as a map of id => unix_expiry_timestamp. The default snooze period is 30 days.
Top performers
The Top Performers dashboard shows the single highest-revenue entry in four dimensions for the selected period, with a comparison to the previous period of the same length.
| Dimension | ID | Fields returned |
|---|---|---|
| Top product | top-product | product_id, product_name, total_quantity_sold, total_revenue, currency |
| Top campaign | top-campaign | campaign_id, campaign_name, total_quantity_sold, total_revenue, currency |
| Top country | top-country | country_code, total_quantity_sold, total_revenue, currency |
| Top device | top-device | device_name, total_quantity_sold, total_revenue, currency |
Each dimension returns current, previous, and revenue_change keys. revenue_change is null when either period has no orders. Revenue figures are normalised to the store's base currency using each order's conversion_rate.
For product variations, the product name is formatted as Parent Product Name (Variation Description).
Changed in v3.3.0: the top-device query (and all Top Performers dimension queries) now JOIN burst_sessions on sessions.ID = statistics.session_id and resolve device_id via sessions.device_id rather than statistics.device_id.
WordPress cron events
| Event hook | Trigger | Description |
|---|---|---|
burst_daily | Daily | Schedules the Quick Wins processing chain and triggers daily subscription aggregation across registered integrations |
burst_process_quick_wins_single_event | Chained, 1 minute apart | Evaluates one Quick Win rule per invocation; schedules the next index until all rules are processed |
burst_subscription_backfill_<plugin_source>_cron | Single-event, chained 1 minute apart | Added in v3.4.0. Processes one batch of 10 historical days per invocation for the named integration (e.g. burst_subscription_backfill_woocommerce_subscriptions_cron) until backfill is complete |
burst_subscription_update_today_<plugin_source> | Single-event, debounced 60s | Added in v3.4.0. Recalculates today's subscription metrics provisionally after a burst_subscription_update_today action; multiple events within the debounce window collapse into a single run |