Skip to main content

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

TablePurpose
{prefix}burst_ordersOne row per completed order
{prefix}burst_order_itemsOne row per line item in an order
{prefix}burst_cartOne active cart per visitor
{prefix}burst_cart_itemsItems currently in a cart
{prefix}burst_subscription_dailyOne row per day per integration with aggregated subscription metrics
{prefix}burst_subscription_product_dailyOne 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:

ParameterTypeDescription
$dataarrayOrder data (see fields below)

$data fields:

KeyTypeRequiredDescription
currencystringYesISO 4217 currency code (e.g. 'USD')
totalfloatYesOrder total before tax
taxfloatNoTax amount (default 0.0)
platformstringYesIntegration identifier (e.g. 'WooCommerce', 'EDD')
conversion_ratefloatYesExchange rate relative to the store base currency (use 1.0 for single-currency stores)
productsarrayYesArray of product line items (see below)

Each item in products:

KeyTypeRequiredDescription
product_idintYesWordPress post ID of the product
amountintYesQuantity purchased
pricefloatYesUnit 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,
],
],
] );
caution

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:

ParameterTypeDescription
$dataarrayCart data (see fields below)

$data fields:

KeyTypeDescription
itemsarrayFull current contents of the cart. Pass an empty array to clear the cart.

Each item in items:

KeyTypeRequiredDescription
product_idintYesWordPress post ID of the product
quantityintYesItem quantity (must be > 0)
pricefloatYesUnit 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:

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

Example:

do_action( 'burst_subscription_update_today', 'woocommerce_subscriptions' );
caution

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:

ParameterTypeDescription
$plugin_sourcestringSource key of the aggregator that finalized a day (e.g. 'woocommerce_subscriptions')
$day_startintUnix 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:

ParameterTypeDescription
$optionsarrayTracking 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:

ParameterTypeDescription
$quick_winsarrayAssociative array of Quick Wins configs keyed by a unique string identifier

Each config entry supports the following keys:

KeyTypeDescription
typestringPriority level: 'critical', 'recommended', or 'opportunity'
datacallable|mixedCallable that receives $args (date_start, date_end, filters) and returns a numeric value, or a static value
conditionsarrayCondition definition with keys compare (>, >=, <, <=, ==, !=) and value (float threshold)
titlestringTranslated title shown in the dashboard. Use %d or %f as a placeholder for the actual metric value
messagestringTranslated description of the issue
recommendationstringTranslated recommended action
urlstring|nullOptional 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. :::

caution

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:

ParameterTypeDescription
$integrationsarrayArray 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:

ParameterTypeDescription
$ceilingintDefault cumulative row-count cap (25000)
$plugin_sourcestringThe 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 );
caution

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.

MetricDescription
Conversion RatePercentage of unique visitors who completed a purchase (converted / visitors × 100)
Abandoned CartsPercentage of carts that were not converted and have been inactive for more than 30 minutes (abandoned / total_carts × 100)
Average Order ValueMean revenue per order in the store's base currency, normalised using each order's conversion_rate
RevenueTotal 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:

  1. 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.
  2. Daily aggregators (in includes/Pro/Admin/Ecommerce/Subscriptions/Aggregators/) — each integration also has a daily aggregator that runs on burst_daily and stores per-day metrics in burst_subscription_daily and per-product breakdowns in burst_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

MetricDescription
Monthly Recurring RevenueSum of normalised monthly recurring revenue across all active and trialling subscriptions at the end of the period
Active SubscriptionsCount of subscriptions in the active state at period end
Canceled SubscriptionsCount of subscriptions that ended within the period
Revenue Churn(churned MRR / MRR at period start) × 100, with absolute churned MRR also returned
Average Lifetime ValueTotal 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:

TypeDescription
subscriptionsSummary metrics (MRR, active, canceled, churn, LTV)
subscriptions-revenue-chartNew vs renewal revenue or sales series, bucketed by group_by (auto, day, week, month) and chart_mode (revenue or sales)
subscriptions-distributionDistribution by gateways, currencies, or countries (selected via the distribution_view arg)
subscriptions-retentionMonthly 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:

