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 Are | Create a Brand For |
|---|---|
| Agency | Each client |
| E-commerce portfolio | Each online store |
| SaaS company | Each product or white-label customer |
| Franchise | Each location |
| Holding company | Each 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
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:
// 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
- Go to Settings → Brands → [Brand] → Email
- Click Add Custom Domain
- Enter your domain (e.g.,
support.yourbrand.com) - Add the DNS records shown to your domain provider
- Click Verify once DNS propagates (usually 5-30 minutes)
DNS Records Required
| Type | Name | Value | Purpose |
|---|---|---|---|
| MX | support | inbound.dispatchtickets.com | Receive emails |
| TXT | support | v=spf1 include:... | SPF (send auth) |
| CNAME | dk1._domainkey | dk1.domainkey... | DKIM (send auth) |
Exact values are shown in the dashboard after you add your domain.
Via the API
// 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
| Role | Can Do |
|---|---|
| Owner | Everything. Manage billing, create/delete brands, invite members. |
| Admin | Manage all brands, invite members, configure settings. |
| Agent | View 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:
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/ticketsCross-Brand Operations
List tickets across all your brands at once:
// 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:
// 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.