27 ott 2025·8 min di lettura

Ritenti automatici dei webhook vs replay manuale: progettare un recupero più sicuro

Ritenti automatici dei webhook vs replay manuale: confronta UX e carico sul supporto e scopri pattern di replay che prevengono doppi addebiti e record duplicati.

Ritenti automatici dei webhook vs replay manuale: progettare un recupero più sicuro

Cosa si rompe quando un webhook fallisce

Un fallimento di webhook raramente è "solo un problema tecnico." Per un utente, sembra che la tua app abbia dimenticato qualcosa: un ordine resta "in sospeso", un abbonamento non si attiva, un biglietto non passa mai a "pagato" o lo stato di una consegna è sbagliato.

La maggior parte delle persone non vede mai il webhook. Vedono solo che il tuo prodotto e la loro banca, casella di posta o dashboard non sono d'accordo. Se c'è in gioco del denaro, quel divario distrugge rapidamente la fiducia.

I fallimenti di solito accadono per motivi banali. Il tuo endpoint va in timeout perché è lento. Il tuo server restituisce un 500 durante un deploy. Un hop di rete perde la richiesta. A volte rispondi troppo tardi anche se il lavoro era stato completato. Per il provider, tutto questo sembra "non consegnato", quindi ritenta o segna l'evento come fallito.

La progettazione del recupero è importante perché gli eventi webhook spesso rappresentano azioni irrevocabili: un pagamento completato, un rimborso emesso, un account creato, un reset della password, una spedizione inviata. Se perdi un evento, i dati sono errati. Se lo processi due volte puoi addebitare due volte o creare record duplicati.

Questo fa diventare il confronto tra ritenti automatici e replay manuale una decisione di prodotto, non solo di ingegneria. Ci sono due strade:

  • Ritenti automatici del provider: il mittente prova di nuovo secondo una cadenza fino a ottenere una risposta di successo.
  • Replay manuale da parte tua: un umano (supporto o un admin) avvia la rielaborazione quando qualcosa non va.

Gli utenti si aspettano affidabilità senza sorprese. Il tuo sistema dovrebbe recuperare da solo la maggior parte delle volte, e quando interviene un umano, gli strumenti devono essere chiari su cosa accadrà e sicuri se premuti due volte. Anche in una soluzione no-code, tratta ogni webhook come "potrebbe arrivare di nuovo."

Ritenti automatici: dove aiutano e dove danneggiano

I ritenti automatici sono il paracadute predefinito per i webhook. La maggior parte dei provider ritenta su errori di rete e timeout, spesso con backoff (minuti, poi ore) e un cutoff dopo un giorno o due. Questo è confortante, ma cambia sia l'esperienza utente che la storia del supporto.

Dal lato utente, i ritenti possono trasformare un momento pulito di "pagamento confermato" in un imbarazzante ritardo. Un cliente paga, vede il successo sulla pagina del provider e la tua app resta "in sospeso" fino al prossimo tentativo. Il contrario succede anche: dopo un'ora di downtime, i ritenti arrivano a ondate e vecchi eventi "recuperano" tutti insieme.

Il supporto spesso riceve meno ticket quando i ritenti funzionano, ma i ticket che restano sono più difficili. Invece di un singolo fallimento evidente, stai scavando attraverso consegne multiple, codici di risposta diversi e un lungo intervallo tra l'azione originale e il successo finale. Quell'intervallo è difficile da spiegare.

I ritenti causano veri problemi operativi quando un downtime scatena una ondata di consegne ritardate, gestori lenti continuano a fare timeout anche se il lavoro è stato eseguito, o consegne duplicate causano doppia creazione o doppio addebito perché il sistema non è idempotente. Possono anche nascondere comportamenti instabili finché non diventano un pattern.

I ritenti sono solitamente sufficienti quando la gestione degli errori è semplice: aggiornamenti non monetari, azioni sicure da applicare due volte e eventi in cui un piccolo ritardo è accettabile. Se l'evento può muovere denaro o creare record permanenti, la scelta tra ritenti e replay diventa meno una questione di comodità e più di controllo.

Replay manuale: controllo, responsabilità e compromessi

Il replay manuale significa che una persona decide di rielaborare un evento webhook invece di affidarsi alla cadenza di ritento del provider. Questa persona può essere un agente di supporto, un admin lato cliente o (nei casi a basso rischio) l'utente finale che clicca "Riprova." Nel dibattito ritenti vs replay, il replay favorisce il controllo umano rispetto alla velocità.

