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 and Talent.