brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
audit-monetization-iapRead-only audit of mobile IAP and subscriptions (StoreKit 2, Play Billing, RevenueCat): receipt validation, restore, lifecycle sync, grace periods, entitlements. Use when "audit our IAP" or "restore purchases broken". Web → audit-payment-system.
Independent GitHub snapshot · Automated classification · Original documentation governs
Degree of freedom: MIXED — Phases 0–1 [HIGH freedom]; Phase 2 sandbox
[LOW freedom — run exactly], sandbox only: a real purchase charges a real card and cannot be undone from here.
Read-only. Entitlements must match what users paid for: no unlock-without-pay, no paid-but-locked, no double-charge, no lost purchase on reinstall.
The two revenue killers are client-trusted entitlements (piracy) and broken restore (refunds + 1-star reviews).
Present findings. Do not patch store/server code until approved. Never test against real billing.
| Skill | Owns |
|---|---|
| audit-monetization-iap (this) | App Store / Play IAP, restore, store notifications |
audit-payment-system | Web money-movement, Stripe, ledgers, PCI |
plan-mobile-readiness | Submission paperwork (IAP via official billing is a checkbox) |
plan-aso | Store listing conversion, not receipt validation |
plan-privacy-compliance | Purchase-data in privacy labels |
Do not fire for "Stripe webhook / double charge on the website" →
audit-payment-system.
Observe:
isProreadsRevenueCat.getCustomerInfo()on-device only; no App Store Server Notification handler. Interpret: a patched client can unlock Pro; refunds never revoke. Classify: client-trust + missing lifecycle sync. Severity: Critical. Finding: entitlements | client-only | Critical |lib/pro.ts:18| verify on server + ASN V2 / RTDN
Receipt / token validation — Server-side (App Store Server API / Play Developer API). Client-trusted "purchase succeeded" is Critical. StoreKit 2 signed transactions still need verification, not just decode.
Source of truth — One place answers "does this user have Pro?" Backend must hear App Store Server Notifications V2 / Play RTDN for cancel, refund, billing failure — not only check at purchase time.
Restore — Discoverable Restore (Apple requires it). Recovers after reinstall / new device / re-login.
Lifecycle — trial, active, grace (billing retry), on hold, paused (Android), expired, refunded, up/downgrade. Missing grace locks paying users out. Missing revoke leaves refunded users in.
Trials — One trial per user/family; no farm. UI must not promise a trial the store will refuse.
Cross-platform — iOS + Android (+ web): one purchase unlocks via backend, or the user is charged twice.
Prices — From the store (localized), never hardcoded.
Edges — Interrupted purchase resumes; sandbox vs prod receipt mix-up; clock-gamed trials.
Exercise: fresh purchase, restore on clean install, cancel → access ends at period end, sandbox refund → revoke, trial → convert, interrupted purchase. Confirm backend entitlement flips.
audit-payment-systemfile:line | fix shapeaudit-payment-system — web / Stripe / ledgerplan-mobile-readiness — store review gatesplan-aso — listing, not billing correctnessplan-privacy-compliance — purchase data disclosure