Subscriptions page:
- Dunning banner: lists 'pending' (grace) subs at top — failing payments to
chase before they halt/churn
- Per-row admin Cancel button (cancel_at_cycle_end via Razorpay; any family) —
POST /api/admin/subscriptions {action:"cancel", subscriptionId}
- Export CSV (family/plan/status/dates/rzp id/price), quoted
- Reconcile button now sends {action:"reconcile"}
Revenue page:
- Real monthly revenue chart from subscription.charged events (valued by plan
price, grouped by IST month) — replaces the fabricated chart
- Churn rate card = cancelled+halted+expired ÷ ever-live subs (red if >10%)
subscriptions API: added revenueTrend + churn to GET; POST routes
reconcile|cancel actions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>