The situation
The business ran collections, machine tracking, and revenue splits with location owners on a Windows application called Smart. It worked, in the sense that the company had been run on it for years. But the split rules were baked into the software, the office couldn't see the history behind a number, and getting a statement to a location owner meant somebody assembling it by hand.
What we built
- Multi-tenant route management covering locations, machines, meters, collections, the money room, and splits
- A customer-facing portal for location owners, with strict data isolation from the operator's own records
- Location statements generated and emailed automatically the moment a collection is submitted
- CSV import for bulk data, and a multi-tab workspace because office staff keep several records open at once
The details that mattered
- The splits engine is fully data-driven with an off-the-top fee model. Every hard-coded fee rule from the old system was removed and re-expressed as data an administrator can see and change.
- Rounding is configurable. An administrator decides whether the remaining cent goes to the location or the operator, and there's an exact-penny mode for locations that audit closely.
- Money is stored as integer cents and meter readings as integers. No floating point anywhere near a dollar figure.
- Row-level security is scoped to route ownership plus explicit backup grants, so a collector sees the locations they're responsible for and nothing else.
- Machine movement history is append-only and records are soft-deleted, never removed. The office has an audit log viewer.
- CSV import runs with dry-run and commit parity: you see exactly what an import will change before you let it change anything.
What it proves
Rounding allocation rules and dry-run imports are not features anyone puts in a demo. They're what you build after you've watched a reconciliation go wrong and had to explain it to the person on the other side of the split.
Systems: Supabase · PostgreSQL · Row-level security · CSV import