Skip to main content
Una plantilla es un mensaje preaprobado por Meta. Es el único tipo de mensaje que puedes enviar cuando la ventana de 24 horas está cerrada — es decir, cuando el contacto no te escribió en las últimas 24 horas. Mientras la ventana está abierta puedes enviar texto libre; una vez cerrada, solo una plantilla llega al cliente.
Las plantillas se crean y se aprueban en el dashboard. La API pública solo las consume para enviar — no las crea ni las edita.

Cómo se resuelve una plantilla

1

Identifica la plantilla por nombre

Una plantilla se identifica por su template_name — el mismo nombre que ves en el dashboard y que reportas a Meta.
2

Indica el idioma

El idioma es obligatorio en todo envío: agrega language en formato Meta lower_UPPER (ej. es_MX) para elegir cuál plantilla enviar.
3

Verifica que esté aprobada

Solo se pueden enviar plantillas en estado APPROVED. Una en PENDING o REJECTED no es enviable.

Componentes de una plantilla

Una plantilla se diseña y se aprueba en el dashboard con partes fijas y ranuras dinámicas. Al enviarla desde la API solo rellenas esas ranuras: no puedes agregar un header ni botones que la plantilla no tenga.

body_variables

Los placeholders del cuerpo ({{1}}, {{2}}, …). Array de { index, value }, index desde 1, hasta 30 variables.

header

El encabezado: texto, o media (imagen, video o documento) vía file_uuid.

button_parameters

El parámetro de un botón dinámico (ej. el sufijo de un botón URL). Hasta 3.
Es una unión por type — el tipo debe coincidir con cómo se diseñó la plantilla: El file_uuid viene del flujo de Subir multimedia. La transcription (hasta 4000 caracteres) es obligatoria cuando la visión no puede transcribir el archivo (MIME no soportado o mayor a 20 MB); si falta en ese caso, la acción falla con TEMPLATE_HEADER_TRANSCRIPTION_MISSING.

button_parameters

Array de { subType, index, text }, hasta 3 botones:
  • subType — hoy solo "url" (botón de URL dinámica).
  • index — la posición del botón dinámico dentro de la plantilla, desde 0.
  • text — el valor que se concatena a la URL base del botón (ej. el identificador de un recurso), hasta 1024 caracteres.
Al escribir la clave es subType (camelCase). El endpoint de lectura Detalle de plantilla devuelve el mismo campo como sub_type (snake_case): no copies la clave literal de la respuesta de lectura — al enviar, sub_type se ignora en silencio y la acción falla con INVALID_REQUEST.

Enviar una plantilla

Rellenas el objeto template según las ranuras que tenga. Estos son los casos más comunes:
Los nombres de las plantillas los ves en el dashboard, que es donde se aprueban. Para saber qué variables, header y botones espera una en concreto, consulta Detalle de plantilla.
Para enviar un texto o media mientras la ventana está abierta y que llegue la plantilla si está cerrada, incluye el template junto al contenido principal en el mismo send_message.

Datos de pago en las variables (marcadores)

Un marcador de pago es un token con forma ==nombre== que se sustituye por el dato de cobro real de esa conversación en el momento de enviar. En una plantilla va en el valor de una variable del cuerpo, nunca en el texto de la plantilla. Meta aprueba el cuerpo con los placeholders (Hola {{1}}, tu CLABE es {{2}} ({{3}})), no los valores: esos viajan en cada envío. Por eso el marcador se puede resolver ahí, y Meta nunca ve el token.
Marcadores disponibles: clabe_spei, clabe_bank y account_national_link.
Solo funcionan en body_variables. En el encabezado de texto y en los parámetros de botón se rechazan con PAYMENT_MARKER_UNSUPPORTED_FIELD (422).El motivo es que el largo de esos campos se valida sobre el texto que envías —midiendo el marcador, no el dato que lo reemplaza—, así que una sustitución podría convertir un valor válido al guardarlo en un rechazo de Meta al entregarlo. Y el parámetro de un botón es el sufijo de una URL ya aprobada, así que un link de pago ahí produciría una URL anidada. Mueve el marcador a una variable del cuerpo.El pie de página de una plantilla no admite variables en absoluto; eso lo impone Meta.
Si la conversación todavía no tiene cuenta de cobro, se genera en ese momento — el marcador es el disparador. Por eso una campaña cuyas plantillas traigan marcadores crea una cuenta por destinatario: es lo que permite atribuir quién pagó.
El envío se bloquea entero, sin entregar nada, si el marcador no se puede resolver o su resultado no cabe: nombre mal escrito (PAYMENT_MARKER_UNKNOWN, 422), la conversación no tiene ese dato (PAYMENT_MARKER_DATA_UNAVAILABLE, 422), el cuerpo interpolado supera los 1024 caracteres de Meta (TEMPLATE_BODY_TOO_LONG, 422) o no se pudo generar la cuenta de cobro (PAYMENT_PROFILE_GENERATION_FAILED, 500). Nunca se entrega un mensaje a medias en un flujo de dinero.

Plantillas de prueba para conversaciones tester

El dashboard permite crear plantillas de prueba (status: FAKE) desde el módulo Tester sin pasar por la aprobación de Meta. Sirven para que el operador y los integradores prueben flujos contra conversaciones tester sin esperar la revisión de Meta. Reglas de envío vía API pública:
  • Conversación tester (is_tester: true en GET /conversation) — puedes enviar tanto plantillas APPROVED como plantillas FAKE. El envío replica el flujo real pero no toca Meta (wamid retorna "").
  • Conversación real (is_tester: false) — solo plantillas APPROVED. Si intentas enviar una plantilla FAKE o una plantilla con is_tester: true a una conversación real, la API responde con TEMPLATE_FAKE_REQUIRES_TESTER_CONVERSATION (422).
El catálogo público de plantillas no incluye plantillas FAKE — solo las APPROVED reales. Si necesitas el nombre de una plantilla FAKE para enviarla, consulta al operador.

Próximos pasos

Enviar mensajes

El envío de plantillas, texto, media y respuestas rápidas.

Conversaciones

La ventana de 24 horas y el estado de una conversación.