Appwrite Teams provides an effective way to implement multi-tenancy in your applications. Create a team for each tenant to handle multi-tenant apps with built-in data isolation.
Learn more about Teams
What is multi-tenancy?
Multi-tenancy is a design pattern where a single instance of software serves multiple user groups (tenants). With Appwrite Teams, you can:
- Create a team for each tenant in your application
- Control access to resources using team-based permissions
- Define different roles within each tenant
- Scale to unlimited tenants without code changes
Common use cases
- SaaS applications: Organizations that need isolated data and users
- Collaborative tools: Projects with different access levels
- Educational platforms: Schools with teachers and students
- Business software: Companies with department-based access control
Create teams for tenants
When a new tenant signs up, create a dedicated team that serves as their isolated environment.
import { Client, Teams, ID } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1')
.setProject('<PROJECT_ID>');
const teams = new Teams(client);
// Create team for a new tenant
const tenantTeam = await teams.create({
teamId: 'example_corp',
name: 'Example Corp',
roles: ['owner', 'admin', 'member']
});
Add members to tenants
Invite users to join a tenant using team memberships. Each member can be assigned different roles for access control.
import { Client, Teams } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1')
.setProject('<PROJECT_ID>');
const teams = new Teams(client);
// Invite a member to the tenant
const membership = await teams.createMembership({
teamId: 'example_corp',
roles: ['admin'],
email: 'user@example.com',
url: 'https://example.com/accept-invite'
});
Secure resources with team permissions
Control access to rows and resources using team-based permissions. This ensures data isolation between tenants.
import { Client, TablesDB, ID, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1')
.setProject('<PROJECT_ID>');
const tablesDB = new TablesDB(client);
// Create a row that only members of "Example Corp" tenant can access
const row = await tablesDB.createRow({
databaseId: 'invoices_db',
tableId: 'invoices',
rowId: ID.unique(),
data: {
title: 'Q2 Invoice',
amount: 2500.00,
customer: 'Example Customer',
status: 'pending',
tenant_id: 'example_corp'
},
permissions: [
// All Example Corp team members can read
Permission.read(Role.team('example_corp')),
// Only admins can update
Permission.write(Role.team('example_corp', ['admin']))
]
});
Query tenant data
When querying data, users will automatically only see rows they have permission to access based on their team memberships.
import { Client, TablesDB, Query } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1')
.setProject('<PROJECT_ID>');
const tablesDB = new TablesDB(client);
// Current user will only see invoices they have access to
const rows = await tablesDB.listRows({
databaseId: 'invoices_db',
tableId: 'invoices'
});
// For specific tenant data, you can add a query filter
const tenantRows = await tablesDB.listRows({
databaseId: 'invoices_db',
tableId: 'invoices',
queries: [
Query.equal('tenant_id', 'example_corp')
]
});
Learn how to manage team invitations