1msg official logo

WhatsApp Business API para acuse de soporte — reacción y confirmación de lectura

Este escenario combina sendReaction y readMessage durante la ventana de atención al cliente de 24 horas.

Descripción del caso de uso

Este escenario combina sendReaction y readMessage durante la ventana de atención al cliente de 24 horas. Una reacción de pulgar arriba en el id del mensaje entrante señala acuse sin otra burbuja de texto.

Ejemplo de plantilla

Tu mensaje fue registrado — estamos preparando una respuesta detallada.

La reacción emoji y la confirmación de lectura apuntan al id del mensaje entrante del payload del webhook.

Cuándo usarlo

  • pulido ux de soporte

Valor para el negocio

  • Inbound client message arrives via webhook with message id
  • sendReaction adds a thumbs-up emoji on the quoted inbound message
  • readMessage marks the inbound message as read in WhatsApp
  • Client perceives fast acknowledgement without extra text spam
  • Agent or automation continues with the detailed response when ready

Flujo de trabajo

  1. Llega un mensaje del cliente vía webhook con su id de mensaje.
  2. Tu backend envía una reacción de pulgar arriba citando ese id.
  3. readMessage marca el mensaje entrante como leído.
  4. El cliente ve el acuse mientras se prepara la respuesta detallada.
  5. El progreso de entrega se reporta de forma asíncrona — típicamente sent, luego delivered (o failed/undelivered).
  6. Tu sistema recibe el estado vía webhook (hooks[]) o consulta el estado de entrega y maneja fallos si es necesario.

Implementación técnica

Requisitos previos

  • Ventana de sesión de WhatsApp abierta y webhook entrante que provee el id del mensaje.
  • Canal 1MSG con acceso a sendReaction y readMessage.

Ejemplos de código

Node.js

#!/usr/bin/env node

// === Configuration (replace "___" placeholders) ===
const API_BASE_URL = "https://api.1msg.io"; // production 1MSG API base URL
const CHANNEL_ID = "___";                   // channel ID from 1MSG dashboard
const API_TOKEN = "___";                    // channel JWT token (Bearer)



// === Test data ===
const TEST_PHONE = "___";            // client phone in international format
const INBOUND_MESSAGE_ID = "___";         // inbound message ID for reaction/read

function normalizePhone(phone) {
  return String(phone).replace(/\D/g, "");
}

async function sendReactionAndRead({ phone, messageId }) {
  const reactionUrl = `${API_BASE_URL}/${CHANNEL_ID}/sendReaction`;
  const requestBody = {
    phone: normalizePhone(phone),
    body: "👍",
    quotedMsgId: messageId,
  };

  const reactionRes = await fetch(reactionUrl, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${API_TOKEN}`,
    },
    body: JSON.stringify(requestBody),
  });

  const reactionRaw = await reactionRes.text();
  let reactionData;
  try {
    reactionData = JSON.parse(reactionRaw);
  } catch {
    reactionData = null;
  }

  if (!reactionRes.ok || !reactionData || reactionData.sent !== true) {
    console.error("Send failed.");
    console.error(reactionRaw);
    process.exit(1);
  }


  const readUrl = `${API_BASE_URL}/${CHANNEL_ID}/readMessage`;
  const secondaryRequestBody = { messageId };

  const readRes = await fetch(readUrl, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${API_TOKEN}`,
    },
    body: JSON.stringify(secondaryRequestBody),
  });

  const readRaw = await readRes.text();
  let readData;
  try {
    readData = JSON.parse(readRaw);
  } catch {
    readData = null;
  }

  if (!readRes.ok || !readData || readData.result !== "success") {
    console.error("Send failed.");
    console.error(readRaw);
    process.exit(1);
  }
  console.log("API response:", readRaw);


  console.log("Message sent to client.");
  console.log("API response:", reactionRaw);
  return reactionData;
}

if (require.main === module) {
  sendReactionAndRead({ phone: TEST_PHONE, messageId: INBOUND_MESSAGE_ID }).catch((err) => {
    console.error("Execution failed:", err.message);
    process.exit(1);
  });
}

module.exports = { sendReactionAndRead };

Respuesta inmediata de la API (síncrona)

  • HTTP 2xx y JSON "sent": true significan que 1MSG aceptó el mensaje para envío — no que ya llegó al teléfono del cliente.
  • Guarda el campo `id` de la respuesta (valor tipo wamid.…). Úsalo para correlacionar callbacks de entrega o polling.
  • La respuesta también puede incluir message y description — solo informativos.

Estado de entrega (asíncrono)

  • Registra un webhook (POST …/webhook) para que 1MSG envíe actualizaciones de entrega a tu endpoint HTTPS en un payload `hooks[]` separado (sent, delivered, read, o failed/undelivered cuando aplique).
  • Opcionalmente consulta: GET {base}/{channel}/hookInfo?messageId=<id de sendTemplate>.
  • En la práctica, la entrega suele completarse en pocos segundos — pero eso no está garantizado por el contrato de la API.

Errores frecuentes

  • Ventana de sesión cerrada (sin mensaje del cliente en 24 horas)
  • Número de teléfono inválido o no normalizado
  • Cuerpo del mensaje / URL de media ausente o inválida
  • Fallo de entrega — revisa el webhook de estado y la política de reintentos

Preguntas frecuentes

  • ¿Necesito una plantilla? No — este escenario usa un mensaje de sesión dentro de la ventana de atención de 24 horas.
  • ¿Cuándo se cierra la ventana de sesión? Si el cliente no escribió ni respondió en 24 horas, sendMessage fallará hasta que una plantilla reabra el chat.
  • ¿Cómo verifico la entrega? sent: true solo confirma aceptación. Rastrea la entrega vía webhook hooks[] o polling.
  • ¿Qué pasa si no se entrega? Registra el hook failed/undelivered, verifica la ventana de sesión, luego reintenta o usa una plantilla.
  • ¿Puedo conectarlo a mi CRM o backend? Sí — dispara la llamada a la API desde tu webhook entrante o motor de flujos.

CTA

¿Listo para usar acuse de soporte — reacción y confirmación de lectura? Conecta tu canal 1MSG y ejecuta los ejemplos de código de arriba.

Recursos relacionados

Build WhatsApp automation in minutes

Use 1MSG to automate this workflow and try it with our free demo.

Try the demo →