Passa al contenuto principale

UC-024 — Template con Link Tracciati

CampoValore
IDUC-024
ObiettivoCreare template WhatsApp con bottoni tracciati per misurare il CTR
CanaleWhatsApp
Complessità⭐⭐⭐ Avanzato
Tempo stimato30 minuti
API coinvoltePOST /api/message-server/whatsapp/templates, POST /api/message-server/whatsapp/send

Scenari reali

  • ShopItalia — Misurare CTR: Traccia quanti utenti cliccano sul bottone "Vai allo shop" nel template promozionale per calcolare il conversion rate della campagna.
  • TravelDream — Tracking landing page: Ogni destinatario riceve un link univoco alla landing page dell'offerta viaggio, con parametri UTM per analisi in Google Analytics.
  • MarketingPro — A/B testing link: Invia due varianti del template con link diversi (landing A vs landing B) per determinare quale converte meglio.

Il diagramma mostra il ciclo completo: creazione del template con tracking, invio al destinatario e cattura del click con redirect trasparente alla landing page.

Prerequisiti

  • API Key attiva con permessi template WhatsApp
  • Numero WhatsApp Business verificato (vedi UC-025)
  • Landing page HTTPS pronta per il tracking
  • Familiarita con i template WhatsApp (vedi UC-013)

Crea un template WhatsApp con trackButtonLinks: true per abilitare il tracking automatico dei click.

curl -X POST https://lora-api.agiletelecom.com/api/message-server/whatsapp/templates \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"name": "promo_estate_tracked_2026",
"language": "it",
"category": "MARKETING",
"components": [
{"type": "HEADER", "format": "IMAGE",
"example": {"header_handle": ["https://cdn.shopitalia.it/promo/estate-2026-header.jpg"]}},
{"type": "BODY",
"text": "Ciao {{1}}, i saldi estivi sono arrivati! Sconto {{2}} su tutta la collezione fino al {{3}}.",
"placeholderFields": [
{"index": 1, "label": "Nome cliente", "example": "Marco"},
{"index": 2, "label": "Percentuale sconto", "example": "50%"},
{"index": 3, "label": "Data scadenza", "example": "30 giugno"}]},
{"type": "BUTTONS", "buttons": [
{"type": "URL", "text": "Vai allo shop",
"url": "https://shopitalia.it/promo/estate2026?utm_source=whatsapp&utm_campaign={{1}}",
"example": ["promo_estate"]}]}
],
"trackButtonLinks": true
}'

Response — Template sottomesso

{
"templateId": "promo_estate_tracked_2026",
"name": "promo_estate_tracked_2026",
"status": "PENDING",
"language": "it",
"category": "MARKETING",
"trackButtonLinks": true,
"createdAt": "2026-04-09T12:00:00+02:00"
}

:::info Approvazione Meta Il template deve essere approvato da Meta prima dell'uso. Il processo richiede tipicamente da pochi minuti a 24 ore. Monitora lo stato con una GET sul template. :::

Dietro le quinte — Come funziona il tracking dei link
  1. URL rewriting: Quando trackButtonLinks: true e attivo, il gateway sostituisce l'URL originale del bottone con un URL di tracking intermedio (es. https://trk.agiletelecom.com/c/abc123).
  2. Click capture: Quando il destinatario clicca il bottone, la richiesta passa dal tracking service che registra: timestamp, destinatario, template, campagna.
  3. Redirect trasparente: Dopo aver registrato il click, il tracking service esegue un redirect HTTP 302 verso l'URL originale della landing page.
  4. Parametri UTM: I parametri UTM nell'URL originale vengono preservati nel redirect, permettendo l'attribuzione in Google Analytics o altri strumenti di analisi.
  5. Metriche disponibili: Click totali, click unici, CTR (click/delivered), tempo medio al click, distribuzione oraria dei click.

Step 2 — Invia il messaggio con template tracciato

Una volta approvato il template, invia il messaggio con i parametri personalizzati.

curl -X POST https://lora-api.agiletelecom.com/api/message-server/whatsapp/send \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"destination": "+393471234567",
"templateId": "promo_estate_tracked_2026",
"language": "it",
"components": [
{
"type": "HEADER",
"parameters": [
{"type": "image", "image": {"link": "https://cdn.shopitalia.it/promo/estate-2026-header.jpg"}}
]
},
{
"type": "BODY",
"parameters": [
{"type": "text", "text": "Marco"},
{"type": "text", "text": "50%"},
{"type": "text", "text": "30 giugno"}
]
},
{
"type": "BUTTON",
"sub_type": "URL",
"index": 0,
"parameters": [
{"type": "text", "text": "promo_estate"}
]
}
]
}'

