Guide
Bilingual email QA: how EN/FR campaigns actually go wrong
Every Canadian-market sender ships at least two of everything: English and French, launch and reminder. The second language is where campaigns quietly fail, because it’s checked last, by tired eyes, often by someone who doesn’t read it fluently. These are the bilingual failure modes we see repeatedly, the checks that only exist for French, and the pass that catches each one.
The shapes a bilingual campaign takes
The shape decides what you compare against what, and where the second language can hide.
- Two separate emails. One EN build and one FR build, each with its own subject line and test send. The most common shape, and the easiest to check, unless the FR email was cloned from the EN one and only partly translated.
- One email with language blocks. One template where a profile attribute picks the English or French block at send time. The code shows both branches; only a test send per language shows what each subscriber gets.
- EN and FR decks side by side. One copy deck with an English and a French column for every section, often with Launch and Reminder tables. Sometimes the French arrives as its own document a week later.
- A per-language link matrix. A links sheet with one URL column per language. The FR email must use the FR column, and the two columns often differ by one path segment.
1. The language leak
One module in the FR email still says English. It happens because builds are cloned from the EN version and one block escapes translation. The catch: read every block of the email, visible or not, for its language, and flag any block that reads as the other language. The spots that leak most:
- The hidden pre-header. Nobody sees it in the preview pane, but every inbox shows it next to the subject line.
- Alt text. The images are swapped for French versions and the alt attribute keeps the English words.
- The title tag and the lang attribute. A cloned build keeps
<title>in English andlang="en", so a screen reader reads the French with an English voice. - Button and link text. Image buttons, the text fallback of a bulletproof button, “View online” and “Privacy” in the header and footer.
- The unsubscribe page. The email says “Se désabonner” and the preference center loads in English. It is outside the email, so it is outside most QA passes.
2. Deck versions that don’t line up
Bilingual copy decks usually declare versions campaign-wide: the launch email is Version 1, the reminder is Version 2, each with EN and FR columns side by side. QA tools (and humans) that assume “reminder = version 1 of the reminder section” end up comparing the FR reminder against the FR launch copy and reporting nonsense. The fix is to respect the deck’s own numbering, and to honor “same as launch” markers where the deck says a section carries over. The copy deck comparison guide covers deck structure in depth.
3. Links that don’t switch languages
Every URL in a bilingual program carries a language marker: a /fr/ path segment, a lang=fr parameter, a separate French domain. Three ways it goes wrong:
- The EN link in the FR email. Pasted from the English column of the link matrix, or kept from the cloned build.
- The French URL that serves English. The link says
/fr/, but the page has no French version yet and falls back to English. - The tracking wrapper that hides it. Every link is a click-tracking URL with an opaque token, so the href tells you nothing.
The check: follow every link through the wrapper and every redirect to its final destination, then read the destination’s language from its URL, page title and first heading. On an FR email, anything landing on /en/ or on an English page is a finding. Leave the unsubscribe link out of the automated pass, since requesting it can unsubscribe the seed address, and open it by hand on a test profile.
4. Accents lost in the build
“Économisez” becomes “Economisez” somewhere between the deck and the template: an encoding issue, a font substitution, a copy-paste through a tool that strips diacritics. Subject lines and pre-headers are the worst case. They pass through the platform’s header encoding, and a missing UTF-8 charset turns “é” into “é” in the inbox while the body looks fine. Capitals lose accents most often. A character-aware copy comparison catches it; an eyeball at arm’s length does not.
5. Unequal legal copy
The EN footer got the updated disclosure; the FR footer kept last quarter’s. Legal lines change mid-campaign more than any other copy, and they change in one language first. Compare each language against its own column of the deck, then compare the two emails structurally: same legal paragraphs, same footnote markers, same links, same modules in the same order. The unsubscribe line needs the same parity: “Unsubscribe” in English, “Se désabonner” or “Désabonnement” in French, both present and both working.
6. The checks that only exist for French
A translated English checklist misses these. They are rules of French copy, not translation errors, so a fluent translator can still ship them if the build mangles them.
- Non-breaking spaces. French puts a space before the colon and inside « guillemets », and in France before ; ! ? too. It must be non-breaking (
) or the punctuation wraps onto its own line. A regular space is wrong in both the France and the Canadian convention. - Quotation marks. « Guillemets », not “English quotes”.
- Months and days in lowercase. “jusqu’au 30 novembre”, “dès lundi”. A capital “Novembre” usually means the date was typed over the English.
- Money and numbers. “1 234,56 $”: a space between thousands, a decimal comma, the dollar sign after the amount. Percentages take a space too: “25 %”.
- Gender and plurals. “Cher client” before a first-name token reads wrong for half the list. French uses the singular for 0 and 1 (“0 point”), so a points balance needs its own French rule.
- The length problem. French runs 15 to 25 percent longer than English. “Shop now” becomes “Magasinez maintenant” and the button wraps; a one-line headline takes two; the inbox cuts the subject line earlier. Check the French build against the French creative, and see where inboxes cut the French subject with the free subject and pre-header preview.
A worked example: Harbourline HL2316, French round
Harbourline is a fictional retailer, and HL2316 its points campaign: “Earn 4X points on your everyday spend”. Here is what a French round can look like when the FR build is cloned from the EN one: what the email had, then what the deck and the French rules ask for.
→ points ! (breaking space before !)
Pre-header · Earn more on your everyday spend.
→ Obtenez plus sur vos achats courants.
Headline ··· ECONOMISEZ SUR CHAQUE ACHAT
→ ÉCONOMISEZ SUR CHAQUE ACHAT
Body ······· jusqu’à $1,250.00 en récompenses
→ jusqu’à 1 250,00 $ en récompenses
Date ······· valide jusqu’au 30 Novembre 2026
→ valide jusqu’au 30 novembre 2026
Button alt · alt="Activate now"
→ alt="Activez maintenant"
Terms link · harbourline.example/en/legal/terms
→ harbourline.example/fr/juridique/conditions
Footer ····· Unsubscribe
→ Se désabonner
Eight findings, and a reviewer scrolling the French preview sees perhaps three: the headline, the amount, the date. The pre-header, the alt text and the link destination never show in a preview, and the space before “!” only shows when the line wraps. That is why the bilingual pass is a fixed list, not a read-through.
The bilingual pass, in order
2. FR email vs deck FR column ····· line by line, both directions
3. FR email language scan ········· every block, incl. alt, pre-header, title
4. FR typography ·················· spaces, « », capitals, 1 234,56 $
5. FR links → FR destinations ····· through tracking wrappers
6. FR build vs FR creative ········ buttons and headlines that wrap
7. EN ↔ FR structure ·············· same modules, same counts, same order
How SendLint runs the pass
Attach the deck once with its EN and FR columns (two decks and a links sheet combine into one with Prepare a deck), and run the round as a batch with each email set to its language. Each email is compared against its own language column, accents included: subject line, pre-header, headline, body, CTAs, legal, alt text and links. The <title> is compared with the deck’s subject line and the lang attribute with the email’s language. An email set to the wrong language is refused, with the language it reads as.
Every block of copy is read for its language: a block that reads as English in a French email, with no lang attribute saying it should, is flagged, and alt text has its own language check. On French analyses, four typography checks run: guillemets, breaking spaces before : ; ! ? and inside « », accents missing on capitals, and money not written as 1 234,56 $. The unsubscribe check knows the French wording and never requests the link.
Links are followed through click-tracking wrappers, and where they land is compared with the deck’s link for that language. With the client’s domains set and the language link check on, an owned-domain link whose path names the other language is a finding. The Link sheet lists every final URL with the landing page’s title, so an English landing page shows at a glance. When the French deck changes between rounds, Deck compare shows every changed line, language by language.
The report lists every version with its fails and warnings, and each language is signed off on its own, with its own certificate. Two steps stay with a person: the EN ↔ FR structure (step 7), and the copy calls that need a French reader, like gendered greetings and a capitalized month. See it on a sample campaign in the demo.
Frequently asked questions
- What goes wrong most often in bilingual EN/FR email campaigns?
- Language leaks (a module, an alt text or the hidden pre-header still in English), deck versions that don't line up, French links that land on English pages, dropped accents, French typography left in English style, and legal copy updated in one language only.
- How do you catch an English fragment in a French email?
- Read every block for its language, not just the visible body: alt text, the hidden pre-header, the title tag, button text and link labels. Alt text and pre-headers leak most because a visual review never sees them.
- Do French emails need different QA checks than English ones?
- Yes. French has its own typography: guillemets, non-breaking spaces before the colon and inside guillemets, accents kept on capitals, lowercase month and day names, and money written as 1 234,56 $. French also runs longer, so buttons and headlines need their own check.
- How do you check that links in a French email go to French pages?
- Follow every link through its tracking wrapper and redirects to the page it lands on, then read that page's language from its URL, title and first heading. Never request unsubscribe links from a seed address.
- Why do French buttons and headlines break when the English ones fit?
- French usually runs 15 to 25 percent longer than the English. A button sized for two English words wraps with the French label, and a one-line headline takes two. Check the French build against its own creative at desktop and phone widths.
- How do you QA one email that switches language from a profile attribute?
- Treat each branch as its own email: send one test to a French profile and one to an English profile, then check each send against its own deck column. The template code alone does not show what the conditional outputs.
Keep reading
- How to QA an email against the copy deck, line by lineThe shapes a deck arrives in, both directions, per version and per language, the parts everyone skips (subject line, alt text, links, tokens), what counts as different, and what to do when the deck is revised mid-campaign.
- The email QA checklist: every check before you sendEvery check a bank-grade email QA pass covers, why each exists, and which ones humans consistently miss.
- The email accessibility checklist: WCAG 2.1 AA for HTML emailWhich criteria actually apply to email, the checks for structure, text, contrast, images, links and motion, what fails most in real campaigns, and how to test with a screen reader.