Create your first experiment
Define an experiment in Studio or YAML and apply it through the governed action path.
You can create experiments in two ways:
- Studio no-code UI for business users and quick edits,
- YAML + fx for source-controlled workflows.
Both paths converge on the same governed domain actions.
Option A: Create in Studio
- Start the hosted API and Studio. See Start the web UI locally.
- Sign up, verify email, and create an organization.
- Open the organization Overview at
/app/{orgSlug}and select Create experiment. - Complete Basics: hypothesis, stable ID, audience sampling, holdback, and exposure behavior.
- Configure Activation: choose the trigger and add shared code or metadata when needed.
- Add Variants, including weights, payload JSON, DOM operations, or advanced JS/CSS.
- Add the primary outcome and any guardrails under Metrics.
- Open Review, inspect the generated specification, and click Create draft.
From the experiment detail page, the dotted lifecycle canvas shows completed, current, and upcoming stages. You can submit for review, approve, start, pause, resume, conclude, edit, or stop the experiment as its current state allows.
Approval enforces separation of duties: the experiment owner cannot approve their own experiment. To exercise the complete lifecycle, use a second organization member with permission to approve. A single-member evaluation can still create, validate, preview, and submit drafts, but it intentionally stops at independent approval.
Return to /app/{orgSlug}/experiments to see the draft in the Design column. Use the Table toggle when you need a compact inventory instead of the visual Pipeline. See Use the Studio workflow for the complete interface guide.
Option B: Author YAML locally
Create experiments/homepage-cta.yaml:
id: homepage-cta
name: Homepage CTA
description: Test whether a more direct CTA improves signup.
sampleRate: 1
variants:
- key: control
name: Current CTA
- key: treatment
name: New CTA
payload:
cta: Start building
metrics:
- key: signup
name: Signup
kind: conversion
eventName: signup
isPrimary: trueValidate and apply locally:
fx validate experiments/
fx plan experiments/
fx apply experiments/Or push to the hosted API:
fx push experiments/ \
--api-url https://api.example.com \
--api-key fx_key_... \
--tenant <orgId>You can also import the same YAML files in Studio from /app/{orgSlug}/experiments/import.
Lifecycle
Fabric Experiments treats lifecycle changes as actions:
Every action is validated, persisted, and emitted to the audit trail.
| Action | Allowed from | Result | Important guard |
|---|---|---|---|
experiment.submit_for_review | draft | review | The spec must pass schema validation. |
experiment.approve | review | approved | The authenticated approver must not be the experiment owner. |
experiment.start | approved | running | Approval evidence must already exist. |
experiment.pause | running | paused | Also used by an applied SRM breach. |
experiment.resume | paused | running | Existing assignment configuration is retained. |
experiment.kill | running, paused | killed | Terminal decision; it cannot be resumed. |
experiment.declare_winner | running | concluded | Requires a winner variant and justification. |
experiment.archive | killed, concluded | archived | Archived is the final state. |
Any action/state pair not listed here is rejected before its handler runs.
The review → approved transition requires an approver whose authenticated
user identity is different from ownerId; request approval from another
organization member. Payload fields cannot override that authenticated actor.
Studio presents these domain states as six visual stages:
| Stage | States |
|---|---|
| Design | draft |
| Review | review |
| Ready | approved |
| Live | running, paused |
| Decision | concluded, killed |
| Archive | archived |