Home / Multi-language funnels
Multi-language
One funnel. Every language. One set of numbers.
Most funnel tools make you duplicate the whole funnel per language. You end up maintaining four copies of the same questions, and your conversion rate is split across four sets of analytics. Leadtrak.ai keeps the translations inside the one funnel, so there is one funnel to edit, one score model, and one report.
Honest scope: translations are written in a translation panel in the app — a side-by-side table of your default-language text and the translation, one page per language, reached from the Languages button on any funnel. Machine translation is planned, not built.
How it works
Translations are an overlay
Each locale is a map of field path to translated text, laid over the default-language funnel at render time. Anything you have not translated yet falls back to the default language rather than rendering blank — a half-finished translation is still a working page.
Language cannot change the outcome
Only human-readable text can be translated. An overlay can never touch an answer's stored value, its score weight, a branch jump or a URL. The German visitor and the English visitor answer the same instrument, so their leads are directly comparable.
The chrome is translated too
Continue, Back, Submit, “Step 2 of 4” and the validation summary ship translated for English, German, French, Spanish, Dutch, Polish and Italian, and any of them can be overridden per funnel. No English button on a German page.
How a visitor's language is chosen
In this order, first match wins:
| # | Source | Behaviour |
|---|---|---|
| 1 | ?lang=de in the URL | Explicit choice. Beats everything else, and is remembered for that funnel in a cookie so it survives the next step. |
| 2 | Cookie from an earlier explicit choice | The language a visitor picked sticks as they move through the funnel. |
| 3 | Accept-Language header | A browser set to German gets German with no query string and no redirect. |
| 4 | The funnel's default locale | The fallback, and what an unknown or unsupported language resolves to. |
Language tags are validated before use. A malformed or hostile value is discarded and the funnel falls back to its default language, so the switcher is not an injection point.
Details that matter on a real page
Correct lang and dir
The page declares the language it is actually in, which is what screen readers and search engines need. Arabic, Hebrew, Persian and Urdu render right-to-left automatically.
A switcher that works without JavaScript
The language switcher is plain links, and every step is a normal server-rendered form post. Validation messages come back in the visitor's language whether or not scripts loaded.
One funnel in the reporting
Because locales are not separate funnels, lead volume, score distribution and cost per qualified lead are aggregated across every language by default — not four dashboards you have to add up.
Survives the editor
Translations round-trip through save and reload without loss, proven by an automated test that saves over real HTTP, reads the funnel back and compares the whole definition.
Built and planned
| Capability | Status |
|---|---|
| One funnel definition rendered in many languages | Built |
| Partial translations with fallback to the default language | Built |
Language from ?lang=, cookie, or Accept-Language | Built |
| Translated buttons, progress and validation copy (en, de, fr, es, nl, pl, it) | Built |
| Per-funnel override of any interface string | Built |
| Right-to-left layout for Arabic, Hebrew, Persian and Urdu | Built |
| Identical scoring and routing in every language | Built |
| Translation panel in the app, per language, with an untranslated-content warning | Built |
| Machine translation of a funnel in one click | Planned |
Per-language domains or sub-paths instead of ?lang= | Planned |
| Translated follow-up email and WhatsApp sequences | Planned |
Everything marked Built is covered by automated tests, including tests that fetch a live funnel over HTTP in three languages and confirm a submission in German produces exactly the same stored answer and score as the same submission in English.