Tenant boundaries обираються свідомо
Isolation може бути на рівні rows, schemas, databases або окремої infrastructure. Вибір залежить від risk, scale, compliance та operational cost.
Tenant identity повинна проходити через requests, jobs, caches, logs і background tasks. Пропущений tenant filter — security bug.
Authorization моделюється окремо від UI roles
“Admin/member” часто замало. Краще моделювати capabilities і resources, щоб enterprise customers могли мати складніші policies.
Authorization enforced на service boundaries і покривається tests. Frontend visibility — лише UX layer.
Billing — це ledger problem
Subscription status, usage, credits, invoices і retries створюють edge cases. Billing logic не можна розмазувати по продукту.
Provider webhooks нормалізуються, handlers idempotent, а event history дозволяє reconciliation.
Slow work виноситься в async processing
Exports, imports, AI jobs, emails, media та integrations не повинні блокувати requests. Використовуйте queues з retries, deduplication, dead-letter і telemetry.
Кожен background job потребує idempotency strategy.
Migrations мають бути backward compatible
SaaS не може зупинятися на кожну migration. Використовуйте additive changes, dual read/write і staged cleanup.
Old і new app versions мають переживати rollout одночасно.
Observability по tenant і workload
Global averages приховують noisy-neighbor. Вимірюйте latency, errors, queue depth і cost по tenant/workload.
Rate limits, quotas та workload isolation захищають platform і SLO.