Protect the flows that make you money
Poor UX is lost conversion, and it hides in the people your analytics never splits out. A contract is a flow you protect (sign up, checkout, booking) with a promise attached: people using a keyboard, zoom, large text or a screen reader get through about as well as everyone else. After every release Metrickle judges it, and when it breaks you get one case with the step, the element, the revenue lost and the recordings that prove it.
| Setting | Net success | p90 time | Verdict |
|---|---|---|---|
| None | 71% | 3m 10s | Baseline |
| Reduced motion | 70% | 3m 02s | Holding |
| Large text | 58% | 4m 05s | Watch |
| Forced colors | — | — | 12 of 30 attempts |
| Keyboard | 38% | 7m 40s | Broken |
Broken for keyboard users: 33 points behind people using no settings, and most attempts stop at Payment.
From a broken release to a verified fix
Protect a flow
Save the flow with a start step and a success step, and hold it as a contract. Assistants can draft one, but only a person can hold it.
Get a verdict per release
Each setting is judged against people using none, on success rate and p90 time, since the latest release.
Work the case, verify the fix
One case per broken task. Draft the fix with the recordings attached, mark it shipped, and the case closes only when the task recovers for the same people.
Red only when it’s real
A verdict a team learns to ignore is worse than none. Contracts are built so that red means something.
- Holding, watch, broken or not enough evidence. Watch is never green: it’s a material gap that isn’t yet clear of noise.
- A sample floor: a setting needs 30 attempts since the release before it’s judged, so one session can’t fail a release.
- A real test: a gap only goes red once it clears a one-sided significance test.
- Sensible defaults you can change: within 10 points on success rate and 1.5× on p90 time.
- Re-judged every hour, shown per app on the portfolio, and sent to Slack, Teams or a webhook when one turns red.
| Release | Shipped | Verdict |
|---|---|---|
| v4.12 | 2 days ago | Broken: keyboard |
| v4.11 | 9 days ago | Watch: large text |
| v4.10 | 3 weeks ago | Holding |
| v4.9 | 5 weeks ago | Fix verified |
Large text has been on watch since v4.11. The gap is 13 points but on too few attempts to call. It stays amber, never green, until it’s settled.
One case, not a replay library
When a contract breaks, Metrickle opens one case per task, pinned to the setting that broke. Every failing attempt is filed under one class by its strongest evidence.
- Never started: the way in was missed or dead-clicked.
- Wrong path: extra screens, search used as a back button, u-turns.
- Stuck: a form error, a script error, focus that never landed, a dead or slow control, then rage.
- Done but expensive: finished, but far slower than most, after an error, or later undone.
- No evidence, no blame: attempts with nothing to show for them are counted, never filed.
| Class | Chart | Attempts |
|---|---|---|
| Stuck | 212 | |
| Never started | 41 | |
| Wrong path | 33 | |
| Done but expensive | 18 |
Stuck at Payment: a dead click on button "Apply coupon", then rage. $9.1k lost. 5 recordings attached, each linked to the moment.
Recordings in a case are consented and masked, like all replays, and need replay switched on for the app. Native apps don’t detect dead taps yet, so mobile cases can’t yet say focus never landed.
Success that matches the money you keep
A completion stays provisional for seven days. A refund, a cancel or a problem report from the same person in that time takes it back, so contracts judge what was kept, not what was clicked.
- Net first, gross alongside, with revoked and provisional counts and the revenue that went with them.
- Barrier reports count against the right people: the setting that was on when the report was sent.
- A forecast: provisional completions are ranked by revocation risk, such as coupon thrashing, pricing revisits, backtracking and form-error recovery.
| Reason | Completions | Revenue |
|---|---|---|
| Refund | 96 | −$4.3k |
| Cancelled | 38 | −$1.7k |
| Problem report | 17 | — |
Forecast: 62% net once the 380 provisional completions settle. The riskiest are the ones that thrashed coupon codes.
Send refunds as events with negative revenue, or give a task its own cancel step. A Stripe and RevenueCat integration is planned.
Common questions
What is a contract?
A conversion flow you protect (a start step and a success step, like checkout started and order placed) with a promise attached: people using an accessibility setting finish it about as well as people using none. By default that means within 10 points on success rate and 1.5× on p90 time. When it breaks, the case tells you what it cost.
Which settings are judged?
Keyboard navigation, zoom, large text, high contrast, forced colors and reduced motion on the web, and the screen reader setting in the mobile SDKs. Browsers hide whether a screen reader is running, so on the web keyboard navigation stands in for it.
Can one bad session fail a release?
No. A setting needs 30 attempts since the release before it’s judged and stays silent until then. A gap goes on watch first, and only turns red once it’s statistically clear of noise.
Can an AI assistant hold a contract or close a case?
No. Assistants on API tokens can draft contracts and try their terms, read verdicts, open cases, draft fixes, mark them shipped and ask for verification. Holding a contract and dismissing a case take a person in the dashboard. A case closes only when verification shows the task recovered for the same people, whoever asks for it.
Which plans include contracts?
Free protects one flow, with its verdict and case file: the step, the element and the revenue lost. Growth and above protect every flow, and add the recordings that prove each case.
Does this replace an accessibility audit?
No, it works alongside one. Audits and tools like axe find problems in your code; post axe-core results from CI and each violation shows up next to the friction it causes. Contracts show whether people using those settings actually get through, after every release, and which barrier is costing the most.
See where your apps break, and who they break for
Free to start. One script tag on the web, one SDK on mobile, and no cookie banner in cookieless mode.
Get early access