Multi-tenant SaaS development.
Multi-tenant SaaS development, end to end: the customer-facing product, the console the staff run it from, and the data model underneath, with tenant isolation, billing and credits, and ledger-grade data wherever money is involved.
Multi-tenant platforms built end to end, including the operational surface a business needs in order to actually run the thing.
- Typical duration
- 2–6 months
- Shape
- Fixed scope, milestone billed
- Stack
- Next.js · Postgres · .NET · Go
Plenty of software gets delivered looking finished and turns out to be unrunnable. There is no way to see what customers are doing, no way to correct a bad record, no audit trail when somebody asks what happened, and nothing reconciles. We build the whole system: the customer-facing product, the console the staff live in, and the data model underneath that has to survive contact with an accountant.
What this includes
- Multi-tenant architecture with plan-level feature flags and limits
- Payments, subscriptions, credits and webhook reconciliation
- Ledger-grade data integrity wherever money is involved
- Operational console: tenants, bookings, jobs, usage, intervention
- Audit logs, role-based access and the boring safety work
- Deployment pipelines, environments and rollback
Subscription billing, credits and ledgers
Payments, subscriptions, credits and webhook reconciliation are built as part of the platform, not bolted on afterwards. Wherever money moves, balances are derived from recorded movements in a double-entry ledger rather than stored as a number that can drift, so every figure the business reports can be explained by the rows that produced it.
Tenant isolation enforced in the database
Every tenant shares one codebase and one database, and each one's data stays its own. Isolation is enforced by the database itself rather than left to every query remembering a WHERE clause, so a single missed filter cannot show one customer another customer's records.
Further reading
- Architecture
Multi-tenant row-level security that survives a forgotten WHERE clause
One missing predicate is all it takes for one customer to see another's data. Why application-layer filtering is not a security posture, how to make a shared schema genuinely safe with row-level security, the two settings that decide whether it works at all, and the places isolation still leaks after the database is correct.
- Data modelling
Double-entry accounting schema inside an application database
How to stop storing balances and start recording movements, so that every figure the business reports can be explained by the rows that produced it. The schema, the invariant, why entries are never updated, how to post from application events without double-posting, and what it costs when the ledger gets long.
Other services
- Legacy .NET modernization
ASP.NET Web Forms and .NET Framework applications moved to modern .NET, incrementally and in production, without a code freeze.
- Modernization assessment
Two weeks, fixed price. A written migration plan for your legacy system that is useful whether or not you hire us to execute it.
- ASP.NET Web Forms migration
ASP.NET Web Forms applications moved to ASP.NET Core and .NET 10 in production, one route at a time, with one login across both stacks and no code freeze.