L'esperienza utente è mista. Per incidenti di alto valore, un pulsante di replay può risolvere rapidamente un caso singolo senza aspettare la finestra di ritento successiva. Ma molti problemi resteranno più a lungo perché nulla accade finché qualcuno non nota e agisce.

Il carico sul supporto di solito aumenta, perché il replay trasforma fallimenti silenziosi in ticket e follow-up. Il vantaggio è la chiarezza: il supporto può vedere cosa è stato riprodotto, quando, da chi e perché. Quel registro di controllo è importante quando ci sono soldi, accessi o documenti legali in gioco.

La sicurezza è la parte difficile. Uno strumento di replay dovrebbe avere permessi e ambito limitato:

  • Solo ruoli fidati possono eseguire replay, e solo per sistemi specifici.
  • I replay sono limitati a un singolo evento, non a "replay di tutto."
  • Ogni replay è registrato con motivo, attore e timestamp.
  • I dati sensibili del payload sono mascherati nell'interfaccia.
  • I rate limit prevengono abusi e spam accidentale.

Il replay manuale è spesso preferibile per azioni ad alto rischio come creare fatture, fornire account, rimborsi o qualsiasi cosa che potrebbe addebitare due volte o creare record duplicati. Si adatta anche a team che richiedono passaggi di revisione, come "conferma pagamento saldato" prima di riprovare la creazione di un ordine.

Come scegliere tra ritenti e replay

Scegliere tra ritenti automatici e replay manuale non è una regola unica. L'approccio più sicuro è di solito misto: ritenta automaticamente gli eventi a basso rischio e richiedi un replay deliberato per tutto ciò che potrebbe costare denaro o generare duplicati difficili da sistemare.

Inizia classificando ogni evento webhook per rischio. Un aggiornamento di stato di consegna è fastidioso se ritardato, ma raramente causa danni duraturi. payment_succeeded o create_subscription sono eventi ad alto rischio perché una corsa in più può addebitare due volte o creare record duplicati.

Poi decidi chi può innescare il recupero. I ritenti di sistema sono ottimi quando l'azione è sicura e veloce. Per eventi sensibili, è spesso meglio lasciare che il supporto o le operations inneschino un replay dopo aver verificato l'account del cliente e la dashboard del provider. Permettere agli utenti finali di riprovare può funzionare per azioni a basso rischio, ma può anche trasformarsi in click ripetuti e più duplicati.

Anche le finestre temporali contano. I ritenti avvengono solitamente in minuti o ore perché sono pensati per curare problemi transitori. I replay manuali possono essere consentiti per periodi più lunghi, ma non per sempre. Una regola comune è permettere il replay finché il contesto di business è ancora valido (prima che un ordine venga spedito, prima che chiuda un periodo di fatturazione), poi richiedere una correzione più attenta.

Una checklist rapida per ogni tipo di evento:

  • Qual è la cosa peggiore che succede se viene eseguito due volte?
  • Chi può verificare l'esito (sistema, supporto, operations, utente)?
  • Quanto velocemente deve avere successo (secondi, minuti, giorni)?
  • Quale tasso di duplicati è accettabile (quasi zero per il denaro)?
  • Quanto tempo di supporto per incidente è accettabile?

Se il tuo sistema ha perso un webhook create_invoice, una breve serie di ritenti può andare bene. Se ha perso charge_customer, preferisci un replay manuale con un audit trail chiaro e controlli di idempotenza integrati.

Se stai costruendo il flusso in uno strumento no-code come AppMaster, tratta ogni webhook come un processo di business con un percorso di recupero esplicito: ritento automatico per i passaggi sicuri e un'azione di replay separata per i passaggi ad alto rischio che richiedono conferma e mostrano cosa accadrà prima di eseguirli.

Idempotenza e basi della deduplicazione

Metti il pattern in pratica
Trasforma questa checklist in un flusso di recupero funzionante con database, logica e UI in un’unica build.
Prova la piattaforma

Idempotenza significa che puoi processare lo stesso webhook più di una volta in sicurezza. Se il provider ritenta o un agente di supporto riproduce un evento, il risultato finale dovrebbe essere lo stesso che processarlo una sola volta. Questa è la base di un recupero sicuro nel confronto tra ritenti e replay.

