One email template for every language: Klaviyo, Braze, Iterable, Salesforce and Brevo
How to send one campaign in several languages from a single template, with the language condition written in each platform's syntax, and when it's better to keep one template per language.
If you send in two or three languages, you have two options: one template per language, each sent to its own segment, or a single template that shows each contact the version in their language. The second one halves the setup and keeps the design identical across languages. Here's how to write it in each platform, and when not to do it.
The idea
The template contains every version of the text and a condition on the contact's language field:
- if the language is English, show the English version;
- if it's French, the French one;
- otherwise, the main language.
The main language always goes in the "otherwise" branch. That way, contacts with no language, or with a language you don't send in, still get a complete email instead of a blank one.
The syntax, platform by platform
Assume the main language is Spanish and the field is called language (in your account it may be locale, IDIOMA or something else).
Klaviyo
{% if person|lookup:'language' == 'en' %}
English version
{% elif person|lookup:'language' == 'fr' %}
French version
{% else %}
Spanish version
{% endif %}
Braze. language is a standard attribute, so it goes as ${language}. If your language field is a custom attribute, use {{custom_attribute.${your_field}}} instead.
{% if ${language} == 'en' %}
English version
{% elsif ${language} == 'fr' %}
French version
{% else %}
Spanish version
{% endif %}
Iterable
{{#eq locale "en"}}
English version
{{else}}
Spanish version
{{/eq}}
For a third language, nest another {{#eq}} inside the {{else}}.
Salesforce Marketing Cloud (AMPscript)
%%[ IF AttributeValue("Language") == "en" THEN ]%%
English version
%%[ ELSEIF AttributeValue("Language") == "fr" THEN ]%%
French version
%%[ ELSE ]%%
Spanish version
%%[ ENDIF ]%%
Brevo
{% if contact.LANGUAGE == "en" %}
English version
{% else %}
Spanish version
{% endif %}
Don't wrap the whole email, only what changes
The first instinct is to wrap the entire HTML in the condition, which duplicates the whole design once per language. It works, but the template becomes huge and any design change has to be made three times.
It's better to put the condition only around what actually changes (headlines, paragraphs, buttons, alt texts) and leave the layout, styles and images outside. The design exists once, and the languages only swap the words.
The subject line and the preheader
Most platforms accept the same condition in the subject line. Use it: a Spanish email with an English subject is the first thing people notice. Do the same with the preheader, which usually lives in a hidden block at the top of the HTML.
Three checks before sending
- Language codes. If your field holds
esfor some contacts andes-ESorSpanishfor others, the condition only catches one. Normalize the field, or compare against every value you have. - Links per language. The English button should go to the English page. It's easy to translate the text and forget the URL.
- One test per language. Send the test to a contact in each language, plus one with the field empty, to check that the fallback works.
When one template per language is better
- You A/B test per language. Many platforms run tests at campaign level, and mixing languages muddies the results.
- Your languages send at different times or to very different segments.
- Each language has its own content, not a translation: different products, offers or dates. The condition would end up wrapping almost everything.
For a translated campaign that goes out at the same time, one template is less work and keeps everything consistent.
In Remite you pick the languages in the brief, and when you export you choose between one file per language or one with all of them, with the conditions already written for your platform.