Concepts

Understanding the core concepts of multi-project architecture helps you build scalable platforms with isolated tenant environments.

Projects

What is a project

A Vercel project represents a single application with its own Git repository, environment variables, and deployment history. In multi-project architecture, each tenant gets their own dedicated Vercel project.

Key characteristics:

  • Unique project ID
  • Independent configuration
  • Separate deployment history
  • Isolated builds and functions

Programmatic creation

Create projects using the Vercel SDK:

import { projectsCreateProject } from "@vercel/sdk/funcs/projectsCreateProject.js";

const { value: project } = await projectsCreateProject(vercel, {
  teamId: "team_1234",
  requestBody: {
    name: `tenant-${tenantId}`,
    framework: "nextjs",
  },
});

Project templates

Generate projects from templates to ensure consistency:

const { value: project } = await projectsCreateProject(vercel, {
  teamId: "team_1234",
  requestBody: {
    name: `tenant-${tenantId}`,
    gitRepository: {
      type: "github",
      repo: "your-org/tenant-template",
    },
  },
});

Deployments

Isolated deployments

Each project has independent deployments:

  • Separate build processes
  • Independent function execution
  • Isolated environment variables
  • Individual deployment URLs

Deployment lifecycle

  1. Create: Deploy code to project
  2. Build: Vercel builds the application
  3. Preview: Test deployment before promoting
  4. Production: Promote deployment to production
  5. Rollback: Revert to previous deployment if needed

Preview vs production

Preview deployments:

  • Generated for every Git push
  • Unique URL per deployment
  • Test changes before production

Production deployments:

  • Live on project domains
  • Promoted from preview or direct deploy
  • Serves end users

Domains

Per-project domains

Each tenant project can have its own domains:

import { projectsAddProjectDomain } from "@vercel/sdk/funcs/projectsAddProjectDomain.js";

await projectsAddProjectDomain(vercel, {
  idOrName: project.id,
  requestBody: {
    name: "tenant1.com",
  },
});

Automatic URLs

Every project gets automatic Vercel URLs:

  • Production: project-name.vercel.app
  • Preview: project-name-git-branch.vercel.app

Custom domains per project

Configure custom domains independently for each tenant:

  • Add domain via SDK
  • Tenant configures DNS
  • Verify ownership
  • SSL certificate issues automatically

Architecture

Multiple projects vs single project

Multi-Project:

  • Each tenant = separate Vercel project
  • Complete isolation
  • Independent scaling
  • Higher management overhead

Multi-Tenant (single project):

  • All tenants = one Vercel project
  • Shared infrastructure
  • Lower management overhead
  • Application-level isolation

Use cases

When to use Multi-Project vs Multi-Tenant

Use Multi-Project when:

  • Tenants deploy their own code
  • Each tenant needs custom functionality
  • Complete isolation is required (security, compliance)
  • AI agents are generating and deploying code
  • Users create applications from templates

Use Multi-Tenant when:

  • All tenants use the same application
  • Content differs but code is the same
  • You want to deploy once, update all tenants
  • Lower operational overhead preferred

AI coding platforms

Perfect for platforms where:

  • AI generates unique code per tenant
  • Each tenant's app is different
  • Users can deploy custom logic
  • Examples: Spawn, Orchids, v0

Template-based platforms

Ideal for:

  • Creating projects from templates
  • Customizing per tenant
  • Maintaining consistency
  • Rapid tenant onboarding

User-generated applications

Well-suited for:

  • Users creating their own apps
  • Hosting user-generated content
  • Platform controls infrastructure
  • Users focus on their code

Next steps