What is Handlebars and How to Use It in MSG91?
Handlebars is a templating language that lets you create dynamic email content using expressions inside double curly braces {{ }}.
In MSG91, you can use Handlebars to:
Insert variables like customer name, order ID, or any other data.
Show or hide blocks of content based on simple conditions.
Loop through lists such as items in an order.
This document shows what is supported in MSG91’s Handlebars implementation and how to use it safely when creating templates.
1. What Handlebars features are available in MSG91?
MSG91 supports the core Handlebars helpers:
Variables
{{firstName}}
{{user.tier.gold}}
Conditions (if / else)
{{#if isPremium}} … {{/if}}
{{#if isPremium}} … {{else}} … {{/if}}
Negative condition (unless)
{{#unless hasOrdered}} … {{/unless}}
Loops (each)
{{#each order.items}} … {{/each}}
Root context (advanced use)
{{@root.supportPhone}} — access a top-level variable from inside a nested block.
1.1 Helpers that are NOT available
These helpers are not supported in MSG91 and will cause errors such as “Missing helper”:
Logical helpers: and, or, {{#and}}, {{#or}}
Comparison helpers: greaterThan, lessThan, gt, lt, equals, notEquals
Utility helpers: length, subtract, and any other custom helper not added by MSG91
Important:
To ensure your templates work, use only:
if
else
unless
each
And send simple boolean flags from your backend.
2. Common patterns for building templates
These reusable patterns work with MSG91’s supported Handlebars features.
2.1 Simple show/hide with if and else
Use this when you want different text for different users.
Template
{{#if isPremium}}
<p>Thanks for being a premium user! Enjoy your exclusive benefits.</p>
{{else}}
<p>Upgrade to premium to unlock more benefits.</p>
{{/if}}Sample data
{
"isPremium": true
}2.2 Negative condition using unless
Use this when you want to show a reminder only if something has not happened.
Template
{{#unless hasOrdered}}
<p>You haven’t placed an order yet. Use code WELCOME10 to get 10% off!</p>
{{/unless}}Sample data
{
"hasOrdered": false
}2.3 “AND” condition (A and B) using nested if
Handlebars does not support “and”, so we use nested conditions.
Template
<p>
Hello {{name}}!
{{#if hasFoodPreference}}
{{#if hasDrinkPreference}}
Thank you for letting us know your dining preferences.
{{/if}}
{{/if}}
We look forward to sending you more delicious recipes.
</p>Sample data
{
"name": "Ben",
"hasFoodPreference": true,
"hasDrinkPreference": true
}2.4 “OR” condition (A or B) using a boolean flag
Compute OR in your application.
Template
<p>
Hello {{name}}!
{{#if hasOutdoorInterest}}
We think you might enjoy a map of trails in your area.
{{else}}
We’d love to know more about the outdoor activities you enjoy.
{{/if}}
Have a great day.
</p>Sample data
{
"name": "Ben",
"isRunner": true,
"isCyclist": false,
"hasOutdoorInterest": true
}2.5 Comparison via boolean flags
For example: “balance above ₹1,00,000” or “items in cart”.
High balance example
{{#if user.isHighBalance}}
<p>Alert: Your account balance exceeds ₹1,00,000.</p>
{{/if}}Sample data
{
"user": {
"balance": 125000,
"isHighBalance": true
}
}Cart example
<p>
Hello {{name}}!
{{#if hasCartItems}}
You have items left in your cart. Continue checkout anytime.
{{else}}
Thanks for browsing our site.
{{/if}}
</p>Sample data
{
"name": "Ben",
"hasCartItems": true
}2.6 Looping with each
Template
<ol>
{{#each user.orderHistory}}
<li>You ordered: {{this.item}} on {{this.date}}</li>
{{/each}}
</ol>Sample data
{
"user": {
"orderHistory": [
{ "date": "2025-02-01", "item": "NIKE Air Force" },
{ "date": "2025-05-01", "item": "Air Jordans" },
{ "date": "2025-07-01", "item": "Converse All Stars" }
]
}
}3. Quick cheat sheet
Need | Template pattern | Data you must send |
|---|---|---|
Show content for premium users | {{#if isPremium}} … {{/if}} | "isPremium": true/false |
Reminder if no order | {{#unless hasOrdered}} … {{/unless}} | "hasOrdered": true/false |
A AND B | Nested {{#if}} | Two booleans |
A OR B | Single {{#if flag}} | One OR-boolean |
Compare threshold | {{#if someFlag}} | Precomputed boolean |
List items | {{#each items}} | Array |
Access root variable | {{@root.xyz}} | Root variable |
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>MSG91 Handlebars Combined Test</title>
</head>
<body>
<!-- 2.1 Simple show/hide with if / else -->
<h2>Premium Section</h2>
{{#if isPremium}}
<p>Thanks for being a premium user! Enjoy your exclusive benefits.</p>
{{else}}
<p>Upgrade to premium to unlock more benefits.</p>
{{/if}}
<hr />
<!-- 2.2 Negative condition with unless -->
<h2>Order Reminder</h2>
{{#unless hasOrdered}}
<p>You haven’t placed an order yet. Use code <strong>WELCOME10</strong> to get 10% off your first purchase!</p>
{{/unless}}
<hr />
<!-- 2.3 AND condition with nested if -->
<h2>Dining Preferences (AND condition)</h2>
<p>
Hello {{name}}!
{{#if hasFoodPreference}}
{{#if hasDrinkPreference}}
Thank you for letting us know your dining preferences.
{{/if}}
{{/if}}
We look forward to sending you more delicious recipes.
</p>
<hr />
<!-- 2.4 OR condition with boolean flag -->
<h2>Outdoor Interest (OR flag)</h2>
<p>
Hello {{name}}!
{{#if hasOutdoorInterest}}
We think you might enjoy a map of trails in your area.
{{else}}
We’d love to know more about the outdoor activities you enjoy.
{{/if}}
Have a great day.
</p>
<hr />
<!-- 2.5 Comparison via boolean flags: high balance -->
<h2>High Balance Alert</h2>
{{#if user.isHighBalance}}
<p>Alert: Your account balance exceeds ₹1,00,000. Consider investing to grow your savings.</p>
{{/if}}
<!-- 2.5 Comparison via boolean flags: cart items -->
<h2>Cart Reminder</h2>
<p>
Hello {{name}}!
{{#if hasCartItems}}
It looks like you still have some items in your shopping cart.
Sign back in to continue checking out at any time.
{{else}}
Thanks for browsing our site. We hope you'll come back soon.
{{/if}}
</p>
<hr />
<!-- 2.6 Looping over lists with each -->
<h2>Order History</h2>
<ol>
{{#each user.orderHistory}}
<li>You ordered: {{this.item}} on: {{this.date}}</li>
{{/each}}
</ol>
<hr />
<!-- Cheat sheet: generic items list -->
<h2>Generic Items List (cheat sheet pattern)</h2>
<ul>
{{#each items}}
<li>{{this}}</li>
{{/each}}
</ul>
<!-- Cheat sheet: root context example -->
<p>
For help, contact us at: {{@root.supportPhone}}
</p>
</body>
</html>{
"isPremium": true,
"hasOrdered": false,
"name": "Bhaskar",
"hasFoodPreference": true,
"hasDrinkPreference": true,
"isRunner": true,
"isCyclist": false,
"hasOutdoorInterest": true,
"hasCartItems": true,
"cartItems": [
"raft",
"water bottle",
"sleeping bag"
],
"user": {
"balance": 125000,
"isHighBalance": true,
"orderHistory": [
{ "date": "2025-02-01", "item": "NIKE Air Force" },
{ "date": "2025-05-01", "item": "Air Jordans" },
{ "date": "2025-07-01", "item": "Converse All Stars" }
]
},
"items": [
"Item A",
"Item B",
"Item C"
],
"supportPhone": "+91-9876543210"
}4. Do’s and Don’ts
Do:
Keep logic simple (if, else, unless, each)
Compute complex logic in backend
Test with sample JSON
Use booleans like isHighBalance, hasItems, etc.
Don’t:
Don’t use unsupported helpers (or, and, greaterThan, equals, subtract, etc.)
Don’t put business logic inside templates
Don’t reference variables you don’t send
5. Why Use Handlebars in MSG91?
Multiple emails flying everywhere — hard to track
→ Always accurate and personalized using live data.Credits wasted for separate email content
→ Save credits — one dynamic template handles all orders.Templates too rigid
→ Handlebars enables dynamic emails at scale.
Compatible with automated workflows and transactional emails.
6. How to Create a Template in MSG91
1. Log in to your MSG91 Email account
Open your MSG91 dashboard.
2. Go to Templates → Create Template
Navigate to Email → Templates → Create Template.
3. Choose “Start from Scratch” or Use AI
Build a template manually
Or generate via AI, then enhance with Handlebars
4. Insert Handlebars in the Email Body
Use Handlebars directly in your HTML editor to show dynamic content.
5. Test Your Template
Use Preview or provide sample JSON.
6. Submit and Launch
Submit for approval → Once approved, use in campaigns or workflows.
7. Need Help?
If you’re unsure about your data or template logic, we’re here to help.
Email: [email protected]
Live Chat: Available in MSG91 Dashboard