One Customer Environment for identity, billing, and audit

A lot of software "suites" are a shared login and a shared invoice over products that otherwise do not know about each other. Each app keeps its own users, its own settings, its own log. The integration is the brand, not the data.

That falls apart the first time someone asks a cross-product question. Who has access to anything, across all apps? What did this customer's account do last quarter, everywhere? You end up exporting from each product and stitching the answer together by hand.

The record, not the login, is the unit

We built Spot Suite around one record per customer: the Customer Environment. Identity, the subscription, product entitlements, and the audit trail all hang off it. Adding a second product to a customer does not create a second account. It attaches to the Environment they already have.

Sign-in is Spot Suite OIDC, scoped per tenant. A user is defined once, and access to xEvolve or any module is a grant on the same identity. The billing record is one subscription, even when the customer runs several products. The audit trail is one timeline, not one per app.

What that makes easy

Two questions get short answers. Access reviews stop being a per-app chore, because access is defined in one place. Cross-product audit becomes one export, because the events share a timeline.

It also makes the buying motion honest. A customer can start with one product on a trial and add more later without migrating anything. The Environment grows; nothing is rebuilt.

What it costs us

This is not free to build, and it shows up in the constraints. Each customer gets an Environment provisioned on signup, and xEvolve and Automate Certificates keep their data in the shared Supabase Postgres project in the EU (Paris), with files in Cloudflare R2. Guardrail Ledger is the exception: a paid workspace gets a dedicated Supabase project in the region chosen at signup. Most of the infrastructure is shared, so every record, file, and session has to be scoped to the right tenant in every product. That is more moving parts for us to operate than a flat multi-tenant schema we could have shipped faster.

We took that cost on purpose. For regulated buyers, "your product data is scoped to your tenant, stored in the region we told you, and on one audit trail you can export" is worth more than a faster signup. Most of the servers are shared. What is yours is the Environment that ties it together, and the tenant boundary around your data.

If you want to see how a single Environment handles two products at once, request a walkthrough.