What we learned building a CRM on Supabase
SalesCrew gives each client a whole Supabase project. Five questions a CRM buyer asks are answered by that one choice.

The short answer
- SalesCrew is a single-tenant CRM built on Supabase: every client instance is its own Supabase project with Postgres, storage and edge functions.
- With one project per client, the walls between clients, the export and the data region are all set once, when the instance is created.
- The SalesCrew MCP server runs inside each instance. An AI agent reaches the same database, under the same rules, as a person in the app.
- Credentials sit in Supabase Vault in the client's own project and are never displayed after entry.
The choice: a whole project per client
A multi-tenant CRM puts every customer in one shared database and separates them with a tenant ID on each row. We went the other way. Each SalesCrew instance gets its own Supabase project: its own Postgres database, its own file storage and its own edge functions.
The front end is one React and TypeScript build, hosted on Vercel. Each instance loads it with its own settings. It talks only to its own project. You'll find each instance at its own subdomain of salescrew.io.
What each Supabase building block does in SalesCrew
| Supabase piece | Job in the CRM |
|---|---|
| Postgres | Every record: contacts, companies, deals, threads, cadences, the audit log |
| Row-level security | Scopes each user and token by channel, Upwork profile and area |
| Vault | Holds API keys and mailbox credentials; never shown after entry |
| Edge functions | Serve the MCP server over HTTP and the AI gateway |
| Storage | Files attached to records |
| Project region | Sets where the client's data lives |
Architecture per the SalesCrew fact sheet §4, September 2026.
Lesson 1: isolation belongs in the infrastructure
In a shared database, one client's rows are kept from another's by a filter. Every query has to carry it, every time. With a project per client, no other client's data is in the database at all.
Row-level security still matters inside an instance. SalesCrew uses it for the 3-axis scope model: channel, Upwork profile and area. The same scope applies to a person in the app and to an MCP token, so a token never sees more than its user would.
Lesson 2: the agent should use the app's own door
The MCP server runs as an edge function inside each instance. When Claude, ChatGPT or Cursor calls a tool, it lands in the same project, under the same security rules, as a click in the app. That's how every UI action can also be one of 140+ MCP tools with the same effect.
Every tool call is written to the audit log with its actor: a user, a token or an agent. You can trace an agent's work the same way you'd trace a colleague's.
Lesson 3: secrets stay where the data is
A CRM holds a lot of keys: mailbox logins, the Upwork API, Instantly, the marketing collectors. In SalesCrew they all go into Supabase Vault in the client's own project. A key is never displayed again once it's entered.
Bring-your-own-key AI works the same way. Your Anthropic key sits in your Vault, and the AI gateway uses it for your calls.
Lesson 4: export is just Postgres
When your data is its own Postgres database, leaving is easy to describe. Export is a full Postgres dump plus CSV of everything. If a client leaves, the instance goes read-only with export open. A person removes it 90 days later. No timer does it.
Lesson 5: data region is a provisioning choice
Each Supabase project runs in a region you choose when it's created. So "where does my CRM data live?" has one answer per client, set on day one. Instances are backed up daily, and point-in-time recovery is an add-on at $120 a month.
Questions
- Can you build a CRM on Supabase?
- Yes. SalesCrew runs on Supabase: each client instance is its own Supabase project with Postgres, storage and edge functions, and the React front end is hosted on Vercel. Row-level security, Supabase Vault and edge functions cover access control, secrets and the MCP server.
- Why one Supabase project per client instead of one shared database?
- Because the wall between clients is then a separate database, not a filter on every query. A client's data sits only in that client's project. Export is a full Postgres dump plus CSV, and the data region is chosen when the project is provisioned.
- Where does SalesCrew keep API keys and mailbox passwords?
- In Supabase Vault, inside the client's own project. A credential is never displayed again after it is entered. That includes a client's own Anthropic key when they use BYOK.
- How are SalesCrew instances backed up?
- Every instance is backed up daily. Point-in-time recovery is an add-on at $120 a month.