How do I keep client data separate?

Run one CRM per client: a separate database, sending mailboxes and suppression list for each. A mistake in one account stays there.

An admin approves every new account by hand. Nothing is created until then. We reply by email; no newsletter, no sequence.

Want to see it first? Book a demo

app.salescrew.io/inbox
The unified reply inbox with classified threads

The short answer

  • Agencies running outbound for several clients keep client data separate by running one CRM per client, each with its own database, not a filtered view of a shared one.
  • Client data can be separated at three levels: a filter in application code, a row-level rule in a shared database, or a database per client.
  • Outbound needs a second layer of separation: each client's sending mailboxes, suppression list and reply inbox stay inside that client's account.
  • SalesCrew runs every client as its own Supabase project, with its own Postgres database, file storage and region, and each instance has unlimited seats.

Why a filter isn't separation

The real risk is rarely a hacker. It's an ordinary slip: a query that forgot its client filter, a permission set copied from the wrong template, a report built on the whole table. What decides the damage is how far that slip travels before something stops it.

With a filter in the app, every client's rows share the same tables. Code that remembers to ask "which client?" is the only wall. One missing condition shows your dental client a roofer's pipeline.

Row-level security moves the rule into the database, so it runs on every query. That's a big step up. But the rule and the data still share one home, and a policy written too loosely reaches every client at once.

A database per client changes the shape of the problem. No table holds two clients, so no query can cross between them. A mistake in one project touches one client.

The three levels of separation

Read the second row first. It decides the rest.

Filter in the appRow rule in a shared databaseA database per client
Where the rule livesIn app code, on every query a developer writesIn the database, on every queryNo shared data, so no rule is needed
What one mistake exposesAnother client's recordsEvery client, if the policy is wrongOne client's own account
What an export containsFiles cut out of shared tablesFiles cut out of shared tablesThe whole database, relationships intact
Data residencyOne region for everyoneOne region for everyoneChosen per client at setup

Outbound adds a second layer

When you send cold email for several clients, data isn't the only thing that leaks. Sender reputation leaks too. If client A's list bounces hard from a mailbox you share with client B, both lose inbox placement. A suppression list shared across clients can also block a contact who opted out of one client but never heard from the other.

So keep each client's outbound inside that client's account. In SalesCrew each instance has its own mailbox pool, with per-mailbox and per-domain daily caps. Unsubscribes and bounces go onto that client's suppression list, and suppression is checked again at send time. Replies land in that client's shared inbox, next to that client's deals.

You still run all of it from one place. The agency console lists every client instance, and a snapshot of your best setup (pipeline stages, cadences, fields) applies to each new client you add. Your team works every account, and no account can see another.

How SalesCrew keeps each client apart

Every SalesCrew client instance is its own Supabase project: its own Postgres database, file storage and edge functions. You pick the region when the project is created. Inside an instance, row-level security and three access scopes (channel, profile and area) govern people and MCP tokens the same way. Every tool call lands in an audit log with the actor named.

When a client leaves, you hand them a full Postgres dump and CSV exports of their own data, not a file cut from a shared table. Core starts at $299 a month, and every tier has unlimited seats, so your whole team and the client's team can log in. See pricing for the tiers.

A white-label login says nothing about where data lives

A product can show each client its own logo and domain while every client's rows sit in one shared table. Ask the three questions in the FAQ below before you trust a demo.

Questions

Can one CRM hold multiple businesses?
Yes, in two ways. A shared CRM keeps every business in the same database and separates them with filters or row rules. A per-client setup gives each business its own database, so no table ever holds two clients' records.
Is row-level security enough to keep clients separate?
Row-level security is a real control, because the rule sits in the database and applies to every query. It still lives inside one shared database, so a policy written too loosely reaches every client at once. A separate database per client removes that failure instead of guarding against it.
Should each client have its own sending mailboxes?
Yes, when you run outbound for them. Separate mailboxes keep one client's bounce rate and complaints off another client's domain. They also keep replies landing in the right client's inbox, next to the right deals.
What should I ask a vendor to confirm how separated my clients are?
Ask whether two clients' records ever sit in the same table. Ask whether an export gives you a database or a folder of files. Ask whether one client can sit in a different storage region without moving anyone else. Those three answers come from the architecture, not the brochure.