KeyTypeDefaultDescription
date_startint0Unix timestamp for the start of the range
date_endint0Unix timestamp for the end of the range
metricsstring[]['product', 'sales', 'revenue']Metric column ids to retrieve. Restricted to the sales_products allow-list: product, adds_to_cart, sales, revenue
filtersobject[][]Additional filter objects (each with key and value) merged with the built-in type = 'purchase' filter
group_bystring[]['product']Grouping column ids. utm_source is normalised to source; an empty array falls back to ['page_url']
limitint100Maximum number of rows to return. Clamped to the range 1500

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:

KeyTypeDefaultDescription
date_startint0Unix timestamp for the start of the range
date_endint0Unix timestamp for the end of the range
metricsstring[]['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
filtersobject[][]Additional filter objects (each with key and value) merged with the built-in type = 'subscription' filter
group_bystring[]['plan']Grouping column ids. utm_source is normalised to source; an empty array falls back to ['page_url']
limitint100Maximum number of rows to return. Clamped to the range 1500

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,
] );
caution

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.

StageIDDescription
Visitors started sessionvisitsAll unique visitors in the date range
Viewed a productproduct_page_viewsVisitors who viewed a page with page_type = 'product' or page_type = 'download', or the configured product archive page
Added to cartadd_to_cartVisitors who have at least one burst_cart_items row with added_at within the range
Started checkoutcheckout_visitsVisitors who viewed the configured WooCommerce/EDD checkout page
PurchasedconversionsVisitors 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.

MethodReturn typeDescription
get_cart_abandonment_rate( $args )float|nullCart abandonment rate as a percentage
get_checkout_completion_rate( $args )float|nullPercentage of checkout page visitors who converted
get_avg_checkout_completion_time( $args )int|nullAverage time spent on the checkout page in seconds
get_safari_checkout_abandonment_delta( $args )float|nullDifference in abandonment rate between Safari and all browsers combined (percentage points)
get_cart_drop_off_rate( $args )float|nullPercentage of visitors who did not add anything to their cart
get_cart_to_checkout_rate( $args )float|nullPercentage of cart starters who did not convert (cart exit rate)
get_average_order_value( $args )float|nullAverage order value in the store currency (not normalised)
get_email_campaign_conversion_rate( $args )float|nullConversion rate of visitors arriving via email campaigns
get_returning_customer_rate( $args )float|nullPercentage of orders from customers who had a prior converted cart
get_new_visitor_conversion_rate( $args )float|nullConversion rate of first-time visitors
get_returning_vs_new_visitor_cr_ratio( $args )float|nullRatio of returning-visitor CR to new-visitor CR
get_home_page_bounce_rate( $args )float|nullBounce rate on the homepage (/)
get_product_page_exit_without_add_to_cart_rate( $args )float|nullPercentage of product/download page visitors who left without adding to cart
get_single_product_exit_rate( $args )float|nullPercentage of visitors who viewed exactly one product/download page and left without adding to cart
get_avg_session_duration( $args )float|nullAverage session duration in seconds
get_mobile_vs_desktop_conversion_ratio( $args )float|nullRatio 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.

DimensionIDFields returned
Top producttop-productproduct_id, product_name, total_quantity_sold, total_revenue, currency
Top campaigntop-campaigncampaign_id, campaign_name, total_quantity_sold, total_revenue, currency
Top countrytop-countrycountry_code, total_quantity_sold, total_revenue, currency
Top devicetop-devicedevice_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 hookTriggerDescription
burst_dailyDailySchedules the Quick Wins processing chain and triggers daily subscription aggregation across registered integrations
burst_process_quick_wins_single_eventChained, 1 minute apartEvaluates one Quick Win rule per invocation; schedules the next index until all rules are processed
burst_subscription_backfill_<plugin_source>_cronSingle-event, chained 1 minute apartAdded 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 60sAdded 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