Passa al contenuto principale

UC-028 — Compliance e Opt-out (GDPR)

CampoValore
IDUC-028
ObiettivoGestire richieste di opt-out e cancellazione contatti in conformita GDPR
CanaleTutti (SMS, RCS, WhatsApp)
Complessità⭐⭐ Intermedio
Tempo stimato15 minuti
API coinvolteGET /api/partner-gateway/v1/contacts, DELETE /api/partner-gateway/v1/contacts, DELETE /api/partner-gateway/v1/contacts/list/contacts

Scenari reali

  • FashionOutlet — Richiesta GDPR art. 17: Un cliente invia un'email richiedendo la cancellazione completa dei propri dati. L'operatore deve rimuoverlo da tutte le liste e cancellare il contatto entro 30 giorni.
  • TelcoMobile — Gestione opt-out: Un utente risponde "STOP" a un SMS promozionale. Il sistema automaticamente lo rimuove dalle liste marketing e lo aggiunge alla lista di esclusione.
  • ClinicaSalute — Pulizia contatti non raggiungibili: Dopo una campagna, il team marketing rimuove tutti i contatti con stato ERROR permanente per mantenere le liste pulite e ridurre i costi.

Flusso di opt-out e cancellazione

Il diagramma illustra il flusso completo di gestione di una richiesta di opt-out: ricerca del contatto, rimozione dalle liste, cancellazione definitiva e conferma.

Step 1 — Cerca il contatto per numero di telefono

Quando ricevi una richiesta di opt-out, cerca il contatto nel sistema:

curl -X GET "https://lora-api.agiletelecom.com/api/partner-gateway/v1/contacts?phone=%2B393471234567" \
-H "X-Api-Key: YOUR_API_KEY"

Response — Contatto trovato

{
"content": [{
"id": "cnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
"phone": "+393471234567",
"firstName": "Marco",
"lastName": "Bianchi",
"lists": [
{ "id": "lst_001", "name": "Clienti attivi" },
{ "id": "lst_002", "name": "Newsletter marketing" },
{ "id": "lst_003", "name": "Promo stagionali" }
]
}],
"totalElements": 1
}

:::tip Nota il contactId e le liste Il campo id del contatto e gli id delle liste ti serviranno per gli step successivi. Se il contatto e presente in più liste, dovrai rimuoverlo da ciascuna. :::

Step 2 — Rimuovi il contatto da tutte le liste

Per ogni lista in cui il contatto e presente, rimuovilo:

# Rimuovi da "Clienti attivi"
curl -X DELETE "https://lora-api.agiletelecom.com/api/partner-gateway/v1/contacts/list/lst_001/contacts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactIds": ["cnt_f47ac10b-58cc-4372-a567-0e02b2c3d479"]
}'

Response — Rimosso dalla lista

{
"removed": 1,
"listId": "lst_001",
"listName": "Clienti attivi"
}

Ripeti per tutte le liste (lst_002, lst_003, ecc.) con lo stesso pattern.

Dietro le quinte — Perche rimuovere dalle liste prima di cancellare
  1. Integrita referenziale: Rimuovere il contatto dalle liste prima della cancellazione assicura che non restino riferimenti orfani. Alcune campagne programmate potrebbero ancora referenziare le liste.
  2. Audit trail: La rimozione esplicita da ogni lista genera eventi tracciabili nel log, utili per dimostrare la conformita GDPR.
  3. Campagne in corso: Se una campagna e in fase di invio e usa una di queste liste, la rimozione preventiva impedisce che il contatto riceva ulteriori messaggi prima della cancellazione completa.
  4. Tempistiche GDPR: Il Regolamento europeo (art. 17) concede 30 giorni per completare la cancellazione. Tuttavia, e buona pratica bloccare immediatamente l'invio (rimozione dalle liste) e procedere alla cancellazione il prima possibile.

Step 3 — Cancella il contatto

Dopo aver rimosso il contatto da tutte le liste, procedi con la cancellazione definitiva:

curl -X DELETE "https://lora-api.agiletelecom.com/api/partner-gateway/v1/contacts/cnt_f47ac10b-58cc-4372-a567-0e02b2c3d479" \
-H "X-Api-Key: YOUR_API_KEY"

Response — Contatto cancellato

{
"deleted": true,
"contactId": "cnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
"deletedAt": "2026-04-09T16:45:00+02:00"
}

