Back to Docs

Multi-Brand Setup

Manage support for multiple brands, clients, or products from one dashboard. Each brand gets isolated data and its own email identity.

When to Use Brands

A brand (also called a workspace) is an isolated container for tickets. Each brand has its own:

  • Ticket queue and customer data
  • Email address (e.g., [email protected])
  • Settings and configurations
  • Team member access controls

Use separate brands when you need data isolation between different entities:

You AreCreate a Brand For
AgencyEach client
E-commerce portfolioEach online store
SaaS companyEach product or white-label customer
FranchiseEach location
Holding companyEach subsidiary brand

Brands vs. Tags: Use brands for true isolation (separate email identities, separate data). Use tags within a single brand for categorization (departments, priority levels, issue types).

Creating Brands

Via the Dashboard

Go to Settings → Brands → Create Brand. Enter a name and optional slug (used for the default email address).

Via the API

Create a brand
const brand = await dispatch.brands.create({
  name: 'Acme Store',
  slug: 'acme-store', // Optional, auto-generated if omitted
});

// brand.id = 'br_abc123'
// Default email: [email protected]

Via the SDK (Programmatic)

For platforms that provision brands automatically for customers:

Provision brand for a new customer
// When a new customer signs up for your platform
async function onCustomerSignup(customer: Customer) {
  const brand = await dispatch.brands.create({
    name: customer.companyName,
    slug: slugify(customer.companyName),
    metadata: {
      customerId: customer.id,
      plan: customer.plan,
    },
  });

  // Store the brand ID in your database
  await db.customers.update(customer.id, {
    dispatchBrandId: brand.id,
  });

  return brand;
}

Structuring Your Brands

Agency Example

An agency managing 20 clients:

Your Account
├── Brand: "Client A - Fashion Store"
│   └── [email protected]
├── Brand: "Client B - Tech Startup"
│   └── [email protected]
├── Brand: "Client C - Restaurant Chain"
│   └── [email protected]
└── ... (17 more clients)

E-commerce Portfolio Example

A portfolio operator with 5 stores:

Your Account
├── Brand: "Urban Apparel"
│   └── [email protected]
├── Brand: "Home Essentials"
│   └── [email protected]
├── Brand: "Pet Paradise"
│   └── [email protected]
├── Brand: "Fitness First"
│   └── [email protected]
└── Brand: "Beauty Box"
    └── [email protected]

Franchise Example

A franchise with 50 locations:

Your Account
├── Brand: "Downtown Location"
│   └── [email protected]
├── Brand: "Airport Location"
│   └── [email protected]
├── Brand: "Mall Location"
│   └── [email protected]
└── ... (47 more locations)

Custom Email Domains

By default, each brand gets an email address like [email protected]. For a professional setup, configure custom domains so customers email [email protected].

Setting Up a Custom Domain

  1. Go to Settings → Brands → [Brand] → Email
  2. Click Add Custom Domain
  3. Enter your domain (e.g., support.yourbrand.com)
  4. Add the DNS records shown to your domain provider
  5. Click Verify once DNS propagates (usually 5-30 minutes)

DNS Records Required

TypeNameValuePurpose
MXsupportinbound.dispatchtickets.comReceive emails
TXTsupportv=spf1 include:...SPF (send auth)
CNAMEdk1._domainkeydk1.domainkey...DKIM (send auth)

Exact values are shown in the dashboard after you add your domain.

Via the API

Add custom domain to a brand
// Add domain
const domain = await dispatch.brands.addDomain('br_abc123', {
  domain: 'support.acme.com',
});

// domain.dnsRecords contains the records to add

// After adding DNS records, verify
await dispatch.brands.verifyDomain('br_abc123', domain.id);

Team Access & Permissions

Control which team members can access which brands. This is critical for agencies where staff should only see their assigned clients.

Access Levels

RoleCan Do
OwnerEverything. Manage billing, create/delete brands, invite members.
AdminManage all brands, invite members, configure settings.
AgentView and respond to tickets in assigned brands only.

Assigning Brands to Agents

When you invite a team member as an Agent, select which brands they can access:

Invite agent with brand access
await dispatch.team.invite({
  email: '[email protected]',
  role: 'agent',
  brandIds: ['br_client_a', 'br_client_b'], // Only these brands
});

Switching Between Brands

In the Dashboard

Use the brand switcher in the top navigation to move between brands. Your current brand context is shown in the header.

In the API

Every API call includes the brand ID in the URL:

// Tickets for Brand A
GET /brands/br_client_a/tickets

// Tickets for Brand B
GET /brands/br_client_b/tickets

Cross-Brand Operations

List tickets across all your brands at once:

List tickets across all brands
// All open tickets across all brands you have access to
const { data: tickets } = await dispatch.tickets.listAll({
  status: 'open',
});

// Each ticket includes its brandId
tickets.forEach(ticket => {
  console.log(`[${ticket.brandId}] ${ticket.title}`);
});

Cross-Brand Reporting

Get a unified view of support metrics across all your brands:

Get metrics across brands
// Overall metrics
const metrics = await dispatch.metrics.summary();
// {
//   totalTickets: 1523,
//   openTickets: 47,
//   avgResponseTime: '2.3 hours',
//   byBrand: [
//     { brandId: 'br_client_a', name: 'Client A', open: 12, closed: 234 },
//     { brandId: 'br_client_b', name: 'Client B', open: 8, closed: 189 },
//     ...
//   ]
// }

// Per-brand breakdown
const brandMetrics = await dispatch.metrics.byBrand('br_client_a', {
  period: 'last_30_days',
});

Dashboard Reports

The dashboard shows aggregate metrics with the ability to filter by brand. Export reports as CSV for client reporting.