Actualizado el 29/10/2026
Para medir clics y ventas de una plantilla de WhatsApp en GA4, usa un botón de URL con sufijo dinámico: la plantilla aprobada tiene una dirección fija que termina en {{1}}, y en cada envío pasas un valor que identifica la campaña (y, si quieres, el envío). Ese valor se convierte en UTMs (utm_source=whatsapp, utm_medium, utm_campaign) directamente en la URL o mediante una redirección en tu dominio, y GA4 atribuye la sesión y la compra a la campaña. Del lado de WhatsApp, cruzas con el webhook de estado y con las analíticas de plantillas de Meta para tener el embudo completo: entregado, leído, clicado y vendido.
Esta guía muestra las reglas de Meta para URLs en plantillas, dos formas de armar las UTMs, el payload de envío y un modelo de informe.
Las reglas de Meta para el botón de URL
Según la documentación de componentes de plantilla:
| Regla | Límite |
|---|---|
| Botones de URL por plantilla | Hasta 2 |
| Texto del botón | Hasta 25 caracteres |
| Largo de la URL | Hasta 2.000 caracteres |
| Variables en la URL | Como máximo 1, siempre al final de la dirección |
| Ejemplo | Obligatorio cuando la URL tiene variable |
| Caracteres especiales | Deben codificarse (p. ej., el espacio pasa a %20); los caracteres sin codificar pueden hacer fallar el envío |
La consecuencia práctica es importante: no puedes poner la variable en medio de la URL ni tener dos variables (una para la campaña y otra para el contacto). Todo el rastreo tiene que caber en un único sufijo al final.
Dos formas de llevar la UTM
Opción 1: UTM fija en la URL, variable en el último parámetro
La plantilla nace con las UTMs de la campaña, y la variable completa solo el último parámetro:
https://www.tienda.com/ofertas?utm_source=whatsapp&utm_medium=template&utm_campaign=bf2026&utm_content={{1}}
En el envío, {{1}} recibe algo como oferta_zapatillas_a. Ventajas: es simple y no necesita servidor. Desventajas: utm_campaign queda atada a la plantilla, así que cada campaña nueva exige una plantilla nueva (y una nueva aprobación); y el valor que pasas debe estar codificado para URL.
Opción 2: redirección en tu dominio (recomendada)
La plantilla tiene una URL corta en tu propio dominio:
https://www.tienda.com/w/{{1}}
En el envío, {{1}} recibe un código corto, como k7Qm2x. Tu servidor guarda qué significa ese código (campaña, plantilla, destino, ID del envío) y responde con una redirección 302 a la URL final con todas las UTMs. Ventajas:
- una plantilla sirve para muchas campañas, sin nueva aprobación;
- puedes cambiar el destino después del envío, si la página cambia;
- el servidor registra el clic al instante, con el código del envío;
- el cliente ve el dominio de tu empresa, no un acortador desconocido.
La documentación de Meta no trata los acortadores de terceros. Usar tu propio dominio evita la duda y deja claro al cliente adónde va.
Un redireccionador mínimo en Node.js (Express):
import express from 'express';
const app = express();
app.get('/w/:code', async (req, res) => {
const link = await db.links.findOne({ code: req.params.code });
if (!link) return res.redirect(302, 'https://www.tienda.com/');
await db.clics.insert({ code: link.code, wamid: link.wamid, en: new Date() });
const url = new URL(link.destino);
url.searchParams.set('utm_source', 'whatsapp');
url.searchParams.set('utm_medium', 'template');
url.searchParams.set('utm_campaign', link.campana);
url.searchParams.set('utm_content', link.plantilla);
url.searchParams.set('utm_id', link.campana_id);
res.redirect(302, url.toString());
});
¿Quieres probar mientras lees? Crea tu cuenta en Vectalk y envía el primer mensaje por la API oficial. Crear cuenta gratis →
Cómo armar las UTMs para GA4
GA4 recomienda completar siempre utm_source, utm_medium y utm_campaign, y sugiere también utm_id (ayuda de Google Analytics sobre UTMs). Los valores distinguen mayúsculas de minúsculas: whatsapp y WhatsApp se convierten en dos fuentes distintas. Define un estándar y usa minúsculas.
| Parámetro | Valor sugerido | Para qué |
|---|---|---|
utm_source | whatsapp | Fuente del tráfico |
utm_medium | template (marketing) o utilidad | Separar campañas de avisos transaccionales |
utm_campaign | bf2026, reactivacion_oct | Nombre de la campaña |
utm_content | nombre de la plantilla o variante de la prueba | Comparar textos y botones |
utm_id | ID de la campaña en tu sistema | Vincular con datos de costo |
Sobre las agrupaciones de canales: en el grupo predeterminado de GA4, las reglas de canal miran fuente y medio. Con utm_medium=template, el tráfico puede caer en «Unassigned» o en otro canal, según las reglas y la lista de sitios que mantiene Google. Para ver WhatsApp como un canal propio, crea un grupo de canales personalizado con la condición «Fuente de la sesión coincide exactamente con whatsapp».
No pongas teléfono, nombre, correo ni otros datos personales en la UTM. Google prohíbe enviar información de identificación personal a Analytics, y la URL también queda en el historial del navegador. Para vincular el clic con el contacto, usa el código opaco de la redirección y guarda la relación en tu base de datos.
La plantilla y el payload de envío
Creación de la plantilla (mismo formato de la Cloud API), con cuerpo, botón de URL dinámica y botón de baja:
{
"name": "oferta_semana_url",
"language": "es",
"category": "MARKETING",
"components": [
{
"type": "BODY",
"text": "¡Hola, {{1}}! El kit que viste tiene 20% de descuento hasta el domingo.",
"example": { "body_text": [["Ana"]] }
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Ver oferta",
"url": "https://www.tienda.com/w/{{1}}",
"example": ["k7Qm2x"]
},
{ "type": "QUICK_REPLY", "text": "No quiero ofertas" }
]
}
]
}
Envío a un contacto, pasando el nombre en el cuerpo y el código en el botón. El index es la posición del botón de URL en la lista (empieza en 0):
{
"messaging_product": "whatsapp",
"to": "5511999999999",
"type": "template",
"template": {
"name": "oferta_semana_url",
"language": { "code": "es" },
"components": [
{
"type": "body",
"parameters": [{ "type": "text", "text": "Ana" }]
},
{
"type": "button",
"sub_type": "url",
"index": "0",
"parameters": [{ "type": "text", "text": "k7Qm2x" }]
}
]
}
}
El flujo en tu sistema, por contacto:
- Genera un código corto único y guarda
code → campaña, plantilla, destino. - Envía la plantilla con el código en el parámetro del botón.
- Guarda el
wamidque devuelve la API junto con el código. - Actualiza
delivered,readofailedcuando llegue el webhook de estado. - Registra el clic en el redireccionador y deja que GA4 se encargue de la sesión y la compra.
Si el envío es para muchos contactos, genera los códigos en lote antes de la campaña. El artículo cómo enviar una plantilla por la API detalla los demás componentes del payload.
Medir el clic con Meta
Además de tu redireccionador, Meta cuenta los clics en botones. Según la documentación de analíticas, las analíticas de plantillas devuelven clics en botones de URL y de respuesta rápida para plantillas de marketing y de utilidad, con los tipos url_button (total) y unique_url_button (cuentas distintas que hicieron clic). Tres detalles:
- primero hay que activar las analíticas de plantillas en la cuenta (desde WhatsApp Manager o con
is_enabled_for_insights=true), y una vez activadas no se pueden desactivar; - los datos de lectura y clic están disponibles hasta 7 días desde el envío;
- el rastreo de clics se puede desactivar por plantilla con
cta_url_link_tracking_opted_out.
Consulta de ejemplo (con IDs ilustrativos):
curl -g 'https://graph.facebook.com/v26.0/<WABA_ID>/template_analytics?start=1793145600&end=1793232000&granularity=daily&metric_types=sent,delivered,read,clicked&template_ids=[<TEMPLATE_ID>]' \
-H 'Authorization: Bearer <TOKEN>'
Los números de Meta y los de tu redireccionador no tienen por qué coincidir exactamente: son mediciones distintas. Usa Meta para comparar plantillas entre sí y tu redireccionador para vincular el clic con el envío y con la venta.
Informe: del envío a la venta
Con el código de la redirección, puedes juntar todo en una tabla por campaña. Ejemplo en SQL, suponiendo las tablas envios (una fila por mensaje, con el código del link y el último estado del webhook), clics (redireccionador) y pedidos (con el código del link guardado en el checkout):
SELECT
e.campana,
COUNT(*) FILTER (WHERE e.status IN ('delivered', 'read')) AS entregados,
COUNT(*) FILTER (WHERE e.status = 'read') AS leidos,
COUNT(c.code) AS hicieron_clic,
COALESCE(SUM(p.pedidos), 0) AS pedidos,
COALESCE(SUM(p.ingresos), 0) AS ingresos,
ROUND(COUNT(*) FILTER (WHERE e.status IN ('delivered', 'read')) * 0.3217, 2) AS costo_meta_brl
FROM envios e
LEFT JOIN (SELECT DISTINCT code FROM clics) c ON c.code = e.code
LEFT JOIN (
SELECT link_code, COUNT(*) AS pedidos, SUM(valor) AS ingresos
FROM pedidos GROUP BY link_code
) p ON p.link_code = e.code
GROUP BY e.campana;
El resultado se convierte en un informe así (ejemplo ficticio, solo para mostrar el formato):
| Campaña | Entregados | Leídos | Hicieron clic | Pedidos | Ingresos | Costo Meta |
|---|---|---|---|---|---|---|
| bf2026_zapatillas | 4.000 | 2.900 | 610 | 48 | R$ 9.120,00 | R$ 1.286,80 |
| reactivacion_oct | 1.500 | 820 | 95 | 7 | R$ 980,00 | R$ 482,55 |
El costo usa la tarifa de marketing para destinatarios en Brasil vigente desde el 1/10/2026 (R$ 0,3217, en reales brasileños, por mensaje entregado). Si envías a otros países, usa la tarifa del país del destinatario. En GA4, el mismo análisis aparece en el informe de adquisición de tráfico filtrado por Fuente de la sesión = whatsapp, con el evento de compra marcado como evento clave.
Una salvedad: sin identificación del usuario (User-ID), GA4 en general solo atribuye la venta si ocurre en el mismo navegador del clic. Si el cliente hace clic en el celular y compra en la computadora, la venta desaparece del informe de GA4, pero puede aparecer en el tuyo si el checkout guarda el código del link. Para enviar la venta de vuelta a Meta, revisa API de Conversiones para WhatsApp.
Cómo hacerlo con Vectalk
En Vectalk creas la plantilla con botón de URL dinámica por API (crear plantilla), con los componentes en el formato de la Cloud API mostrado arriba, y la envías con el parámetro del botón por el endpoint de mensajes (enviar plantilla, ejemplo «Botão com parâmetro dinâmico»). Los webhooks de estado llegan al endpoint que registres, listos para alimentar la tabla envios.
El redireccionador, GA4 y el informe quedan en tu sistema: Vectalk no tiene herramienta de campañas ni acortador en el panel. Cada mensaje entregado se descuenta del saldo prepago, sin tarjeta en Meta. Crea tu cuenta en apps.vectalk.com.br/register. Si estás empezando, lee la guía de la API oficial de WhatsApp.
Preguntas frecuentes
¿Puedo poner la variable en medio de la URL?
No. Meta acepta como máximo una variable en la URL del botón, y siempre se agrega al final de la dirección.
¿Puedo usar un link acortado de terceros en el botón?
La documentación de componentes no menciona los acortadores. Recomendamos una redirección en tu propio dominio: el cliente reconoce la dirección, y tú controlas el destino y registras el clic.
¿Funciona en plantillas de utilidad?
Sí, el botón de URL dinámica existe en plantillas de utilidad, como el link de rastreo del pedido. Usa un utm_medium distinto (por ejemplo, utilidad) para no mezclarlo con las campañas. Meta también cuenta los clics de plantillas de utilidad en las analíticas.
¿Por qué GA4 muestra menos clics que mi redireccionador?
Bloqueadores, consentimiento de cookies, páginas que tardan en cargar y clics repetidos hacen que los números difieran. El redireccionador cuenta la solicitud; GA4 cuenta la sesión que cargó la etiqueta.
¿Cómo rastreo anuncios que llevan a WhatsApp?
Es otro camino: los anuncios de clic a WhatsApp traen datos de origen en el primer mensaje del cliente. Revisa cómo rastrear anuncios Click-to-WhatsApp.
Fuentes oficiales consultadas el 29/10/2026: Componentes de plantilla, Analíticas de WhatsApp Business Platform, Precios, Parámetros UTM en Google Analytics, Grupos de canales predeterminados de GA4, Prácticas recomendadas para no enviar datos personales a Analytics, Documentación de Vectalk: enviar plantilla.
Pon a funcionar el WhatsApp oficial de tu empresa
Crea tu cuenta, conecta tu número a la API oficial (puedes mantener la app con coexistencia) y empieza a atender y enviar mensajes.
