Skip to main content

Access contract

Compares billing subscription state (Stripe or Paddle) against your application database.

Rules (summary)

#ConditionSeverity
1Active/trialing sub + has_paid_access = falsehigh (revenue leak)
2Cancelled/unpaid sub + has_paid_access = truehigh (wrongful access)
3Same stripe_customer_id on 2+ usersmedium
4Active price ID not in plans maphigh
5DB plan ≠ mapped plan for active subhigh
6User has customer ID but no Stripe submedium
7Active Stripe customer, no app userlow

Rules 4–5 require a plans: block in config.

CLI

npx prodverdict check access
npx prodverdict check access --config ./prodverdict.yml
npx prodverdict check access --fixtures --fixtures-dir scenarios/fail-revenue-leak
npx prodverdict check access --format json
npx prodverdict check access --strict # fail on warn

Exit codes

CodeMeaning
0pass or warn (without --strict)
1fail (high severity)
2config / credential error

Paddle

Use source_of_truth: paddle and PADDLE_API_KEY. See SDK example examples/paddle-stripe/.