# Payments and payouts

Two separate money systems — do not mix them.

## 1. Commerce (courses, mentorship, coaching SKUs)

| Piece | Behavior |
|-------|----------|
| Checkout | `/payments` — Stripe Checkout and/or Flutterwave by region |
| Instructor share | **70%** instructor / **30%** platform (env: `INSTRUCTOR_REVENUE_SHARE`, `PLATFORM_REVENUE_SHARE`) |
| Hold | `PAYOUT_HOLD_DAYS` (default 7) before eligible |
| Minimum | `PAYOUT_MIN_AMOUNT` (default 5000 smallest units) |
| Status | Earnings `PENDING` until payout batch / admin |

### Providers

| Region | Collections | Payouts |
|--------|-------------|---------|
| Africa | Flutterwave | Flutterwave Transfers (bank / MoMo) |
| EU / Americas / Asia | Stripe Checkout | Stripe Connect |

Instructors complete payout profile at `/dashboard/earnings/payout-settings`; admin must **verify** before automated payouts. Admin may **Mark as Paid** for exceptions (`/admin/instructor-earnings`).

Refunds reverse related `InstructorEarning` rows — instructors are not paid on refunded sales.

Canonical terms: monorepo `Docs/PAYOUT_TERMS.md`.

### App routes

| Route | Role |
|-------|------|
| Course / mentorship / coaching `…/payment` pages | Buyer checkout |
| `/dashboard/earnings` | Instructor ledger |
| `/dashboard/earnings/payout-settings` | Connect / MoMo profile |
| `/admin/instructor-earnings` | Ops |

### APIs

`/payments`, `/payouts`, `/instructor-earnings`, `/promo-codes`.

## 2. Employer seats (CMH Talent)

Manual invoices → admin marks paid → search seats / `MANUAL_ACTIVE`. **No** Stripe self-serve in MVP.

See [Employer billing](/product/billing) and [Talent](/product/talent).
