Multi-Tenant AI: Why Agencies Need Separate Pitch Profiles Per Client
By Alex Kerlek · Published · 4 min read
An agency or internal team running outbound for more than one product line has a problem that a single-tenant tool doesn't solve: the value props, proof points, and personas for Client A should never leak into a dossier being generated for Client B. This isn't a hypothetical risk invented to justify an architecture decision. It has happened, repeatedly, in production AI systems run by companies with far more security resources than a small SDR tool.
This has already happened, more than once
- In March 2023, a race condition in an open-source Redis client caused ChatGPT to briefly show users each other's chat titles and, for about 1.2% of Plus subscribers, exposed billing details including partial card numbers
- In early 2026, a misconfigured Firebase database behind the "Chat & Ask AI" app - over 50 million downloads - left more than 300 million private chat logs from 25 million users publicly accessible with no authentication at all
- Security researchers also demonstrated a web-cache deception attack against ChatGPT's own session endpoint, letting an attacker pull a victim's session token straight from a CDN's cache
The model isn't what leaks
What's worth noting about all three: none of them was the AI model itself "leaking" one customer's context into another's output. Security research is consistent on this point - stateless LLM inference doesn't retain or cross-contaminate one user's prompt into another's response at the model level. Every real incident traced back to the surrounding application: a shared session cache, a misconfigured database, a caching layer that didn't check whose data it was serving.
The fix isn't some exotic AI-specific safeguard. It's the same discipline that prevents any multi-tenant data leak.
That's the encouraging finding for an architecture like ours: every pitch profile, persona, and prospect belongs to exactly one tenant at the database row level, and every generation call is scoped to that tenant by construction - enforced the same way regardless of how much AI sits on top of it.
Where this gets genuinely harder
It's worth being precise about where the easy answer stops working. Row-level scoping is a strong, industry-standard fix for structured relational data - cloud architecture guidance from AWS and others recommends exactly this pattern, and it's what a straightforward multi-tenant SaaS tool should be built on.
It's a materially weaker fix on its own for tools built around a shared vector database or retrieval pipeline pulling from multiple clients' documents at once. OWASP specifically flags this as its own risk category - unentitled semantic search results bleeding across tenants - requiring namespace-level isolation separate from the database layer entirely. That's a different, harder engineering problem than a `tenant_id` column and a `WHERE` clause.
Tools that execute AI-generated code on a tenant's behalf face a third layer entirely: dynamic agent runtimes need kernel-level sandboxing, because a container-escape vulnerability in a shared execution environment can expose one tenant's memory and files to a neighbor regardless of how carefully the database is scoped. That's a real, documented class of vulnerability in shared container runtimes - and it has nothing to do with database design at all.
The isolation options, and why one fits a small team
Standard cloud architecture references, including AWS's own SaaS guidance, generally recognize a handful of isolation patterns:
- Pooled row-level security - one shared database, tenant scoping enforced by database policy on every query
- Schema-per-tenant - a shared database instance with a separate schema per customer, moderate operational overhead
- Silo, or database-per-tenant - fully dedicated infrastructure per customer, the strongest isolation and the highest operational cost
- Vector namespace isolation - a dedicated logical index per tenant, specifically for AI retrieval pipelines rather than relational data
- MicroVM compute isolation - a dedicated guest kernel per tenant workload, relevant only for platforms that execute arbitrary AI-agent code
The right choice tracks team size and what the product actually does. Silo and microVM isolation solve real problems, but they're solutions built for scale or for agentic code execution that a structured, row-scoped tool doesn't need to take on.
Why staying simple is the safer choice
A tool that stays structured - tenant-scoped relational data, not a shared retrieval index blending everyone's documents together - sidesteps that harder problem rather than solving it cleverly. That's not a limitation to apologize for. For a small team, the boring, well-understood isolation pattern beats a more sophisticated one that's easier to get subtly wrong.