The straightforward way to run a platform like this is one big database with a column marking which venue each row belongs to, and a filter on every screen. It works perfectly until somebody misconfigures a filter.
We do not do it that way. Each venue gets its own separate data store and its own separate reporting dashboard, created from the same template but never sharing a table, a query or a connection.
The difference matters when something goes wrong. With filters, a mistake shows you another client’s margins. With separate stores, a mistake shows you an empty report. One of those is a bad afternoon; the other is a breach.
And we prove it rather than assert it
Before handover, we run a documented isolation test. An operator signed into one sandbox venue attempts to reach another’s records, dashboards and documents — by direct link, by substituting identifiers, and through the reporting layer. Every attempt is recorded with its result, and the report is handed over as a deliverable.
If you ask us how we know the separation holds, the answer is a document, not a reassurance.