Skip to main content
You have two ways to make a template render differently per tenant, both driven by the tenant_id passed at trigger time:
  • Brand variables — one shared template with tenant values substituted at runtime ({{$brand.logo}}, {{$brand.primary_color}}, {{$brand.brand_name}}). Best for white-labelling — the content is the same, only branding and tenant-specific values change.
  • Template variants — the same template with different content, layout, or channels enabled per tenant, using a variant condition on tenant_id. Best when tenant differences go beyond variable substitution — a different call to action, an extra section, a tenant-specific footer, or an entirely different channel set.
Most workspaces use variables broadly and reserve variants for the handful of tenants that need genuinely different content. The two approaches compose: a tenant-specific variant can still reference {{$brand.*}} variables inside it.

When to reach for each

White-labelling with brand variables

Use tenant properties inside your template to render tenant-specific branding at runtime. One template works for every tenant — SuprSend substitutes the values when the workflow is triggered with a tenant_id.

Email template design

Inside the email template designer, you get pre-built tenant components that auto-render the branded header, footer, and buttons for the tenant.
1

Find and add the tenant component

Inside the email template designer, find the tenant component in the right-side content menu and add it to your template.

Find and add tenant component in template editor

2

Select the relevant block type

Select the relevant block type (header, footer, buttons) from the right panel.

Select relevant block type

3

Customize the selected block

Tenant blocks use the tenant’s primary color and logo by default. Click any block to customize colors, padding, and styling from the right panel. To insert tenant variables anywhere in a block, use {{$brand.<property>}}. See the full list of available variables.

Other channels

For SMS, WhatsApp, push, Slack, MS Teams, in-app inbox, and webhook templates, reference tenant properties directly in the template body using {{$brand.<property>}}. There are no visual designer components for these channels — the substitution happens at render time regardless.

Available variables

Use {{$brand.<property>}} in Handlebars templates and data["$brand"].<property> in JSONNET templates. Variables are replaced at runtime with the tenant’s properties (from the tenant_id passed when sending). Basic Colors Social links Custom properties

Custom content with template variants

When variable substitution isn’t enough — a tenant needs a different subject line, an extra body section, a different CTA, or a completely different set of channels — create a template variant with a tenant_id condition. SuprSend evaluates variants top-to-bottom at send time and picks the first one whose condition matches; if no variant matches, the default template is used. Because the default template is the fallback, you can add a variant for one specific tenant without touching how anyone else receives the notification.

Common patterns

  • Tenant-specific content — the enterprise-tier tenant needs a compliance disclaimer in every notification; add a variant with tenant_id equals enterprise-corp and put the disclaimer in the body.
  • Tenant-specific channels — one tenant wants Slack messages disabled but everyone else keeps them; enable/disable channels inside that tenant’s variant.
  • Completely different layout — a strategic customer wants their password-reset email to match their brand’s structure, not yours; the variant can override the full email HTML while still using {{$brand.*}} variables inside.
  • Combined tenant + language — a variant condition can reference tenant_id alongside $preferred_language, trigger data, or user properties, so you can layer tenant customization on top of multi-lingual templates.

Creating a tenant variant

1

Open the template and add a new variant

In the template editor’s left panel, click the + next to All Variants and choose New Variant.
2

Add a tenant condition

In the Create Variant modal, add a condition like tenant_id equals <your-tenant-id>. Pick the channels this variant applies to.
3

Edit the variant's content

Edit the subject, body, or channel-specific content the same way you would the default template. Brand variables still work inside the variant.
4

Commit and test

Commit the template, then trigger the workflow with a tenant_id matching the variant to see it render. Tenants whose tenant_id doesn’t match will continue to see the default template.
Keep the default template as the canonical content and treat variants as focused overrides — this keeps maintenance predictable. If two tenants need the same override, use a condition like tenant_id in [acme-corp, globex] rather than duplicating the variant.
See Template Variants for the full variant reference — condition operators, evaluation order, and variant limits.

FAQ

Use $brand.* variables when the content is the same and only tenant-specific values change (logo, primary color, product name, support email) — one shared template stays maintainable and every new tenant just needs its properties populated. Use a template variant when the content itself differs — a different CTA, an extra section, a tenant-specific layout, or a legal footer only one tenant needs.
SuprSend evaluates variants top-to-bottom and picks the first one whose condition matches. If no variant matches, the default template is used — so you can safely add a variant for one tenant without affecting anyone else.
Yes. {{$brand.*}} variables substitute in every variant, including the default. A variant overrides the content, not the variable resolution — so a tenant variant can still render {{$brand.logo}} and get the tenant’s logo.
Yes. When you create a variant, you pick the channels it applies to. If a tenant’s variant enables only Email + In-App Inbox, sends for that tenant will skip the other channels defined on the default template.
Yes. A variant condition can reference tenant_id, the user’s $preferred_language, trigger data properties, or any combination. Common pattern: one variant per tenant for content differences, plus multi-lingual translations inside each variant for language differences.

Next steps

Template Variants

Learn the full variant model — conditions, evaluation order, and multi-lingual support.

Tenant Workflows

Trigger a workflow with a tenant_id and see brand variables and variants resolve at runtime.

Multi-lingual Templates

Combine tenant variants with per-language translations for global multi-tenant apps.

Managing Tenants

Create tenants, set brand properties, and manage the tenant lifecycle.