Shared Inbox de WhatsApp para nueva PlataformaMás
1msg official logo

Lista de documentos previa a la cita (WhatsApp API)

El escenario envía al cliente una plantilla de WhatsApp personalizada con checklist de documentos antes de una visita.

Descripción del caso de uso

El escenario envía al cliente una plantilla de WhatsApp personalizada con checklist de documentos antes de una visita. El mensaje incluye nombre del cliente, servicio, fecha de visita y checklist en la cuarta variable. Un botón URL estático abre detalles de la reserva.

Ejemplo de plantilla

Hola, {{1}}! Para tu {{2}} el {{3}}, por favor trae: {{4}}

Ver reserva
  • {{1}}
    nombre del cliente
  • {{2}}
    servicio o tipo de cita
  • {{3}}
    fecha de visita
  • {{4}}
    checklist de documentos
  • “Ver reserva”
    botón — fijo en la plantilla de Meta
WhatsApp Business API for pre-visit documents list

Cuándo usarlo

Usa este escenario cuando una visita próxima exige documentos concretos y el checklist no puede esperar a que el cliente abra correo, SMS o un portal — sobre todo si no hay conversación abierta en WhatsApp, así que solo puede salir primero una plantilla aprobada. Encaja en visitas de salud y cumplimiento, citas de visa o servicios legales donde la falta de documentos retrasa la reunión, e integradores que conectan reglas de documentos del CRM a recordatorios por WhatsApp.

Menos rechazos en recepción
Cuatro variables del cuerpo llevan el nombre del cliente, el servicio, la fecha de visita y el checklist completo de documentos en WhatsApp, así los requisitos quedan en el chat que sí revisa y no enterrados en un correo.
Menos reprogramaciones por documentos faltantes
El sistema de agendamiento dispara un evento de recordatorio pre-visita antes de la cita, así el checklist sale de forma proactiva y no cuando el personal descubre vacíos en la puerta.
Cero trabajo manual de checklist
Los campos de la reserva y la lista de documentos se resuelven desde el sistema de agendamiento o el CRM y se envían en una sola plantilla aprobada, así recepción no retipea reglas para cada visita.
Detalles de reserva a un toque
Un botón URL estático fijado en la plantilla de Meta abre la página de reserva junto al checklist, así el cliente puede contrastar servicio y fecha sin llamar al mostrador.
Entrega registrada para seguimiento
El estado de entrega se escribe de vuelta al sistema de agendamiento o al CRM tras el envío, así el equipo sabe si el checklist llegó al cliente antes del día de la visita.

Flujo de trabajo

  1. Disparador

    El sistema de agendamiento dispara un evento de recordatorio de documentos pre-visita.

    evento · disparado

  2. Capturar evento

    El sistema obtiene el teléfono del cliente y los campos de la reserva.

    phone: "+…"

  3. Construir y enviar

    Se construye un mensaje de plantilla personalizado con cuatro variables en el cuerpo y un botón URL estático.

    POST /sendTemplate

  4. Entregado

    El cliente recibe la notificación de checklist en WhatsApp.

    entregado

  5. Estado registrado

    Se registra el resultado de entrega para agendamiento o seguimiento en CRM.

    status: "read"

WhatsApp Business API for pre-visit documents list

Implementación técnica

Requisitos previos

  1. Clave API de 1MSG · Cómo obtener la clave API
  2. Cuenta de WhatsApp Business · Cómo conectar WABA
  3. Plantilla de WhatsApp · Cómo aprobar una plantilla WABA
  4. Opt-in del cliente · Cómo gestionar el consentimiento

Ejemplos de código

#!/usr/bin/env bash
set -euo pipefail

# === Configuration (replace "___" placeholders) ===

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

TEMPLATE_NAME="___"                        # approved template name
TEMPLATE_NAMESPACE="___"                   # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___"                    # template language code, e.g. "en"



# === Test data ===
TEST_PHONE="___"                 # client phone in international format
TEST_CUSTOMERNAME="___"         # {{1}} customer name
TEST_SERVICE="___"         # {{2}} service name
TEST_BOOKINGDATE="___"         # {{3}} booking date
TEST_ADDITIONALINFO="___"         # {{4}} additional info

PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"

for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
            "TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
            "TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
            "TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
            "TEST_SERVICE=$TEST_SERVICE" \
            "TEST_BOOKINGDATE=$TEST_BOOKINGDATE" \
            "TEST_ADDITIONALINFO=$TEST_ADDITIONALINFO"; do
    val="${pair#*=}"
    if [ -z "$val" ] || [ "$val" = "___" ]; then
        echo "Missing configuration value: ${pair%%=*}" >&2
        exit 1
    fi
done

if [ -z "$PHONE_NORM" ]; then
    echo "Error: phone number has no digits after normalization" >&2
    exit 1
fi

URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"

# params carries body ONLY. Button text is fixed in the Meta template — no button param.

# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} service name → ${TEST_SERVICE}
# {{3}} booking date → ${TEST_BOOKINGDATE}
# {{4}} additional info → ${TEST_ADDITIONALINFO}
read -r -d '' PAYLOAD <<JSON || true
{
  "phone": "${PHONE_NORM}",
  "template": "${TEMPLATE_NAME}",
  "namespace": "${TEMPLATE_NAMESPACE}",
  "language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
  "params": [
    {
      "type": "body",
      "parameters": [
        { "type": "text", "text": "${TEST_CUSTOMERNAME}" },
        { "type": "text", "text": "${TEST_SERVICE}" },
        { "type": "text", "text": "${TEST_BOOKINGDATE}" },
        { "type": "text", "text": "${TEST_ADDITIONALINFO}" }
      ]
    }

  ]
}
JSON

RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${API_TOKEN}" \
    -d "$PAYLOAD")"

HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"

case "$BODY" in
    *'"sent":true'*) ok=1 ;;
    *) ok=0 ;;
esac

if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
    echo "Message sent to client."
    echo "API response: $BODY"
else
    echo "Send failed. HTTP status: $HTTP_CODE" >&2
    echo "$BODY" >&2
    exit 1
fi

Respuesta y estado de entrega

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 (tipo wamid.…) para correlacionar los callbacks de entrega.

200 OKRespuesta
{
  "sent": true,
  "message": "Sent to [email protected]",
  "description": "Message has been sent to the provider",
  "id": "wamid.HBgLMzgwNjM5..."
}
  • sent

    Aceptado para envío — aún no en el teléfono del cliente

  • id

    Guárdalo; los callbacks de entrega y hookInfo se basan en él

Estados de entrega y webhooks →

Errores frecuentes

EstadoRespuesta de la APICausaSolución
200Message was not sent: template is not definedFalta namespace, template o language en el cuerpo de la petición.Envía los tres. Toma namespace y el nombre exacto de la plantilla de GET /templates; language es un objeto: {"policy": "deterministic", "code": "es_MX"}.
200template name (…) does not exist in <language>La plantilla está aprobada en otro idioma que el solicitado.Usa el código de idioma exacto con el que se aprobó la plantilla (por ejemplo, es_MX no es lo mismo que es). Revísalo en GET /templates.
200Message was not sent: provide chatId, phone, bsuid, or usernameNingún destinatario que el canal pudiera resolver.Envía un solo destinatario: phone (código de país y número, solo dígitos), chatId (por ejemplo [email protected]) o bsuid.

Todos los códigos de error →

Preguntas comunes

Relacionado

Desarrolla para WhatsApp en horas
sin complicaciones de infraestructura