# Metrics Contract

This contract makes each metric reproducible before the experiment begins.

## Population

`eligible_cancel_start`

One record per billing account per experiment window where:

- an active direct web subscription starts the flow;
- the account is not enterprise, reseller, app-store billed, in collections, or internal;
- assignment exists before treatment content renders; and
- repeated starts collapse to the first eligible start.

## Metric definitions

### Voluntary 30-day retained value rate

```text
accounts that accepted an alternative
AND remain intentionally active or paused at day 30
AND complete ≥1 meaningful product action in days 8–30
----------------------------------------------------------------
eligible cancellation starts
```

Does not count accidental renewal, failed cancellation, billing dispute, or a pause with no meaningful return.

### Cancellation completion rate

```text
accounts with successful billing cancellation within 24 hours
---------------------------------------------------------------
eligible cancellation starts that did not voluntarily accept an alternative
```

Report a second intent-to-treat view using every eligible start.

### Cancellation-related contact rate

Support conversations tagged to billing/cancellation and created from 24 hours before to 72 hours after the first eligible start, per 1,000 starts.

### Post-flow trust

Response to: “This company made it easy to make the right subscription decision.” Scale: 1 strongly disagree to 5 strongly agree. Report response rate and respondent composition with the score.

## Event contract

| Event | Fires when | Required fields | Must not include |
|---|---|---|---|
| `cancel_flow_started` | First page successfully renders | account key, assignment, plan family, locale | free text, exact price |
| `cancel_reason_selected` | Structured reason is committed | reason code, taxonomy version | free text |
| `cancel_reason_skipped` | Skip is selected | taxonomy version | inferred reason |
| `cancel_response_viewed` | ≥ 50% of response visible for ≥ 1 sec | response code, eligibility version | sensitive inputs |
| `cancel_response_accepted` | Alternative succeeds | response code, effective date | payment details |
| `cancel_completed` | Billing confirms cancellation | effective date, idempotency result | support notes |
| `cancel_failed` | Final operation fails | safe error class, retryable flag | raw stack or PII |
| `meaningful_product_action_completed` | Approved value event occurs | action code, date | content payload |

## Decision thresholds

Thresholds are locked before external exposure:

- retained value lift: `≥ +3.0 pp`;
- cancellation completion: `≥ 90%` and non-inferior within `−1.5 pp`;
- support contact change: `≤ +5%`;
- trust difference: `≥ −0.1`;
- p75 treatment latency: `≤ +300 ms`.

Any definition change after exposure begins creates a new metric version and requires the readout to show both versions.

