Strategy 10 min read

Iterable Personalization: Dynamic Messaging That Scales With Your Business

By Excelohunt Team ·
Iterable Personalization: Dynamic Messaging That Scales With Your Business

Personalisation in email exists on a spectrum. At one end, a first name in the subject line. At the other, an email where virtually every element — product recommendations, content blocks, offers, imagery, and copy — is dynamically rendered based on what you know about the individual receiving it.

Iterable is built to operate at the sophisticated end of that spectrum. Its personalisation tools — Handlebars templating, dynamic content blocks, and Catalog — give engineering-forward teams the infrastructure to build genuinely individual email experiences. This guide explains how those tools work, how to implement them, and what data foundation you need to make them perform.

Iterable’s Personalisation Layers

Iterable’s personalisation stack has three main layers, each requiring progressively more technical investment:

  1. Merge tags: Basic attribute substitution — pulling user profile fields into email content
  2. Handlebars logic: Conditional rendering, loops, and computed content — the engine for truly dynamic emails
  3. Catalog: A structured product or content database that powers algorithmic recommendations and dynamic content at scale

Each layer builds on the previous one. A brand starting with personalisation should implement all three, but begin by getting the data infrastructure right before adding complexity.

Layer 1: Merge Tags and User Profile Data

The starting point is user profile data. Every user in Iterable has a profile — a set of attributes that describe who they are, their preferences, and their history with your brand.

Standard Iterable user profile attributes include:

  • email, firstName, lastName
  • phoneNumber (for SMS personalisation)
  • Any custom attributes you define (e.g., plan_type, favourite_category, subscription_start_date, last_purchase_value)

Custom attributes are added to user profiles via Iterable’s API, either at user creation or through update calls that modify specific attributes. Well-designed custom attributes are the foundation of meaningful personalisation.

Merge Tag Syntax in Iterable

In Iterable’s email editor (and in templates created via API), user profile attributes are referenced using Handlebars-style double-curly-brace syntax:

Hi {{firstName}},

For custom attributes:

You're currently on our {{plan_type}} plan.

For event data attached to the workflow trigger (custom event properties):

Your order #{{dataFields.orderId}} has been confirmed.

Always set fallbacks for merge tags using Handlebars default helper:

Hi {{firstName "there"}},

This renders “Hi there,” when firstName is empty rather than “Hi ,”— a small but important detail for list hygiene.

Layer 2: Handlebars Logic for Dynamic Content

Handlebars is the templating language Iterable uses for dynamic content rendering. It supports conditional logic, loops, and helpers — enabling email templates that adapt their content based on user data without requiring separate templates for each variation.

Conditional Rendering

