{"id":286,"date":"2026-10-25T13:05:25","date_gmt":"2026-10-25T13:05:25","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/estado-mensaje-webhook-whatsapp\/"},"modified":"2026-10-25T13:05:35","modified_gmt":"2026-10-25T13:05:35","slug":"estado-mensaje-webhook-whatsapp","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/","title":{"rendered":"Estados de mensaje en la API de WhatsApp: sent, delivered, read y failed por webhook"},"content":{"rendered":"\n<p><em>Actualizado el 25\/10\/2026<\/em><\/p>\n\n\n\n<p>En la API de WhatsApp, el estado de un mensaje enviado llega por el webhook, en el arreglo <code>statuses<\/code>, y no en la respuesta del env\u00edo. Los valores posibles son <code>sent<\/code> (sali\u00f3 de los servidores de WhatsApp), <code>delivered<\/code> (lleg\u00f3 al dispositivo), <code>read<\/code> (se mostr\u00f3 en un chat abierto), <code>played<\/code> (nota de voz reproducida por primera vez) y <code>failed<\/code> (no se pudo enviar o entregar, con el motivo en <code>errors<\/code>). Cada evento trae el <code>wamid<\/code> del mensaje, y tu sistema debe guardar el estado m\u00e1s avanzado sin dejar que un evento atrasado haga retroceder el registro.<\/p>\n\n\n\n<p>Esta gu\u00eda muestra qu\u00e9 significa cada estado, los payloads, c\u00f3mo leer errores y cobro y un modelo de almacenamiento en Node.js y Python.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La respuesta del env\u00edo no es el estado<\/h2>\n\n\n\n<p>Cuando llamas al endpoint de mensajes, la respuesta 200 trae el <code>wamid<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"contacts\": [{ \"input\": \"5215512345678\", \"wa_id\": \"5215512345678\" }],\n  \"messages\": [{ \"id\": \"wamid.HBgNNTIxNTUxMjM0NTY3OBUCABEYEjQ...\" }]\n}<\/code><\/pre>\n\n\n\n<p>Eso solo significa que Meta acept\u00f3 la solicitud. El mensaje todav\u00eda puede fallar, por ejemplo por el l\u00edmite de marketing por usuario o porque el n\u00famero no tiene WhatsApp. Guarda el <code>wamid<\/code> al enviar: es la clave que une el mensaje con los estados que llegar\u00e1n despu\u00e9s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Los cinco estados de la Cloud API<\/h2>\n\n\n\n<p>La <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/reference\/messages\/status\" target=\"_blank\" rel=\"noreferrer noopener\">referencia del webhook de estado<\/a> define:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Estado<\/th><th>Significado<\/th><th>En la app del cliente<\/th><\/tr><\/thead><tbody><tr><td><code>sent<\/code><\/td><td>El mensaje sali\u00f3 de los servidores de WhatsApp<\/td><td>Una palomita<\/td><\/tr><tr><td><code>delivered<\/code><\/td><td>El mensaje lleg\u00f3 al dispositivo del destinatario<\/td><td>Dos palomitas<\/td><\/tr><tr><td><code>read<\/code><\/td><td>El mensaje se mostr\u00f3 en un chat abierto en el dispositivo<\/td><td>Dos palomitas azules<\/td><\/tr><tr><td><code>played<\/code><\/td><td>Primera reproducci\u00f3n de un mensaje de voz<\/td><td>Micr\u00f3fono azul<\/td><\/tr><tr><td><code>failed<\/code><\/td><td>El mensaje no se pudo enviar o entregar<\/td><td>Tri\u00e1ngulo rojo de error<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Dos detalles de la documentaci\u00f3n cambian la forma de procesarlos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>read<\/code> puede llegar sin <code>delivered<\/code>.<\/strong> Si el cliente tiene el chat abierto cuando llega el mensaje, Meta omite el webhook de <code>delivered<\/code> y env\u00eda solo <code>read<\/code>. Trata <code>read<\/code> como &#8220;entregado y le\u00eddo&#8221;.<\/li>\n\n\n<li><strong><code>played<\/code> solo existe para notas de voz.<\/strong> Se dispara la primera vez que el cliente reproduce un audio enviado como voz (mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/enviar-multimedia-api-whatsapp\/\">c\u00f3mo enviar audio y notas de voz<\/a>).<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">El payload de estado<\/h2>\n\n\n\n<p>Todo estado llega con <code>field: \"messages\"<\/code>, igual que los mensajes recibidos. Lo que cambia es que <code>value<\/code> trae <code>statuses<\/code> en lugar de <code>messages<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"object\": \"whatsapp_business_account\",\n  \"entry\": [{\n    \"id\": \"WABA_ID\",\n    \"changes\": [{\n      \"field\": \"messages\",\n      \"value\": {\n        \"messaging_product\": \"whatsapp\",\n        \"metadata\": { \"display_phone_number\": \"5215500000000\", \"phone_number_id\": \"PHONE_NUMBER_ID\" },\n        \"statuses\": [{\n          \"id\": \"wamid.HBgNNTIxNTUxMjM0NTY3OBUCABEYEjQ...\",\n          \"status\": \"delivered\",\n          \"timestamp\": \"1761400000\",\n          \"recipient_id\": \"5215512345678\",\n          \"pricing\": {\n            \"billable\": true,\n            \"pricing_model\": \"PMP\",\n            \"type\": \"regular\",\n            \"category\": \"marketing\"\n          }\n        }]\n      }\n    }]\n  }]\n}<\/code><\/pre>\n\n\n\n<p>Campos del objeto de estado:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Campo<\/th><th>Cu\u00e1ndo aparece<\/th><th>Para qu\u00e9 sirve<\/th><\/tr><\/thead><tbody><tr><td><code>id<\/code><\/td><td>Siempre<\/td><td>El <code>wamid<\/code> del mensaje enviado<\/td><\/tr><tr><td><code>status<\/code><\/td><td>Siempre<\/td><td>Uno de los cinco valores anteriores<\/td><\/tr><tr><td><code>timestamp<\/code><\/td><td>Siempre<\/td><td>Momento (Unix, en segundos) en que se gener\u00f3 el evento<\/td><\/tr><tr><td><code>recipient_id<\/code><\/td><td>Siempre<\/td><td>N\u00famero del destinatario (o ID del grupo, en grupos)<\/td><\/tr><tr><td><code>biz_opaque_callback_data<\/code><\/td><td>Si enviaste ese campo en el mensaje<\/td><td>Devuelve un identificador tuyo, como el ID del pedido o de la campa\u00f1a<\/td><\/tr><tr><td><code>pricing<\/code><\/td><td>En <code>sent<\/code> y en uno de los dos, <code>delivered<\/code> o <code>read<\/code><\/td><td>Categor\u00eda y tipo de cobro<\/td><\/tr><tr><td><code>errors<\/code><\/td><td>Solo en <code>failed<\/code><\/td><td>C\u00f3digo y descripci\u00f3n del error<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>En mensajes a grupos, <code>recipient_id<\/code> trae el ID del grupo, y el n\u00famero del participante va en <code>recipient_participant_id<\/code>.<\/p>\n\n\n\n<p>Un mismo <code>POST<\/code> puede traer varios estados, incluso de mensajes distintos. Recorre siempre el arreglo completo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El objeto <code>pricing<\/code><\/h3>\n\n\n\n<p><code>pricing<\/code> es la forma m\u00e1s confiable de saber si el mensaje se cobr\u00f3 y c\u00f3mo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>category<\/code><\/strong>: categor\u00eda de la tarifa, como <code>marketing<\/code>, <code>utility<\/code>, <code>authentication<\/code> o <code>service<\/code>.<\/li>\n\n\n<li><strong><code>type<\/code><\/strong>: <code>regular<\/code> (cobrado), <code>free_customer_service<\/code>, <code>free_entry_point<\/code> (enviado en la ventana gratuita que abre un anuncio de clic a WhatsApp) o <code>free_group_customer_service<\/code>.<\/li>\n\n\n<li><strong><code>billable<\/code><\/strong>: Meta lo marca como obsoleto. Usa <code>type<\/code> y <code>category<\/code>.<\/li>\n\n<\/ul>\n\n\n\n<p>Desde el 1 de octubre de 2026, Meta cambi\u00f3 el significado de <code>type<\/code>: los mensajes de utilidad enviados dentro de la ventana de atenci\u00f3n ahora llegan como <code>regular<\/code>, y <code>free_customer_service<\/code> pas\u00f3 a indicar un mensaje de servicio dentro de la cuota gratuita del n\u00famero (1.000 al mes). Los mensajes de servicio por encima de esa cuota tambi\u00e9n llegan como <code>regular<\/code>. Si tu reporte de costos usa <code>type<\/code>, revisa la regla. Mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/costo-campana-whatsapp\/\">cu\u00e1nto cuesta una campa\u00f1a de WhatsApp<\/a> para sumar los costos.<\/p>\n\n\n\n<p>Desde la versi\u00f3n 24.0 de la Graph API, el objeto <code>conversation<\/code> deja de venir en los estados, salvo en mensajes enviados dentro de una ventana de punto de entrada gratuito.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Estado <code>failed<\/code>: c\u00f3mo leer el error<\/h2>\n\n\n\n<p>Cuando el mensaje falla, el estado trae <code>errors<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"id\": \"wamid.HBgNNTIxNTUxMjM0NTY3OBUCABEYEjQ...\",\n  \"status\": \"failed\",\n  \"timestamp\": \"1761400005\",\n  \"recipient_id\": \"5215512345678\",\n  \"errors\": [{\n    \"code\": 131049,\n    \"title\": \"This message was not delivered to maintain healthy ecosystem engagement.\",\n    \"message\": \"This message was not delivered to maintain healthy ecosystem engagement.\",\n    \"error_data\": { \"details\": \"In order to maintain a healthy ecosystem engagement, the message failed to be delivered.\" },\n    \"href\": \"\/documentation\/business-messaging\/whatsapp\/support\/error-codes\"\n  }]\n}<\/code><\/pre>\n\n\n\n<p>Guarda el <code>code<\/code> y el <code>error_data.details<\/code>. Los c\u00f3digos que m\u00e1s aparecen en estados de falla, seg\u00fan la <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/support\/error-codes\" target=\"_blank\" rel=\"noreferrer noopener\">lista oficial de errores<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>C\u00f3digo<\/th><th>Causa<\/th><th>Acci\u00f3n<\/th><\/tr><\/thead><tbody><tr><td><code>131026<\/code><\/td><td>Destinatario sin WhatsApp, sin aceptar los t\u00e9rminos m\u00e1s recientes o con la app desactualizada<\/td><td>Confirma el n\u00famero; no reintentes en bucle<\/td><\/tr><tr><td><code>131047<\/code><\/td><td>Pasaron m\u00e1s de 24 horas desde el \u00faltimo mensaje del cliente<\/td><td>Env\u00eda una plantilla<\/td><\/tr><tr><td><code>131049<\/code><\/td><td>No entregado para cuidar el engagement (l\u00edmite de marketing por usuario)<\/td><td>Espera al menos 24 horas; mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/error-131049-whatsapp-limite-marketing\/\">l\u00edmite de marketing por usuario<\/a><\/td><\/tr><tr><td><code>131050<\/code><\/td><td>El cliente dej\u00f3 de recibir marketing de la empresa<\/td><td>M\u00e1rcalo como opt-out; no reintentes<\/td><\/tr><tr><td><code>131053<\/code><\/td><td>Fall\u00f3 la carga del archivo, en general por tipo no compatible<\/td><td>Revisa el MIME del archivo<\/td><\/tr><tr><td><code>131056<\/code><\/td><td>Demasiados mensajes al mismo destinatario en poco tiempo<\/td><td>Espera antes de volver a escribirle a esa persona<\/td><\/tr><tr><td><code>132015<\/code><\/td><td>Plantilla pausada por baja calidad<\/td><td>Edita la plantilla y espera la aprobaci\u00f3n<\/td><\/tr><tr><td><code>131000<\/code><\/td><td>Error desconocido<\/td><td>Reintenta; si persiste, abre un ticket<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La lista completa, con m\u00e1s c\u00f3digos, est\u00e1 en <a href=\"https:\/\/vectalk.com.br\/blog\/es\/errores-api-whatsapp\/\">errores de la API de WhatsApp<\/a>.<\/p>\n\n\n\n<p>Un mensaje <code>failed<\/code> no se entrega y, por lo tanto, no entra en el cobro por mensaje entregado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Orden, duplicados y demoras<\/h2>\n\n\n\n<p>La documentaci\u00f3n de Meta no promete que los estados lleguen en orden, y advierte que los reintentos de entrega del webhook pueden generar notificaciones duplicadas. Los reintentos siguen hasta 7 d\u00edas. En la pr\u00e1ctica:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Puede llegar <code>read<\/code> antes que <code>delivered<\/code><\/strong>, o <code>delivered<\/code> despu\u00e9s de <code>read<\/code>. Nunca sobrescribas un estado m\u00e1s avanzado con uno anterior.<\/li>\n\n\n<li><strong>El mismo estado puede llegar dos veces.<\/strong> Usa <code>id<\/code> + <code>status<\/code> como clave de idempotencia.<\/li>\n\n\n<li><strong>Un estado puede llegar horas o d\u00edas despu\u00e9s<\/strong> si tu endpoint estuvo ca\u00eddo. Guarda el <code>timestamp<\/code> del evento, no la hora en que lo procesaste.<\/li>\n\n\n<li><strong><code>delivered<\/code> puede no llegar nunca<\/strong>, por ejemplo si el tel\u00e9fono del cliente sigue apagado. No trates &#8220;sin <code>delivered<\/code> en 5 minutos&#8221; como una falla.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo guardar los estados sin retroceder<\/h2>\n\n\n\n<p>El modelo m\u00e1s simple: una fila por mensaje enviado, una columna de hora por etapa y un campo con el estado m\u00e1s avanzado. Ejemplo en Node.js con PostgreSQL (biblioteca <code>pg<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-js\">const ORDEN = { sent: 1, delivered: 2, read: 3, played: 4 };\n\nexport async function guardarEstado(db, st) {\n  const cuando = new Date(Number(st.timestamp) * 1000);\n\n  if (st.status === 'failed') {\n    const err = st.errors?.[0] ?? {};\n    await db.query(\n      `UPDATE envios SET failed_at = $2, error_codigo = $3, error_detalle = $4,\n         status = CASE WHEN status_orden = 0 THEN 'failed' ELSE status END\n       WHERE wamid = $1`,\n      [st.id, cuando, err.code ?? null, err.error_data?.details ?? err.message ?? null],\n    );\n    return;\n  }\n\n  const orden = ORDEN[st.status];\n  if (!orden) return; \/\/ estado desconocido: reg\u00edstralo en log y sigue\n\n  await db.query(\n    `UPDATE envios SET\n       ${st.status}_at = COALESCE(${st.status}_at, $2),\n       delivered_at = CASE WHEN $3 &gt;= 3 THEN COALESCE(delivered_at, $2) ELSE delivered_at END,\n       categoria = COALESCE($4, categoria),\n       tipo_cobro = COALESCE($5, tipo_cobro),\n       status = CASE WHEN $3 &gt; status_orden THEN $6 ELSE status END,\n       status_orden = GREATEST(status_orden, $3)\n     WHERE wamid = $1`,\n    [st.id, cuando, orden, st.pricing?.category ?? null, st.pricing?.type ?? null, st.status],\n  );\n}<\/code><\/pre>\n\n\n\n<p>Lo que garantiza este c\u00f3digo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No retrocede.<\/strong> <code>status_orden<\/code> solo aumenta; un <code>delivered<\/code> atrasado no borra un <code>read<\/code>.<\/li>\n\n\n<li><strong>Idempotente.<\/strong> Guardar el mismo evento dos veces da el mismo resultado, gracias al <code>COALESCE<\/code>.<\/li>\n\n\n<li><strong><code>read<\/code> implica entrega.<\/strong> Si se omiti\u00f3 el <code>delivered<\/code>, <code>delivered_at<\/code> se completa con la hora del <code>read<\/code>.<\/li>\n\n\n<li><strong>Una falla no borra un \u00e9xito.<\/strong> Si la fila ya tiene un estado positivo, el <code>failed<\/code> se registra en los campos de error sin cambiar el estado principal, para que lo investigues.<\/li>\n\n<\/ul>\n\n\n\n<p>La misma l\u00f3gica en Python, sin base de datos, para pruebas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-python\">ORDEN = {\"sent\": 1, \"delivered\": 2, \"read\": 3, \"played\": 4}\n\n\ndef aplicar_estado(envio: dict, st: dict) -&gt; dict:\n    cuando = int(st[\"timestamp\"])\n    if st[\"status\"] == \"failed\":\n        err = (st.get(\"errors\") or [{}])[0]\n        envio.update(failed_at=cuando, error_codigo=err.get(\"code\"))\n        if envio.get(\"status_orden\", 0) == 0:\n            envio[\"status\"] = \"failed\"\n        return envio\n\n    orden = ORDEN.get(st[\"status\"])\n    if orden is None:\n        return envio\n    envio.setdefault(f\"{st['status']}_at\", cuando)\n    if orden &gt;= 3:\n        envio.setdefault(\"delivered_at\", cuando)\n    if orden &gt; envio.get(\"status_orden\", 0):\n        envio.update(status=st[\"status\"], status_orden=orden)\n    return envio<\/code><\/pre>\n\n\n\n<p>Para probar con eventos reales en tu computadora, mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/\">c\u00f3mo probar el webhook de WhatsApp en local<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vincular el estado a tu negocio con <code>biz_opaque_callback_data<\/code><\/h3>\n\n\n\n<p>Al enviar, puedes incluir <code>biz_opaque_callback_data<\/code> con un identificador tuyo (por ejemplo <code>\"pedido:48213\"<\/code> o <code>\"campana:black-friday\"<\/code>). Vuelve en todos los estados de ese mensaje. As\u00ed evitas una consulta extra para saber a qu\u00e9 pedido o campa\u00f1a pertenece el <code>wamid<\/code> y facilitas los reportes por campa\u00f1a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e9tricas que salen de los estados<\/h2>\n\n\n\n<p>Con las horas guardadas, las m\u00e9tricas m\u00e1s usadas son directas:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>M\u00e9trica<\/th><th>C\u00e1lculo<\/th><\/tr><\/thead><tbody><tr><td>Tasa de entrega<\/td><td>mensajes con <code>delivered_at<\/code> o <code>read_at<\/code> \u00f7 mensajes enviados<\/td><\/tr><tr><td>Tasa de lectura<\/td><td>mensajes con <code>read_at<\/code> \u00f7 mensajes entregados<\/td><\/tr><tr><td>Tiempo hasta la lectura<\/td><td><code>read_at<\/code> \u2212 <code>sent_at<\/code><\/td><\/tr><tr><td>Tasa de falla por c\u00f3digo<\/td><td>conteo de <code>error_codigo<\/code> \u00f7 mensajes enviados<\/td><\/tr><tr><td>Costo estimado<\/td><td>suma de tarifas por <code>categoria<\/code>, solo de mensajes con <code>tipo_cobro = regular<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Para m\u00e9tricas de atenci\u00f3n (tiempo de primera respuesta, tiempo medio de atenci\u00f3n), mira <a href=\"https:\/\/vectalk.com.br\/blog\/es\/metricas-atencion-whatsapp\/\">m\u00e9tricas de atenci\u00f3n en WhatsApp<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo hacerlo con Vectalk<\/h2>\n\n\n\n<p>Vectalk reenv\u00eda a tus URL el mismo webhook de estado de Meta, con <code>statuses<\/code>, <code>pricing<\/code> y <code>errors<\/code> en el formato descrito. Basta con registrar la URL con <code>POST https:\/\/apis.vectalk.com.br\/api\/webhooks<\/code> y responder 200 en menos de 20 segundos.<\/p>\n\n\n\n<p>Adem\u00e1s del webhook, Vectalk guarda el historial de mensajes y permite consultarlo por estado o por <code>wamid<\/code>, lo que ayuda a conciliar eventos que tu sistema pudo haber perdido:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl \"https:\/\/apis.vectalk.com.br\/api\/messages?status=failed&amp;direction=outbound&amp;from=2026-10-01&amp;to=2026-10-25\" \\\n  -H \"Authorization: Bearer $VECTALK_TOKEN\"\n\ncurl \"https:\/\/apis.vectalk.com.br\/api\/messages?messageId=wamid.HBgNNTIxNTUxMjM0NTY3OBUCABEYEjQ...\" \\\n  -H \"Authorization: Bearer $VECTALK_TOKEN\"<\/code><\/pre>\n\n\n\n<p>Los filtros aceptados (<code>status<\/code>, <code>from<\/code>, <code>to<\/code>, <code>messageId<\/code>, <code>direction<\/code>, <code>page<\/code>, <code>limit<\/code>) est\u00e1n en <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/messages\/list\">Listar mensajes<\/a>, y el formato de los eventos en <a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">Webhooks<\/a> (documentaci\u00f3n en portugu\u00e9s). El costo de los mensajes llega en la factura de Vectalk, sin tarjeta en Meta. Crea tu cuenta en <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preguntas frecuentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPor qu\u00e9 recib\u00ed <code>read<\/code> sin <code>delivered<\/code>?<\/h3>\n\n\n\n<p>Porque el cliente ten\u00eda el chat abierto cuando lleg\u00f3 el mensaje. En ese caso, Meta env\u00eda solo <code>read<\/code>. Considera el mensaje entregado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El mensaje se qued\u00f3 en <code>sent<\/code>. \u00bfQu\u00e9 pas\u00f3?<\/h3>\n\n\n\n<p>Sali\u00f3 de los servidores de WhatsApp, pero todav\u00eda no lleg\u00f3 al dispositivo, por ejemplo porque el tel\u00e9fono est\u00e1 apagado o sin conexi\u00f3n. El <code>delivered<\/code> llega cuando el dispositivo lo recibe. Si despu\u00e9s llega <code>failed<\/code>, el c\u00f3digo explica el motivo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfSe cobra un mensaje <code>failed<\/code>?<\/h3>\n\n\n\n<p>No. Meta cobra los mensajes entregados. Un mensaje que fall\u00f3 no se entreg\u00f3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPuedo consultar el estado de un mensaje por la API de Meta en lugar de esperar el webhook?<\/h3>\n\n\n\n<p>La Cloud API entrega los estados por webhook, as\u00ed que tu endpoint tiene que estar disponible y guardando los eventos. En Vectalk, tambi\u00e9n puedes consultar el historial con el endpoint de listado de mensajes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfCu\u00e1nto tiempo despu\u00e9s del env\u00edo puede llegar un estado?<\/h3>\n\n\n\n<p>No hay un plazo fijo. El <code>read<\/code> depende de cu\u00e1ndo el cliente abre el chat, y los reintentos de entrega del webhook pueden durar hasta 7 d\u00edas si tu endpoint est\u00e1 ca\u00eddo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Fuentes oficiales consultadas el 25\/10\/2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/reference\/messages\/status\" target=\"_blank\" rel=\"noreferrer noopener\">Referencia del webhook de estado<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/overview\" target=\"_blank\" rel=\"noreferrer noopener\">Webhooks: visi\u00f3n general<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/support\/error-codes\" target=\"_blank\" rel=\"noreferrer noopener\">C\u00f3digos de error<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">Precios<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/audio-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Mensajes de audio<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/messages\/list\">Documentaci\u00f3n de Vectalk: Listar mensajes<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 significa cada estado de mensaje de la API de WhatsApp, c\u00f3mo llega por webhook, c\u00f3mo leer errores y cobro y c\u00f3mo guardar los estados sin perderlos ni retroceder.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[12],"tags":[],"class_list":["post-286","post","type-post","status-publish","format-standard","hentry","category-uncategorized-es"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Estado de mensaje en la API de WhatsApp | Vectalk<\/title>\n<meta name=\"description\" content=\"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Estado de mensaje en la API de WhatsApp | Vectalk\" \/>\n<meta property=\"og:description\" content=\"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T13:05:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T13:05:35+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"Estados de mensaje en la API de WhatsApp: sent, delivered, read y failed por webhook\",\"datePublished\":\"2026-10-25T13:05:25+00:00\",\"dateModified\":\"2026-10-25T13:05:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/\"},\"wordCount\":1573,\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/\",\"name\":\"Estado de mensaje en la API de WhatsApp | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T13:05:25+00:00\",\"dateModified\":\"2026-10-25T13:05:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/estado-mensaje-webhook-whatsapp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Estados de mensaje en la API de WhatsApp: sent, delivered, read y failed por webhook\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Estado de mensaje en la API de WhatsApp | Vectalk","description":"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/","og_locale":"en_US","og_type":"article","og_title":"Estado de mensaje en la API de WhatsApp | Vectalk","og_description":"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.","og_url":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-25T13:05:25+00:00","article_modified_time":"2026-10-25T13:05:35+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"Estados de mensaje en la API de WhatsApp: sent, delivered, read y failed por webhook","datePublished":"2026-10-25T13:05:25+00:00","dateModified":"2026-10-25T13:05:35+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/"},"wordCount":1573,"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/","url":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/","name":"Estado de mensaje en la API de WhatsApp | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-25T13:05:25+00:00","dateModified":"2026-10-25T13:05:35+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"Estado de mensaje en la API de WhatsApp: qu\u00e9 son sent, delivered, read, played y failed, payloads del webhook, errores, cobro y c\u00f3mo guardarlos.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Estados de mensaje en la API de WhatsApp: sent, delivered, read y failed por webhook"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=286"}],"version-history":[{"count":1,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/286\/revisions"}],"predecessor-version":[{"id":289,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/286\/revisions\/289"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}