Concepts
Understanding the core concepts of multi-tenant architecture helps you build scalable platforms on Vercel.
Tenants
What is a tenant
A tenant represents a customer, workspace, or organization within your multi-tenant application. Each tenant has its own data, configuration, and branding, but all tenants share the same codebase and deployment.
Examples:
- Blog platform: Each writer with their own blog is a tenant
 - Documentation platform: Each company with its own docs site is a tenant
 - E-commerce platform: Each store owner is a tenant
 
Tenant identification strategies
You can identify tenants using three approaches:
Subdomain-based: Extract the tenant from the subdomain (tenant1.yourapp.com)
// middleware.ts
const hostname = request.headers.get("host");
const subdomain = hostname.split(".")[0]; // "tenant1"Custom domain-based: Map custom domains to tenants (tenant1.com → Tenant 1)
// Map custom domain to tenant in database
const tenant = await db.tenant.findFirst({
  where: { customDomain: hostname },
});Path-based: Extract tenant from URL path (/tenant1/dashboard)
const pathname = request.nextUrl.pathname;
const tenantSlug = pathname.split("/")[1]; // "tenant1"Tenant data isolation
Multi-tenant applications must isolate data between tenants:
Database-level: Use tenant ID in all queries
const posts = await db.post.findMany({
  where: { tenantId: tenant.id },
});Application-level: Middleware ensures requests can only access their tenant's data
Edge Config: Store tenant configuration for fast lookups at the edge
Domains
Wildcard domains
Wildcard domains let you automatically serve all subdomains from a single Vercel project:
- Add 
*.yourapp.comto your project - Point your domain to Vercel's nameservers
 - Any subdomain (
tenant1.yourapp.com,tenant2.yourapp.com) automatically routes to your app - Vercel issues SSL certificates for each subdomain on the fly
 
Requirements: Must use Vercel's nameservers (ns1.vercel-dns.com, ns2.vercel-dns.com)
Custom domains
Custom domains let tenants bring their own domain:
- Add 
tenant1.comto your Vercel project via SDK - Tenant configures DNS (CNAME or nameservers)
 - Verify domain ownership (TXT record)
 - Vercel issues SSL certificate automatically
 
SSL certificate issuance
Vercel automatically issues SSL certificates for all domains using Let's Encrypt:
- Wildcard domains: Single wildcard certificate covers all subdomains
 - Custom domains: Individual certificate per domain
 - Automatic renewal before expiration
 - No configuration required
 
Domain verification
For domains already in use on Vercel, ownership verification is required:
- Add domain to your project
 - Vercel generates a unique TXT record
 - Tenant adds TXT record to their DNS
 - Verify ownership via SDK or dashboard
 - Certificate issues once verified
 
Routing
How middleware resolves tenants
Next.js middleware runs on every request before your pages render:
// middleware.ts
export async function middleware(request: NextRequest) {
  const hostname = request.headers.get("host");
  // Get tenant from subdomain or custom domain
  const tenant = await resolveTenant(hostname);
  // Add tenant to request headers
  const response = NextResponse.next();
  response.headers.set("x-tenant-id", tenant.id);
  return response;
}Request handling flow
- User visits 
tenant1.yourapp.com - Request hits Vercel's edge network
 - Middleware extracts subdomain (
tenant1) - Middleware looks up tenant in database or Edge Config
 - Middleware adds tenant context to request headers
 - Page component reads tenant from headers
 - Page renders with tenant-specific data
 
Performance considerations
Edge Config: Store tenant configuration at the edge for sub-10ms lookups
import { get } from "@vercel/edge-config";
const tenant = await get(`tenant_${hostname}`);Caching: Cache tenant lookups in middleware to reduce database queries
Connection pooling: Use connection pooling for database queries to handle multiple tenants efficiently
Architecture
Single deployment serving multiple domains
Multi-tenant architecture means:
- One Next.js codebase
 - One Vercel deployment
 - Multiple domains (subdomains + custom domains)
 - Shared infrastructure and resources
 - Tenant-aware routing and data access
 
Tenant context
Pass tenant information through your application:
In middleware: Set headers
response.headers.set("x-tenant-id", tenant.id);In server components: Read headers
import { headers } from "next/headers";
const tenantId = headers().get("x-tenant-id");In API routes: Access request headers
const tenantId = request.headers.get("x-tenant-id");