Lundi matin, 9h30. Un ticket de support tombe côté client : *"Je n'arrive pas à me connecter, je ne reçois pas le code SMS sur mon numéro Inwi."* Vous testez sur votre propre numéro IAM, le code arrive instantanément. Vous regardez les logs de votre API : le statut est en "Pending".
C'est un scénario classique quand on intègre de l'authentification OTP au Maroc. Un SMS qui n'arrive pas (ou qui arrive 15 minutes plus tard) n'est pas forcément lié à une panne globale. Souvent, la friction vient d'un détail de configuration de votre côté, ou d'une règle stricte côté opérateur.
Voici les 7 causes les plus fréquentes qui bloquent la réception d'un OTP au Maroc, et comment réagir sans perdre de temps.
Les 7 causes les plus fréquentes
1. Le Sender ID n'est pas whiteliste chez l'opérateur concerné
Un Sender ID peut être validé chez Maroc Telecom, mais pas encore actif chez Orange ou inwi. C'est le motif n°1 des disparités de réception. Si l'API renvoie un HTTP 400 ou 403 avec un message mentionnant une restriction de Sender ID, c'est là qu'il faut creuser. L'activation multi-opérateur n'est jamais instantanée.
2. Le numéro de destination est invalide ou mal formaté
Au Maroc, le format local (06XXXXXXXX ou 07XXXXXXXX) doit être converti au format international (2126XXXXXXXX) avant l'envoi. Si votre backend ou votre formulaire front-end ne force pas cette conversion, l'opérateur rejettera la requête avec une erreur HTTP 400 Bad Request (Invalid Destination Address).
3. La saturation réseau aux heures de pointe
Les soirs de Ramadan (juste avant ou après le Ftour) ou les veilles d'Aïd, le trafic SMS explose. Les opérateurs mettent en place des files d'attente (throttling). Un SMS OTP qui arrive normalement vite peut mettre 15 à 20 minutes à arriver. Dans ce cas, votre statut restera bloqué sur Pending.
4. Le contenu est détecté comme SPAM
Si votre OTP inclut des liens raccourcis (bit.ly), des caractères non standards, ou des mots-clés blacklistés ("gratuit", "gagnez"), le filtre anti-spam réseau peut le bloquer silencieusement. L'API peut renvoyer un statut Delivered alors que le message est bloqué côté opérateur. Restez sur un format ultra-basique : "Votre code de validation est le : 123456."
5. Une erreur d'encodage (Unicode vs GSM-7)
Si vous envoyez un message OTP en arabe sans configurer l'encodage UCS-2 (ou Unicode) dans les headers de votre requête API, le message peut arriver sous forme de points d'interrogation (????) ou être scindé et rejeté.
6. Le mobile du destinataire est hors réseau
Cela paraît évident, mais un téléphone en mode avion, éteint, ou sans couverture réseau ne recevra pas le message. L'opérateur gardera le SMS en file d'attente pendant une durée limitée (le Validity Period, souvent 24h à 48h) avant de l'abandonner définitivement (statut Failed).
7. Le compte API est à sec ou suspendu
Une erreur 401 Unauthorized ou 402 Payment Required dans vos logs indique généralement que votre solde de crédits est épuisé, ou que votre compte a été suspendu pour activité suspecte (volume anormalement élevé).
Comment lire le code de statut DLR
Ne devinez pas ce qui se passe : écoutez les Webhooks de statut (Delivery Reports ou DLR) que notre API vous renvoie.
Delivered: Le téléphone a confirmé au réseau qu'il a bien reçu le SMS. Si le client dit qu'il ne l'a pas, demandez-lui de vérifier ses SMS bloqués (filtre anti-spam iOS/Android).Pending: Le SMS est dans les serveurs de l'opérateur (IAM, Orange ou inwi). Le téléphone cible est probablement hors ligne ou le réseau est surchargé. Patientez.Failed: L'envoi a échoué. Le numéro n'existe pas, n'est plus attribué, ou le SMS a expiré dans la file d'attente.Unknown/Rejected: L'opérateur a refusé le message, souvent à cause d'un filtre anti-spam ou d'un Sender ID non autorisé.
Pour savoir si un taux de Delivered bas sur un opérateur est anormal, comparez-le aux taux de remise par opérateur (IAM, Orange, Inwi) que nous publions, calculés sur ces mêmes accusés finaux : baromètre SMS Maroc.
Checklist de diagnostic en 5 minutes
Lorsqu'un utilisateur se plaint, effectuez ces 3 vérifications dans vos logs :
- Vérifiez la réponse de l'API lors de l'envoi initial (POST). Avez-vous reçu un code HTTP
200/202(Succès) ou une erreur400/401? - Consultez le statut DLR final (le webhook). Est-il en
Pending,FailedouDelivered? - Comparez par opérateur. Le problème survient-il uniquement sur les numéros
0661(IAM) ou0614(Orange) ? Cela indique souvent un souci de whitelisting de Sender ID spécifique à un opérateur.
Quand contacter le support vs corriger soi-même
- Corrigez vous-même : Erreurs HTTP
400(numéro mal formaté, erreur de syntaxe JSON), erreurs401(clé API invalide), ou statutFailedisolé sur un seul numéro (souvent lié au mobile du client). - Contactez le support : Statut
UnknownouRejectedsystématique sur vos envois, délais dePendingdépassant les 2 heures sur plusieurs numéros différents, ou un Sender ID qui passe chez Orange mais pas chez inwi. Dans ce cas, ouvrez un ticket avec lesmessage_idconcernés pour que nous puissions analyser les journaux de routage bruts avec nos partenaires de routage.
Questions fréquentes
Quelle est la latence d'acheminement sur les réseaux IAM, Inwi et Orange ?
Sur nos routes locales vers Maroc Telecom (IAM), Orange et inwi, la distribution est instantanée et suivie en temps réel par accusé de réception (DLR).
Comment la plateforme gère-t-elle le format des numéros marocains ?
EnvoiSMS normalise automatiquement les numéros saisis (06..., 07..., 00212...) vers le standard E.164 (+212) pour éviter tout échec de distribution.