product docs integrations use-cases changelog pricing Get API Key
// product · the experimentation engine, end to end

One engine for every experiment.

Design, assign, measure, decide, ship. Crawltic runs the whole lifecycle behind a single API, with the statistics and the rollout safety built in, not bolted on.

Get API Key Explore the API
lifecycle.live — checkout-buttonrunning
01
design
Variants, primary metric, guardrails and decision rules as code
queued
02
assign
Deterministic, sticky bucketing at the edge in under 4ms
queued
03
measure
Any event or custom metric, server or client side
queued
04
decide
Bayesian and sequential inference against your thresholds
queued
05
ship
Guarded ramp to 100%, with automatic rollback on regressions
queued
[1/5]POST /v1/experiments
0ms
p99 variant assignment
0
inference methods, one response
0s
median guardrail rollback
0B
events processed / mo
// 01 · assignment

Deterministic routing, at the edge.

Every unit is hashed onto a 10,000-slot bucket line and lands in the same variant on every request, on every device you key it to. No lookup, no round-trip, no flicker.

  • Sticky bucketing on user, device, account, or any custom key
  • Weighted splits and global holdouts carved from the same line
  • Mutual-exclusion layers so concurrent tests never collide
  • Exposure logged automatically at the moment of assignment
request · api.crawltic.comedge-fra1
A · 45%
B · 45%
hold
edge-fra1 · resolving bucket
responseawaiting
traffic-router.live — checkout-buttonlive
Visitors · A
0
Visitors · B
0
Assign p99
3.8ms
// 02 · custom metrics

Win on the number that matters to you.

Clicks are a proxy. Crawltic compares variants on whatever you emit: earnings per click, revenue per visitor, churn, latency. Mark any metric as a guardrail and it can veto a winner on its own.

  • Numeric, count, ratio and binary metric types
  • Direction-aware: lower churn and lower latency count as wins
  • Outlier capping and CUPED variance reduction per metric
  • Server-side, client-side, or warehouse-synced events
// metrics.json
{ "key": "p95_latency", "type": "numeric",
  "better": "down", "guardrail": { "max_regression": 0.05 } }
metrics.live — A vs B, 4 metricsstreaming
epcprimary+18.4%
A $0.412B $0.488
revenue/visitor+12.6%
A $41.20B $46.40
churn_30d-18.8%
A 4.80%B 3.90%
p95_latencyguardrail-5.4%
A 184msB 174ms
A · controlB · variantwindow: rolling 60 min
// 03 · analysis

Bayesian and frequentist, in one response.

Every results call returns probability-to-beat-control, credible intervals, p-values and confidence intervals together. Your data team picks the framework; the engine keeps both honest.

  • Beta-Binomial and Normal-Gamma posteriors, updated per event
  • Automatic sample-size and minimum detectable effect planning
  • Sample ratio mismatch detection with alerting
posterior.live — revenue/visitor
P(B beats A)
50.0%
Sample size
400
p-value
0.012
sequential.live — group-sequential boundary, alpha = 0.05monitoring
z-statistic
+0.00
Info fraction
0%
Decision
monitoring
// peek without penalty

Look at results every minute. Stay at 5% error.

Checking a fixed-horizon test early inflates false positives. Crawltic spends alpha across the whole run, so the boundary starts strict and relaxes as evidence accrues.

The moment the statistic crosses, the test stops, often well before the planned sample, and the decision engine takes over.

Efficacy boundary: stop, B wins Harm boundary: stop, B regresses Naive fixed-horizon threshold Observed z-statistic
// 04 · decision engine

It decides, then ships safely.

Set confidence thresholds, sample quotas and guardrails once. Crawltic promotes the winner through a staged ramp and pulls it back the second a guardrail trips.

decision-engine.live — pricing-page-layoutarmed
verdict
Is Variant B worth shipping? metric: revenue/visitor
-50%0+50% AB
+12.6%
Variant B earns more per visitor · auto-ship at +5%
Visitors in A (min 2,500)2,500/2,500
Visitors in B (min 2,500)2,500/2,500
Guardrails passing (all 3)3/3
Purchases, both groups (min 400)356/400

Recalculated every minute · ramp starts the moment the last quota clears

staged rollout + guardrail tripwire
Exposure
0%
error_rate
0.43%
State
ramping 1/5

Ramp 1 → 5 → 25 → 50 → 100% · each step holds until guardrails re-verify · breach = instant rollback + webhook

// 05 · multi-armed bandit

Stop paying for losing variants.

When the goal is conversions now rather than a clean read later, switch an experiment to bandit mode. Thompson sampling re-weights traffic every minute, so the strongest arm earns the most exposure while the others keep just enough to stay honest.

  • Thompson sampling or epsilon-greedy policies, per experiment
  • Minimum exploration floor for every arm
  • Switch a running A/B test to bandit mode without re-bucketing
  • Regret and conversions saved reported alongside lift
bandit.live — hero-offer · 4 arms · thompsonrebalancing
controlleader 25.0%
v2-copyleader 25.0%
v3-bundleleader 25.0%
v4-urgencyleader 25.0%
Visitors
0
Conv. saved vs even split
+0
Leading arm
control
Access layer

Same engine. Three ways in.

Everything above is reachable from your code, your agent, or your terminal. Pick the surface that fits the moment.

api.sh

REST + GraphQL API

Full CRUD on experiments, metrics and rollouts. OpenAPI spec and typed SDKs for TypeScript, Python, Go and Ruby.

mcp-session

MCP Server

Give Claude, Cursor or any MCP client scoped tools to create, monitor and ship experiments in plain language.

zsh — crawltic

Crawltic CLI

One static binary. Script creation, ramps and result checks from CI, cron, or your shell.

Run your first experiment through the API today.

One key unlocks assignment, analytics, the decision engine, MCP and the CLI.

Get API KeyRead the Docs