For the complete documentation index, see llms.txt. This page is also available as Markdown.

Fetch Experience Data

post

Retrieve per-variant time series data for an experience (A/B test).

POST /analytics/experience/{experienceId}/timeseries

Returns metric values over time for each variation in the experiment, segmented by variation name. Use this data to compare variant performance over time and compute signals like "win-day count" (how many periods a variant beat control).

Parameters

  • experienceId (path) — required. UUID of the experience.

  • granularity — optional time bucketing: hour, day (default), week, or month.

  • modecumulative (default, running totals) or noncumulative (per-bucket values).

  • metrics — optional array of metric enum values to include (see table below). Defaults to conversion_rate, net_revenue_per_visitor, gross_profit_per_visitor.

  • startTs — optional 10-digit epoch timestamp in seconds. Defaults to experience start date.

  • endTs — optional 10-digit epoch timestamp in seconds. Defaults to now or experience end date.

  • filters — optional analytics filters object. See below and the Filters Reference for available fields.

Available Metrics

Pass one or more of these enum values in the metrics array:

Value
Description

conversion_rate

Conversion rate

net_revenue_per_visitor

Revenue per visitor (RPV)

gross_profit_per_visitor

Profit per visitor (PPV)

aov

Average order value

n_visitors

Visitor count

n_orders

Order count

net_revenue

Total net revenue

Filters

This endpoint accepts the same filters as POST /analytics/resource/{experienceId}. Key filters include:

Field
Type
Description

deviceType

string

"any", "mobile", or "desktop"

visitorType

string

"any", "new", or "returning"

countryCodes

string[]

ISO 3166-1 alpha-2 codes, e.g. ["US", "GB"]

sourceSitesOrChannels

string[]

Traffic channel names (see Filters Reference)

userBehavior

object

Visitor behavior filter (see sub-fields below)

experimentProductsOnly

boolean

Only include products in the experiment (target products)

onlyProductIds

string[]

Shopify product IDs to include

onlyProductHandles

string[]

Shopify product handles to include

userBehavior sub-fields

All fields are optional booleans. Set to true to filter to only visitors who performed that action.

Field
Description

viewedProductPage

Visitor viewed a product page

viewedCollectionPage

Visitor viewed a collection page

addedToCart

Visitor added an item to cart

viewedCheckout

Visitor reached checkout

See the Filters Reference section for the full list of available filter fields.

Response Structure

The response contains a segments object keyed by variation name. Each segment has a data array of time-bucketed metric values. A variations array provides metadata including which variation is the control.

Each data point includes a dt field as a formatted date string (not Unix epoch). Format depends on granularity:

  • hour / day: "YYYY-MM-DD HH:mm:ss"

  • week / month: "YYYY-MM-DD"

Date Range Behavior

  • When startTs and endTs are omitted, the date range defaults to the experience's full lifetime (start date through end/pause date or now).

  • If the experience is paused or ended, the response is automatically truncated at the pause/end date — no data points are returned after that point.

  • If the provided startTs is before the experience start date, it is clamped to the experience start. Similarly, endTs is clamped to the experience end/pause date.

Path parameters
experienceIdstring · uuidRequiredPattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Body
startTsstringOptional

Optional analysis start timestamp as a 10-digit Unix epoch string in seconds. Defaults to the experience start date.

endTsstringOptional

Optional analysis end timestamp as a 10-digit Unix epoch string in seconds. Defaults to now or the experience end date.

granularitystring · enumOptional

Time bucket granularity. Supported values: hour, day, week, month. Defaults to day.

Default: dayPossible values:
modestring · enumOptional

Time series mode. Use 'cumulative' for running totals or 'noncumulative' for per-bucket values. Defaults to cumulative.

Default: cumulativePossible values:
Responses
200

OK

application/json
post/v25-10-beta/analytics/experience/{experienceId}/timeseries
200

OK

Deprecated
get

Retrieve analytics data for a specific experience, including metrics, variations, and optionally graph images.

This legacy GET endpoint is deprecated, intentionally limited to the original query-parameter contract, and kept only as a beta compatibility path. Use the POST variant on the same path for all new integrations. The GET endpoint will be removed when the beta version ends.

