We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.
Las plantillas se usan al enviar mensajes de plantilla mediante la API de nube, alojada en Meta, o la API local. La API de nube revisa las plantillas y los parámetros de las variables mediante aprendizaje automático para proteger la seguridad y la integridad de los servicios de la API de nube. Cuando la API de nube revisa las plantillas y el texto de las variables, no se comparte información con WhatsApp.
Las plantillas se pueden crear con la API de administración de WhatsApp Business o el Administrador de WhatsApp Business. El número de plantillas que puede tener una cuenta de WhatsApp Business lo determina su empresa principal. Si una empresa principal no está verificada, cada una de sus cuentas de WhatsApp Business se limita a 250 plantillas. Sin embargo, si la empresa principal está verificada y al menos una de sus cuentas de WhatsApp Business tiene un número de teléfono de empresa con un nombre para mostrar aprobado, cada una de sus cuentas de WhatsApp Business puede tener hasta 6000 plantillas.
Necesitarás lo siguiente:
Puedes añadir una plantilla de mensaje en un idioma específico al crear una plantilla. Estas plantillas se tienen en cuenta para el límite. Asegúrate de mantener la coherencia al proporcionar traducciones. Para obtener más información, consulta el artículo del Servicio de ayuda ¿Por qué veo errores de “estructura no disponible” en mi devolución de llamada?.
Envía una solicitud POST al extremo Cuenta de WhatsApp Business > Plantillas de mensajes para crear una plantilla.
POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
{ "name": "<NAME>", "category": "<CATEGORY>", "allow_category_change": <ALLOW_CATEGORY_CHANGE>, "language": "<LANGUAGE>", "components": [<COMPONENTS>] }
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
Cadena | Obligatorio. Nombre de la plantilla. Máximo 512 caracteres. |
|
Enumeración | Obligatorio. Categoría de la plantilla. Consulta Categorías de plantillas a continuación. |
|
Booleano | Opcional. Se establece en verdadero para permitirnos asignar automáticamente una categoría. Si se omite, es posible que la plantilla se rechace a causa de una categorización incorrecta. |
|
Enumeración | Obligatorio. Código de idioma y configuración regional de la plantilla. |
|
Cadena | Opcional. Nombre exacto de la plantilla de la biblioteca de plantillas de utilidad. Obtén información sobre cómo crear plantillas con la biblioteca de plantillas de utilidad. |
|
Matriz de objetos | Obligatorio. Componentes que conforman la plantilla. Consulta Componentes de la plantilla a continuación. | Consulta Componentes de la plantilla a continuación. |
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
Objeto JSON | Opcional. Datos opcionales durante la creación de una plantilla de la biblioteca de plantillas. Estos son campos opcionales para el componente de botón. Nota: En el caso de las plantillas de utilidad que tienen botones, esta propiedad no es opcional. Obtén información sobre cómo crear plantillas con la biblioteca de plantillas. |
|
Enumeración | Tipo de botón. QUICK_REPLY, URL, PHONE_NUMBER, OTP, MPM, CATALOG, FLOW, VOICE_CALL, APP Obligatorio. |
|
Cadena | Número de teléfono para el botón. Opcional. |
|
Objeto JSON | Consulta los parámetros de URL Opcional. | |
Booleano | Indica si el usuario ha aceptado o no las condiciones del modo sin pulsación. Opcional. |
|
Enumeración | Tipo de contraseña de un solo uso (OTP). COPY_CODE, ONE_TAP, ZERO_TAP Opcional. |
|
Matriz de objetos JSON | Consulta los parámetros de aplicación admitidos Opcional. |
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
Objeto JSON | Opcional. Datos opcionales durante la creación de una plantilla de la biblioteca de plantillas. Estos son campos opcionales para el componente de botón. Obtén información sobre cómo crear plantillas con la biblioteca de plantillas. | |
Booleano | Valor booleano para añadir información a la plantilla sobre cómo contactar con la empresa mediante su número de teléfono. Opcional. |
|
Booleano | Valor booleano para añadir información a la plantilla sobre cómo obtener más información con un enlace URL. Está disponible con restricciones y se ignorará si no está disponible. Opcional. |
|
Booleano | Valor booleano para añadir información a la plantilla en la que se recomiende no compartir los códigos de autenticación con nadie. Opcional. |
|
Booleano | Valor booleano para añadir información a la plantilla sobre cómo hacer un seguimiento de los paquetes de entrega. Está disponible con restricciones y se ignorará si no está disponible. Opcional. |
|
Entero de 64 bits | Valor entero para añadir información a la plantilla sobre cuándo caducará el código. Opcional. |
|
Las plantillas se deben clasificar en una de las siguientes categorías. Las categorías tienen en cuenta los precios y la categoría que designes se validará al crear la plantilla.
AUTHENTICATION
MARKETING
UTILITY
Consulta nuestro documento Categorización de plantillas para determinar la categoría que usar al crear plantillas.
Las plantillas están formadas por varios componentes de texto, de contenido multimedia e interactivos en función de las necesidades de la empresa. Consulta el documento Componentes de las plantillas para obtener una lista de todos los componentes posibles y sus requisitos, así como muestras y consultas de ejemplo.
Al crear una plantilla, debes definir sus componentes; para ello, asigna una matriz de objetos de componentes a la propiedad “components” en el cuerpo de la solicitud.
Por ejemplo, a continuación se muestra una matriz que contiene un componente de cuerpo de texto con dos variables y valores de ejemplo, un componente de botón de número de teléfono y un componente de botón de URL:
[ { "type": "BODY", "text": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. If you have any questions, please use the buttons below to contact support. Thank you for being a customer!", "example": { "body_text": [ [ "Pablo","860198-230332" ] ] } }, { "type": "BUTTONS", "buttons": [ { "type": "PHONE_NUMBER", "text": "Call", "phone_number": "15550051310" }, { "type": "URL", "text": "Contact Support", "url": "https://www.luckyshrub.com/support" } ] } ]
Consulta el documento Componentes de las plantillas para obtener una lista de todos los componentes posibles y sus requisitos, así como muestras y consultas de ejemplo.
Ten en cuenta que las plantillas categorizadas como AUTHENTICATION
tienen requisitos únicos de componentes. Consulta Plantillas de autenticación.
Al enviar una solicitud de creación de plantillas, validamos inmediatamente su categoría según nuestras normas para la categorización de plantillas.
status
en PENDING
. A continuación, la plantilla se somete a una revisión.status
en REJECTED
y activamos un webhook de actualización de estado de plantilla de mensaje con el valor de reason
establecido en INCORRECT_CATEGORY
. Te recomendamos que escuches este webhook para identificar plantillas rechazadas o solicitar el campo rejected_reason
en las plantillas recién creadas, que tendrán el valor TAG_CONTENT_MISMATCH
.En ambos casos, el estado inicial de la plantilla se devuelve como parte de la respuesta de la API.
Si el estado de la plantilla se ha establecido en REJECTED
como parte de la validación de la categoría, tienes varias opciones:
Puedes incluir la propiedad allow_category_change
en la solicitud para que asignemos automáticamente una categoría en función del contenido de la plantilla y nuestras normas para la categorización de plantillas. Esto puede impedir que el estado de la plantilla se establezca en REJECTED
inmediatamente a causa de una categorización incorrecta.
Ten en cuenta que la categorización automática solo se puede usar al crear una plantilla.
Las plantillas con el estado PENDING
se someterán a una revisión. Revisamos el contenido de cada plantilla recién creada o editada para asegurarnos de que se ajusta a nuestras normas y políticas de contenido. Según el resultado de esta revisión, cambiamos automáticamente el estado a APPROVED
o REJECTED
, lo que activa un webhook de actualización de estado de plantilla de mensaje.
En función del resultado de la validación de la categoría y la revisión de la plantilla, establecemos el valor de status
de la plantilla en uno de los siguientes valores o lo cambiamos:
APPROVED
: la plantilla ha superado la revisión y se ha aprobado, de modo que ahora se puede enviar en mensajes de plantilla.PENDING
: la plantilla ha superado la validación de la categoría y se está sometiendo a una revisión.REJECTED
: la plantilla no ha superado la validación de la categoría o la revisión. Puedes solicitar el campo rejected_reason en la plantilla para obtener el motivo.Consulta todos los campos y estados posibles en la referencia del extremo Plantilla de mensaje de WhatsApp.
Si la operación se realiza correctamente, la API responde con el identificador, el estado y la categoría de la plantilla recién creada. Hay tres resultados posibles:
status
es PENDING
).status
es REJECTED
).status
es APPROVED
). Esto solo es posible en el caso de las plantillas de autenticación con botones de contraseña de un solo uso.{ "id": "<ID>", "status": "<STATUS>", "category": "<CATEGORY>" }
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
| Identificador de la plantilla. |
|
|
| |
| Categoría de la plantilla asignada por ti o por nosotros. |
|
A continuación, te mostramos un ejemplo de solicitud para crear una plantilla de promoción estacional compuesta por los siguientes componentes:
Para obtener ejemplos adicionales, consulta Ejemplos de solicitudes.
curl 'https://graph.facebook.com/v21.0
/102290129340398/message_templates' \
-H 'Authorization: Bearer EAAJB...' \
-H 'Content-Type: application/json' \
-d '
{
"name": "seasonal_promotion",
"language": "en_US",
"category": "MARKETING",
"components": [
{
"type": "HEADER",
"format": "TEXT",
"text": "Our {{1}} is on!",
"example": {
"header_text": [
"Summer Sale"
]
}
},
{
"type": "BODY",
"text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
"example": {
"body_text": [
[
"the end of August","25OFF","25%"
]
]
}
},
{
"type": "FOOTER",
"text": "Use the buttons below to manage your marketing subscriptions"
},
{
"type":"BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Unsubscribe from Promos"
},
{
"type":"QUICK_REPLY",
"text": "Unsubscribe from All"
}
]
}
]
}'
{ "id": "572279198452421", "status": "PENDING", "category": "MARKETING" }
Usa la API de nube o la API local para enviar una plantilla en un mensaje de plantilla.
Si no podemos entregar un mensaje a un usuario de WhatsApp, volveremos a intentar la entrega durante un periodo de tiempo que se conoce como duración (TTL) o periodo de validez del mensaje.
Puedes personalizar el valor de TTL predeterminado de las plantillas de autenticación, utilidad y marketing.
Te recomendamos que establezcas un valor de TTL para todas las plantillas de autenticación, preferiblemente igual o inferior al tiempo de caducidad de tu código, para asegurarte de que los clientes solo reciban un mensaje cuando el código todavía se pueda utilizar.
Autenticación | Utilidad | Marketing | |
---|---|---|---|
Valor de TTL predeterminado | Diez minutos | 30 días | 30 días |
Compatibilidad | API de nube y API local | Solo API de nube | API de mensajes de marketing (MM) de Lite |
Rango de personalización | De 30 segundos a 15 minutos | De 30 segundos a 12 horas | De 12 horas a 30 días |
Las plantillas de autenticación creadas antes del 23 de octubre de 2024 tienen un valor de TTL predeterminado de 30 días.
Para establecer un valor de TTL personalizado en una plantilla de autenticación, utilidad o marketing, incluye y establece el valor de la propiedad message_send_ttl_seconds
en la llamada POST /<PHONE_NUMBER_ID>/messages
.
El valor de TTL se puede personalizar en incrementos de un segundo.
message_send_ttl_seconds
válidos30
a 900
segundos (de 30 segundos a 15 minutos). 30
a 43200
segundos (de 30 segundos a 12 horas).43200
a 2592000
segundos (de 12 horas a 30 días).Para las plantillas de autenticación y utilidad, puedes establecer el valor de la propiedad message_send_ttl_seconds
en -1
, que establecerá un valor de TTL personalizado de 30 días.
Los mensajes que no se han podido entregar durante el periodo de TTL predeterminado o personalizado se eliminan.
Si no recibes un webhook de mensaje entregado antes de que se supere el valor de TTL, debes asumir que el mensaje se ha eliminado.
Si envías un mensaje y se produce un error en la entrega, podría producirse un breve retraso antes de recibir el webhook, por lo que es posible que quieras crear en un pequeño búfer antes de asumir que el mensaje se ha eliminado.
Te recomendamos añadir un botón de respuesta rápida a las plantillas categorizadas como MARKETING
que permita a los clientes desactivar los mensajes de marketing con facilidad. Así, los clientes podrán desactivar los mensajes de marketing que envíes sin tener que bloquear a la empresa. De esta forma, es posible que puedas escalar el volumen de mensajes más rápidamente. Consulta este artículo para obtener más detalles sobre las ventajas de añadir un botón de desactivación en las plantillas de marketing.
Tu empresa debe tomar las medidas necesarias para dejar de enviar mensajes de marketing a los clientes que han elegido no recibirlos. Si no lo haces, el porcentaje de bloqueos y la puntuación de calidad se verán afectados negativamente.
Envía una solicitud GET al extremo Cuenta de WhatsApp Business > Plantillas de mensajes para obtener una lista de las plantillas que pertenecen a una cuenta de WhatsApp Business.
GET /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?fields=<FIELDS> &limit=<LIMIT>
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
Lista separada por comas | Opcional. Lista de campos de plantilla que quieres que se devuelvan. |
|
Entero | Opcional. Número máximo de plantillas que quieres que se devuelvan en cada página de resultados. |
|
curl 'https://graph.facebook.com/v21.0
/102290129340398/message_templates?fields=name,status&limit=3' \
-H 'Authorization: Bearer EAAJB...'
{
"data": [
{
"name": "seasonal_promotion_text_only",
"status": "APPROVED",
"id": "564750795574598"
},
{
"name": "seasonal_promotion_video",
"status": "PENDING",
"id": "1252715608684590"
},
{
"name": "seasonal_promotion_image_header",
"status": "PENDING",
"id": "1372429296936443"
}
],
"paging": {
"cursors": {
"before": "MAZDZD",
"after": "MgZDZD"
},
"next": "https://graph.facebook.com/v21.0
/102290129340398/message_templates?fields=name%2Cstatus&limit=3&after=MgZDZD"
}
}
Solo puedes devolver plantillas con valores de campo concretos si incluyes el campo y el valor deseado en la solicitud. Por ejemplo, puedes incluir status=REJECTED
para obtener solo las plantillas rechazadas.
curl 'https://graph.facebook.com/v21.0
/104996122399160/message_templates?fields=name,status&status=REJECTED' \
-H 'Authorization: Bearer EAAJB...'
{ "data": [ { "name": "seasonal_promotion_text_only_v4", "status": "REJECTED", "id": "564750795574598" }, { "name": "discount_qualifier", "status": "REJECTED", "id": "163917509772674" }, { "name": "limited_time_offer_tuscan_getaway_2023", "status": "REJECTED", "id": "202389039167147" }, { "name": "2023_mar_promo_2", "status": "REJECTED", "id": "1116034925734553" }, { "name": "2023_mar_promo", "status": "REJECTED", "id": "952600926095321" } ] }
El espacio de nombres de la plantilla de mensaje se necesita para enviar mensajes con las plantillas de mensajes.
Para obtener el espacio de nombres de una plantilla, envía una solicitud GET
al extremo /{whatsapp-business-account-ID}
e incluye el campo message_template_namespace
.
curl -i -X GET "https://graph.facebook.com/v21.0
/{whatsapp-business-account-ID}
?fields=message_template_namespace
&access_token={system-user-access-token}"
Si la solicitud se realiza correctamente, se devuelve un objeto JSON con el espacio de nombres y el identificador de la cuenta de WhatsApp Business:
{ "id": "1972385232742141", "message_template_namespace": "12abcdefghijk_34lmnop" }
Envía una solicitud POST al extremo Plantilla de mensaje de WhatsApp para editar una plantilla. También puedes editar una plantilla manualmente mediante la ventana disponible en Administrador de WhatsApp > Herramientas de la cuenta > Plantillas de mensajes.
APPROVED
, REJECTED
o PAUSED
.category
o components
de una plantilla.category
de una plantilla aprobada.POST /<WHATSAPP_MESSAGE_TEMPLATE_ID>
{ "category": "<CATEGORY>", "components": [<COMPONENTS>] }
Marcador de posición | Descripción | Valor de ejemplo |
---|---|---|
Cadena | Obligatorio si se omite la propiedad “components”. Categoría de la plantilla. |
|
Matriz | Obligatorio si se omite la propiedad “category”. Matriz de objetos de componentes de la plantilla. | Consulta Solicitud de ejemplo (editar los componentes) a continuación. |
Solicitud de ejemplo del texto del cuerpo de una plantilla con contenido de marketing y utilidad para que solo incluya contenido de marketing.
curl 'https://graph.facebook.com/v21.0
/564750795574598' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
"components": [
{
"type": "HEADER",
"format": "TEXT",
"text": "Our {{1}} is on!",
"example": {
"header_text": [
"Spring Sale"
]
}
},
{
"type": "BODY",
"text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
"example": {
"body_text": [
[
"the end of April",
"25OFF",
"25%"
]
]
}
},
{
"type": "FOOTER",
"text": "Use the buttons below to manage your marketing subscriptions"
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Unsubcribe from Promos"
},
{
"type": "QUICK_REPLY",
"text": "Unsubscribe from All"
}
]
}
]
}'
Solicitud de ejemplo para cambiar la categoría de una plantilla de UTILITY
a MARKETING
.
curl 'https://graph.facebook.com/v21.0
/1252715608684590' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
"category": "MARKETING"
}'
Ejemplo de respuesta una vez realizada correctamente la solicitud.
{ "success": true }
Usa el extremo Cuenta de WhatsApp Business > Plantillas de mensajes para eliminar una plantilla por su nombre o identificador.
PENDING_DELETION
e intentaremos entregar el mensaje durante 30 días. En cuanto pase ese periodo de tiempo, recibirás el error “Estructura no disponible” y el cliente no recibirá el mensaje.Eliminar una plantilla por su nombre elimina todas las plantillas que coincidan con ese nombre (esto quiere decir que las plantillas con un mismo nombre pero en idiomas distintos también se eliminarán).
DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?name=<NAME>
curl -X DELETE 'https://graph.facebook.com/v16.0/102290129340398/message_templates?name=order_confirmation' \ -H 'Authorization: Bearer EAAJB...'
{ "success": true }
Para eliminar una plantilla por su identificador, incluye el identificador de la plantilla junto con su nombre en la solicitud. Solo se eliminarán las plantillas cuyos identificadores de plantilla coincidan.
DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?hsm_id=<HSM_ID>, &name=<NAME>
curl -X DELETE 'https://graph.facebook.com/v21.0
/102290129340398/message_templates?hsm_id=1407680676729941&name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'
{ "success": true }