APIs & Integrations
REST, JSON:API, GraphQL and webhooks — plus the retry, idempotency and reconciliation nobody budgets for.
A handful of decisions made in the first few weeks of a SaaS build determine how painful the next three years are. Most of them are cheap to get right at the start and become migrations — sometimes migrations requiring downtime — once you have customers.
Three broad models, and the right one depends on your customers rather than on preference. A shared schema with a tenant identifier on every row is simplest to operate and cheapest to scale, but every query must be scoped correctly and one missed filter is a data leak between customers. A schema per tenant gives stronger isolation at the cost of migrations that must run across every schema. A database per tenant offers the strongest isolation and the highest operational overhead, and is usually driven by enterprise or regulatory requirements.
Most products should start with a shared schema and enforce scoping at the framework level rather than by remembering to add a where clause — a global scope or repository layer that makes an unscoped query difficult to write by accident.
Subscriptions appear simple and then you meet mid-cycle upgrades and downgrades, proration, annual plans with monthly add-ons, usage-based components, trials converting or lapsing, failed payments and dunning, refunds, credits, tax by jurisdiction, and an invoice a customer disputes eight months later.
Use a billing provider — Stripe or similar — rather than building it. But do not let the provider be your only record: keep your own subscription state and invoice history, treat webhooks as the sync mechanism, and reconcile periodically. Providers get replaced; your billing history has to survive that.
Where most SaaS products lose users. An empty account with no obvious next step converts poorly regardless of how good the product becomes later. Sensible defaults, sample or seeded data, and a first-run path to something that demonstrates value beat a feature tour.
Technically this means the invite and team setup flow, email verification that does not block exploration, and — for anything with a real setup cost — the ability to import existing data rather than start from nothing.
For an early-stage product, my most useful contribution is often arguing for a narrower first release. Fewer configurable options, decisions deferred until there is evidence, and features left out until someone asks twice.
Configurability in particular is a trap: every setting is a permutation to support, test and document forever. A product with opinions is easier to build, easier to explain and easier to change than one that tries to accommodate every workflow before knowing which ones matter.
A common engagement: something works, has users, and was built quickly. The gap to production is usually not features — it is tests on the paths where failure is expensive, a deployment pipeline, environment parity, monitoring, backups that have been restored from, and the multi-tenancy scoping that was assumed rather than enforced. See DevOps & CI/CD for the delivery side of that.
I take on senior technical partner engagements — architecture ownership, build leadership, and involvement in what gets built rather than only how. Whether that is described as fractional CTO depends on your situation. What I will not do is take equity in place of a working arrangement that suits both sides; it tends to blur accountability rather than align it.
Usually in this order: verify multi-tenant scoping is enforced rather than remembered, add tests to the paths where failure costs money, get a deployment pipeline and environment parity in place, then monitoring and verified backups. Performance work comes after that, because it is rarely the actual constraint at early scale and it is easy to optimise the wrong thing.
No. Use Stripe or an equivalent for card handling, invoicing, tax and compliance. But keep your own subscription state and invoice history synced via webhooks rather than treating the provider as your only record — providers get replaced and your billing history needs to outlive that decision.
A common inflection point. Options range from a separate database for that tenant within the same application, through a dedicated deployment, to a self-hosted arrangement. Each has a different operational cost, and the deal should be priced with that cost understood. It is worth designing the shared-schema application so a per-tenant database is possible without a rewrite.
Then the useful role is usually architecture review, taking on a specific area they have not done before such as billing or multi-tenancy, or providing a second opinion on decisions that are hard to reverse. That is often better value than adding another pair of hands to feature work.
Describe the problem in your own words — I will tell you what I would actually build, and what I would not.
Start a conversation