Use case

Customer support channel routing

Before a support reply or service notification goes out, check which channels the customer's number and e-mail can actually receive on, then route to one that arrives.

Last updated

A globe inside the MobileValidate shield over a glowing platform, circled by flag pins, with the words Global coverage, validate anywhere in the world.
One API for numbers from every supported country.

Customer support channel routing checks which channels a customer can actually receive on before a reply or notification is sent. One lookup tells you whether the number is registered on messaging apps such as WhatsApp, Telegram or Viber, whether the mobile line is reachable, and whether the e-mail mailbox exists. You then pick a consented channel that will arrive.

Why do support messages go unanswered?

Support teams often send on whatever channel the ticket arrived on, or on a fixed default such as e-mail. That breaks in predictable ways:

  • The e-mail address was mistyped at sign-up. Replies bounce or land nowhere, and the customer thinks you ignored them. The e-mail mailbox check tells you whether the mailbox exists at major webmail providers.
  • The customer changed phones or apps. A number that had a messaging-app account a year ago may not have one now. A reply sent there waits unread.
  • The number is switched off or out of coverage. For a time-critical message, such as a technician arriving within the hour, an SMS to an unreachable phone is too late. The HLR lookup answers whether the mobile line is reachable at the moment you ask.
  • The channel doesn't suit the message. A photo of a damaged part, a document to sign or a quick-reply button needs a channel that supports it. A fixed line can't receive SMS at all. The carrier lookup reports the line_type.

A lookup doesn't choose the channel for you. It removes channels that can't work, so your routing rules choose among the ones that can.

How does support channel routing work?

  1. Collect channel consent. When a customer opens a ticket, signs up or updates their profile, record which channels they agreed to be contacted on for support.
  2. Check the consented channels. Call POST /v1/lookup with the customer's number in numbers, their address in emails, and only the checks for channels you can send on, for example ["whatsapp", "telegram", "viber", "email"].
  3. Store the answer, not the raw response. Save one row per channel with registered and checked_at in your help-desk or CRM.
  4. Route each message. Pick the customer's preferred channel among those with registered: true. If none is true, use SMS for a mobile line, e-mail if the mailbox exists, or a voice call.
  5. Refresh on events. Re-check when a message fails, when the customer changes their details, or when the stored answer is older than your refresh window, for example 30 days.
  6. Add bulk-only channels ahead of time. iMessage and RCS checks run in bulk jobs only, so include them in a periodic job over active customers.

The same logic works for service notifications such as order updates, outage notices and account alerts, as long as the customer agreed to receive them on that channel.

Which checks answer which question?

CheckWhat it answersWhen to run itLink
whatsapp, telegram, viberIs the number registered on this messaging app?Ticket opened, profile updated, delivery failedWhatsApp, Telegram, Viber
emailDoes the mailbox exist at a major webmail provider?Sign-up, e-mail change, bounceE-mail mailbox check
carrierIs the number mobile, fixed line or VoIP?Once per number, before choosing SMS or voiceCarrier lookup
hlrIs the mobile line reachable right now?Before a time-critical SMSHLR lookup
imessage, rcs (bulk only)Can the number receive iMessage or RCS?Periodic bulk job over active customersiMessage, RCS

Check only the channels you actually send on. Each channel is a separate check and a separate charge.

What should you do with each result?

ResultSuggested routing
Preferred app registered: trueSend the reply there
Preferred app registered: falseSkip that app; try the next consented channel
Any check registered: null (unknown)Keep the customer's last working channel; check again later
Mailbox registered: falseDon't rely on e-mail; ask the customer to confirm their address on the next contact
Mailbox unknown with UNSUPPORTED_PROVIDERNormal for company domains; send e-mail as usual and watch for bounces
line_type: fixed_lineNo SMS; use voice, e-mail or an app if one is registered
HLR status: unreachableHold the SMS or send on an app or e-mail; retry later

What does a request look like?

This test-mode request checks one number on two messaging apps and one e-mail address. +447700900001 answers registered: true for every yes/no service, and [email protected] answers registered: false.

curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+447700900001"],"emails":["[email protected]"],"checks":["whatsapp","viber","email"],"wait":5}'

Runs as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

Response (excerpt, test mode: the checks of the phone row, then of the e-mail row):

