Detect a contact's language on first contact, store it, and run every message, form, call route and reminder in that language from then on.
Bring your stack to a call and we will scope it against how your business actually runs.
Book a callPlenty of businesses serve a bilingual market and handle it with goodwill rather than with a system. Somebody on the team speaks Spanish, so Spanish-speaking callers get passed to that person. The website is in English. The forms are in English. The confirmation texts, the reminders, the review requests, the follow-up emails: all English. The result is a journey that starts in Spanish because a human was kind, and then switches to English the moment automation takes over. The person who felt well looked after on the phone receives a reminder they have to work to understand, and a review request they ignore.
The leak is not where people expect. Most operators assume the problem is the front door. That Spanish-speaking prospects do not inquire. Usually they do inquire, and they convert at the front door just fine, because a person handled it. The loss happens downstream, in every automated touch after the first conversation: confirmations that do not get read, reminders that do not get acted on, so no-show rates for Spanish-speaking contacts that run visibly higher than for English-speaking ones. Nobody traces the no-shows back to the language of the reminder, because language is not recorded as a field, so the pattern is invisible in reporting.
There is a second, slower leak. When language handling depends on one bilingual staff member, that person becomes a bottleneck and a single point of failure. They cannot take holiday without the Spanish-speaking pipeline stalling. They get interrupted constantly. And when they leave, a portion of the customer base effectively loses its channel into the business overnight. Fixing this properly means making language a property of the contact record rather than a property of who happens to be at the desk, detected once, stored, and honoured by every workflow, form, calendar, and call route from then on.
One pipeline, Bilingual Intake, with language carried as a field rather than as a parallel pipeline. Running two language-specific pipelines is the most common mistake in this build. It doubles the maintenance and makes reporting incomparable. Stages:
Translate forms properly. Machine-translated form labels read as careless to a native speaker, and carelessness at the intake step sets the tone for everything after it. Have a fluent speaker review every string, including button text, validation messages, and the thank-you screen: those last ones are almost always missed.
Trigger: a new contact is created from any inbound channel: SMS, web chat, social message, inbound call, or a form that did not pre-set language.
Conditions and branches: check preferred_language first and exit immediately if it is already populated; re-detecting on a known contact is how stored preferences get silently overwritten. Then branch on channel. Text channels get content-based detection on the inbound message. Inbound calls get detection from the keypress on the bilingual greeting, which is far more reliable than speech detection. Form submissions from a language-specific landing page get language from the hidden field and skip detection. If the inbound message is under four words (“hi”, “hola”, “info”) treat detection as low confidence and go straight to the confirmation branch rather than committing.
Actions in order:
Stop and exit conditions: exits as soon as preferred_language is set, or immediately if it was already set. Never runs twice on the same contact.
Trigger: tag lang-unconfirmed applied.
Conditions and branches: branch on detection confidence. High confidence gets a soft confirmation embedded in the ongoing conversation. Low confidence gets an explicit bilingual choice before anything else is sent, because sending four messages in the wrong language and then correcting is worse than one extra question.
Actions in order:
Stop and exit conditions: exits on confirmation, on the second unanswered attempt, or on opt-out. Never sends a third confirmation request, asking somebody twice what language they speak is tolerable, three times is not.
Trigger: an inbound message is detected in a language different from the stored preferred_language.
Conditions and branches: this is the workflow that separates a real bilingual system from a cosmetic one. Branch on whether language_confirmed is yes. If it is no, the stored value was a guess, so the new inbound signal simply wins: overwrite without asking. If it is yes, the contact actively chose the stored language, so a single message in the other language may be incidental (a forwarded sentence, a quoted phrase, somebody else using their phone) and must be verified rather than acted on. Second branch: if two consecutive inbound messages arrive in the new language, treat that as decisive regardless of confirmation status.
Actions in order:
Stop and exit conditions: exits once the language is resolved and the flag cleared. Hard exit on opt-out. If mismatches occur more than twice on one contact, stop automating the decision, apply bilingual-staff-required, and let a human set the field.
Trigger: contact enters Language Set.
Conditions and branches: every message step in this workflow branches on preferred_language at the moment of sending, not at the moment of enrollment. Reading the field at enrollment is the subtle bug that causes a corrected language to be ignored for the rest of the sequence. Branch on calendar: es routes to Consultation: Spanish, en to Consultation: English, other to Interpreted Appointment. Branch on staff availability: if the Spanish calendar has no slot inside five business days, offer Callback: Spanish instead of offering an English slot.
Actions in order:
Stop and exit conditions: booking, opt-out, mismatch flag raised, or exhaustion of the four-exchange ceiling. The whole workflow halts rather than continuing in the wrong language if preferred_language is ever empty: fail loudly, do not default silently mid-sequence.
Trigger: appointment created on any of the four calendars.
Conditions and branches: every single send reads preferred_language at send time. Branch on interpreter_required: interpreted appointments get an extra confirmation to the interpreter and a longer arrival instruction. Branch on channel consent: if consent_sms is no, run the whole ladder by email only, in the same language.
Actions in order:
Stop and exit conditions: cancellation, opt-out, or appointment completion plus review request sent. If preferred_language changes mid-ladder, cancel the remaining queued sends and re-queue them from the correct template set rather than letting both versions go out.
Trigger: preferred_language set to other, or tag interpreter-needed applied by staff.
Conditions and branches: branch on whether the business has a standing arrangement for the detected language. If yes, route to that arrangement. If no, route to a named human to decide, and send the contact a short holding message in English and Spanish only, not a machine translation into the third language, which risks being wrong in a way nobody on the team can check.
Actions in order:
Stop and exit conditions: exits when the appointment completes or when a human marks the contact as unservable in that language. Never sends machine-translated marketing into a language the business cannot support.
Trigger: contact enters Nurture.
Conditions and branches: the nurture sequence exists once, with language-matched template pairs at every step, rather than as two separate campaigns. Branch at each send on preferred_language. Suppress entirely for lang-other. Branch on quiet hours in the contact's time zone, which for a bilingual market frequently spans more than one time zone: do not assume the business's zone.
Actions in order:
Stop and exit conditions: any reply, any booking, opt-out, or 30 days elapsed. Opt-out confirmations send in the stored language. An unsubscribe confirmation in the wrong language is the last impression the contact gets.
Trigger: inbound call to any business number.
Conditions and branches: branch first on which number was dialled. A Spanish-advertised number skips the menu entirely and sets preferred_language to es with language_source self-selected. The person chose it by choosing where to call. The main number plays the bilingual greeting and branches on keypress. Then branch on staff availability in the chosen language; if no Spanish-speaking staff member is available, do not route to an English speaker, route to the missed-call path, which at least continues in the right language.
Actions in order:
Stop and exit conditions: call answered, reply received and handed to Workflow 4, or opt-out. Do not send a second missed-call text if the same number calls again within thirty minutes.
Afterwards, language stops being a favor somebody does and becomes a property of the record. A Spanish-speaking contact is greeted in Spanish, qualified in Spanish, booked onto a calendar that only offers slots a Spanish speaker can serve, reminded in Spanish, asked for a review in Spanish, and nurtured in Spanish for as long as they stay on the list: without anybody having to remember. The bilingual staff member stops being a bottleneck for messaging and gets to spend their language skill on the conversations that genuinely need a person.
The reporting change is equally significant. Because both language populations run through one pipeline and write to the same fields, you can finally see whether the Spanish-speaking segment books, shows, and converts at the same rate as the English-speaking one. Almost always there is a gap at the start, and almost always it is in show rate rather than booking rate, which is exactly the gap that language-matched reminders close. Once it is measurable, it is fixable.
Metrics to watch:
None of the above is legal advice. Messaging registration rules, consent standards, language-access obligations in regulated sectors, and data-protection requirements vary by jurisdiction and by industry. Confirm the specifics (including whether any language-access duty applies to this business) with the client's own counsel before going live. To scope a build for a specific business, book a call at bookings.appbo.io.
Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.
Book a call