EpicThe Surprise Charge — The trial that ends politely
The trial that ends politely
Release slices (delivery order, slice-rN labels on each story):
- R1 Measure the fury — the surprise join — Surprise Rate and the silent-surprised proxy computable per cohort. Dark
- R2 No-surprise surfaces — the day-12 banner and honest receipts. In-app only — no email infra, no vendor risk
- R3 The reminder + the experiment — the T-48h email with the holdback experiment attached — the readout that ends the finance argument [BLOCKED BY BLK-01, BLK-05]
- R4 One-tap cancel, everywhere — one-tap cancel from all three surfaces; the parity rule asserted in CI per market [BLOCKED BY BLK-02]
Every story cites the press-release paragraph or FAQ answer that demands it.
StoryREQ-D1 · Build the surprise joinpriority: Medium
As the analyst sizing this problem, I want charges joined to refunds, tickets and activity, so that Surprise Rate is a number instead of an argument.
Charges join to refunds, "surprise" tickets, and activity history, so Surprise Rate and the silent-surprised proxy compute per cohort.
Source: PR para 2 / IFAQ-03
Provenance: [OBSERVED] × 2
Out of scope: dashboards
Depends on: —
Acceptance criteriaGIVEN a cohort with charges, refunds, tickets and activity data
WHEN the join runs
THEN Surprise Rate and M4 compute with cohort sizes stated
working-backwardsdiscoveryslice-r1
StoryREQ-DP2 · The in-app backstop bannerpriority: Medium
As a trial user who never opens email, I want the app itself to warn me, so that an unread inbox doesn't cost me $12.
From day 12, an in-app banner states the charge date and price with the same two actions, until the user decides.
Source: PR para 3 / 03-demo-spec.md F1
Provenance: [OBSERVED] × 1
Out of scope: push notifications
Depends on: —
Acceptance criteriaGIVEN a trial user with the email unopened
WHEN they open the app on day 12+
THEN the banner shows date, price, keep, and one-tap cancel
working-backwardsdeliveryslice-r2
StoryREQ-DP4 · Receipts that prevent the next surprisepriority: Medium
As a paying customer, I want every receipt to say what happens next, so that no future charge is a surprise.
Every receipt shows amount, next renewal date, next price, and a cancel link.
Source: PR para 5 / EFAQ-04
Provenance: [OBSERVED] × 1
Out of scope: dunning redesign (F2 copy only)
Depends on: —
Acceptance criteriaGIVEN any successful charge
WHEN the receipt renders
THEN next renewal date, price and a cancel link are present
working-backwardsdeliveryslice-r2
StoryREQ-DP1 · The T-48h reminderpriority: High
As a trial user who forgot I signed up, I want to be told before I'm charged, so that the first I hear of it is never my bank statement.
One email, at least 48 hours before the first charge, stating price and date, with equal keep and one-tap-cancel actions.
Source: PR para 3 / EFAQ-03
Provenance: [OBSERVED] × 1
Out of scope: reminders for later renewals
Depends on: REQ-D1, BLK-05
Acceptance criteriaGIVEN a trial reaching day 12
WHEN the reminder sends
THEN it precedes the charge by ≥48h (M1 records the ordering)
AND a send failure is logged and visible — never silently absorbed (F5)
working-backwardsdeliveryblockedslice-r3
StoryREQ-D2 · The reminder holdback experimentpriority: Highest
As the VP in the finance standoff, I want the revenue fear tested by a real experiment, so that neither belief ships unverified.
A randomized holdback cohort receives no reminder; net revenue at day 60 is compared, reminded vs holdback.
Source: PR para 7 / IFAQ-01
Provenance: [OBSERVED] × 1, [ASSUMED] × 1 → RESTS ON ASSUMPTION
Out of scope: acting on the result
Depends on: REQ-D1, BLK-01
Conditional on: BLK-01 — finance co-owns the design, or the readout settles nothing
Acceptance criteriaGIVEN random assignment at trial start
WHEN the day-60 readout runs
THEN it states effect size, confidence interval and cohort sizes — or declares itself underpowered rather than extending silently
working-backwardsdiscoveryrests-on-assumptionshape-pendingblockedslice-r3
StoryREQ-DP3 · One-tap cancelpriority: Highest
As a user who decided to leave, I want cancelling to be one tap from wherever I am, so that leaving is as easy as joining was.
Cancelling from reminder, banner, or receipt is one screen and one tap, confirmed immediately, data retained 30 days.
Source: PR para 5 / RFAQ-02
Provenance: [OBSERVED] × 1, [UNKNOWN] × 1
Out of scope: win-back offers
Depends on: BLK-02
Conditional on: BLK-02 / Q-06 — markets that prescribe a cancel method get a per-market flow, still never more steps than signup
Acceptance criteriaGIVEN a user in the default flow
WHEN they tap cancel from any of the three surfaces
THEN cancellation completes on that screen with inline confirmation
working-backwardsdeliveryshape-pendingblockedslice-r4
StoryREQ-DP5 · The parity rulepriority: Medium
As a user in any market, I want cancelling to never take more steps than subscribing did, so that the exit is never a maze.
Cancelling never requires more steps than subscribing did, in any market, on any surface.
Source: EFAQ-02 / 03-demo-spec.md F4
Provenance: [OBSERVED] × 1
Out of scope: nothing — this rule has no exceptions
Depends on: REQ-DP3
Acceptance criteriaGIVEN the subscribe flow takes N steps in a market
WHEN the cancel flow is measured in that market
THEN its step count is ≤ N, asserted in CI per market config
working-backwardsdeliveryblockedslice-r4