Acuses de recibo

El estado de entrega de un SMS, uno por uno.

Un SMS aceptado por la API todavía no es un SMS recibido. Entre ambos, el operador (IAM, Orange o Inwi) devuelve un acuse de recibo: el DLR. Así se lee y así se usa en su aplicación.

Los seis estados de un mensaje

Cada mensaje tiene un estado, legible con GET /v1/messages/{id} y enviado a su webhook.

  • queued — aceptado por EnvoiSMS.ma, pendiente de salida.
  • sent — entregado a la red; el operador aún no se ha pronunciado.
  • delivered — el operador confirma la entrega en el teléfono.
  • failed — el operador o la ruta rechazó el mensaje; error_code indica el motivo.
  • undeliverable — no se puede contactar con el número (inexistente o dado de baja).
  • unconfirmed — la red aceptó el mensaje pero nunca dio un veredicto en la ventana de informe; un DLR tardío sustituye este estado.

De dónde viene el acuse de recibo

El DLR (Delivery Report) lo emite el operador del destinatario, no nosotros: lo transmitimos tal cual. Un teléfono apagado o sin cobertura retrasa la entrega, y por tanto el DLR, a veces varias horas. «sent» no es un fallo: es una espera.

Leer un fallo: error_code

Un mensaje failed o undeliverable lleva un error_code corto y estable sobre el que su código puede decidir.

  • DLR_<estado de red> — el fallo viene del informe del operador (por ejemplo DLR_REJECTD, DLR_EXPIRED, DLR_UNDELIV).
  • GATEWAY_* — fallo en el enrutamiento de EnvoiSMS.ma, antes de llegar a la red.
  • META_* — rechazo de WhatsApp, para los mensajes enviados por ese canal.
  • Un código desconocido se trata como fallo definitivo: pueden aparecer valores nuevos.

Recibir los estados por webhook

Declare una URL y suscríbala a los eventos message.sent, message.delivered y message.failed. Cada llamada va firmada: verifique la cabecera X-EnvoiSMS-Signature-256 (HMAC-SHA256 del timestamp y del cuerpo) y rechace un timestamp de más de 5 minutos. Los metadatos enviados con el mensaje vuelven en el webhook, para enlazar el estado con su pedido o su usuario.

Qué se factura

Un mensaje fallido se reembolsa en cuanto tenemos la prueba de que la red no lo facturó; cuando falta esa prueba, nuestro equipo lo revisa en lugar de reembolsarlo a ciegas. Para un código OTP que genere usted mismo, añada metadata.purpose = "otp": ante un fallo definitivo hacia un número marroquí, el código aún válido (menos de 10 minutos) se reenvía una vez por otra ruta SMS, sin coste adicional.

Todo lo que debe saber sobre Acuses de recibo.

¿Por qué mi SMS se queda en «sent»?
El operador aún no ha devuelto el acuse de recibo, a menudo porque el teléfono está apagado o sin cobertura. El estado pasará a delivered o failed al llegar el DLR, o a unconfirmed si no llega ningún veredicto en la ventana de informe.
¿«delivered» significa que el mensaje se ha leído?
No. En un SMS, delivered significa que el operador lo entregó al teléfono. El SMS no tiene confirmación de lectura; WhatsApp sí (read).
¿Se factura un SMS fallido?
Se reembolsa en cuanto tenemos la prueba de que la red no lo facturó. Si no, nuestro equipo lo revisa antes de decidir.
¿Consultar la API o usar un webhook?
El webhook: el estado se le envía en cuanto cambia, sin bucles de consulta. GET /v1/messages/{id} sigue siendo útil para una comprobación puntual o una recuperación.