:::danger Cancellazione permanente La cancellazione del contatto e irreversibile. Tutti i dati associati (nome, email, telefono, storico liste) verranno rimossi definitivamente. Assicurati di aver completato le operazioni di audit e backup necessarie prima di procedere. :::

Step 4 — Verifica la cancellazione

Conferma che il contatto non esista più nel sistema:

curl -X GET "https://lora-api.agiletelecom.com/api/partner-gateway/v1/contacts?phone=%2B393471234567" \
-H "X-Api-Key: YOUR_API_KEY"

Response — Nessun risultato

{
"content": [],
"totalElements": 0,
"page": 0,
"size": 20
}

Risultato atteso

StepAzioneRisultato
1GET /contacts?phone=...Contatto trovato con lista associazioni
2DELETE /contacts/list/{id}/contactsContatto rimosso da tutte le liste
3DELETE /contacts/{id}Contatto cancellato definitivamente
4GET /contacts?phone=...totalElements: 0, conferma cancellazione

Esempio completo end-to-end

Ecco lo scenario FashionOutlet completo per una richiesta GDPR art. 17:

#!/bin/bash
# Script GDPR opt-out completo per FashionOutlet

API_KEY="YOUR_API_KEY"
BASE_URL="https://lora-api.agiletelecom.com/api/partner-gateway/v1"
PHONE="+393471234567"
PHONE_ENCODED="%2B393471234567"

echo "=== GDPR Opt-out Request ==="
echo "Data richiesta: $(date -Iseconds)"
echo "Numero: ${PHONE}"

# 1. Cerca il contatto
CONTACT=$(curl -s -X GET "${BASE_URL}/contacts?phone=${PHONE_ENCODED}" \
-H "X-Api-Key: ${API_KEY}")

CONTACT_ID=$(echo "$CONTACT" | jq -r '.content[0].id')
TOTAL=$(echo "$CONTACT" | jq -r '.totalElements')

if [[ "$TOTAL" == "0" || "$CONTACT_ID" == "null" ]]; then
echo "Contatto non trovato. Nessuna azione necessaria."
exit 0
fi

echo "Contatto trovato: ${CONTACT_ID}"

# 2. Recupera le liste associate
LISTS=$(echo "$CONTACT" | jq -r '.content[0].lists[].id')

for LIST_ID in $LISTS; do
echo "Rimozione da lista: ${LIST_ID}"
curl -s -X DELETE "${BASE_URL}/contacts/list/${LIST_ID}/contacts" \
-H "X-Api-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{"contactIds": ["'"${CONTACT_ID}"'"]}' > /dev/null
done

# 3. Cancella il contatto
echo "Cancellazione contatto: ${CONTACT_ID}"
curl -s -X DELETE "${BASE_URL}/contacts/${CONTACT_ID}" \
-H "X-Api-Key: ${API_KEY}" > /dev/null

# 4. Verifica
VERIFY=$(curl -s -X GET "${BASE_URL}/contacts?phone=${PHONE_ENCODED}" \
-H "X-Api-Key: ${API_KEY}" | jq -r '.totalElements')

if [[ "$VERIFY" == "0" ]]; then
echo "Cancellazione confermata. GDPR request completata."
else
echo "ATTENZIONE: contatto ancora presente. Verifica manuale necessaria."
fi

Varianti

Opt-out solo marketing (conserva contatto)

Se l'utente vuole solo smettere di ricevere messaggi promozionali, rimuovilo solo dalle liste marketing mantenendo il contatto nel sistema per le comunicazioni transazionali.

Pulizia massiva contatti non raggiungibili

Dopo una campagna, rimuovi in batch i contatti con errori permanenti passando un array di contactIds a DELETE /contacts/list/{listId}/contacts.

Errori comuni

404 Not Found — Contatto non esistente

{ "status": "fail", "data": { "error": "Contact not found" } }

Soluzione: Il contatto potrebbe essere già stato cancellato. Verifica con GET /contacts prima di tentare la cancellazione.

409 Conflict — Contatto in uso da campagna attiva

{ "status": "fail", "data": { "error": "Contact is referenced by an active campaign" } }

Soluzione: Attendi il completamento della campagna oppure rimuovi prima il contatto dalle liste coinvolte.

Prossimi passi

Riferimenti