Ricevi eventi in tempo reale da Superroute — ordini, cambi di stato, aggiornamenti di tracciamento. Con payload firmati, tentativi automatici e debugger integrato.
Un webhook è una richiesta HTTP POST che Superroute invia a un URL configurato ogni volta che succede qualcosa — un ordine viene creato, una consegna completata, un evento di tracciamento registrato. Tu costruisci un endpoint di ricezione, noi vi consegnamo l'evento.
Come funziona la consegna
Gli eventi vengono accodati e inviati in modo asincrono. Ogni richiesta porta una firma HMAC-SHA256 per verificare la provenienza. Le consegne fallite (non 2xx o timeout) vengono riprovate con backoff esponenziale fino a 5 volte.
Modello di sicurezza
Configuri un segreto condiviso nella pagina impostazioni. Ogni webhook uscente viene firmato con tale segreto. Il ricevitore ricalcola la firma e confronta — se coincidono, il payload è autentico e non manomesso.
Catalogo Eventi
Sono disponibili otto tipi di eventi uscenti. Ognuno ha il proprio campo URL nella pagina impostazioni — puoi iscriverti a qualsiasi sottoinsieme.
ordine.creato
Si attiva alla creazione di un ordine di consegna locale (Delivery / Pickup / P2P) tramite qualsiasi canale: form web, API REST/GraphQL, sincronizzazione piattaforma e-commerce, regole automatiche, righe importate, ecc. Esclude gli ordini label-service e altri tipi non di consegna. Saltato nel flusso batch quando lo stesso destinatario ha anche order_create_async_postback_url configurato. Configura con order_create_webhook_url.
Si attiva ad ogni evento del ciclo di vita di un pacco (informazioni inviate, inizio consegna, consegna riuscita, non consegnato, ecc.). Configura con tracking_event_webhook_url. Gli eventi di consegna e di ritiro contengono anche la prova di consegna: proof_files e proof_files_detail (file_id, type, url, full_url, URL di download firmato). Le foto caricate dopo l’evento arrivano come pod.files_updated. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
Esempi di Payload
{
"id": 90001,
"order_id": 1001,
"order_ref": "REF-001",
"location_id": 12,
"location_name": "Toronto Depot",
"tracking_event_type": "D",
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"otep_status": "delivered",
"proof_files": [
"storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg"
],
"proof_files_detail": [
{
"file_id": 234567,
"type": 1,
"url": "storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234567?expires=1784748600&signature=8f2c1d...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
},
{
"file_id": 234568,
"type": 2,
"url": "storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234568?expires=1784748600&signature=41ba90...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
}
],
"description": {
"en": "Your parcel has been delivered successfully. Thank you!",
"fr": "Votre colis a été livré avec succès. Merci !",
"chs": "您的包裹已成功送达,感谢您的使用!",
"cht": "您的包裹已成功送達,感謝您的使用!",
"es": "Tu paquete ha sido entregado con éxito. ¡Gracias!",
"de": "Ihr Paket wurde erfolgreich zugestellt. Vielen Dank!",
"nl": "Uw pakket is succesvol afgeleverd, bedankt voor uw gebruik!",
"pt": "Seu pacote foi entregue com sucesso. Obrigado!",
"it": "Il tuo pacco è stato consegnato con successo. Grazie!",
"sr": "Vaš paket je uspešno dostavljen, hvala vam što koristite naše usluge!",
"hu": "Csomagja sikeresen kiszállításra került, köszönjük hogy használta szolgáltatásunkat!",
"pl": "Twoja paczka została dostarczona pomyślnie. Dziękujemy!",
"sk": "Váš balík bol úspešne doručený. Ďakujeme!",
"cs": "Váš balík byl úspěšně doručen. Děkujeme!"
},
"tracking_number": [
"SR000000001"
],
"external_tracking_number": [
"1Z999AA10123456784"
]
}
ordine.create_async
Si attiva una volta al termine dell'elaborazione di un'importazione batch. Il payload contiene l'array dei risultati per riga. Configura con order_create_async_postback_url.
Attivato quando una foto di consegna o una firma viene aggiunta, sostituita o rimossa (action: added / updated / removed) — un invio per file, niente più polling degli allegati. Si attiva configurando pod_files_webhook_url. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
Attivato quando un ordine viene eliminato definitivamente, così il tuo sistema può replicare la rimozione. Si attiva configurando order_deleted_webhook_url.
Attivato quando un tentativo di annullamento viene rifiutato (ad esempio l'ordine è già in consegna), così i tuoi processi operativi possono monitorare gli annullamenti falliti senza interrogare l'API. Si attiva configurando order_cancel_failed_webhook_url.
Esempi di Payload
{
"result": false,
"code": "ORDER_ALREADY_IN_DELIVERY",
"message": "Order can no longer be cancelled at its current status",
"http_status": 409,
"submitted": {
"order_id": 1001,
"tracking_number": "SR000000001",
"external_tracking_number": null
}
}
Posto della bacheca percorsi modificato
Si attiva quando un posto della bacheca percorsi cambia titolare o la bacheca cambia stato — il campo action indica cosa è successo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Solo a livello aziendale. Iscrizione tramite route_board_webhook_url.
Un canale webhook separato per i fornitore di consegna terzi integrati con gli armadietti intelligenti. Gli eventi vengono consegnati all'endpoint configurato per il tuo account fornitore e ogni endpoint può sottoscrivere qualsiasi sottoinsieme di tipi di evento.
partner_locker.delivery.doors_opened
Sportelli Aperti — Si attiva nel momento in cui gli sportelli si aprono per un tentativo di consegna — sia che il corriere abbia usato lo schermo dell'armadietto con il codice di accesso sia l'API di apertura remota — incluse le riaperture per riassegnazione. Il blocco opening elenca ogni scomparto aperto con grid_id, numero sportello hardware compartment_number e pickup_locker_number (numero sequenziale di visualizzazione contato dall'alto verso il basso per colonna, poi da sinistra a destra). Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro. Il payload include anche pickup_code: il codice di ritiro del destinatario, assegnato nel momento in cui si aprono gli sportelli; resta lo stesso codice dopo che il corriere conferma il deposito e diventa utilizzabile per il ritiro solo a deposito confermato.
Consegnato nell'armadietto — Attivato quando un deposito è confermato e i pacchi sono nell'armadietto. Il payload include il codice di ritiro del destinatario. Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro. Per gli sportelli aperti tramite l'API di apertura remota la piattaforma liquida il deposito non appena l'armadietto segnala chiusi tutti gli sportelli aperti, quindi l'evento scatta senza una chiamata confirm; confirmed_by indica il percorso di liquidazione: courier_terminal, partner_api, door_close, timeout_door_closed o console.
Riapertura di correzione — Attivato quando gli scomparti occupati vengono riaperti entro la finestra di correzione per rimediare a un posizionamento errato — dallo schermo dell'armadietto o tramite API. Il blocco correction elenca gli scomparti riaperti. Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro.
partner_locker_delivery.event_type_code_rotated — Si attiva quando il partner rigenera il codice di consegna o il codice di ritiro di una consegna. Il blocco rotation indica quale codice è stato sostituito, quando, e se la notifica al destinatario è stata reinviata — il nuovo codice non viaggia mai in un webhook; viene rivelato solo nella risposta diretta dell'API di rigenerazione.
Firma e Verifica: I webhook degli armadietti fornitore usano un proprio schema di firma: X-Webhook-Signature è base64(HMAC-SHA256(segreto, timestamp + "\n" + id consegna + "\n" + corpo grezzo)), dove timestamp e id consegna provengono dagli header X-Webhook-Timestamp e X-Webhook-Delivery-Id. Verifica anche X-Webhook-Content-Digest (SHA-256 del corpo) e rifiuta i timestamp obsoleti. X-Webhook-Id resta stabile tra i tentativi — usalo per l'idempotenza.
Come Configurare: Gli endpoint si gestiscono in Consegna di terzi → Armadietto fornitore → Impostazioni, un endpoint per fornitore, con un elenco di eventi selezionabile. Le consegne fallite vengono ritentate con backoff esponenziale fino a 7 volte prima della dead letter; gli eventi in dead letter possono essere reinviati manualmente dalla pagina eventi.
Eventi sandbox (armadietti simulati): Le consegne create su armadietti simulati emettono gli stessi eventi webhook della produzione, firmati con lo stesso segreto, così da poter sviluppare con traffico realistico. Gli eventi sandbox sono contrassegnati in tre modi: il payload contiene "livemode": false, l'event_id inizia con PLE-MOCK- e la richiesta include l'header X-Webhook-Test: 1. Se sull'endpoint è configurato un URL sandbox, gli eventi sandbox vengono inviati lì invece che all'URL di produzione; altrimenti ripiegano sull'URL di produzione, sempre contrassegnati. L'interruttore «Consegna eventi sandbox» ferma completamente la consegna sandbox.
Eventi di consegna di terzi
Webhook di consegna pacchi inviati ai fornitori di consegna di terzi (corrieri). Coprono il ciclo di vita delle assegnazioni di consegna, così il corriere non deve più interrogare la piattaforma in cerca di nuovi incarichi. Questa categoria è separata dagli eventi degli armadietti intelligenti qui sotto: ogni fornitore configura per categoria un endpoint, un segreto di firma e una sottoscrizione eventi indipendenti — nel proprio portale fornitore oppure tramite l'operatore della piattaforma.
delivery.assignment.created
Assegnazione creata — Si attiva quando un ordine viene assegnato al fornitore — da una regola automatica o manualmente. Il payload contiene il numero di assegnazione, gli identificativi dell'ordine e i numeri di tracciamento dei pacchi.
Assegnazione annullata — Si attiva quando la piattaforma ritira un'assegnazione dal fornitore. Il campo reason distingue cancelled (l'assegnazione è stata annullata presso il vettore), fallback_to_self_delivery (la piattaforma ha ripreso l'ordine in consegna propria) e reassigned (l'ordine è stato spostato a un altro fornitore).
Consegna parziale — Si attiva quando una parte della spedizione è stata consegnata mentre altri colli sono ancora in corso. L'array packages riporta l'esito di ogni collo e legs elenca gli ordini esterni prenotati presso il corriere: uno per collo quando il corriere non accetta spedizioni multicollo.
Firma e Verifica: I webhook di consegna di terzi usano lo stesso schema di firma dei webhook degli armadietti fornitore: X-Webhook-Signature è base64(HMAC-SHA256(secret, timestamp + "\n" + delivery id + "\n" + raw body)), dove timestamp e delivery id provengono dagli header X-Webhook-Timestamp e X-Webhook-Delivery-Id. Verifica anche X-Webhook-Content-Digest (SHA-256 del corpo) e rifiuta i timestamp obsoleti. X-Webhook-Id resta stabile tra i tentativi — usalo per l'idempotenza.
Come Configurare: I fornitori configurano questo endpoint autonomamente nel portale fornitore (Impostazioni webhook), oppure lo fa l'operatore della piattaforma in Consegna di terzi → Fornitori → Webhook. Un endpoint per fornitore con un elenco di eventi selezionabile. Il segreto di firma può essere generato automaticamente o impostato con un valore personalizzato, ed è consultabile nella pagina delle impostazioni. Le consegne fallite vengono ritentate con backoff esponenziale fino a 7 volte prima della dead letter; gli eventi in dead letter possono essere reinviati manualmente. Dalla pagina delle impostazioni è possibile inviare in qualsiasi momento un evento di test (mock) firmato: le richieste di test portano l'header X-Webhook-Test: 1 e contengono "test": true nei dati del payload.
Eventi del ciclo di vita dell'ordine
Eventi granulari e opzionali accanto al classico webhook order.status_change (che resta invariato): chi è stato assegnato, se l'autista ha accettato, quando il pacco è stato ritirato, è in viaggio, consegnato o fallito, oltre ai cambi di turno degli autisti e alle posizioni degli autisti a frequenza limitata. Non viene inviato nulla finché non configuri gli URL qui sotto.
order.assigned
Un autista è stato assegnato all'ordine (manualmente, dalla pianificazione dei giri o dall'assegnazione automatica). data.source = auto_assign quando lo ha fatto l'orchestratore.
Una posizione dell'autista proveniente dall'app o dal tracker, limitata per autista da driver_location_min_interval_sec (predefinito 60 s). Inviata solo a driver_location_webhook_url.
Come Configurare: Impostazioni → Webhook (oppure GET/PUT /api/v1/webhook-settings, GraphQL webhookSettingsUpdate): order_lifecycle_webhook_url riceve tutti gli eventi order.* e driver.on_duty_changed; order_lifecycle_events li restringe a un elenco separato da virgole; driver_location_webhook_url e driver_location_min_interval_sec controllano driver.location_update. È possibile indicare più URL separati da virgole. Le consegne compaiono nel registro delle consegne webhook con reference_type order / driver.
Firma e Verifica: Firmato esattamente come ogni altro webhook in uscita del tuo account: header Signature legacy più X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 con il tuo webhook_sign_secret. I nuovi tentativi riutilizzano lo stesso event_id: usalo per la deduplicazione.
Eventi degli ordini su dispositivo
Eventi facoltativi per i pacchi gestiti dai tuoi armadietti intelligenti, chioschi e smart drop: un pacco depositato in una macchina, ritirato, prelevato dal personale o oltre la scadenza di ritiro, e i problemi aperti o risolti su di esso. Solo aggiuntivo: nessun webhook esistente cambia e non viene inviato nulla finché non configuri device_order_webhook_url.
device_order.stored
Un pacco è stato depositato nella macchina e attende la persona successiva (destinatario, corriere o operatore, vedi data.device_order.next_actor). due_at è la scadenza di ritiro.
Il pacco ha superato il suo due_at senza essere ritirato. È ancora nella macchina e il codice funziona ancora; overdue_at viene impostato e next_actor diventa operator.
È stato aperto un problema sulla gestione (ad esempio door_left_open, deposit_unverified, item_missing, overdue). data.exception contiene id, type, severity e status.
Esempi di Payload: data.device_order: id, kind, status, next_actor, device_type, device_id, device_name, grid_code, reference_number, order_id, external_order_id, due_at, overdue_at, stored_at, ended_at, removal_reason (orari in ISO 8601, null finché non raggiunti). Gli eventi di problema aggiungono data.exception: id, type, severity, status, resolution_action. Il codice di ritiro non è mai incluso. event_id è DOE-<id dell'evento del registro> e resta invariato nei tentativi successivi.
Come Configurare: Impostazioni → Webhooks (o GET/PUT /api/v1/webhook-settings): device_order_webhook_url riceve ogni evento device_order.*; device_order_events lo limita a un elenco separato da virgole. Più URL possono essere separati da virgole. Le consegne compaiono nel registro delle consegne webhook con reference_type device_order.
Firma e Verifica: Firmato esattamente come ogni altro webhook in uscita del tuo account: header Signature legacy più X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 con il tuo webhook_sign_secret. I nuovi tentativi riutilizzano lo stesso event_id: usalo per la deduplicazione.
I pacchi che un vettore partner consegna nei tuoi armadietti con il proprio account non vengono inviati su questo canale; il partner li riceve tramite i webhook degli armadietti del fornitore.
Come Configurare
Puoi configurare i webhook a due livelli: aziendale (copre tutto) o per cliente (sovrascrive per quel sotto-account B2B specifico).
1. Vai alle impostazioni
Accedi e vai in Impostazioni → API e Webhook. Le sovrascritture per cliente sono nella pagina di dettaglio del cliente.
2. Imposta il segreto di firma
Scegli una stringa di almeno 16 caratteri, idealmente 32+ byte casuali. Il ricevitore la userà per verificare le firme.
3. Imposta gli URL eventi desiderati
Compila solo gli URL degli eventi che ti interessano. Lascia gli altri vuoti.
webhook_sign_secretConfiguri un segreto condiviso nella pagina impostazioni. Ogni webhook uscente viene firmato con tale segreto. Il ricevitore ricalcola la firma e confronta — se coincidono, il payload è autentico e non manomesso.
order_create_webhook_urlSi attiva alla creazione di un ordine di consegna locale (Delivery / Pickup / P2P) tramite qualsiasi canale: form web, API REST/GraphQL, sincronizzazione piattaforma e-commerce, regole automatiche, righe importate, ecc. Esclude gli ordini label-service e altri tipi non di consegna. Saltato nel flusso batch quando lo stesso destinatario ha anche order_create_async_postback_url configurato. Configura con order_create_webhook_url.
order_status_change_webhook_urlSi attiva ad ogni transizione di stato — ritirato, in transito, consegnato, eccezione, annullato. Configura con order_status_change_webhook_url.
tracking_event_webhook_urlSi attiva ad ogni evento del ciclo di vita di un pacco (informazioni inviate, inizio consegna, consegna riuscita, non consegnato, ecc.). Configura con tracking_event_webhook_url. Gli eventi di consegna e di ritiro contengono anche la prova di consegna: proof_files e proof_files_detail (file_id, type, url, full_url, URL di download firmato). Le foto caricate dopo l’evento arrivano come pod.files_updated. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
order_create_async_postback_urlSi attiva una volta al termine dell'elaborazione di un'importazione batch. Il payload contiene l'array dei risultati per riga. Configura con order_create_async_postback_url.
pod_files_webhook_urlAttivato quando una foto di consegna o una firma viene aggiunta, sostituita o rimossa (action: added / updated / removed) — un invio per file, niente più polling degli allegati. Si attiva configurando pod_files_webhook_url. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
order_deleted_webhook_urlAttivato quando un ordine viene eliminato definitivamente, così il tuo sistema può replicare la rimozione. Si attiva configurando order_deleted_webhook_url.
order_cancel_failed_webhook_urlAttivato quando un tentativo di annullamento viene rifiutato (ad esempio l'ordine è già in consegna), così i tuoi processi operativi possono monitorare gli annullamenti falliti senza interrogare l'API. Si attiva configurando order_cancel_failed_webhook_url.
route_board_webhook_urlSi attiva quando un posto della bacheca percorsi cambia titolare o la bacheca cambia stato — il campo action indica cosa è successo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Solo a livello aziendale. Iscrizione tramite route_board_webhook_url.
device_order_webhook_urlEventi facoltativi per i pacchi gestiti dai tuoi armadietti intelligenti, chioschi e smart drop: un pacco depositato in una macchina, ritirato, prelevato dal personale o oltre la scadenza di ritiro, e i problemi aperti o risolti su di esso. Solo aggiuntivo: nessun webhook esistente cambia e non viene inviato nulla finché non configuri device_order_webhook_url.
Ogni webhook uscente porta una firma HMAC-SHA256 codificata in esadecimale nell'header. Il ricevitore deve ricalcolarla sul body grezzo con il segreto condiviso e rifiutare la richiesta se non corrisponde.
Algoritmo
HMAC-SHA256 (hex)
Nome header
Signature
Passi di verifica
Leggi il body grezzo prima che parsing o middleware lo modifichino.
Calcola hash_hmac('sha256', rawBody, sharedSecret) e codifica in esadecimale.
Confronta con l'header Signature a tempo costante (hash_equals in PHP, crypto.timingSafeEqual in Node).
Rispondi 2xx solo se le firme coincidono. Altrimenti 401.
func handleWebhook(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
received := r.Header.Get("Signature")
mac := hmac.New(sha256.New, []byte(sharedSecret))
mac.Write(body)
expected := hex.EncodeToString(mac.Sum(nil))
if !hmac.Equal([]byte(received), []byte(expected)) {
w.WriteHeader(401); return
}
// ... handle event ...
w.WriteHeader(200)
w.Write([]byte("ok"))
}
require 'openssl'
require 'rack/utils'
post '/webhooks/superroute' do
raw = request.body.read
received = request.env['HTTP_SIGNATURE'] || ''
expected = OpenSSL::HMAC.hexdigest('sha256', shared_secret, raw)
halt 401 unless Rack::Utils.secure_compare(received, expected)
payload = JSON.parse(raw)
# ... handle event ...
status 200
'ok'
end
Tentativi e Affidabilità
L'endpoint dovrebbe rispondere rapidamente con 2xx. Altrimenti, in caso di timeout o irraggiungibilità, la consegna viene riprovata.
Tentativi massimi
5 (iniziale + 4 retry)
Timeout per tentativo
3 secondi
Backoff
Esponenziale — circa 10s, 100s, 1000s, 10000s
Progetta per l'idempotenza. Poiché una consegna può essere ritentata, il ricevitore può vedere lo stesso evento più volte. Usa l'ID ordine/tracking come chiave di deduplica — conserva gli ID elaborati almeno 24 ore.
Risposta consigliata. Conferma rapidamente (HTTP 200) ed elabora in modo asincrono. Evita operazioni lente in modo sincrono nel handler — incontrerai il timeout di 3 secondi.
Verificatore di Firma
Incolla un payload ricevuto, il valore dell'header Signature e il tuo segreto — lo strumento ricalcola la firma nel browser (nulla esce da questa pagina) e ti dice se coincide.
Invia Webhook di Test
Spara un webhook reale e firmato correttamente dal nostro server a un URL che fornisci. Usalo per verificare raggiungibilità del ricevitore, parsing del payload e logica di verifica firma.
Consegne Webhook Recenti
Vedi i tentativi di consegna webhook più recenti del tuo account — eventi reali di produzione e test inviati da questa pagina. Incolla il Bearer token per caricare.
Tempo
Evento
URL
Stato
HTTP
Tentativo
Tempo (ms)
Prova?
Azioni
Nessuna consegna webhook trovata.
Best Practice
Conferma rapidamente (HTTP 200) ed elabora in modo asincrono per restare sotto il timeout di 3 secondi.
Verifica sempre la firma prima di fidarti del payload.
Tratta gli eventi come at-least-once — deduplica sul numero ordine/tracking.
Usa endpoint HTTPS con certificato valido.
Logga le richieste in ingresso per poterle riprodurre se il handler ha un bug.