UC-029 — Report Campagna Completo
| Campo | Valore |
|---|---|
| ID | UC-029 |
| Obiettivo | Creare una campagna, monitorarne le statistiche e scaricare il report completo in CSV |
| Canale | SMS (applicabile a tutti i canali) |
| Complessità | ⭐⭐⭐ Avanzato |
| Tempo stimato | 25 minuti |
| API coinvolte | POST /api/partner-gateway/v1/campaigns, PUT /api/partner-gateway/v1/campaigns/{id}/confirm, GET /api/partner-gateway/v1/campaigns/{id}/stats, POST /api/partner-gateway/v1/exports/delivery-reports, GET /api/partner-gateway/v1/exports/{exportId} |
Scenari reali
- FashionOutlet — Analisi ROI Black Friday: Dopo la campagna Black Friday, il team marketing vuole un report dettagliato con tassi di consegna per operatore, costi totali e confronto con l'anno precedente.
- TelcoMobile — Report settimanale per il management: Ogni lunedi, il responsabile comunicazione genera un report aggregato delle campagne della settimana per la direzione.
- BancaAdriatica — Audit consegne cliente enterprise: Il team compliance deve documentare il tasso di consegna delle notifiche transazionali per un audit interno trimestrale.
:::info Use case composito Questo UC combina i flussi di UC-006 — Campagna Bulk SMS e UC-011 — Export Delivery Reports in un workflow end-to-end completo. :::
Flusso completo
Il diagramma illustra il workflow completo: dalla creazione della campagna al download del report CSV per l'analisi.
Step 1 — Crea la campagna
Crea una nuova campagna SMS indirizzata a una lista di contatti:
curl -X POST "https://lora-api.agiletelecom.com/api/partner-gateway/v1/campaigns" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Black Friday 2026 - SMS Promo",
"channel": "SMS",
"sender": "FashionOut",
"contactListId": "lst_bf2026_clienti_vip",
"message": {
"body": "Ciao {firstName}! Black Friday FashionOutlet: -50% su tutto solo oggi! Usa il codice BF2026 su https://fashionoutlet.it/bf Rispondi STOP per opt-out."
},
"scheduledDate": "2026-11-27T09:00:00+01:00"
}'
Response — Campagna creata
{ "id": "cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "status": "DRAFT", "totalContacts": 15420, "scheduledDate": "2026-11-27T09:00:00+01:00" }
:::tip Salva l'ID campagna
Il campo id della campagna e necessario per tutti gli step successivi: conferma, monitoraggio e collegamento al report.
:::
Step 2 — Conferma l'invio della campagna
La campagna resta in stato DRAFT fino alla conferma esplicita:
curl -X PUT "https://lora-api.agiletelecom.com/api/partner-gateway/v1/campaigns/cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90/confirm" \
-H "X-Api-Key: YOUR_API_KEY"
Response — Campagna confermata
{ "id": "cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90", "status": "CONFIRMED", "estimatedCompletionTime": "2026-11-27T09:45:00+01:00" }
Dietro le quinte — Cosa succede dopo la conferma
- Validazione: Il sistema verifica lista contatti, mittente e credito.
- Scheduling: Se la
scheduledDatee futura, la campagna resta in coda. - Throttling: L'invio avviene in batch (15.000 SMS in ~30-45 minuti).
- Credito: Addebitato all'invio effettivo, non alla conferma.
Step 3 — Monitora le statistiche della campagna
Durante e dopo l'invio, controlla le statistiche aggregate:
curl -X GET "https://lora-api.agiletelecom.com/api/partner-gateway/v1/campaigns/cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90/stats" \
-H "X-Api-Key: YOUR_API_KEY"
Response — Statistiche campagna completata
{
"campaignId": "cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90",
"status": "COMPLETED",
"stats": {
"totalMessages": 15420, "delivered": 14650, "failed": 458,
"deliveryRate": 95.01, "totalCost": 539.70
},
"completedAt": "2026-11-27T09:38:22+01:00"
}
:::info Polling delle statistiche
Le statistiche si aggiornano in tempo reale durante l'invio. Puoi interrogare l'endpoint ogni 30-60 secondi per monitorare il progresso. Lo status passa da SENDING a COMPLETED quando tutti i messaggi sono stati processati.
:::
Step 4 — Esporta il delivery report
Richiedi l'export CSV con il dettaglio di ogni singolo messaggio:
curl -X POST "https://lora-api.agiletelecom.com/api/partner-gateway/v1/exports/delivery-reports" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"dateFrom": "2026-11-27",
"dateTo": "2026-11-28",
"channel": "SMS",
"campaignId": "cmp_d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f90"
}'
Response — Export in coda
{
"exportId": "exp_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"status": "PENDING",
"type": "DELIVERY_REPORTS",
"createdAt": "2026-11-28T10:00:00+01:00"
}
Step 5 — Scarica il CSV
Interroga lo stato dell'export con GET /exports/{exportId}. Quando status e COMPLETED, usa il downloadUrl per scaricare il file:
curl -X GET "https://lora-api.agiletelecom.com/api/partner-gateway/v1/exports/exp_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d" \
-H "X-Api-Key: YOUR_API_KEY"
{
"exportId": "exp_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"status": "COMPLETED",
"isAvailableForDownload": true,
"downloadUrl": "https://cdn.agiletelecom.com/exports/exp_1a2b3c4d.csv?token=eyJhbG...",
"fileSize": 2458900,
"totalRows": 15420
}
curl -o "report_blackfriday_2026.csv" \
"https://cdn.agiletelecom.com/exports/exp_1a2b3c4d.csv?token=eyJhbG..."
Dietro le quinte — Struttura del CSV
Il CSV contiene una riga per messaggio con colonne: messageId, destination, channel, status, statusCode, sendDate, deliveryDate, cost, parts, campaignId. L'export asincrono e necessario per dataset di grandi dimensioni.
Risultato atteso
| Step | Azione | Risultato |
|---|---|---|
| 1 | POST /campaigns | Campagna creata, status: "DRAFT" |
| 2 | PUT /campaigns/{id}/confirm | status: "CONFIRMED", invio schedulato |
| 3 | GET /campaigns/{id}/stats | Statistiche aggregate, deliveryRate: 95.01% |
| 4 | POST /exports/delivery-reports | Export in coda, status: "PENDING" |
| 5 | GET /exports/{id} | CSV scaricabile con dettaglio 15.420 messaggi |
Esempio completo end-to-end
#!/bin/bash
API_KEY="YOUR_API_KEY"
BASE_URL="https://lora-api.agiletelecom.com/api/partner-gateway/v1"
# 1. Crea e conferma campagna
CMP_ID=$(curl -s -X POST "${BASE_URL}/campaigns" \
-H "X-Api-Key: ${API_KEY}" -H "Content-Type: application/json" \
-d '{"name":"Black Friday 2026","channel":"SMS","sender":"FashionOut","contactListId":"lst_bf2026_clienti_vip","message":{"body":"Ciao {firstName}! -50% su tutto! Codice BF2026"}}' | jq -r '.id')
curl -s -X PUT "${BASE_URL}/campaigns/${CMP_ID}/confirm" -H "X-Api-Key: ${API_KEY}" > /dev/null
# 2. Monitora fino al completamento
while true; do
CMP_STATUS=$(curl -s -X GET "${BASE_URL}/campaigns/${CMP_ID}/stats" \
-H "X-Api-Key: ${API_KEY}" | jq -r '.status')
echo "Stato: ${CMP_STATUS}"
[[ "$CMP_STATUS" == "COMPLETED" ]] && break
sleep 60
done
# 3. Esporta e scarica
EXP_ID=$(curl -s -X POST "${BASE_URL}/exports/delivery-reports" \
-H "X-Api-Key: ${API_KEY}" -H "Content-Type: application/json" \
-d '{"dateFrom":"2026-11-27","dateTo":"2026-11-28","channel":"SMS","campaignId":"'"${CMP_ID}"'"}' | jq -r '.exportId')
sleep 30
DL_URL=$(curl -s -X GET "${BASE_URL}/exports/${EXP_ID}" -H "X-Api-Key: ${API_KEY}" | jq -r '.downloadUrl')
curl -o "report_blackfriday_2026.csv" "$DL_URL"
Varianti
Report multi-canale
Per campagne multi-canale, ometti il filtro channel nella richiesta di export per includere SMS, RCS e WhatsApp nello stesso CSV.
Report aggregato per periodo
Per un report settimanale che include tutte le campagne, ometti campaignId e specifica solo dateFrom/dateTo.
Errori comuni
404 Not Found — Campagna non esistente
{ "status": "fail", "data": { "error": "Campaign not found" } }
Soluzione: Verifica l'ID campagna. Usa GET /campaigns per elencare le campagne disponibili.
Export FAILED — Intervallo date troppo ampio
{ "exportId": "exp_1a2b3c4d", "status": "FAILED", "error": "Date range too large. Maximum 90 days." }
Soluzione: Riduci l'intervallo a massimo 90 giorni. Per periodi più lunghi, suddividi in più export.
Prossimi passi
- UC-006 — Campagna Bulk SMS: Approfondisci la creazione di campagne
- UC-011 — Export Delivery Reports: Dettagli sugli export asincroni
- UC-007 — Gestione Contatti e Liste: Prepara le liste per le campagne
- UC-030 — Template Lifecycle Completo: Ciclo di vita completo di un template WhatsApp