The most fundamental use of Handlebars in Iterable is {{#if}} / {{else}} / {{/if}} blocks:

{{#if (eq plan_type "premium")}}
  <p>As a Premium member, you have access to our full feature suite.</p>
{{else}}
  <p>Upgrade to Premium to unlock our full feature suite.</p>
{{/if}}

This pattern allows a single email template to serve two different audiences — existing premium users see one message, non-premium users see another. Scale this across 3–4 conditions and a single template can serve an entire customer base with highly relevant content.

Loops for Repeating Content

The {{#each}} helper renders a block of HTML once for each item in an array. This is used for:

  • Rendering each item in an abandoned cart (dynamically, regardless of how many items are in the cart)
  • Showing multiple recommended products
  • Displaying a list of features or benefits specific to a user’s plan
{{#each cart_items}}
  <tr>
    <td><img src="{{this.image_url}}" alt="{{this.product_name}}"></td>
    <td>{{this.product_name}}</td>
    <td>{{this.price}}</td>
  </tr>
{{/each}}

The cart items array is passed to Iterable either as a user profile attribute or as part of the custom event data payload when the workflow is triggered.

Handlebars Helpers

Iterable exposes a set of Handlebars helpers that extend basic logic capabilities:

  • {{eq}}, {{ne}}, {{gt}}, {{lt}} — comparison operators for {{#if}} conditions
  • {{formatDate}} — formats a date attribute in a specified format
  • {{formatCurrency}} — formats a number as currency with the appropriate symbol and decimal format
  • {{lookup}} — accesses a specific index in an array by position

Combining these helpers allows for complex conditional rendering that would otherwise require separate templates:

{{#if (gt order_value 100)}}
  <p>Your order qualifies for free express shipping.</p>
{{else}}
  <p>Add {{formatCurrency (subtract 100 order_value)}} more to your order for free express shipping.</p>
{{/if}}

Layer 3: Iterable Catalog

Catalog is Iterable’s structured data store for product, content, or any other tabular data that you want to use in email personalisation. Think of it as a database table that lives inside Iterable, queryable at send time to populate email content dynamically.

What Catalog Is Used For

The primary use case for Catalog is product recommendations — surfacing relevant products from a catalogue of potentially thousands of items without manually specifying which products appear in each email.

Other use cases include:

  • Content recommendations: Articles, blog posts, or video content catalogued with metadata (topic, author, content type)
  • Location-specific content: Store locations, local offers, or region-specific promotions
  • Plan or pricing information: Tier-specific feature lists or pricing details that update without requiring template changes

Setting Up a Product Catalog

To populate a product Catalog in Iterable:

  1. Define the collection schema — the fields each product will have (productId, name, category, price, imageUrl, pageUrl, inStock, etc.)
  2. Upload data via the Iterable Catalog API, typically via a daily or real-time sync from your product catalogue system
  3. Configure collection metadata so Iterable knows how to index and query the data

Once populated, Catalog collections can be queried within Handlebars templates using Iterable’s Catalog helper functions, which retrieve matching items based on filter criteria (category match, price range, availability) and sort them by a relevance algorithm or custom scoring logic.

Personalised Recommendations via Catalog

A recommendation block in an Iterable email that uses Catalog retrieves items based on the match between the user’s profile attributes and the Catalog item’s fields:

{{#catalogLookup "products" items=3 filter="category eq user.favourite_category AND inStock eq true" sort="popularityScore desc"}}
  <a href="{{this.pageUrl}}">
    <img src="{{this.imageUrl}}" alt="{{this.name}}">
    <p>{{this.name}}{{formatCurrency this.price}}</p>
  </a>
{{/catalogLookup}}

This block retrieves 3 products from the “products” collection where the category matches the user’s favourite_category attribute and the item is in stock, sorted by popularity score.

The result: every recipient sees different products — products that match their demonstrated preference — without the marketing team manually curating content for each segment.

User Profile Data and Event Data for Personalisation

The quality of Iterable personalisation is directly determined by the richness of the user profile and event data you send to the platform. Two areas are especially important:

User Profile Enrichment Strategy

Don’t rely only on attributes collected at signup. Build a strategy for continuously enriching user profiles from multiple signals:

  • Behavioural attributes: Update last_active_date, total_purchase_count, average_order_value, and similar calculated attributes on a scheduled basis from your data warehouse
  • Engagement attributes: After each email, update engagement scoring attributes on user profiles — email_engagement_score, last_email_open_date
  • Lifecycle attributes: Update lifecycle_stage via workflow Update User nodes as users progress through defined stages
  • Preference attributes: Surface preference signals from behavioural data and write them to profile attributes (e.g., preferred_category derived from most-clicked email content)

Event Data for Dynamic Content

Custom events passed to Iterable at workflow entry carry a dataFields object that is accessible throughout the workflow. For purchase or cart events, this typically includes the products involved — which can then be used directly in Handlebars templates without requiring a Catalog lookup.

Designing the schema of your custom events thoughtfully upfront saves significant effort later. Include enough product or content metadata in the event payload that email templates can render fully personalised content from event data alone, with Catalog as an additional layer for cross-sell and recommendations.

Testing Personalised vs. Non-Personalised Emails

The most direct way to prove the value of personalisation investment is an A/B test comparing personalised and non-personalised versions of the same email.

Use Iterable’s Experiment node in the relevant workflow to split traffic:

  • Path A (personalised): Dynamic Handlebars content, Catalog-driven product recommendations, user profile merge tags throughout
  • Path B (control): Static content, editorially curated products, basic merge tags only

Measure over a sufficiently large sample (aim for 500+ users per path minimum for reliable results) and track:

  • Click-through rate on the personalised content blocks vs. static content
  • Revenue per email sent (if purchase events are tracked as conversions)
  • Unsubscribe rate (personalised emails should not drive higher unsubscribes if the personalisation is relevant)

Iterable’s personalisation capabilities are designed for engineering-forward teams that want to build genuinely individual email experiences — not just segment-based variations. The combination of Handlebars templating, Catalog, and rich user profiles creates the infrastructure for email that scales with your business while getting more relevant for every user over time.

At Excelohunt, we work with growth-stage and enterprise brands to build Iterable personalisation programmes — from data engineering strategy to template development to testing frameworks. If you want to make your Iterable emails genuinely personalised at scale, we can help.


Looking to implement these strategies with expert support?

Tags: iterablepersonalizationemail-marketingstrategy

Want Us to Implement This for Your Brand?

Get a free email audit and see exactly where you're losing revenue.

Get Your Free Audit
1