Skip to main content
An experiment (an A/B test) runs two flow variants on a single placement, splits traffic between them, and measures which one performs better on a chosen metric. While the experiment runs, the placement serves a variant flow to each user instead of its default flow. Use an experiment when you have a hypothesis (“a shorter onboarding will convert better”) and two published flows to compare. FlowPilot assigns each user to one variant, keeps them on it, and reports the completion rate, lift, and statistical confidence so you can decide which flow to keep.
New to FlowPilot? Read Core concepts first to learn the terms used throughout these docs.

How an experiment relates to a placement

An experiment is always attached to one placement. A placement can have at most one experiment running or paused at a time.
  • When no experiment is active, the placement serves its default flow.
  • When an experiment is running, resolution routes each qualifying user to one of the experiment’s variant flows instead of the default.
  • When the experiment ends, the placement goes back to serving a default flow (either the original default, or the winning variant’s flow if you declared a winner).
The experiment runs for whoever the placement already targets. It inherits the placement’s audience filter, so to change who sees the test you edit the placement, not the experiment. See Audience targeting.

How variant assignment works

Assignment is deterministic and sticky. The same user always lands in the same variant for the life of the experiment, so their experience does not flip between sessions. The backend assigns a user like this:
1

Compute a bucket

bucket = FNV-1a(userID + experimentID) % 100. This produces a stable number from 0 to 99 for each (user, experiment) pair. The same inputs always produce the same bucket.
2

Order the variants

Variants are sorted by bucket_order (the control is always bucket_order 0, the next variant is 1, and so on).
3

Walk the cumulative traffic split

The bucket is assigned to the first variant whose cumulative traffic percentage it falls under. For a 70/30 split, buckets 0 to 69 get the control and buckets 70 to 99 get the challenger.
4

Remember the assignment

The result is cached so the user keeps the same variant on every future resolve, even as traffic accumulates. This is the “sticky” part.
Each experiment has exactly one control variant (is_control), the baseline you measure against. The other variant is the challenger.
Assignment is keyed on the userID your app sends to the SDK. If your app does not send a stable user id, the SDK falls back to a per-install device identifier, which is stable on one device but not across reinstalls. If the id you send changes between sessions, the same person can be re-bucketed into a different variant and your results will be muddy. See Variables and SDK context for how the user id is set.
Experiment assignment only happens for online resolves of a running experiment. Offline or bundled resolves always serve the deterministic default flow, never a per-user variant.

The experiments list

Open Experiments from the sidebar to see every experiment in the current app. The page header has a New Experiment button.

Filtering

The filter bar has:
  • A search box that matches an experiment’s name or description.
  • Status tabs: All, Draft, Running, Paused, Completed. Each tab shows a count.
  • A Placement dropdown to show only experiments on one placement.

Statuses

StatusMeaning
DraftCreated but not started. No traffic is enrolled and the placement still serves its default flow.
RunningLive. Users are being assigned to variants and events are collected.
PausedTemporarily stopped. The placement serves its default flow again, but assignments are remembered for when you resume.
CompletedEnded. Shown as Completed · Winner when you declared a winner, or Completed · No winner when you stopped without one.

Table columns

Each row shows the experiment Name, its Placement, the Variants (Control vs Variant B), a Progress bar, Lift, Confidence, and Status. Lift and confidence stay blank (shown as a dash) until each variant has collected enough data to be meaningful (at least 30 enrollments per variant). Click a row to open the detail page.

Row actions

The ... menu on each row lets you Pause a running experiment, Resume a paused one, or Delete the experiment. Starting, stopping, declaring a winner, and editing happen on the detail page. See Running an experiment.

Common mistakes

  • Sending an unstable user id. Sticky assignment depends on a consistent userID. An id that changes per session breaks stickiness and invalidates the comparison.
  • Expecting more than one experiment per placement. A placement holds one active experiment at a time. Stop or pause the current one before starting another on the same placement.
  • Reading lift before there is data. Early numbers swing wildly. The dashboard hides lift and confidence until each variant clears 30 enrollments for exactly this reason.