Matching numbers

Income books

One monthly file. Owner, driver, and admin reports add up. Print statements, 1099 worksheets, and Stripe stay in their lanes.

Identity: driver paid = host net + Period 2 binder reserve + platform take. Demo rate is $25 = $15 + $8 + $2. Gas is never on the sheet. Stripe is the wallet — /admin/accounting is a deep-link, /admin/income is the books.

DoorPathWhat they see
Host/owners/earnings + /printHost net, hours, days, identity bar
Lessee/drivers/earnings + /printWhat they paid us, $25 stack
Desk/admin/income + /printAll three legs, one-click packets
Host tax/owners/taxes + /print1099-NEC, 1099-K, ID card from the same totals
Lessee tax/drivers/taxes + /printLease statement + ID card
Wallet/admin/accountingOpen Stripe. No balances in-app.
lib/reporting/books.ts
for (const row of BOOK_MONTHS) {
  assert(row.hostNet + row.insuranceReserve + row.platformTake === row.driverPaid);
}

Print uses window.print() on a statement page; chrome (nav, glass) is hidden. Forms stamp VOID until TAX_FORM_1099_ENABLED and a TIN match. Public copy: /tax, /privacy, /disclosures, /licenses.