Unlocking Multilingual Abandoned Cart Notifications in Klaviyo
Share
How to build high‑performing, compliant, and scalable abandoned‑cart systems that speak your customers’ language—literally.
Why this matters
When a customer abandons a cart, there’s a narrow window to recover revenue. If that message arrives in the wrong language—or worse, violates regional compliance rules—you lose both the sale and trust. Multilingual abandoned‑cart flows are no longer a nice‑to‑have for global brands; they’re the cost of entry.
At Sticky Digital, multilingual systems do three things exceptionally well: (1) detect language and intent, (2) speak like a human in that language, and (3) respect consent rules by country and channel. Done right, abandoned‑cart becomes a profit center that compounds lifetime value rather than a blunt instrument that racks up unsubscribes.
Want the broader view of how we work? Read Inside Sticky Digital: What It’s Like to Work With a Top Retention Marketing Agency.
Table of contents
- Principles for multilingual recovery that actually scale
- Klaviyo’s language signals: what’s reliable, what isn’t
- Data model: the lean multilingual blueprint
- Architecture options: split or dynamic?
- Build it: email flow, step‑by‑step (with code)
- Build it: SMS flow, step‑by‑step (with copy & compliance by region)
- Currency, catalog, and checkout localization
- QA plan, seed profiles, and failure modes
- Measurement: how to prove it’s working
- A/B testing roadmap
- Governance: consent, preference center, auditability
- Common patterns for Shopify (+ notes for SFCC/BigCommerce)
- Copy vault: ready‑to‑ship EN/ES emails & SMS
- Engineering appendix: template logic patterns
- Troubleshooting index
- Working with Sticky Digital
1) Principles for multilingual recovery that actually scale
- One flow, many languages. Maintain a single Abandoned Cart flow. Localize inside the flow using conditional blocks or a translation dictionary.
-
Prefer explicit to inferred. A declared
language_preferencebeats any inference. Fall back to Klaviyo’s$locale_languageonly when necessary. - Make consent jurisdiction‑aware. SMS consent rules differ by market. Save the how/where/basis of consent and branch legally.
- Translate for meaning, not just words. Adapt offer framing, humor, and urgency to market norms.
- Close the loop with CX. Cart issues often reflect UX blockers: shipping shock, duties, payment friction, or sizing.
For our approach to testing and iteration, see A/B Testing Your BFCM Offers.
2) Klaviyo’s language signals: what’s reliable, what isn’t
Use a tiered strategy to determine language:
-
Primary (explicit):
language_preference(custom property) collected via forms, checkout, or account. -
Secondary (system):
$locale_language(e.g.,en,es) and$locale_country(e.g.,US,MX). -
Tertiary (context): billing/shipping country, site language selector, or URL path (
/es).
Rule of thumb: If language_preference exists, use it. Else use $locale_language. Else default to EN and invite a preference update via your footer or preference center.
For product context on why Klaviyo’s profile model matters, see: February 2025 Klaviyo Updates, June 2025 Klaviyo Updates, and Klaviyo Boston Highlights.
3) Data model: the lean multilingual blueprint
Minimal profile properties
-
language_preference(e.g.,en,es,fr) -
$locale_languageand$locale_country(system) -
sms_consent_country(e.g.,US,MX) -
subscriber_tier(for incentives, loyalty/subscription synergy)
Event coverage
- Checkout Started with cart payload (images, titles, prices)
- Placed Order
- Active on Site (optional)
Build loyalty and subscription together for better recovery economics. See our Services.
4) Architecture options: split or dynamic?
Option A — One flow with dynamic content (recommended)
- Single Abandoned Cart flow with a language split.
- Use block‑level display conditions or a translation dictionary.
- Pros: centralized throttles, holdouts, and simpler QA.
Option B — Separate flows per language
- Duplicate the entire flow per language.
- Pros: clear ownership per regional team.
- Cons: heavy maintenance; fragmented testing.
5) Build it: email flow, step‑by‑step (with code)
Flow & filters
- Trigger: Checkout Started
- Flow filter: Has not Placed Order since Checkout Started
-
Suppression:
opt_out_cart_recovery = true
Language split
{% set lang = person|lookup:'language_preference'|default:person|lookup:'$locale_language'|default:'en' %}
Create branches for es, en, fr, and a fallback.
Block‑level display conditions
{% set lang = person|lookup:'language_preference'|default:person|lookup:'$locale_language'|default:'en' %}
{% if lang == 'es' %}
<!-- Spanish block content renders -->
{% endif %}
Translation dictionary pattern
{% set lang = person|lookup:'language_preference'|default:person|lookup:'$locale_language'|default:'en' %}
{% set t = {
'en': {'subject':'You left something behind','headline':'Still thinking it over?','cta':'Resume your checkout','legal':'Prices and availability may vary.'},
'es': {'subject':'Dejaste algo en tu carrito','headline':'¿Aún lo estás pensando?','cta':'Retomar compra','legal':'Los precios y la disponibilidad pueden variar.'},
'fr': {'subject':'Vous avez oublié un article','headline':'Vous hésitez encore ?','cta':'Reprendre votre achat','legal':'Les prix et la disponibilité peuvent varier.'}
} %}
<h1>{{ t[lang].headline }}</h1>
<p>{{ t[lang].legal }}</p>
<a href="https://yourstore.com/cart">{{ t[lang].cta }}</a>
Language‑aware URLs
{% set base = 'https://yourstore.com' %}
{% set path = '/cart' %}
{% if lang == 'es' %}{% set path = '/es' + path %}{% endif %}
{{ base + path }}
6) Build it: SMS flow, step‑by‑step (copy & compliance)
Consent routing
- Segments like “SMS Consent: ES‑Language” and “SMS Consent: EN‑Language”.
- Gate sends by language and country (quiet hours & legal basis differ).
Copy patterns
EN (first touch):
You left something in your cart — want help finishing up? {{ "{{ cart_url }}" }}
ES (primer toque):
Dejaste algo en tu carrito — ¿te ayudo a terminar la compra? {{ "{{ cart_url }}" }}
For more SMS design and urgency frameworks, see our Templates & Assets.
7) Currency, catalog, and checkout localization
- Route to the correct language version (e.g.,
/es) and pre‑select currency where supported. - Surface shipping estimates and duties early.
- Show locally trusted payment methods to reduce friction.
8) QA plan, seed profiles, and failure modes
Seed pack
- Create at least one seed per language‑country combo (e.g.,
es‑MX,en‑US,fr‑CA).
Scenarios
- Abandon on
/es, then browse/(EN): language should stick. - Consent set to EN but locale is ES: explicit property should win.
- No language properties: default to EN and invite preference set.
Common failures
- Mixed‑language messaging due to overlapping block conditions.
- Buttons ignoring language path.
- Hard‑coded currency.
9) Measurement: how to prove it’s working
Primary KPIs
- Recovery rate by language
- Revenue per recipient (RPR) by language and channel
- Time‑to‑recover (median hours)
- Unsubscribe/complaint rate by language
Secondary diagnostics
- Click‑to‑checkout and completion rate
- Reply rate (SMS)
- % of profiles with declared
language_preference
Decision rule example: If ES‑path RPR < EN‑path RPR by >20% after 10k sends, run a two‑cell copy test (tone vs. incentive).
10) A/B testing roadmap
Phase 1 — Message fit
- Tone (warm vs. direct) per language
- Subject line structure (urgency first vs. product first)
- Incentive reveal timing (none vs. second touch)
Phase 2 — Offer calibration
- Free shipping vs. %-off vs. add‑to‑cart perk
- Return policy framing by region
Phase 3 — UX blockers
- Shipping/duties disclosure
- Size/fit guidance
- Payment method logos by market
Deep dive method here: A/B Testing Your BFCM Offers.
11) Governance: consent, preference center, auditability
- Capture source, timestamp, IP, country, and context (form/checkout), especially for SMS.
- Localize the preference center; let users set language, channel, and frequency.
- Keep DSAR‑friendly logs and consistent property naming.
Review our operating principles and security posture on the About page.
12) Common patterns for Shopify (+ notes for SFCC/BigCommerce)
Shopify
- Use Shopify Markets for currency + language sub‑folders (e.g.,
/es). - Pass selected language into Klaviyo via web tracking; set
language_preferencewhen a user changes the selector. - Ensure cart/checkout URLs preserve language path.
SFCC / BigCommerce
- Align on a single
langquery param your cart recognizes and have Klaviyo append it. - Persist the param across sessions.
13) Copy vault: ready‑to‑ship EN/ES emails & SMS
Email 1 — Soft reminder (no incentive)
EN Subject: You left something behind
ES Asunto: Dejaste algo en tu carrito
EN Preheader: It’ll be here when you’re ready.
ES Preheader: Aquí estará cuando estés listo.
EN Body: Still thinking it over? Your items are saved, and checkout takes 30 seconds.
CTA: Resume your checkout
ES Cuerpo: ¿Aún lo estás pensando? Tus artículos están guardados y el pago toma 30 segundos.
CTA: Retomar compra
Email 2 — Value reinforcement (policy clarity)
EN Subject: Free returns, fast shipping — want to finish up?
ES Asunto: Devoluciones gratis, envío rápido — ¿terminamos tu compra?
EN Body: Most carts die over questions: shipping cost, returns, or sizing. Answers are here — and your items are still in stock.
ES Cuerpo: La mayoría de los carritos mueren por dudas: envío, devoluciones o tallas. Las respuestas están aquí — y tus artículos siguen en stock.
Email 3 — Gentle incentive (time‑boxed)
EN Subject: A small nudge to finish ✨
ES Asunto: Un empujoncito para terminar ✨
EN Body: Use code WELCOME10 at checkout in the next 24 hours.
ES Cuerpo: Usa el código WELCOME10 en las próximas 24 horas.
SMS set (EN/ES)
EN #1: You left something in your cart — need a hand? {{ "{{ cart_url }}" }}
ES #1: Dejaste algo en tu carrito — ¿te ayudo? {{ "{{ cart_url }}" }}
EN #2: Still want it? Your cart’s saved for 24 hours: {{ "{{ cart_url }}" }}
ES #2: ¿Aún lo quieres? Tu carrito se guarda 24 h: {{ "{{ cart_url }}" }}
14) Engineering appendix: template logic patterns
A) Safe language resolution
{% set lang = person|lookup:'language_preference'|default:person|lookup:'$locale_language'|default:'en' %}
B) Language‑aware subject lines
{% if lang == 'es' %}
Dejaste algo en tu carrito
{% elif lang == 'fr' %}
Vous avez oublié un article
{% else %}
You left something behind
{% endif %}
C) Language‑aware URLs
{% set base = 'https://yourstore.com' %}
{% set path = '/cart' %}
{% if lang == 'es' %}{% set path = '/es' + path %}{% endif %}
{{ base + path }}
D) Segment examples
-
Language: Spanish — Properties about someone >
language_preferenceequalses(OR$locale_languageequalses). - SMS Consent + ES — Has SMS consent AND (language_preference = es OR $locale_language = es).
15) Troubleshooting index
-
Problem: Emails mixing languages.
Fix: Ensure only one block evaluates to true; definelangonce at top. -
Problem: SMS not sending to ES market.
Fix: Segment also by country; confirm valid consent in that locale. -
Problem: Currency mismatch.
Fix: Avoid hard‑coded currency; use market‑aware prices or currency‑neutral phrasing. -
Problem: Links go to EN site from ES emails.
Fix: Prepend/esbased onlang; test with seeds.
16) Working with Sticky Digital
Multilingual abandoned‑cart is one slice of a full retention system. When you’re ready to scale beyond the first win—loyalty tiers that feed subscription, preference‑center orchestration, offer testing, and lifecycle analytics—our team can take you there.
- Services & Audits — scope, build, and optimize email/SMS with loyalty + subscription together.
- Case Studies — how retention work compounds CLV.
- Contact — ready for a multilingual cart‑recovery build?
- About — values, operating principles, and how we collaborate.
Related reading on our site:
• Best Klaviyo Email Agencies for DTC Growth
• Top Retention Marketing Agencies for Shopify Brands
• Browse all DTC retention topics