Valid view values are overview, audience, and post_test. The value summary is not supported. When view=audience, you must also provide the audience query parameter.

The legacy start and end query parameters must be 10-digit Unix epoch timestamps in seconds, not milliseconds.

Response payloads include impact (object with est_monthly_revenue_increase: the projected 30-day revenue lift from the best non-control variation vs. control, or null when there is insufficient data) plus distribution and ordering helpers such as audienceOrder, histogram, kde, and cdf.

Query parameters
graphsstringOptional

Comma-separated list of graph IDs to include in response. Only applicable for "view=overview" requests. Available options:

  • abandoned_cart_rate
  • abandoned_checkout_rate
  • add_to_cart_rate
  • avg_discount_per_all_orders
  • avg_discount_per_discounted_order
  • avg_product_revenue_per_unit
  • avg_units_per_order
  • checkout_address_submitted_rate
  • checkout_begin_rate
  • checkout_enter_contact_info_rate
  • conversion_rate
  • net_product_revenue_per_order
  • net_revenue_from_post_purchase_offer
  • net_revenue_from_upsell
  • net_revenue_per_order
  • net_revenue_per_visitor
  • net_shipping_revenue_per_order
  • pct_orders_free_shipping
  • pct_orders_with_post_purchase_offer
  • pct_orders_with_upsell
  • pct_subscription_orders
  • profit_per_order
  • profit_per_visitor
  • subscription_orders_per_visitor
  • subscription_product_revenue_per_order
  • subscription_profit_per_visitor
  • subscription_revenue_per_order
  • subscription_revenue_per_visitor
  • view_collection_page_rate
  • view_product_page_rate
graphOutputstring · enumOptional

Output format for graph images. 'png' (default) uploads to S3 and returns a URL. 'base64' returns the raw base64-encoded PNG data inline.

Default: pngPossible values:
viewstring · enumOptional

Resource view to analyze. Supported values are 'overview' for variation-level metrics, 'audience' for a breakdown by the selected audience dimension, and 'post_test' for post-test metrics (customers who converted during the test, tracked by their purchase behavior after that conversion, split by variation).

Default: overviewPossible values:
audiencestring · enumOptional

Audience breakdown dimension. Required when view is audience. Optional when view is post_test (returns the post-test breakdown by the selected dimension). Not allowed when view is overview. Use one of the supported audience fields such as device_type, visitor_type, or source_channel.

Possible values:
analyticsViewTypestring · enumOptional

Optional analytics view preset used by the backend when building the analysis request.

Possible values:
endstringOptional

Optional analysis end timestamp as a 10-digit Unix epoch string in seconds (not milliseconds).

startstringOptional

Optional analysis start timestamp as a 10-digit Unix epoch string in seconds (not milliseconds).

Responses
200

OK

application/json
get/v25-10-beta/analytics/resource/{experienceId}
200

OK

post

Analyze analytics data for a specific experience using a POST request body for filters and request settings.

The legacy GET /analytics/resource/{experienceId} endpoint remains available only as a beta compatibility path for existing integrations. It is deprecated, limited to its original query-parameter contract, and will be removed when the beta version ends.

Valid view values are overview, audience, and post_test. The value summary is not supported. When view is audience, you must also provide the audience field. When view is post_test, the audience field is optional (supply it to break the post-test metrics down by that dimension). The audience field is not allowed when view is overview.

Use startTs and endTs in the request body to match the backend contract. These values must be 10-digit Unix epoch timestamps in seconds, not milliseconds. Use the filters object for all advanced filtering instead of query parameters.

Post-test metrics (view=post_test)

Post-test metrics look at customers who converted during the test and track their purchase behavior after that conversion, split by variation — answering "which variation produced more valuable customers over time?". Tracking is at the customer level (not cookie). Order filters narrow the in-test customer set only; they do not constrain the post-test orders.

The includeInTestOrders field (boolean, default true) controls whether in-test orders are folded into the metrics:

  • true (default) — returns all three families. total_* is the LTV view (post-test + in-test combined), and the in-test eso_* family is included.

  • false — the eso_* family is omitted entirely, and total_* collapses to equal post_* (since no in-test orders are folded in). The post_* family and headcounts are returned as usual.