JSON
[
  {
    "whatsapp.registered": {
      "service": "whatsapp.registered", "status": "completed", "registered": true, "attributes": null,
      "confidence": "high", "confidence_score": 0.99, "checked_at": "2026-09-29T09:14:02.118Z",
      "cached": false, "age_seconds": 0, "billed": false, "reason": null, "poll_after_ms": null
    },
    "viber.registered": {
      "service": "viber.registered", "status": "completed", "registered": true, "attributes": null,
      "confidence": "high", "confidence_score": 0.99, "checked_at": "2026-09-29T09:14:02.118Z",
      "cached": false, "age_seconds": 0, "billed": false, "reason": null, "poll_after_ms": null
    }
  },
  {
    "email.valid": {
      "service": "email.valid", "status": "completed", "registered": false, "attributes": null,
      "confidence": "high", "confidence_score": 0.99, "checked_at": "2026-09-29T09:14:02.118Z",
      "cached": false, "age_seconds": 0, "billed": false, "reason": null, "poll_after_ms": null
    }
  }
]

Both apps are reachable and the mailbox doesn't exist, so this reply should go on the customer's preferred app, and the next agent contact should confirm the e-mail address. Rows come numbers first, then e-mails. For a ready-made version of this logic, see the choose-channel recipe.

How much does it cost?

You pay per check, and only for conclusive answers. Unknown answers are free, and so are invalid, duplicate and unsupported-country results. The request above runs three checks and can bill up to three. Company e-mail domains the mailbox check doesn't cover return unknown and cost nothing.

Support routing is cheap to run because channel data is stable: check once, store the answer, and re-check only on events. Repeat checks of the same number inside the freshness window come free from your account's cache. For a whole customer base, a bulk job costs less per check than real-time lookups, and POST /v1/jobs/estimate shows the maximum cost for free before you start. If you add the HLR lookup for urgent messages, it costs $0.005 per number. See pricing for every current rate.

Channel checks tell you what is technically possible, not what the customer wants or what you're allowed to do.

  • Consent comes first. Check only channels the customer agreed to for support or service messages. Messaging platforms have their own business rules. For example, WhatsApp's Business Messaging Policy requires opt-in before a business messages someone there.
  • Service is not marketing. A support opt-in doesn't cover promotions. Keep the two consents separate in your records.
  • Minimize what you store. Keep registered and checked_at per channel, not full responses. Say in your privacy notice that you check contact channels to deliver service messages.
  • Existing customers only. Don't run channel checks on people who haven't contacted you or given you their details. Our acceptable use policy forbids using checks to find people to message, and requests that look like number-range scans are rejected.

Platform names are used descriptively. MobileValidate isn't affiliated with or endorsed by any messaging platform.

What are the common mistakes?

  • Treating unknown as "not registered". Unknown means no conclusive answer. Switching channel because of a timeout sends customers to a worse channel for no reason.
  • Checking every channel on every message. It multiplies cost and adds latency to replies. Check on events and store the result.
  • Ignoring the customer's stated preference. A customer who asked for e-mail should get e-mail, even if a messaging app is registered.
  • Never refreshing. Numbers change hands and people drop apps. Use checked_at to find stale answers.
  • Sending urgent SMS blind. For time-critical notices, an HLR check first tells you whether the phone is reachable, so you can switch to another channel straight away.

For background on how messaging habits differ by market, read choosing a messaging channel by country. For the marketing side of the same question, see channel selection for consented messaging.

Frequently asked questions

What is support channel routing?

It means sending each support reply or service notification on a channel the customer can actually receive, chosen from the channels they agreed to. A lookup tells you which messaging apps the number is registered on, whether the mobile line is reachable and whether the e-mail mailbox exists.

Does an app account mean I can message the customer there?

No. A registered account shows the channel can reach the number. Whether you may use it depends on the customer's consent and the platform's business messaging rules, which usually require opt-in for business messages.

Should I check before every support message?

No. Channel data changes slowly. Check when a ticket is opened or a customer updates their details, store the result with checked_at, and re-check when a delivery fails or the stored result is older than your refresh window.

What happens when a check returns unknown?

Unknown means no conclusive answer, for example a timeout. It is not charged and it is not a no. Keep the customer's usual channel, or fall back to e-mail or SMS, and check again later.

Can I check iMessage and RCS in real time?

No. iMessage and RCS checks are available in bulk jobs only. Run them over your active customer base ahead of time and store the result in your help-desk or CRM.

Do you return the customer's name or profile from the messaging app?

No. Channel checks answer registered, not registered or unknown, with the time we checked. Names, photos, status texts and profile details are never returned.

Is the HLR check needed for support routing?

Only when reachability matters, for example before a time-critical SMS such as a delivery window or an outage notice. For most replies the messaging-app and e-mail checks are enough.

Know before you send.

Tell us about your use case. We review every request and set you up with test and live keys.