Monitor an Experiment
Track health checks, exposures, and diagnostics for active experiments in Statsig Cloud.
Statsig runs health checks on every live experiment: SDK checks arriving, unit IDs matching, exposures balanced with no sample ratio mismatch (SRM), and no crossover units. Review the checks after you launch the experiment and again before you read its results. Use this page to find out whether assignment and logging are correct. To interpret metric lifts, go to How to read experiment results. To clone, rename, archive, or otherwise operate on the experiment itself, go to Manage an Experiment.
Experiment health checks
- Go to Experimentation > Experiments and select the experiment you want to inspect.
- In the Details panel, find the health status badge next to the quality score, for example Healthy or Unhealthy.
- Hover over the badge to see the Experiment Health Check summary, then click View Details.
Alternately, open the Diagnostics tab, which leads with the Experiment Health Check section. A warning icon on the Diagnostics tab label also signals a failing check. Select a check to read its status, such as FAILED, and an explanation of what triggered it.
The checks shown depend on the experiment's setup and how long it's been running. The console organizes each check by its current state. For example: Checks not yet detected or Pulse metrics available. Common health checks include:
- Checks detected: Verifies that the SDK is reporting config checks shortly after launch. Checks not detected recently means the experiment previously recorded exposures but none in the last 24 hours.
- Valid unit type: Confirms that checks include the experiment's configured ID type.
- Event metrics have data: Ensures that events carry the same unit ID as exposures. This lets Statsig compute metrics. This check often surfaces problems when downstream tooling, such as Segment, omits
stableIDor custom IDs. - Pulse metrics available: Indicates that results are ready (typically the day after launch).
- Exposures are balanced: Runs a chi-squared test for sample ratio mismatch (SRM). Occasionally, warnings occur because of randomness, but persistent red alerts point to assignment or logging issues. Refer to SRM thresholds for more information.
- Crossover units detected: Highlights units exposed to more than one group, when they exceed 0.1% of exposed units. Statsig Cloud keeps these units in both groups because the SDK rarely produces crossovers, and flags them so you can address the root cause. Refer to Crossover troubleshooting.
- Default value type mismatch: Warns if an experiment's fallback default value type disagrees with the parameter definition.
- Group Assignment Health: Surfaces unexpected assignment reasons (for example,
UninitializedorInvalidBootstrap). Click View Assignment Reasons to see the hourly breakdown. - Differential Impact Detection: Reports when Statsig has finished checking whether a group of users responds to the treatment differently from the rest. Refer to Differential impact detection.
SRM thresholds
The Exposures are balanced check sets its status from the chi-squared p-value and the absolute deviation from the expected split.
| p-value | Absolute deviation | Status |
|---|---|---|
| Between 0.001 and 0.01 | Any | Warning (yellow) |
| Less than 0.01 | Less than 0.1% | Warning (yellow) with low expected impact |
| Less than 0.001 | 0.1% or more | Alert (red) that requires investigation |
To diagnose and resolve SRM, go to Managing SRM.
Guardrail metric alerts
The Diagnostics tab lists the metric alerts attached to this experiment under Guardrail Metric Alerts. It displays each metric's current status and when it last triggered. When an alert generates, a banner appears at the top of the experiment and a matching card appears on the Results tab. Select Resolve to clear an alert and record why.
For more information, go to Rollout alerts, which covers how to create an alert as well as how Statsig evaluates your alerts.
Crossover troubleshooting
A crossover unit is a unit that logged exposures to more than one group of the same experiment run. Statsig can't attribute that unit's behavior to a single variant. The Crossover units detected check appears when crossover units exceed 0.1% of exposed units.
How Statsig Cloud handles crossover units
Statsig Cloud keeps a crossover unit in both groups instead of discarding it. Statsig SDKs produce crossovers rarely, and the units that do cross over tend to cross in every group rather than in one. Including them dilutes the measured effect slightly instead of biasing it toward one group.
Below 1%, treat the check as a prompt to find the root cause, not as a reason to discard the readout. Above 1%, contact Statsig in Slack: a rate that high usually points to an implementation problem.
Warehouse Native drops crossover units from the analysis instead of keeping them, because it often reads exposures from another assignment service where crossover rates run higher. For that behavior and its thresholds, go to Monitor an experiment in the Warehouse Native documentation.
Common causes of crossover units
| Cause | What to look for | What to do |
|---|---|---|
| The client bootstrapped with values generated for a different unit | Exposures with the BootstrapStableIDMismatch reason in the exposure stream | Pass getClientInitializeResponse the same stableID the client uses at runtime. Go to BootstrapStableIDMismatch. |
| A client SDK and a server SDK both evaluate the same experiment for the same user | One unit ID under two groups, with exposures logged from two SDK types | Evaluate an experiment for a given user in one place. If both SDKs must evaluate it, confirm that a configuration update reached both before you read results. |
| A client holds cached values from before a configuration change | Crossover that starts right after you change allocation, targeting, or the experiment's salt | Avoid changing a running experiment's configuration. To change group structure, reset the experiment instead. |
What doesn't count as crossover
Two patterns look like crossover in the exposure stream, but neither triggers the check:
| Pattern | Why it isn't crossover |
|---|---|
Exposures with the Unrecognized reason | The definition was missing from the SDK's payload, so the exposure carries no group. A unit that returns the default value on one check and a real variant on the next has one analyzed exposure, not two conflicting ones. Go to Evaluation reasons. |
| Exposures from an earlier run | The check compares exposures within the current analysis window. Resetting an experiment generates a new salt and starts a new window, so a unit that was in control before the reset and in test after isn't flagged. Statsig doesn't exclude those units from the new run's analysis. |
Prevent crossover with persistent assignment
Configure persistent assignment on a supported server SDK before you start the experiment. Persistent assignment saves each unit's evaluation the first time the SDK evaluates it, then loads that saved evaluation on later calls. The unit keeps its group even when the experiment's configuration changes, which is the only way to keep an assignment stable through a configuration change.
If you can't pinpoint the cause, contact Statsig in Slack for help.
Exposure streams
The Exposure Stream section on the Diagnostics tab lists the most recent exposures for the experiment. Use it to confirm that checks arrive, that targeting resolves the way you expect, and that your SDKs evaluate against current configuration. Select Show non-production logs to include checks from non-production environments.
Read an exposure row
| Column | What it shows |
|---|---|
| Eval Time | When the SDK last applied the configuration it used for this check. It isn't the moment the SDK evaluated the unit. |
| Received | The exposure's own time, corrected for clock skew. Read this column as when the evaluation happened. |
| ID column | The unit Statsig evaluated. The heading is the experiment's ID type, such as userID, stableID, or a custom ID. |
| Rule | The rule that matched, such as Failed targeting. For each value, go to Diagnostics rule meanings. |
| Reason | The evaluation reason, such as Network:Recognized. For each value, go to Evaluation reasons. |
| LCUT | Last Config Updated Time: the most recent configuration change reflected in the SDK. Go to Evaluation times. |
| Stale | Yes when the evaluating process used an older version of the experiment than the console holds. The Rule value also carries a (Stale version) suffix. |
| User Properties | The user object your code sent with the check. |
Eval Time moves only when an SDK picks up a configuration change, so the gap between it and Received widens the longer a project goes without one. Don't read that gap as delivery latency: neither column reports how long Statsig took to ingest the exposure. To measure SDK upload latency, turn on SDK debug logging instead.
Query the stream
The Query Exposures panel beside the table controls what the stream returns. Choose a time range, select + next to Filters to filter on a column or user property, then select Apply.
The time range reaches back 7 days at most. Calendar days older than that aren't selectable, and presets wider than 7 days don't appear. This limit applies to row-level exposure queries in the console for every project, and no setting extends it. It bounds the query, not your data.
What the exposure stream can't tell you
Each query returns at most 100 rows, newest first, however wide the time range. Treat the stream as a recent sample for debugging rather than an export. It also lists every evaluation that reached Statsig, including rows that bot filtering later removes, so it isn't the analyzed population. A row missing here is weaker evidence than a unit missing from your results.
For exposure counts over a longer window, select View in Metrics Explorer in the Exposure Stream header. That view aggregates exposures and the 7-day limit doesn't apply to it.
Cumulative exposures
To track growth per variant:
- Open the Results tab.
- Find the Cumulative Exposures card below the hypothesis. It shows the total exposures and each group's share.
- Click See More to expand the chart.
| Date | Control | Test A | Test B |
|---|---|---|---|
| Jul 8, 2026 | 0 | 0 | 0 |
| Jul 9, 2026 | 3,317 | 3,291 | 2,995 |
| Jul 10, 2026 | 5,276 | 5,272 | 5,140 |
| Jul 11, 2026 | 6,321 | 6,424 | 6,132 |
| Jul 12, 2026 | 6,696 | 6,762 | 6,508 |
| Jul 13, 2026 | 6,711 | 6,777 | 6,526 |
| Jul 14, 2026 | 6,727 | 6,791 | 6,542 |
| Jul 15, 2026 | 6,741 | 6,807 | 6,559 |
| Jul 16, 2026 | 6,755 | 6,823 | 6,577 |
| Jul 17, 2026 | 6,771 | 6,839 | 6,593 |
| Jul 18, 2026 | 6,784 | 6,851 | 6,606 |
| Jul 19, 2026 | 6,795 | 6,864 | 6,618 |
| Jul 20, 2026 | 6,813 | 6,883 | 6,636 |
| Jul 21, 2026 | 8,731 | 8,749 | 8,671 |
| Jul 22, 2026 | 8,880 | 8,932 | 8,853 |
| Jul 23, 2026 | 9,052 | 9,090 | 9,019 |
| Jul 24, 2026 | 9,214 | 9,257 | 9,212 |
| Jul 25, 2026 | 9,343 | 9,405 | 9,344 |
| Jul 26, 2026 | 9,490 | 9,544 | 9,477 |
| Jul 27, 2026 | 9,651 | 9,715 | 9,688 |
| Jul 28, 2026 | 9,798 | 9,890 | 9,868 |
| Jul 29, 2026 | 9,951 | 10,060 | 10,042 |
| Jul 30, 2026 | 10,104 | 10,244 | 10,220 |
| Jul 31, 2026 | 10,278 | 10,416 | 10,376 |
| Aug 1, 2026 | 10,425 | 10,548 | 10,503 |
| Aug 2, 2026 | 10,564 | 10,688 | 10,632 |
| Aug 3, 2026 | 10,734 | 10,861 | 10,841 |
| Aug 4, 2026 | 10,908 | 11,018 | 11,019 |
| Aug 5, 2026 | 11,060 | 11,189 | 11,184 |
| Aug 6, 2026 | 11,216 | 11,348 | 11,344 |
| Aug 7, 2026 | 11,383 | 11,498 | 11,496 |
| Aug 8, 2026 | 11,527 | 11,637 | 11,635 |
| Aug 9, 2026 | 11,645 | 11,786 | 11,779 |
| Aug 10, 2026 | 11,839 | 11,951 | 11,984 |
The chart shows how many units entered each group over time, so you can identify ramp issues early. A band that flattens means the experiment stopped assigning units, and a band that outpaces the others points at an uneven split.
Was this helpful?
For AI agents: a documentation index is available at /llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.