Scegliere una chiave di idempotenza affidabile

La questione è come decidere "abbiamo già applicato questo?" Buone opzioni dipendono da cosa fornisce il mittente:

  • ID dell'evento del provider (ideale quando è stabile e unico)
  • ID di consegna del provider (utile per diagnosticare i ritenti, ma non sempre coincide con l'evento)
  • La tua chiave composita (per esempio: provider + account + object ID + tipo evento)
  • Un hash del payload raw (fallback quando non c'è altro, ma attenzione a spazi bianchi o ordine dei campi)
  • Una chiave generata che restituisci al provider (funziona solo con API che la supportano)

Se il provider non garantisce ID unici, considera il payload come non affidabile per l'unicità e costruisci una chiave composita basata sul significato di business. Per i pagamenti, potrebbe essere l'ID della charge o della invoice più il tipo di evento.

Dove applicare la deduplicazione

Contare su un solo livello è rischioso. Un design più sicuro verifica in più punti: all'endpoint webhook (rifiuto rapido), nella logica di business (controlli di stato) e nel database (garanzia forte). Il database è il blocco finale: salva le chiavi processate in una tabella con vincolo unico così che due worker non possano applicare lo stesso evento contemporaneamente.

Gli eventi fuori ordine sono un problema differente. La deduplicazione blocca i duplicati, ma non impedisce che aggiornamenti vecchi sovrascrivano stati più recenti. Usa guardie semplici come timestamp, numeri di sequenza o regole "solo avanzamento". Esempio: se un ordine è già marcato Paid, ignora un successivo aggiornamento "Pending" anche se è un nuovo evento.

In una build no-code (per esempio in AppMaster), puoi modellare una tabella processed_webhooks e aggiungere un indice unico sulla chiave di idempotenza. Poi fai sì che il Business Process provi prima a creare quel record. Se fallisce, interrompi l'elaborazione e restituisci successo al mittente.

Passo dopo passo: progetta uno strumento di replay sicuro per impostazione predefinita

Trasforma eventi in workflow
Progetta endpoint webhook e logica di business in un unico posto, senza dover unire servizi diversi.
Crea backend

Un buon strumento di replay riduce il panico quando qualcosa va storto. Il replay funziona meglio quando riesegue lo stesso percorso di elaborazione sicuro, con salvaguardie che impediscono duplicati.

1) Cattura prima, agisci dopo

Tratta ogni webhook in ingresso come un record di audit. Salva il corpo raw esattamente come ricevuto, le intestazioni chiave (soprattutto signature e timestamp) e i metadati di consegna (ora di ricezione, fonte, numero di tentativo se fornito). Salva anche un identificatore normalizzato dell'evento, anche se devi derivarlo.

Verifica la signature, ma persisti il messaggio prima di eseguire le azioni di business. Se l'elaborazione va in crash a metà, hai comunque l'evento originale e puoi provare cosa è arrivato.

2) Rendi l'handler idempotente

Il tuo processore dovrebbe poter essere eseguito due volte e produrre lo stesso risultato finale. Prima di creare un record, addebitare una carta o concedere accesso, deve verificare se quell'evento (o quell'operazione di business) è già riuscito.

Mantieni la regola centrale semplice: un ID evento + un'azione = un risultato riuscito. Se vedi un successo precedente, restituisci successo di nuovo senza ripetere l'azione.

3) Registra risultati comprensibili per gli umani

Uno strumento di replay è valido quanto la sua cronologia. Salva uno stato di elaborazione e una breve motivazione che il supporto possa capire:

  • Successo (con ID dei record creati)
  • Errore retryable (timeout, problemi temporanei upstream)
  • Errore permanente (signature invalida, campi richiesti mancanti)
  • Ignorato (evento duplicato, evento fuori ordine)

4) Il replay deve rieseguire l'handler, non "ricreare"

Il pulsante di replay dovrebbe mettere in coda un job che chiama lo stesso handler con il payload salvato, sotto gli stessi controlli di idempotenza. Non lasciare che l'interfaccia esegua scritture dirette come "crea ordine ora" perché questo aggira la deduplica.

