Plantillas paso a paso
Esta guía explica cómo estructurar una plantilla de WhatsApp usando la API BSP, desde los componentes básicos hasta botones y variables.
Estructura de una plantilla
Una plantilla se compone de hasta un HEADER, un BODY (obligatorio), un FOOTER y un BUTTONS:
| Componente | Obligatorio | Máximo |
|---|---|---|
HEADER | No | 1 |
BODY | Sí | 1 |
FOOTER | No | 1 |
BUTTONS | No | 1 (hasta 10 botones) |
Categorías
| Categoría | Uso |
|---|---|
MARKETING | Promociones, ofertas, anuncios |
UTILITY | Confirmaciones de pedido, recibos, notificaciones |
AUTHENTICATION | Códigos OTP, verificación |
Los templates
AUTHENTICATION solo pueden enviar OTP, y no permiten URLs, media ni emojis. Sus parámetros están limitados a 15 caracteres.Ejemplo básico: texto con variable
{
"name": "welcome_message",
"language": "es",
"category": "MARKETING",
"components": [
{
"type": "BODY",
"text": "¡Hola {{1}}! Bienvenido a Chattigo.",
"example": {
"body_text": [["Juan"]]
}
}
]
}Toda variable (
{{1}}, {{name}}) requiere el campo example con valores de muestra. Sin él, Meta rechaza la plantilla.Formato de parámetros
| Formato | Sintaxis | Ejemplo |
|---|---|---|
positional (default) | {{1}}, {{2}} | "example": {"body_text": [["val1", "val2"]]} |
named | {{first_name}} | "example": {"body_text_named_params": [{"param_name": "first_name", "example": "Pablo"}]} |
Ejemplo completo: header + body + footer + botones
{
"name": "order_status",
"language": "es",
"category": "UTILITY",
"components": [
{
"type": "HEADER",
"format": "TEXT",
"text": "Tu pedido {{1}}",
"example": { "header_text": ["#12345"] }
},
{
"type": "BODY",
"text": "Tu pedido fue enviado y llegará el {{1}}.",
"example": { "body_text": [["viernes 20"]]
}
},
{ "type": "FOOTER", "text": "Gracias por comprar en Chattigo Store." },
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Ver seguimiento",
"url": "https://store.example.com/track/{{1}}",
"example": ["12345"]
}
]
}
]
}Tipos de botón
| Tipo | Máximo | Notas |
|---|---|---|
QUICK_REPLY | 10 | Máximo 25 caracteres de texto |
URL | 2 | Máximo 2000 caracteres de URL |
PHONE_NUMBER | 1 | Máximo 20 caracteres de teléfono |
COPY_CODE | 1 | Requiere example con el código |
VOICE_CALL | 1 | — |
OTP | 1 | Solo AUTHENTICATION, con otp_type |
MPM | 1 | Multi-producto, con catálogo |
SPM | 1 | Producto individual |
FLOW | 1 | WhatsApp Flows |
CATALOG | 1 | Catálogo de productos |
REQUEST_CONTACT_INFO | 1 | Solicita el número del usuario, sin text ni example |
Los botones
QUICK_REPLY deben agruparse juntos, no intercalados con otros tipos. Por ejemplo, [URL, PHONE, QR, QR] es válido; [QR, URL, QR] no.Límites de texto
| Componente | Máximo |
|---|---|
HEADER TEXT | 60 caracteres |
BODY | 1024 caracteres |
FOOTER | 60 caracteres |
| Nombre de plantilla | 512 caracteres (minúsculas + guion bajo) |
Checklist antes de crear
- La categoría coincide con el contenido del mensaje.
- El código de idioma es válido (
es,en_US,pt_BR…). - El nombre usa minúsculas, alfanumérico y guiones bajos.
- El
BODYestá presente y no excede 1024 caracteres. - Cada variable tiene su campo
examplepoblado. - Los botones
URLcon variables tienenexamplepoblado. COPY_CODEtieneexamplecon el código.- Header de media: el handler ya fue subido (
example.header_handle). - No hay
QUICK_REPLYmezclado con otros tipos en el mismo grupo.