Growthbook Experiments Tracker
Pricing
Pay per usage
Go to Apify Store
Growthbook Experiments Tracker
Rising starPricing
Pay per usage
Rating
0.0
(0)
Developer
Tomáš Katz
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 days ago
Last modified
Categories
Share
Internal Apify Actor that fetches experiments from the GrowthBook REST API, runs a set of health checks on them, and posts a status digest to Slack. Built to keep the experiments used by apify-core and apify-web honest — following the practices from the "GrowthBook at Apify" wiki page.
What it reports
Each run covers three groups (all filterable by tags, owner, and project):
- Running experiments — the core status list, with owner, days running, traffic coverage, and exposed users. Experiments whose rule is not enabled in the
productionenvironment are marked staging only and exempt from the running-too-long check. Because GrowthBook records no date for the production switch, the tracker remembers it itself (named key-value storegrowthbook-experiments-state): for experiments first seen as staging-only, "days running" starts the day the production rule turns on; for experiments already in production when first tracked, it falls back to the phase start. - Stale drafts — drafts created long ago but never launched (optional).
- Recently stopped — experiments stopped within the lookback window (optional).
Health checks
| Check | Severity | Meaning |
|---|---|---|
decided-but-running | 🔴 critical | Result is documented (won/lost/inconclusive) but the experiment still runs — burning billed exposure events |
running-too-long | 🟠 warning | Current phase exceeds maxRunningDays (escalated wording at 100% traffic) |
high-exposure | 🟠 warning | More users exposed than maxExposedUsers |
sample-ratio-mismatch | 🟠 warning | SRM p-value < 0.001 in the latest analysis — bucketing is likely broken (e.g. missing hash attribute) |
overdue-status-update | 🟡 attention | The scheduled status update date has passed |
stale-draft | 🟡 attention | Draft older than staleDraftDays, never launched |
stopped-without-conclusion | 🟡 attention | Stopped recently with no documented winner/conclusion |
missing-hypothesis | 🔵 hygiene | Running without a hypothesis |
no-tags | 🔵 hygiene | Running without tags (convention: tag with team + surface) |
no-owner | 🔵 hygiene | No owner assigned |
Input
See the Input tab / .actor/input_schema.json. The important ones:
growthbookToken(required, secret) — GrowthBook REST API secret key (secret_...). Org-scoped, created under GrowthBook → Settings → API Keys.tags,owner,projectId— optional GrowthBook filters.includeStagingOnly— setfalseto hide running experiments not yet enabled in production (their production start is tracked either way).maxRunningDays,staleDraftDays,recentlyStoppedDays,maxExposedUsers— health-check thresholds.slackToken(secret) +slackChannel— when both set, the report is posted to Slack. Without them, the run just logs the report and fills the dataset. The bot needschat:write(plususers:readandusers:read.emailto @mention experiment owners by their GrowthBook email) and must be a member of the channel.
Output
- Slack: one channel message (summary counts, issues sorted by severity with owner mentions, running-experiments list) and per-experiment detail cards in its thread.
- Dataset: one record per experiment with status, phase, exposure, result, and detected
issues[]— usable by other integrations.
Development
npm installnpm test # unit tests for the health checksnpm run lintapify run # local run; input from storage/key_value_stores/default/INPUT.jsonapify push # deploy
The local INPUT.json is gitignored-friendly — never commit real tokens.