Per eventi ad alto rischio (pagamenti, rimborsi, cambi piano), aggiungi una modalità anteprima che mostri cosa cambierebbe: quali record verrebbero creati o aggiornati e cosa verrebbe saltato come duplicato.

Se costruisci questo in uno strumento come AppMaster, tieni l'azione di replay come un unico endpoint backend o Business Process che passa sempre per la logica idempotente, anche quando innescata da una schermata admin.

Cosa salvare così il supporto risolve più in fretta

Quando un webhook fallisce, il supporto può aiutare solo finché i tuoi record sono chiari. Se l'unico indizio è "errore 500", il passo successivo diventa congettura, e la congettura porta a replay rischiosi.

Un buon storage trasforma un incidente spaventoso in un controllo di routine: trova l'evento, vedi cosa è successo, riprova in sicurezza e prova cosa è cambiato.

Inizia con un piccolo e coerente record di consegna per ogni evento in ingresso. Tienilo separato dai dati di business (ordini, fatture, utenti) così puoi ispezionare i fallimenti senza toccare lo stato di produzione.

Salva almeno:

  • Event ID (dal provider), nome sorgente/sistema, e nome dell'endpoint o handler
  • Ora di ricezione, stato corrente (nuovo, in elaborazione, riuscito, fallito) e durata dell'elaborazione
  • Conteggio tentativi, prossimo orario di ritento (se presente), ultimo messaggio d'errore e tipo/codice errore
  • ID di correlazione che collegano l'evento ai tuoi oggetti (user_id, order_id, invoice_id, ticket_id) più gli ID del provider
  • Dettagli di gestione del payload: payload raw (o blob criptato), hash del payload e schema/versione

Gli ID di correlazione sono ciò che rende il supporto efficace. Un agente di supporto dovrebbe poter cercare "Order 18431" e vedere immediatamente ogni webhook che l'ha toccato, inclusi i fallimenti che non hanno mai creato un record.

Mantieni un audit trail per azioni manuali. Se qualcuno riproduce un evento, registra chi l'ha fatto, quando, da dove (UI/API) e l'esito. Salva anche un breve riassunto del cambiamento come "fattura marcata come pagata" o "record cliente creato." Anche una sola frase riduce le contestazioni.

La retention conta. I log sono economici fino a un certo punto, e i payload possono includere dati personali. Definisci una regola chiara (per esempio, payload completo per 7-30 giorni, metadata per 90 giorni) e rispettala.

La tua schermata admin dovrebbe rendere le risposte ovvie. È utile includere ricerca per event ID e correlation ID, filtri per stato e "needs attention", una timeline dei tentativi e degli errori, un pulsante di replay sicuro con conferma e una chiave di idempotenza visibile, oltre a dettagli esportabili per note interne sull'incidente.

Evitare doppi addebiti e record duplicati

Rendi i webhook sicuri per impostazione predefinita
Costruisci un gestore di webhook idempotente con una tabella di deduplica e stati di elaborazione chiari.
Prova AppMaster

Il rischio più grande nel confronto ritenti vs replay non è il ritento in sé. È ripetere un effetto collaterale: addebitare due volte una carta, creare due abbonamenti o spedire due volte lo stesso ordine.

Un design più sicuro separa lo "spostamento di denaro" dalla "consegna di business." Per i pagamenti, tratta questi passaggi separatamente: crea un payment intent (o autorizzazione), catturalo e poi esegui la fulfillment (contrassegna ordine come pagato, sblocca accesso, spedisci). Se un webhook arriva due volte, vuoi che la seconda esecuzione veda "già catturato" o "già evaso" e si fermi.

Usa l'idempotenza lato provider quando crei addebiti. La maggior parte dei provider dei pagamenti supporta una chiave di idempotenza così la stessa richiesta restituisce lo stesso risultato invece di creare un secondo addebito. Salva quella chiave con il tuo ordine interno così puoi riutilizzarla nei retry.

Nel database, rendi la creazione dei record idempotente. La protezione più semplice è un vincolo unico sull'ID esterno dell'evento o sull'ID dell'oggetto (come charge_id, payment_intent_id, subscription_id). Quando arriva lo stesso webhook, l'insert fallisce in modo sicuro e passi a "carica l'esistente e continua."

Proteggi le transizioni di stato così che avanzino solo quando lo stato corrente è quello previsto. Per esempio, sposta un ordine da pending a paid solo se è ancora pending. Se è già paid, non fare nulla.

