| Gap | Impact | Solution |
|---|---|---|
| No credit notes | Post-payment corrections require void + re-invoice | Migration 039: credit_notes table |
| No automated dunning | Overdue invoices not flagged automatically | Nightly cron: mark overdue + email |
| No USDC rate storage | Revenue recognized without documented rate | Migrations 040–041: rate columns |
| No collection retry job | failed fees accumulate | Retry queue via next_retry_at + collection_attempts |
billing_mode not enforced | invoice mode still triggers on-chain collection | Gate in collectCreationFee() |
| No settlement FX rate lock | Rate drift risk during payment window | Lock FX on statement issuance, not payment |
| No rebate calculation logic | Rebate tiers designed but not computed | Implement post-settlement rebate job |
Gaps vs. Industry Best Practices