Как использовать динамический контент в email-рассылках
Персонализация в email-кампаниях принимает разные формы, от простой подстановки имени до персональной скидки. Но гораздо эффектнее, когда шаблон адаптируется динамически: показывает товары в корзине, предлагает аксессуары к недавней покупке или напоминает о просмотренных позициях. Такие рассылки выглядят как продолжение диалога, а не как простые массовые письма.
В этой статье расскажем про динамический контент: что это, зачем он нужен и как он работает.
Что такое динамический контент
Динамический контент — это элементы письма, которые меняются автоматически в момент отправки. Они могут быть уникальными для каждого получателя или сегмента, превращая шаблон в персонализированное сообщение.
Примеры динамических элементов:
Элемент | Описание |
---|---|
Товарные карточки | Формируются из YML- или JSON-фида либо через инструменты CDP и адаптируются под определённого пользователя или сегмент. Также это могут быть универсальные карточки, которые не нужно повторно верстать вручную: система сама добавляет товары и цены с сайта или из CDP. |
Актуальные акции | Подставляются в письмо с учётом региона пользователя, его данных и истории взаимодействий, участия в A/B-тестировании и других факторов. |
Бонусный баланс пользователя | Отображает персональные бонусы, накопленные баллы или доступные привилегии. |
Новости и статьи | Добавляются в зависимости от типа письма. Например, можно автоматизировать ежемесячный дайджест, подгружая в шаблон самые популярные материалы из блога. |
Зачем использовать динамический контент
Если коротко — чтобы письма были эффективнее, быстрее разрабатывались и проще масштабировались. Ниже расскажем про основные преимущества подробнее.
Повышение эффективности рассылок
Когда письмо адаптировано под интересы пользователя, оно выглядит уместно и сильнее привлекает внимание. Глубокая персонализация помогает:
- точнее попадать в потребности аудитории;
- удерживать внимание за счёт релевантных предложений;
- превращать клики в целевые действия.
Лёгкое масштабирование
Без использования динамики для каждого сегмента приходится собирать отдельный шаблон, а это — десятки часов ручной работы. С динамическим контентом вы создаёте один шаблон, а система сама подставляет нужные блоки. Благодаря этому запуск новых кампаний проходит быстрее даже в масштабных проектах, а структура рассылки остаётся аккуратной и управляемой.
Реакция в нужный момент
Динамика позволяет реагировать, когда пользователь максимально вовлечён и заинтересован. Для этого можно настроить автоматические сценарии:
- Клиент несколько раз просмотрел товар на сайте → отправляется письмо с аналогичными товарами или аксессуарами.
- Клиент оформил заказ → отправляется письмо с тематикой «Вам также может понравиться…» и подборкой товаров.
- Появились новинки в категории товаров, которые покупал клиент → отправляется письмо с подборкой «Возможно, вас заинтересуют эти новинки».
Меньше рутинной работы
Один продуманный шаблон с динамическими вставками сокращает число однотипных задач по подготовке писем. За счёт этого освобождается время на более комплексные процессы, такие как разработка креативов и продумывание стратегии.
Как работает динамика в письмах
Чтобы письмо стало динамичным, в нём должна быть реализована особая логика, которая позволяет автоматически менять содержимое. В сервисах рассылок для этого используются специальные инструменты: шаблонизаторы, условия, циклы и подключение внешних источников.
Переменные: подстановка данных
Это самый простой способ персонализации. Переменные подставляют в письмо нужные значения из базы: имя, город, сумму заказа, дату регистрации и другую информацию.
Примеры переменных:
Переменная | Описание |
---|---|
{{user.name}} | Имя получателя |
{{user.city}} | Город из адресной базы |
{{item.title}} | Название товара из массива данных |
Такие переменные можно использовать как в тексте, так и в ссылках, изображениях или заголовках. Главное, чтобы на момент формирования письма эти данные были доступны в системе, иначе переменная останется пустой.
Циклы: перебор списков
Циклы нужны, чтобы отобразить в письме какой-либо список элементов, например, подборку товаров.
Пример цикла:
1 2 3 4 5 6 7
{% for product in recommendations %} <div class="product-card"> <img src="{{product.image}}" alt="{{product.title}}"> <p>{{product.title}}</p> <p>{{product.price}} ₽</p> </div> {% endfor %}
В этом случае если в recommendations
будет указано 5 товаров, то в письме отобразятся 5 товарных карточек.
Условия: показ нужного контента
Условия позволяют управлять содержимым письма в зависимости от пола, статуса, активности или других параметров пользователя. Например, с их помощью можно показывать один блок только мужчинам, а другой — только женщинам.
Пример условия:
1 2 3 4 5 6 7
{% if user.gender == "male" %} <img src="banner-men.jpg" alt="Мужская коллекция"> {% elseif user.gender == "female" %} <img src="banner-women.jpg" alt="Женская коллекция"> {% else %} <img src="banner-default.jpg" alt="Новые поступления"> {% endif %}
Условия также можно сочетать с циклами, например, чтобы показывать только товары определённого ценового диапазона или из выбранных категорий.
Фиды: подключение внешних данных
Чтобы в письмо добавлялась актуальная информация о категориях, ценах и наличии товаров, можно использовать внешние источники. Чаще всего это файлы формата YML или JSON.
Платформа подгружает фид и делает его содержимое доступным для отображения в письмах. Так как данные загружаются из внешнего источника (например, сайта магазина), они сохраняют актуальность в рассылках.
Обобщённый пример подключения YML-фида:
1
[% external_extra("https://site.ru/catalog.yml", "format", "yml") %]
Как использовать динамический контент в различных платформах
В качестве примера рассмотрим, как применяется динамический контент в трёх популярных платформах для массовых рассылок: Altcraft, Sendsay и DashaMail.
Altcraft
В платформе Altcraft доступен «Маркет» — модуль для работы с данными о товарах и клиентских заказах. Он позволяет задействовать эти данные в рассылках для формирования динамического контента.
Маркет позволяет использовать в шаблонах:
- Продукты. Префикс —
product
. Базовая товарная карточка с названием (name
), идентификатором (external_id
), категориями (categories
), произвольными полями (custom_fields
) и множеством других параметров. - SKU (Stock Keeping Unit). Префикс —
sku
. Вариации и свойства продукта, например, производитель (manufacturer_name
), наличие в магазине (is_available
), возможность курьерской доставки (delivery
) и другие. - Заказ. Префикс —
order
. Включает общую информацию об одном заказе: например, идентификатор (external_id
), статус (status
) и общую стоимость (total_price
). - Заказы. Префикс —
orders
. Позволяет выбирать несколько заказов в списке профиля.
Altcraft поддерживает два основных способа импорта товарных данных:
- YML. Стандартный формат «Яндекса» для описания товаров. Подходит для массовой выгрузки из CMS, маркетплейсов или складских систем. Включает название магазина, категории и список товаров, цены и иные параметры.
- JSON. Поддерживает загрузку сущностей продуктов, SKU, категорий, заказов и их позиций с необходимыми параметрами (
external_id
,name
,entity_type
и другими). С помощью JSON в сообщение добавляется информация, генерируемая на вашем сервере точно в момент отправки.
Рассмотрим пример подстановки товарных карточек из макета Altcraft в шаблон. Ниже — упрощённый вариант кода, включающий только ключевые фрагменты:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr><td align="center" valign="top"> {for $index $el = products("product.manufacturer_name == 'Apple'" 4 "price" "desc")} <div style="display: inline-block;width:300px;"> <div><a href="{$el.url}" ><img src="{$el.pictures}" /></a></div> <div><a href="{$el.url}" >{$el.name}</a></div> {if "el.old_price"} <div><s>{$el.old_price}</s></div> {end} <div>{$el.price}</div> <a href="{$el.url}" >Купить</a> </div> {if iseven($index)} <!--[if (gte mso 9)|(IE)]> </td> <td valign="top" width="300" style="width: 300px"> <![endif]--> {else} {if $index lt 3} <!--[if (gte mso 9)|(IE)]> </td></tr> <tr><td valign="top" width="300" style="width: 300px"> <![endif]--> {end} {end} {end} </td></tr> </table>
Разберём некоторые элементы подробнее:
for $index $el
— цикл, позволяющий вывести массив элементов. В данном случае массив представляет собой список товаров.products("product.manufacturer_name == 'Apple'" 4 "price" "desc")
— запрос товаров. Здесь он содержит четыре параметра: в первом задан фильтр (какие товары нужно вывести), во втором — их количество, а два последних — это поле для сортировки и порядок сортировки.- Ещё один важный момент — условие под карточкой товара. Для корректного отображения в Outlook нужна правильная табличная структура. В зависимости от чётности текущей карточки (
if iseven($index)
) нужно либо перейти к следующей ячейке в том же ряду, либо завершить текущий ряд и начать новый. Для этого используют условные комментарии, которые Outlook понимает и обрабатывает.
Важный плюс Altcraft — единый синтаксис шаблонизатора для различных каналов: email, push, SMS и мессенджеров. Одна логика подстановки и фильтрации работает одинаково в разных форматах коммуникации, что упрощает настройку и масштабирование кампаний.
Sendsay
Sendsay оснащён внутренним механизмом шаблонизации контента для рассылок — языком PROScript. Он создан для того, чтобы внутри шаблона письма можно было:
- формировать динамический контент;
- управлять структурой на основе условий;
- подставлять данные из внешних источников.
PROScript поддерживает:
- Переменные. Дают доступ к значениям полей профиля или данных из внешнего источника. Переменная может быть хэшем, ссылкой на массив или объектом.
- Циклы (
foreach
). Позволяют перебирать массивы данных (например, список акций или подарков). - Условия (
if
,elsif
,else
). Выводят блоки контента в зависимости от значений переменных. - Операторы (
==
,!=
,and
,or
). Дают возможность строить сложные, составные проверки и вложенные условия.
Для сценариев e-commerce вроде «Брошенная корзина» или «Брошенный просмотр» Sendsay использует внешние YML-файлы. Кроме описания товаров они могут содержать список категорий, промо-акций и подарков. Элементы этих разделов доступны через специальные ключевые слова в пути:
[% yml.CATEGORY.<id>.* %]
— категории товаров. Здесь<id>
— это значение атрибута id тега<category>
в YML-файле, которое идентифицирует конкретную категорию в каталоге.[% yml.GIFT.<id>.* %]
— список подарков. Здесь<id>
соответствует значению атрибута id тега<gift>
, описывающего конкретный подарок.[% yml.PROMO.<id>.* %]
| — список акций. Здесь<id>
— значение атрибута id тега<promo>
, в котором описаны условия и данные акции.
Рассмотрим упрощённый пример подстановки товарных карточек из JSON в шаблон:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
[% external_extra("URL/products.json","ignore_error","1","timeout","1") %] <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr><td align="center" valign="top"> [% FOREACH item IN products %] <div style="display: inline-block;width:300px;"> <div><a href="[% item.url %]"><img src="[% item.pictures %]" /></a></div> <div><a href="[% item.url %]">[% item.name %]</a></div> [% IF item.old_price %] <div><s>[% item.old_price %]</s></div> [% END %] <div>[% item.price %]</div> <a href="[% item.url %]">Купить</a> </div> [% IF loop.index % 2 == 0 %] <!--[if (gte mso 9)|(IE)]> </td> <td valign="top" width="300" style="width: 300px"> <![endif]--> [% ELSE %] [% IF !loop.last %] <!--[if (gte mso 9)|(IE)]> </td></tr> <tr><td valign="top" width="300" style="width: 300px"> <![endif]--> [% END %] [% END %] [% END %] </td></tr> </table>
Здесь стоит отдельно упомянуть следующие элементы:
- Через
external_extra
запрашивается JSON с каталогом товаров. - Цикл
[% FOREACH item IN products %]
перебирает все полученные товары. - Корректное отображение в Outlook обеспечивается через табличную структуру. Для этого проверяем чётность текущей итерации:
[% IF loop.index % 2 == 0 %]
.
Как это работает при отправке:
- Платформа подгружает данные из JSON.
- Фильтрация и отбор нужных элементов выполняются прямо в шаблоне.
- Получатель видит контент, сформированный по заданным правилам: например, только товары выбранной категории или акции для определённого сегмента.
DashaMail
В отличие от Altcraft и Sendsay, в DashaMail нет полноценного языка шаблонов, циклов и условий в привычном виде, но есть механизм автоматической подстановки товарных данных из YML-файла. Его необходимо предварительно добавить в разделе «Товары». Важно отметить, что подстановка товаров в DashaMail предусмотрена только для триггерных писем.
Здесь базовый пример добавления товарных карточек будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr><td align="center" valign="top"> <!--json_products_limit--><!--4--><!--/json_products_limit--> <!--json_products--> <div style="display: inline-block;width:300px;"> <div><a href="%YML_URL%"><img src="%YML_IMAGE%" /></a></div> <div><a href="%YML_URL%">%YML_NAME%</a></div> <div><s>%YML_OLDPRICE%</s></div> <div>%YML_PRICE%</div> <a href="%YML_URL%">Купить</a> </div> <!--/json_products--> </td></tr> </table>
Рассмотрим подробнее некоторые из элементов:
<!--json_products--><!--/json_products-->
— цикл, который выводит товарные карточки.<!--json_cart-->...<!--/json_cart-->
— для вывода данных из корзины.<!--json_recent-->...<!--/json_recent-->
— для вывода недавно просмотренных товаров.<!--json_products_limit--><!--4--><!--/json_products_limit-->
— позволяет ограничить количество выводимых товаров.
Задать условные комментарии для корректного отображения в Outlook здесь не получится. Для вёрстки необходимо искать другие решения: например, показывать по одной карточке в строке или делать адаптацию через CSS-медиазапросы.
Советы при работе с динамическим контентом
Перед запуском кампании важно проверять, как рассылка выглядит и ведёт себя в реальных условиях. Вот ключевые моменты, о которых стоит помнить:
- Тестируйте шаблоны в разных почтовых клиентах. Например, Gmail может обрезать контент, а Outlook — некорректно отображать таблицы. Проверяйте подстановку: например, что произойдёт, если цикл выводит один товар, а не четыре. Оценивайте рендеринг и на десктопе, и на мобильных устройствах.
- Используйте fallback, если данные не подгрузились. Например, нет товаров в корзине или указано поле без значения. Если товар окажется недоступен, отобразите в письме заглушку (например, «Товар скоро появится») или скрывайте пустые блоки полностью.
- Не перегружайте подборками. Если в письме слишком много товаров, читателю сложнее сосредоточиться. Ограничьте шаблон 4–6 карточками. Под ними добавьте кнопку «Смотреть все», которая откроет список товаров на сайте.
- Следите за размерами изображений. Тяжёлые изображения замедляют загрузку письма. Сжимайте их до оптимального размера (лучше всего до 100 КБ каждое).
Заключение
При грамотной реализации, тестировании и учёте поведения пользователя динамический контент становится мощным инструментом email-маркетинга. Ключ к успеху — сочетать технологию и внимание к деталям:
- выбирать подходящий инструмент под задачи и уровень сложности;
- тестировать сценарии и адаптивность шаблонов;
- следить за корректностью данных и качеством отображения.
А чтобы не вникать в тонкости работы с кодом — воспользуйтесь нашим удобным визуальным конструктором писем Pixcraft. Воплощайте ваши идеи наглядно, быстро и без погружения в сложные технические процессы.
Хотите прокачать навыки в email-маркетинге? Загляните в наш Telegram-канал. Там мы делимся полезными материалами, лайфхаками и идеями для работы.