I fallimenti parziali sono comuni: il denaro è stato spostato, ma la scrittura su DB è fallita. Progetta per questo salvando prima un record duraturo di "evento ricevuto", poi processando. Se il supporto riproduce l'evento in seguito, l'handler può completare i passi mancanti senza addebitare di nuovo.

Quando le cose vanno ancora storte, definisci azioni compensative: annullare un'autorizzazione, rimborsare un pagamento catturato o invertire una fulfillment. Uno strumento di replay dovrebbe rendere esplicite queste opzioni così un umano può correggere l'esito senza indovinare.

Errori comuni e trappole

La maggior parte dei piani di recupero fallisce perché trattano un webhook come un pulsante da premere di nuovo. Se il primo tentativo ha già cambiato qualcosa, un secondo tentativo può addebitare due volte una carta o creare un record duplicato.

Un errore comune è riprodurre eventi senza prima salvare il payload originale. Quando il supporto clicca replay dopo giorni, potrebbe inviare dati ricostruiti di oggi, non il messaggio esatto che era arrivato. Questo rompe l'audit e rende i bug più difficili da riprodurre.

Un'altra trappola è usare timestamp come chiavi di idempotenza. Due eventi possono condividere lo stesso secondo, gli orologi possono scorrere e i replay possono avvenire ore dopo. Vuoi una chiave di idempotenza legata all'ID evento unico del provider (o a un hash stabile e unico del payload), non al tempo.

Segnali d'allarme che si trasformano in ticket di supporto:

  • Ritentare azioni non idempotenti senza un controllo di stato (esempio: "create invoice" eseguito di nuovo anche se una fattura esiste già)
  • Nessuna chiara separazione tra errori retryable (timeout, 503) ed errori permanenti (signature errata, campi mancanti)
  • Un pulsante di replay che chiunque può usare, senza controlli di ruolo, campo motivo o audit trail
  • Loop automatici di retry che nascondono bug reali e continuano a battere sistemi downstream
  • Ritenti "fire and forget" che non limitano i tentativi o non avvisano un umano quando lo stesso evento continua a fallire

Fai anche attenzione a politiche miste. I team a volte abilitano entrambi i sistemi senza coordinamento e finiscono con due meccanismi diversi che rinviano lo stesso evento.

Uno scenario semplice: un webhook di pagamento va in timeout mentre la tua app salva l'ordine. Se il tuo retry esegue di nuovo "addebita il cliente" invece di "verifica che l'addebito esista, poi marca l'ordine come pagato," ottieni un pasticcio costoso. Gli strumenti di replay sicuri controllano sempre prima lo stato corrente, poi applicano solo il passo mancante.

Checklist rapida prima del lancio

Gestisci i pagamenti con cura
Costruisci flussi guidati dai pagamenti che separano lo spostamento di denaro dalla fulfillment e riducono i rischi di replay.
Connetti Stripe

Considera il recupero come una funzionalità, non come un ripensamento. Dovresti poter rieseguire in sicurezza e poter sempre spiegare cosa è successo.

Una checklist pratica pre-lancio:

  • Persisti ogni evento webhook appena arriva, prima che la logica di business venga eseguita. Salva il corpo raw, le intestazioni, l'ora di ricezione e un ID evento esterno stabile.
  • Usa una chiave di idempotenza stabile per evento e riutilizzala per ogni retry e ogni replay manuale.
  • Applica la deduplicazione a livello di database. Metti vincoli unici sugli ID esterni (payment ID, invoice ID, event ID) così una seconda esecuzione non può creare una seconda riga.
  • Rendi il replay esplicito e prevedibile. Mostra cosa accadrà e richiedi conferma per azioni rischiose come catturare un pagamento o provisionare qualcosa di irreversibile.
  • Traccia stati chiari end-to-end: ricevuto, in elaborazione, riuscito, fallito, ignorato. Includi l'ultimo messaggio d'errore, il numero di tentativi e chi ha innescato un replay.

Prima di dichiararlo finito, testa le domande del supporto. Qualcuno può rispondere in meno di un minuto: cosa è successo, perché ha fallito e cosa è cambiato dopo il replay?

