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.
{{$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 atenant_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.Find and add the tenant component

Find and add tenant component in template editor
Select the relevant block type

Select relevant block type
Customize the selected block
{{$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
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 atenant_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-corpand 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_idalongside$preferred_language, trigger data, or user properties, so you can layer tenant customization on top of multi-lingual templates.
Creating a tenant variant
Open the template and add a new variant
Add a tenant condition
tenant_id equals <your-tenant-id>. Pick the channels this variant applies to.Edit the variant's content
Commit and test
tenant_id matching the variant to see it render. Tenants whose tenant_id doesn’t match will continue to see the default template.FAQ
Should I use brand variables or a template variant?
Should I use brand variables or a template variant?
$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.What happens if a tenant doesn't have a matching variant?
What happens if a tenant doesn't have a matching variant?
Do brand variables still work inside a variant?
Do brand variables still work inside a variant?
{{$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.Can a variant enable a different set of channels than the default template?
Can a variant enable a different set of channels than the default template?
Can I combine tenant conditions with language or user-property conditions?
Can I combine tenant conditions with language or user-property conditions?
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
Tenant Workflows
tenant_id and see brand variables and variants resolve at runtime.