Response — Messaggio inviato con tracking

{
"messageId": "wa-msg-trk-2026-04-09-001",
"accepted": true,
"destination": "+393471234567",
"templateId": "promo_estate_tracked_2026",
"trackingEnabled": true,
"trackedLinks": [
{
"buttonIndex": 0,
"originalUrl": "https://shopitalia.it/promo/estate2026?utm_source=whatsapp&utm_medium=template&utm_campaign=promo_estate",
"trackingUrl": "https://trk.agiletelecom.com/c/wa-msg-trk-2026-04-09-001-btn0"
}
]
}

:::tip Conserva i trackingUrl Salva i trackingUrl restituiti nella response per correlare i click con i singoli messaggi nel tuo sistema di analytics. :::

Risultato atteso

StepAzioneRisultato
1POST /whatsapp/templatesTemplate creato con trackButtonLinks: true
2Approvazione MetaStato APPROVED
3POST /whatsapp/sendMessaggio inviato con link tracciati
4Click destinatarioEvento registrato + redirect alla landing

Esempio completo end-to-end

# 1. Crea template con tracking (una tantum, attendi approvazione)
curl -s -X POST https://lora-api.agiletelecom.com/api/message-server/whatsapp/templates \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"name": "promo_estate_tracked_2026",
"language": "it",
"category": "MARKETING",
"components": [
{"type": "BODY", "text": "Ciao {{1}}, sconto {{2}} fino al {{3}}!",
"placeholderFields": [
{"index": 1, "label": "Nome", "example": "Marco"},
{"index": 2, "label": "Sconto", "example": "50%"},
{"index": 3, "label": "Scadenza", "example": "30 giugno"}]},
{"type": "BUTTONS", "buttons": [
{"type": "URL", "text": "Vai allo shop", "url": "https://shopitalia.it/promo?c={{1}}", "example": ["estate2026"]}]}
],
"trackButtonLinks": true
}' | jq .

# 2. Dopo approvazione, invia il messaggio
MSG_ID=$(curl -s -X POST https://lora-api.agiletelecom.com/api/message-server/whatsapp/send \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"destination": "+393471234567",
"templateId": "promo_estate_tracked_2026",
"language": "it",
"components": [
{"type": "BODY", "parameters": [{"type": "text", "text": "Marco"}, {"type": "text", "text": "50%"}, {"type": "text", "text": "30 giugno"}]},
{"type": "BUTTON", "sub_type": "URL", "index": 0, "parameters": [{"type": "text", "text": "estate2026"}]}
]
}' | jq -r '.messageId')

echo "Message ID: $MSG_ID"

Varianti

Template con più bottoni tracciati

Traccia click su bottoni multipli per capire quale CTA converte meglio:

curl -X POST https://lora-api.agiletelecom.com/api/message-server/whatsapp/templates \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"name": "multi_cta_tracked_2026",
"language": "it",
"category": "MARKETING",
"components": [
{"type": "BODY", "text": "Ciao {{1}}, scopri le nostre offerte!"},
{
"type": "BUTTONS",
"buttons": [
{"type": "URL", "text": "Offerte donna", "url": "https://shop.it/donna?c={{1}}", "example": ["spring"]},
{"type": "URL", "text": "Offerte uomo", "url": "https://shop.it/uomo?c={{1}}", "example": ["spring"]}
]
}
],
"trackButtonLinks": true
}'

Errori comuni

400 Bad Request — placeholderFields mancanti

{
"status": "fail",
"data": {
"placeholderFields": "Placeholder fields are required when body contains variables"
}
}

Soluzione: Ogni variabile {{N}} nel testo del body richiede un corrispondente oggetto in placeholderFields con index, label e example.

400 Bad Request — URL bottone non valido

{
"status": "fail",
"data": {
"buttons": "Button URL must be a valid HTTPS URL"
}
}

Soluzione: L'URL del bottone deve iniziare con https://. URL con protocollo HTTP o senza protocollo vengono rifiutati.

401 Unauthorized — API Key mancante o non valida

{
"status": "fail",
"data": {
"authentication": "Invalid or missing API key"
}
}

Soluzione: Verifica che l'header X-Api-Key sia presente e che la chiave sia attiva nel pannello della piattaforma.

Prossimi passi

Riferimenti