Se stai costruendo questo in AppMaster, modella prima il registro eventi nel Data Designer, poi aggiungi una piccola schermata admin con un'azione di replay sicura che verifica l'idempotenza e mostra un passo di conferma. Quest'ordine previene il passaggio "aggiungeremo la sicurezza dopo" che diventa "non possiamo riprodurre in sicurezza."

Esempio: un webhook di pagamento che fallisce una volta e poi riesce

Mantieni il controllo con il codice sorgente
Genera codice sorgente reale così che il design del recupero dei webhook resti manutenibile con la crescita.
Esporta codice

Un cliente paga e il tuo provider di pagamenti invia un webhook payment_succeeded. Nello stesso momento, il tuo database è sotto carico e la scrittura va in timeout. Il provider riceve un 500, quindi ritenta più tardi.

Ecco come dovrebbe essere il recupero quando è sicuro:

  • 12:01 Arriva il tentativo #1 del webhook con event ID evt_123. Il tuo handler parte, poi fallisce su INSERT invoice con un timeout DB. Restituisci 500.
  • 12:05 Il provider ritenta lo stesso event ID evt_123. Il tuo handler controlla prima la tabella di dedupe, vede che non è stato applicato, scrive la fattura, marca evt_123 come processato e restituisce 200.

Ora la parte importante: il sistema deve trattare entrambe le consegne come lo stesso evento. La fattura deve essere creata una sola volta, l'ordine deve passare a "Paid" una sola volta e il cliente deve ricevere una sola email di ricevuta. Se il provider ritenta di nuovo dopo il successo (succede), il tuo handler legge evt_123 come già processato e restituisce un pulito 200 con no-op.

I tuoi log devono rendere il supporto tranquillo, non nervoso. Un buon record mostra che il tentativo #1 è fallito per "DB timeout", il tentativo #2 è riuscito e lo stato finale è "applicato."

Se un agente di supporto apre lo strumento di replay per evt_123, dovrebbe essere noioso: mostra "Già applicato" e il pulsante di replay (se premuto) riesegue solo un controllo sicuro, non gli effetti collaterali. Nessuna fattura duplicata, nessuna email duplicata, nessun doppio addebito.

Prossimi passi: costruire un flusso di recupero pratico

Annota ogni tipo di evento webhook che ricevi, poi marchialo come a basso rischio o ad alto rischio. "Utente registrato" è solitamente a basso rischio. "Payment succeeded", "refund issued" e "subscription renewed" sono ad alto rischio perché un errore può costare denaro o creare un pasticcio difficile da annullare.

Poi costruisci il flusso di recupero minimo che funzioni: conserva ogni evento in ingresso, processalo con un handler idempotente ed esponi una schermata di replay minimale per il supporto. L'obiettivo non è una dashboard elegante. È un modo sicuro per rispondere a una domanda rapidamente: "L'abbiamo ricevuto, l'abbiamo processato, e se no, possiamo riprovare senza duplicare nulla?"

Una prima versione semplice:

  • Persiste il payload raw più l'ID evento del provider, l'ora di ricezione e lo stato corrente.
  • Applica idempotenza così lo stesso evento non può creare un secondo addebito o un secondo record.
  • Aggiungi un'azione di replay che riesegue l'handler per un singolo evento.
  • Mostra l'ultimo errore e l'ultimo tentativo di elaborazione così il supporto sa cosa è successo.

Una volta che questo funziona, aggiungi protezioni che corrispondono al livello di rischio. Gli eventi ad alto rischio dovrebbero richiedere permessi più stretti, conferme più chiare (per esempio: "Il replay può innescare fulfillment. Continuare?"), e un audit trail completo di chi ha riprodotto cosa e quando.

Se vuoi costruirlo senza tanto codice, AppMaster (appmaster.io) si adatta bene al pattern: conserva gli eventi webhook nel Data Designer, implementa workflow idempotenti nel Business Process Editor e pubblica un pannello interno di replay con i builder UI.

Decidi la modalità di deploy presto perché influisce sulle operations. Che tu esegua in cloud o self-hosted, assicurati che il supporto possa accedere ai log e alla schermata di replay in modo sicuro, e che la tua policy di retention mantenga abbastanza storia per risolvere dispute di addebiti e domande dei clienti.

Facile da avviare
Creare qualcosa di straordinario

Sperimenta con AppMaster con un piano gratuito.
Quando sarai pronto potrai scegliere l'abbonamento appropriato.

Iniziare