Headcounts and rates are always present: n_visitors, n_customers, customers_per_visitor, pct_repeat_customers.

Metric families (each metric is { value }; non-control variations additionally carry uplift: { value }, the ratio vs control as a fraction — the control variation has no uplift, and there is no separate pct_change field):

  • post_* — post-test orders only (after the customer's in-test conversion): n_post_orders, post_net_revenue, post_gross_profit, post_orders_per_visitor, post_revenue_per_visitor, post_profit_per_visitor, post_orders_per_customer, post_revenue_per_customer, post_profit_per_customer.

  • eso_* — in-test ("experiment span") orders, only when includeInTestOrders=true: n_eso_orders, eso_net_revenue, eso_gross_profit, eso_orders_per_visitor, eso_revenue_per_visitor, eso_profit_per_visitor, eso_orders_per_customer, eso_revenue_per_customer, eso_profit_per_customer.

  • total_* — post + in-test combined (LTV view): n_total_orders, total_net_revenue, total_gross_profit, total_orders_per_visitor, total_revenue_per_visitor, total_profit_per_visitor, total_orders_per_customer, total_revenue_per_customer, total_profit_per_customer. Always present, but when includeInTestOrders=false these values equal the corresponding post_* values.

When view=post_test is combined with audience, each metric row additionally carries an audience key (the bucket value, e.g. "mobile"), with one row per (variation × audience value), and audienceOrder is populated.

Graphs

When requesting graphs via the graphs object, graphs.ids accepts an array of metric identifiers. Valid values are: conversion_rate, add_to_cart_rate, abandoned_cart_rate, abandoned_checkout_rate, checkout_begin_rate, checkout_enter_contact_info_rate, checkout_address_submitted_rate, view_product_page_rate, view_collection_page_rate, net_revenue_per_visitor, net_product_revenue_per_order, net_revenue_per_order, avg_units_per_order, avg_product_revenue_per_unit, profit_per_visitor, profit_per_order, pct_orders_free_shipping, net_shipping_revenue_per_order, subscription_orders_per_visitor, subscription_revenue_per_visitor, subscription_profit_per_visitor, subscription_product_revenue_per_order, avg_discount_per_discounted_order, avg_discount_per_all_orders, pct_subscription_orders, subscription_revenue_per_order.

Note: revenue_per_visitor is not a valid graph ID — use net_revenue_per_visitor instead.

Each graph object in the response includes id (string), key (the original metric key), type (chart type, e.g. "bar"), title (display title), and either url (CDN URL when outputFormat is "png") or data (base64-encoded PNG when outputFormat is "base64").

Additional Response Fields

Response payloads include impact (object with est_monthly_revenue_increase: the projected 30-day revenue lift from the best non-control variation vs. control, or null when there is insufficient data) plus distribution and ordering helpers: audienceOrder (segment display ordering when using audience view), histogram (order value distribution bins), kde (kernel density estimate curve), and cdf (cumulative distribution function curve). These are present alongside the primary metrics and variations arrays.

Body
viewstring · enumOptional

Resource view to analyze. Supported values are 'overview' for variation-level metrics, 'audience' for a breakdown by the selected audience dimension, and 'post_test' for post-test metrics (customers who converted during the test, tracked by their purchase behavior after that conversion, split by variation).

Default: overviewPossible values:
audiencestring · enumOptional

Audience breakdown dimension. Required when view is audience. Optional when view is post_test (returns the post-test breakdown by the selected dimension). Not allowed when view is overview. Use one of the supported audience fields such as device_type, visitor_type, or source_channel.

Possible values:
includeInTestOrdersbooleanOptional

Only applies when view is post_test. Controls whether in-test orders are folded into the metrics. When true (default), the in-test eso_* family is included and total_* is the LTV view (post-test + in-test combined). When false, the eso_* family is omitted and total_* collapses to equal post_*. The post_* family and headcounts/rates are always returned.

Default: true
analyticsViewTypestring · enumOptional

Optional analytics view preset used by the backend when building the analysis request.

Possible values:
endTsstringOptional

Optional analysis end timestamp as a 10-digit Unix epoch string in seconds (not milliseconds). Maps directly to the backend endTs field.

startTsstringOptional

Optional analysis start timestamp as a 10-digit Unix epoch string in seconds (not milliseconds). Maps directly to the backend startTs field.

testResultbooleanOptional

When true, compute and return the opt-in test verdict (test_result) alongside the overview.

Responses
200

OK

application/json
post/v25-10-beta/analytics/resource/{experienceId}
200

OK

get

Retrieve a paginated list of experiences.

The response includes experiencesList plus the pagination fields page, limit, total, and totalPages.

Query Parameters

All query parameters are optional.

  • limit — integer, defaults to 20

  • page — integer (minimum 1), defaults to 1

  • status — one of started, paused, ended, pending

  • category — one of experiment, personalization

offset is not supported for this endpoint. Pagination is page-based (page + limit).

Each list item includes history — raw user-action records with broad action types (saveExperience, duplicateExperience, archiveCampaign, etc.) and full user objects. For lifecycle-only events (start, pause, end, delete, reset) with the performing user's email, see experienceActions. For config-deploy diffs, see ?includeChangeLog=true on GET /experiences/{experienceId}.

Compared with GET /experiences/{experienceId}, list items do not include experienceCustomMetrics, experienceIntegrations, experienceKeyMetrics, or shippingTestMethodDefinitions.

Query parameters
categorystring · enumOptional

Filter by experience category. Omit to return all categories.

Possible values:
modulestring · enumOptional

Filter by modification type / module (content, checkout, pricing, merchandising, shipping). Category-agnostic. Omit to return all modules.

Possible values:
statusstring · enumOptional

Filter by lifecycle status. Omit to return all statuses.

Possible values:
limitinteger · min: 1 · max: 9007199254740991Optional

Maximum number of experiences per page.

pageinteger · min: 1 · max: 9007199254740991Optional

1-based page number for paginated results.

Responses
200

OK

application/json
get/v25-10-beta/experiences-list
200

OK

get

Retrieve a single experience by ID.

The response body is wrapped in an experience key:

{
  "experience": {
    "id": "YOUR_EXPERIENCE_ID"
  }
}

Compared with GET /experiences-list, this response includes experienceCustomMetrics, experienceIntegrations, experienceKeyMetrics, and shippingTestMethodDefinitions.

Tracking who changed what

This endpoint exposes two complementary audit trails:

  • experienceActions (always returned) — lifecycle state transitions (start, pause, end, delete, reset). Each entry includes a performedBy field with the email of the user who triggered the action, resolved from History records by matching action type and timestamp within a 5-minute window. performedBy is null when no matching History record is found.

  • changeLog (opt-in, see includeChangeLog below) — audit trail of deployed-config changes that touched this experience. Each entry groups diffs by entity type (experience, variations, offers, onsiteEdits, onsiteInjections, redirects, checkoutBlocks, audiences, pageTargeting) and carries the deployer's email via performedBy. Capped at the 20 most recent entries, newest first.

Query Parameters

All query parameters are optional.

  • includeChangeLog — boolean, defaults to false. When true, the response includes a top-level changeLog array on the experience.

Note on history

List items on GET /experiences-list include a history array containing raw user-action records with broader action types (saveExperience, duplicateExperience, archiveCampaign, etc.) and full user objects. The single-experience response does not include this history field — use experienceActions for lifecycle events and ?includeChangeLog=true for config-deploy diffs instead.

Path parameters
experienceIdstring · uuidRequiredPattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Query parameters
includeChangeLogbooleanOptional

When true, include a top-level changeLog array on the experience containing per-deploy diffs of entities that were modified (experience, variations, offers, onsiteEdits, onsiteInjections, redirects, checkoutBlocks, audiences, pageTargeting). Each entry carries the deployer's email via performedBy. Capped at the 20 most recent deploys, newest first. Defaults to false.

Responses
200

OK

application/json
get/v25-10-beta/experiences/{experienceId}
200

OK

Last updated

Was this helpful?