40M
Migrating 40 million comments without losing one
A full migration of the comment platform behind a high-traffic publisher, with instant rollback.
- typescript
- nextjs
- kubernetes
- stripe
A SaaS product has three problems that a single-tenant application never faces: keeping one customer's data away from another's, deciding what each role inside a customer may do, and knowing at any moment who is actually entitled to use the product.
Tenant isolation is a property of the data model, not a condition appended to
every query. When the boundary lives in one place — a scoped connection, a
policy in the database, a repository no query can bypass — a forgotten filter
in a new feature is an error rather than a leak. When it lives in a hundred
where clauses, it is only a matter of time.
Billing is state, not a webhook. Trialling, active, past due, cancelled and paused are states with defined transitions, and access follows from them. A product that infers entitlement from the last message the payment provider happened to deliver will eventually let a cancelled account in and lock a paying one out, usually on a weekend.
The rest is the unglamorous part that decides whether a product survives its first hundred customers: usage that can be counted and invoiced without a spreadsheet, an audit trail of who changed what, an export a customer can take with them, and a deletion path that actually removes data. None of it is visible in a demo. All of it is visible in the first year of operation.
It is worth being honest about where the effort actually goes. The interface is the visible part and rarely the expensive one. The expensive part is the order of side effects: when someone presses pay, the system has to confirm with the provider, reserve the thing being sold, store the order, send the confirmation and update the totals, and it has to reach a correct final state whichever of those steps fails halfway. Getting that sequence right is most of what separates a demo from a product.
The specifics
40M
A full migration of the comment platform behind a high-traffic publisher, with instant rollback.
30,000
A production training game preparing an entire workforce on a new product, 13 days before it went public.
Native
A native application for Windows, macOS and Linux from a single codebase, with the tax data on the user machine rather than on a server.
30,000
Search, communications and peer recognition inside a large employer internal platform.
24M
Frontend, performance and production reliability on a real-time pricing platform.
Stripe
A SaaS ticketing platform built end to end, with Stripe payments and seat allocation that holds under concurrency.
How we work
The same process on a three-week engagement and on a two-year platform.
One session to understand the business process, not to show templates. We leave with priorities and a phased price.
Data model, integrations and a performance budget before the first screen is written.
Weekly releases to an environment you can visit. What gets approved gets deployed, it does not pile up.
Monitoring, verified backups and deployments anyone on the team can run.
As system state, not as the echo of a webhook. A payment provider can deliver the same notification twice, deliver it late, or not deliver it at all, so the account has to end up correct in all three cases. That means idempotent operations and a reconciliation path, not a handler that trusts the first message it sees.
At the data layer, enforced on the server, so isolation does not depend on every future query remembering to filter correctly. Roles are checked before the data is touched rather than by hiding interface elements, which is a suggestion rather than a boundary.
The unglamorous part that decides whether the product survives its first hundred customers: usage that can be counted and invoiced without a spreadsheet, an audit trail of who changed what, an export a customer can take with them, and a deletion path that actually removes data. None of it shows in a demo; all of it shows in the first year.
Next step
We reply within one business day with a phased scope proposal, or with the reason we are not the right studio for it.
We use one analytics cookie to see which pages get read. No advertising, no profiling, and nothing is set without your permission. Read the cookie policy