
The short answer
n8n has no real multi-tenancy, so for agency work you isolate at the instance level: one n8n instance per client, plus one control plane you own that watches the fleet. Projects, the feature everybody reaches for first, is a paid organizational layer inside a single instance. It groups workflows and credentials and decides who sees what in the UI. It does not give you a separate database, a separate encryption key, a separate webhook host or a separate blast radius. If a client's data must never be readable from another client's context, that is an instance boundary, not a folder.
We build and run n8n for clients for a living, and this is the question that comes up on nearly every kickoff call. Here is what we actually do and why.
What n8n gives you out of the box
Worth being precise, because a lot of blog posts are wrong about this. Per n8n's own edition comparison, the free Community edition includes almost the complete product — every node, unlimited workflows, unlimited executions, and queue mode for scaling. What it does not include:
- Projects — the workspace grouping feature
- Sharing of workflows and credentials (only the instance owner and the creator can see them)
- External secrets (Vault, AWS Secrets Manager, 1Password Connect, and friends)
- Environments and Git-based version control
- SSO via SAML or LDAP
- Custom variables, external binary storage, log streaming and multi-main mode
Registering your Community instance with an email is free and unlocks folders, debug-in-editor and custom execution data. That is it.
So on a free self-hosted instance you cannot even share a workflow with a teammate, let alone partition it by client. That single fact pushes most agencies toward one of two places: pay for a plan, or run more instances. Most of the advice online skips straight to "use Projects" without mentioning it is behind a paid tier — and without asking whether it solves the problem at all.
Why "just use Projects" isn't isolation
Projects is a good feature. We use it internally. But it is access control, and people sell it to clients as isolation. Inside one instance, every project still shares:
- One Postgres database. Every client's execution data, including whatever payloads flowed through it, sits in the same tables.
- One
N8N_ENCRYPTION_KEY. Credentials are encrypted at rest with that single key. A database dump is a dump of everyone, decryptable with one secret. - One version and one restart. Upgrading for the client who needs a new node upgrades everybody, during the same window. Our post on rolling back a self-hosted n8n upgrade exists because that goes wrong more often than people admit.
- One set of installed community nodes. A node one client needs is installed in the process every other client's workflows run in.
- One resource pool. A Code node that eats memory is a Code node that eats everyone's memory. Queue mode softens this but does not remove it — see how many n8n workers you actually need.
- One webhook host. Every client's third-party integrations point at the same domain.
None of that is a reason to avoid Projects. It is a reason not to write "isolated environment" in a proposal when what you have is a folder with permissions on it.
The three architectures agencies actually run
Shared instance, no separation. One box, everything in it, you own all the data and no client has a login. Cheapest and fastest. Honest answer: this is fine for your first three or four clients if none of them touch regulated data. It becomes a liability quietly — usually the first time a client asks to "see the automation."
Shared instance with Projects. Requires a paid plan. Real value for a team: your specialists stop tripping over each other and credentials stop leaking sideways between engagements. Still one database, one key, one upgrade. Good for organizing your people. Not a client-facing isolation story.
Instance per client. Each client gets their own container, their own Postgres database, their own encryption key, their own subdomain, and their own upgrade schedule. Costs more in operations and almost nothing in money. This is what we run for anyone whose data has rules attached to it, and for anyone who might one day want their own login.
There is a fourth thing people try — one instance, one mega-workflow, a clientId switch at the top routing to different branches. It works right up until it doesn't, and then it fails for every client at once. We have inherited that pattern twice. Both times the rescue was the same: split it.
What we run, and the numbers behind it
Instance per client, on small hardware, with a control plane we own.
A typical client's few dozen workflows sit comfortably on a 2 vCPU / 4 GB VPS, which runs somewhere between twelve and twenty-five dollars a month depending on the host. Self-hosted n8n has no per-execution fee, so that number does not move when the client's volume triples. Ten clients is a couple hundred dollars a month of infrastructure — less than a single seat of most marketing SaaS. Light clients can share hardware while still getting separate containers and separate databases, which keeps the boundary intact at a fraction of the box count.
Compare that to the paid plan you would buy purely to get Projects. Public 2026 write-ups put the self-hosted Business plan in the €600-a-month range; n8n's pricing page is the source of truth and the number moves. Either way, the plan buys you SSO, environments and external secrets — all genuinely useful — but it does not buy you the thing the instance boundary gives you for the price of a VPS.
The real cost of instance-per-client is not servers, it is fleet management. You need one place that knows whether twelve instances are alive, one place that catches a failed execution on any of them, and one way to ship a fix to all of them. Build that once and the model scales; skip it and you will be SSH-ing into boxes at 11pm. We wire every client instance's failures into a single alerting path, which is the same discipline described in n8n error handling and monitoring.
How to ship one workflow to twelve clients without copy-paste
Export-and-import by hand does not survive contact with a fleet. Treat workflow JSON as source code:
- Keep workflows in Git. One repository, one directory per shared workflow, the JSON committed and reviewed like anything else. This is also how you get a diff when a workflow starts misbehaving. We wrote up the mechanics in n8n version control without Enterprise.
- Push client-specific values into environment variables. No account IDs, no sheet URLs, no phone numbers baked into nodes. If the same JSON cannot run on two clients unmodified, it is not a shared workflow, it is two workflows.
- Deploy over the public REST API.
POST /api/v1/workflowsto create andPUTto update, from a single script that loops over your instance list and their API keys. Deploy to one client first, watch it, then fan out. - Version what you shipped. Record which commit is live on which instance. When client seven behaves differently from client eight, that record is the first thing you will want.
One caveat that bites agencies specifically: n8n's license terms restrict hosting the product for other companies in some configurations. Read them before you sell managed instances — we covered the details in n8n's commercial license for agencies.
Webhooks and the client-facing domain problem
This one is underrated. On a shared instance every client's third-party integrations point at the same host, which means a client can see a URL that obviously belongs to your agency, and an integration you set up for client A lives on the same domain as client B's.
Per-instance, you set WEBHOOK_URL to a subdomain for that client and every registered webhook is theirs. The migration benefit is bigger than the cosmetic one: when a client leaves, or moves hosts, or gets their own instance, you repoint one subdomain instead of hunting down every webhook someone registered against a shared URL three years ago. Shared hosts are easy to enter and painful to exit.
When a shared instance is genuinely fine
Not everything needs a boundary. Stay shared when all of these hold:
- You own the data. The client is buying an outcome, not a system.
- No client ever gets a login.
- No workflow touches health, financial or otherwise regulated data.
- Every client can live with the same upgrade window.
- Losing all of them to one bad afternoon would be survivable.
That describes a lot of early agency work, and pretending otherwise just burns money. The mistake is not starting shared. The mistake is staying shared past the point where one of those five stops being true, because migrating under pressure is where the outages come from.
If you are still deciding whether to self-host at all, we compared the tradeoffs in self-hosted n8n vs n8n Cloud for agencies — the multi-tenancy question is the main reason the answer usually comes out "self-host."
The one thing to take away
Pick your boundary before a client picks it for you. n8n will happily run every client you have in a single process, and it will do it well, right up to the day someone asks a question you cannot answer honestly. Deciding where the walls go while everything is calm costs you an afternoon. Deciding it during an incident costs you the client.
Running n8n for more than one client and not sure your setup holds up? Get a free automation audit — we will look at how your instances, credentials and webhooks are actually partitioned today and tell you plainly what would break, including the parts you would rather not hear. If you would rather we build and run the fleet, that is what our n8n automation practice does.
