Isolate tenants in data, code, and capacity, choosing the right isolation model per tier. Use when designing SaaS data models or containing noisy-neighbor and cross-tenant risks.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add Amey-Thakur/AI-SKILLS --skill multi-tenancy --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Multi Tenancy?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/amey-thakur-multi-tenancy)More formats (shields.io, HTML) on the badges page.
---
name: multi-tenancy
description: Isolate tenants in data, code, and capacity, choosing the right isolation model per tier. Use when designing SaaS data models or containing noisy-neighbor and cross-tenant risks.
---
# Multi-tenancy
Two failure classes define the design: a tenant seeing another's data
(catastrophic, reputational) and a tenant consuming another's capacity
(gradual, contractual). Address both explicitly.
## Method
1. **Choose the isolation model per tier, not ideologically.** Shared
tables with tenant_id: cheapest, scales to millions of tenants.
Schema-per-tenant: middling isolation, migration fan-out pain beyond
hundreds. Database-per-tenant: strongest isolation and per-tenant
restore, real cost; sell it as the enterprise tier. Mixing models
(shared for small, dedicated for large) is normal.
2. **Enforce tenancy below the application when possible.** Postgres
row-level security with `tenant_id = current_setting(...)`, set per
request from the authenticated context, turns a forgotten WHERE
clause from a breach into a bug. Without RLS: repository-layer
scoping that raw queries cannot bypass, and no ORM escape hatches in
handlers.
3. **Carry tenant context, never accept it.** Tenant comes from the
auth token/session, flows through request context to queries, jobs,
and logs. Any endpoint taking tenant_id as a parameter from the
client is an IDOR generator (see authz-design).
4. **Scope everything tenant-shaped.** Object storage prefixes,
cache keys, search indexes, queue messages (tenant in payload,
re-asserted at consumption), rate limits, encryption keys where
contracts demand it. Cross-tenant leaks love the secondary stores
everyone forgets.
5. **Contain noisy neighbors with per-tenant budgets.** Rate limits and
concurrency caps per tenant at the edge; fair-share scheduling in job
queues (round-robin across tenants, not FIFO); statement timeouts so
one tenant's pathological query cannot hold the pool. Track cost per
tenant; the top one is always a surprise.
6. **Test isolation adversarially.** A standing test suite that
authenticates as tenant A and attempts every endpoint against tenant
B's IDs; run it in CI. One passing cross-tenant read is a sev-1, not
a ticket.
## Boundaries
- Per-tenant schema or database migration fan-out needs orchestration
(batching, canary tenants, stragglers report); do not adopt those
models without building it.
- Tenant deletion and export are legal obligations (GDPR); shared-table
models must prove complete deletion across all stores, which is a
feature you build, not a script you improvise.
- In-process caches shared across requests are where tenant bleed hides;
key them by tenant or scope them per request.

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!