# NRR target and dunning (conversion playbook §3.6)

**SSOT:** GitHub #343, #342. Playbook: docs/marketing/2026-02-27-saas-conversion-profitability-playbook.md.

## NRR >105% target (#343)

- **Target:** Net Revenue Retention >105%. Expansion (upgrades, added seats) should offset logo churn.
- **Tracking:** Use Stripe subscription and plan data: count upgrades (free→pro, pro→team), seat changes, and churn. NRR = (beginning ARR + expansion - churn) / beginning ARR.
- **Implementation:** Dashboard or internal report that computes NRR from Stripe (subscriptions, plan changes, cancellations). When built, link here.

## Dunning (#342)

- **Current:** `invoice.payment_failed` webhook handled in frontend/src/app/api/stripe/webhook/route.ts. User plan set to `past_due`; Stripe retries automatically. On continued failure, Stripe cancels subscription → `customer.subscription.deleted` → we set plan to free.
- **Recovery:** User can update payment method via Stripe Customer Portal (Manage billing in dashboard). Optional improvement: on first payment_failed, send email with link to billing portal to increase recovery (playbook: 40–60% of failed payments recoverable with dunning).
