15 dic 2024·8 min di lettura

Checklist per webhook di pagamento idempotenti per aggiornamenti di fatturazione sicuri

Checklist per webhook di pagamento idempotenti per deduplicare eventi, gestire i retry e aggiornare in sicurezza fatture, abbonamenti e diritti d'accesso.

Checklist per webhook di pagamento idempotenti per aggiornamenti di fatturazione sicuri

Perché i webhook di pagamento causano aggiornamenti duplicati

Un webhook di pagamento è un messaggio che il tuo provider di pagamenti invia al backend quando succede qualcosa di importante, come un addebito riuscito, una fattura pagata, il rinnovo di un abbonamento o un rimborso. È sostanzialmente il provider che dice: “Ecco cosa è successo. Aggiorna i tuoi record.”

I duplicati avvengono perché la consegna dei webhook è progettata per essere affidabile, non per essere "una sola volta". Se il tuo server è lento, va in timeout, restituisce un errore o è temporaneamente non disponibile, il provider solitamente ritenterà lo stesso evento. Puoi anche vedere due eventi diversi che si riferiscono alla stessa azione del mondo reale (per esempio, un evento invoice e un evento payment legati allo stesso pagamento). Gli eventi possono anche arrivare fuori ordine, soprattutto con follow-up rapidi come i rimborsi.

Se il tuo handler non è idempotente, può applicare lo stesso evento due volte, e questo si traduce in problemi che clienti e team finanziari noteranno subito:

  • Una fattura segnata come pagata due volte, creando voci contabili duplicate
  • Un rinnovo applicato due volte, estendendo l'accesso oltre il dovuto
  • Diritti d'accesso concessi due volte (crediti extra, postazioni o funzionalità)
  • Rimborsi o chargeback che non revocano correttamente l'accesso

Questo non è solo una “best practice”. È la differenza tra una fatturazione che sembra affidabile e una che genera ticket di supporto.

L'obiettivo di questa checklist è semplice: tratta ogni evento in ingresso come “applica al massimo una volta”. Dovrai conservare un identificatore stabile per ogni evento, gestire i retry in sicurezza e aggiornare fatture, abbonamenti e diritti d'accesso in modo controllato. Se costruisci il backend in uno strumento no-code come AppMaster, valgono comunque le stesse regole: serve un modello dati chiaro e un flusso handler ripetibile che rimanga corretto sotto retry.

Fondamenti di idempotenza applicabili ai webhook

Idempotenza significa che elaborare lo stesso input più volte produce lo stesso stato finale. In termini di fatturazione: una fattura risulta pagata una sola volta, un abbonamento viene aggiornato una sola volta e l'accesso viene concesso una sola volta, anche se il webhook viene consegnato due volte.

I provider ritentano quando il tuo endpoint va in timeout, restituisce un 5xx o la rete cade. Quei retry ripetono lo stesso evento. Questo è diverso da un evento separato che rappresenta un cambiamento reale, come un rimborso avvenuto giorni dopo. I nuovi eventi hanno ID diversi.

Per farlo funzionare servono due cose: identificatori stabili e una piccola “memoria” di ciò che hai già visto.

Quali ID importano (e cosa salvare)

La maggior parte delle piattaforme di pagamento include un event ID unico per l'evento webhook. Alcune includono anche un request ID, una idempotency key, o un ID univoco dell'oggetto di pagamento (come un charge o payment intent) nel payload.

Salva ciò che ti aiuta a rispondere a una domanda: “Ho già applicato esattamente questo evento?”

Un minimo pratico:

  • Event ID (chiave unica)
  • Tipo di evento (utile per il debugging)
  • Timestamp di ricezione
  • Stato di elaborazione (processed/failed)
  • Riferimento al customer, alla invoice o alla subscription coinvolta

La mossa chiave è salvare l'event ID in una tabella con un vincolo di unicità. Poi il tuo handler può fare in sicurezza: inserire prima l'event ID; se esiste già, fermarsi e restituire 200.

Quanto tempo conservare i record di dedupe

Conserva i record di dedupe a sufficienza per coprire retry tardivi e indagini. Una finestra comune è 30–90 giorni. Se gestisci chargeback, dispute o cicli di abbonamento più lunghi, conservali più a lungo (6–12 mesi) e poi elimina le righe vecchie così la tabella rimane veloce.

In un backend generato come AppMaster, questo si mappa bene su un semplice modello WebhookEvents con un campo unico sull'event ID, più un Business Process che esce presto quando viene rilevato un duplicato.

Progetta un modello dati semplice per deduplicare gli eventi

Un buon handler webhook è per lo più un problema di dati. Se riesci a registrare ogni evento del provider esattamente una volta, tutto ciò che segue diventa più sicuro.

Inizia con una tabella che faccia da registro/ ricevuta. In PostgreSQL (incluso quando modellato nel Data Designer di AppMaster), tienila piccola e rigorosa così i duplicati falliscono velocemente.

Il minimo di cui hai bisogno

Ecco una baseline pratica per una tabella webhook_events:

  • provider (testo, es. "stripe")
  • provider_event_id (testo, richiesto)
  • status (testo, ad es. "received", "processed", "failed")
  • processed_at (timestamp, nullable)
  • raw_payload (jsonb o testo)

Aggiungi un vincolo di unicità su (provider, provider_event_id). Quella singola regola è la tua guardia principale per la deduplica.

Vorrai anche gli ID di business che usi per trovare i record da aggiornare. Questi sono diversi dall'event ID del webhook.

Esempi comuni includono customer_id, invoice_id e subscription_id. Tienili come testo perché i provider spesso usano ID non numerici.

Raw payload vs campi parsati

Conserva il payload raw così puoi fare debug e riprocessare in seguito. I campi parsati rendono più facili le query e i report, ma salva solo ciò che effettivamente usi.

Un approccio semplice:

  • Salva sempre raw_payload
  • Salva anche qualche ID parsato che interroghi spesso (customer, invoice, subscription)
  • Salva un event_type normalizzato (testo) per filtrare

Se arriva due volte un evento invoice.paid, il tuo vincolo unico bloccherà il secondo inserimento. Avrai comunque il raw payload per gli audit e l'ID invoice parsato ti permette di trovare facilmente la fattura che hai aggiornato la prima volta.

Passo dopo passo: un flusso handler webhook sicuro

Un handler sicuro è noioso di proposito. Si comporta allo stesso modo ogni volta, anche quando il provider ritenta lo stesso evento o consegna eventi fuori ordine.

Il flusso in 5 passaggi da seguire sempre

  1. Verifica la firma e parsifica il payload. Rifiuta le richieste che falliscono i controlli di firma, hanno un tipo evento inatteso o non sono parsabili.

  2. Scrivi il record dell'evento prima di toccare i dati di fatturazione. Salva l'provider event ID, il tipo, il created time e il raw payload (o un hash). Se l'event ID esiste già, trattalo come duplicato e fermati.

  3. Mappa l'evento a un singolo record “proprietario”. Decidi cosa stai aggiornando: invoice, subscription o customer. Memorizza gli ID esterni sui tuoi record così puoi cercarli direttamente.

  4. Applica un cambiamento di stato sicuro. Muovi lo stato solo in avanti. Non annullare una fattura pagata perché arriva in ritardo un invoice.updated. Registra ciò che hai applicato (vecchio stato, nuovo stato, timestamp, event ID) per l'audit.

  5. Rispondi rapidamente e registra l'esito. Restituisci successo una volta che l'evento è stato salvato in modo sicuro e o processato o ignorato. Logga se è stato processato, deduplicato o rifiutato e perché.

In AppMaster questo di solito diventa una tabella database per gli eventi webhook più un Business Process che controlla “event ID già visto?” e poi esegue i passaggi minimi di aggiornamento.

Gestire retry, timeout e consegne fuori ordine

Progetta il tuo modello di dati di fatturazione
Modella WebhookEvents, invoices e entitlements in PostgreSQL usando AppMaster Data Designer.
Inizia a costruire

I provider ritentano i webhook quando non ottengono una risposta di successo veloce. Possono anche inviare eventi fuori ordine. Il tuo handler deve rimanere sicuro quando lo stesso aggiornamento arriva due volte, o quando un aggiornamento successivo arriva prima.

Una regola pratica: rispondi velocemente, fai il lavoro dopo. Tratta la richiesta webhook come una ricevuta, non come il luogo per eseguire logica pesante. Se chiami API terze parti, generi PDF o ricalcoli conti dentro la richiesta, aumenti i timeout e attivi più retry.

Fuori ordine: conserva la verità più aggiornata

La consegna fuori ordine è normale. Prima di applicare qualsiasi cambiamento, usa due controlli:

  • Confronta i timestamp: applica un evento solo se è più recente di quello che hai già memorizzato per quell'oggetto (invoice, subscription, entitlement).
  • Usa la priorità di stato quando i timestamp sono vicini o poco chiari: paid batte open, canceled batte active, refunded batte paid.

Se hai già registrato una fattura come pagata e arriva in ritardo un evento “open”, ignoralo. Se hai ricevuto “canceled” e più tardi appare un aggiornamento “active” più vecchio, mantieni canceled.

Ignorare vs mettere in coda

Ignora un evento quando puoi dimostrare che è obsoleto o già applicato (stesso event ID, timestamp più vecchio, priorità di stato inferiore). Metti in coda un evento quando dipende da dati che non hai ancora, come un aggiornamento di subscription che arriva prima che esista il record customer.

Un pattern pratico:

  • Salva immediatamente l'evento con uno stato di elaborazione (received, processing, done, failed)
  • Se mancano dipendenze, marchialo come waiting e ritenta in background
  • Imposta un limite di retry e allerta dopo ripetuti fallimenti

In AppMaster questo si adatta bene a una tabella webhook events più un Business Process che riconosce la richiesta rapidamente ed elabora gli eventi in coda in modo asincrono.

Aggiornare in sicurezza fatture, abbonamenti e diritti d'accesso

Dopo aver gestito la deduplica, il rischio successivo è lo stato di fatturazione diviso: la fattura dice pagata, ma l'abbonamento risulta ancora scaduto, o l'accesso è stato concesso due volte e mai revocato. Tratta ogni webhook come una transizione di stato e applicala in un singolo aggiornamento atomico.

Fatture: rendi le modifiche di stato monotone

Le fatture possono attraversare stati come paid, voided e refunded. Potresti anche vedere pagamenti parziali. Non “commutare” una fattura basandoti su qualunque evento arrivi per ultimo. Memorizza lo stato corrente più i totali chiave (amount_paid, amount_refunded) e consenti solo transizioni in avanti sicure.

Regole pratiche:

  • Segna una fattura come pagata una sola volta, la prima volta che vedi un evento paid.
  • Per i rimborsi, aumenta amount_refunded fino al totale della fattura; non diminuirlo mai.
  • Se una fattura è voided, interrompi le azioni di fulfillment, ma conserva il record per audit.
  • Per pagamenti parziali, aggiorna gli importi senza concedere benefici da “fully paid”.

Abbonamenti e diritti d'accesso: concedere una sola volta, revocare una sola volta

Gli abbonamenti includono rinnovi, cancellazioni e periodi di grazia. Conserva lo stato della subscription e i confini del periodo (current_period_start/end), poi deriva le finestre di entitlement da questi dati. Gli entitlements dovrebbero essere record espliciti, non un singolo booleano.

Per il controllo accessi:

  • Una concessione di entitlement per utente/prodotto/per periodo
  • Un record di revoca quando l'accesso termina (cancellazione, rimborso, chargeback)
  • Una traccia di audit che registra quale evento webhook ha causato ogni cambiamento

Usa una transazione per evitare stati divisi

Applica aggiornamenti di invoice, subscription e entitlement in un'unica transazione database. Leggi le righe correnti, controlla se questo evento è già stato applicato, poi scrivi tutte le modifiche insieme. Se qualcosa fallisce, fai rollback così non ti ritrovi con “fattura pagata” ma “nessun accesso”, o viceversa.

In AppMaster questo spesso si mappa su un singolo Business Process che aggiorna PostgreSQL in un percorso controllato e scrive una voce di audit insieme alla modifica di business.

Sicurezza e controlli di integrità per gli endpoint webhook

Evita concessioni di accesso duplicate
Usa la logica drag-and-drop per mantenere sincronizzati invoice, subscription e entitlement.
Prova AppMaster

La sicurezza dei webhook fa parte della correttezza. Se un attaccante può colpire il tuo endpoint, può cercare di creare stati "pagato" falsi. Anche con la deduplica, devi comunque provare che l'evento è reale e mantenere i dati dei clienti al sicuro.

Verifica il mittente prima di toccare i dati di fatturazione

Valida la firma su ogni richiesta. Per Stripe ciò tipicamente significa controllare l'header Stripe-Signature, usando il corpo raw della richiesta (non un JSON riscritto), e rifiutare eventi con timestamp vecchio. Tratta header mancanti come un errore grave.

Valida le basi subito: metodo HTTP corretto, Content-Type e campi richiesti (event id, tipo e l'ID dell'oggetto che userai per trovare una invoice o subscription). Se costruisci questo in AppMaster, tieni il secret di firma nelle variabili d'ambiente o in una config sicura, mai nel database o nel codice client.

Una checklist rapida di sicurezza:

  • Rifiuta richieste senza firma valida e timestamp recente
  • Richiedi header e content type attesi
  • Usa accesso al database con privilegi minimi per l'handler dei webhook
  • Conserva i segreti fuori dalle tabelle (env/config), ruotali quando necessario
  • Restituisci 2xx solo dopo aver persistito l'evento in modo sicuro

Mantieni i log utili senza esporre segreti

Logga il necessario per debug di retry e dispute, ma evita valori sensibili. Conserva un sottoinsieme sicuro di PII: provider customer ID, internal user ID e magari un'email mascherata (es. a***@domain.com). Non memorizzare mai i dati completi della carta, indirizzi completi o header di autorizzazione raw.

Logga ciò che ti aiuta a ricostruire cosa è successo:

  • Provider event id, tipo, created time
  • Risultato della verifica (signature ok/failed) senza salvare la firma
  • Decisione di dedupe (nuovo vs già processato)
  • ID dei record interni toccati (invoice/subscription/entitlement)
  • Motivo dell'errore e conteggio retry (se metti in coda i retry)

Aggiungi protezioni di base contro gli abusi: rate limit per IP e (quando possibile) per customer ID, e considera di permettere solo le range IP note del provider se la tua infrastruttura lo supporta.

Errori comuni che causano doppie addebiti o doppio accesso

Prototipa la fatturazione Stripe più velocemente
Collega Stripe e testa consegne duplicate senza scrivere boilerplate da zero.
Provalo

La maggior parte dei bug di fatturazione non riguardano la matematica. Succedono quando tratti una consegna webhook come un messaggio singolo e affidabile.

Errori che portano più spesso ad aggiornamenti duplicati:

  • Deduplicare per timestamp o importo invece che per event ID. Eventi diversi possono condividere lo stesso importo e i retry possono arrivare minuti dopo. Usa l'event ID unico del provider.
  • Aggiornare il database prima di verificare la firma. Verifica prima, poi parsifica, poi agisci.
  • Trattare ogni evento come fonte di verità senza controllare lo stato corrente. Non segnare ciecamente una fattura come pagata se è già pagata, rimborsata o voided.
  • Creare più entitlements per lo stesso acquisto. I retry possono creare righe duplicate. Preferisci un upsert come “ensure entitlement exists for subscription_id”, poi aggiorna date/limiti.
  • Far fallire il webhook perché un servizio di notifica è giù. Email, SMS, Slack o Telegram non dovrebbero bloccare la fatturazione. Metti in coda le notifiche e restituisci comunque successo dopo che le modifiche core di fatturazione sono state salvate in sicurezza.

Un esempio semplice: arriva due volte un evento di rinnovo. La prima consegna crea una riga entitlement. Il retry crea una seconda riga e la tua app vede “due entitlements attivi” e concede posti o crediti extra.

In AppMaster la soluzione riguarda per lo più il flusso: verifica prima, inserisci il record evento con vincolo di unicità, applica gli aggiornamenti di fatturazione con controlli di stato e sposta gli effetti collaterali (email, ricevute) in step asincroni così non possono innescare un fenomeno di retry a catena.

Esempio realistico: rinnovo duplicato + rimborso successivo

Questo schema può sembrare spaventoso, ma è gestibile se il tuo handler è sicuro da rieseguire.

Un cliente è su un piano mensile. Stripe invia un evento di rinnovo (per esempio, invoice.paid). Il tuo server lo riceve, aggiorna il database, ma impiega troppo a restituire 200 (cold start, database occupato). Stripe assume che sia fallito e ritenta lo stesso evento.

Alla prima consegna concedi l'accesso. Al retry rilevi che è lo stesso evento e non fai nulla. Più tardi arriva un evento di rimborso (per esempio, charge.refunded) e revoche l'accesso una sola volta.

Ecco un modo semplice per modellare lo stato nel database (tabelle che puoi costruire in AppMaster Data Designer):

  • webhook_events(event_id UNIQUE, type, processed_at, status)
  • invoices(invoice_id UNIQUE, subscription_id, status, paid_at, refunded_at)
  • entitlements(customer_id, product, active, valid_until, source_invoice_id)

Come dovrebbe apparire il database dopo ogni evento

Dopo Evento A (rinnovo, prima consegna): webhook_events ottiene una nuova riga per event_id=evt_123 con status=processed. invoices viene marcata come pagata. entitlements.active=true e valid_until avanza di un periodo di fatturazione.

Dopo Evento A di nuovo (rinnovo, retry): l'inserimento in webhook_events fallisce (event_id unico) o il tuo handler vede che è già processato. Nessuna modifica a invoices o entitlements.

Dopo Evento B (rimborso): una nuova riga webhook_events per event_id=evt_456. invoices.refunded_at viene impostato e status=refunded. entitlements.active=false (o valid_until impostato a now) usando source_invoice_id per revocare l'accesso una sola volta.

Il dettaglio importante è il tempo: il controllo di dedupe avviene prima di qualsiasi scrittura di grant o revoke.

Checklist rapida pre-lancio

Pubblica un endpoint webhook sicuro
Verifica le firme prima, salva gli eventi, poi applica una singola modifica di stato atomica.
Crea flusso

Prima di attivare i webhook in produzione, vuoi la prova che un evento reale aggiorni i record di fatturazione esattamente una volta, anche se il provider lo invia più volte (o dieci volte).

Usa questa checklist per convalidare l'installazione end-to-end:

  • Conferma che ogni evento in ingresso viene prima salvato (raw payload, event id, type, created time e risultato della verifica della firma), anche se i passaggi successivi falliscono.
  • Verifica che i duplicati siano rilevati presto (stesso provider event id) e che l'handler esca senza modificare invoice, subscription o entitlements.
  • Dimostra che l'aggiornamento di business è una tantum: una sola modifica di stato fattura, una sola modifica di stato subscription, una sola concessione o revoca di entitlement.
  • Assicurati che i fallimenti siano registrati con dettagli sufficienti per poter riprodurre in sicurezza (messaggio d'errore, step che ha fallito, stato retry).
  • Testa che il tuo handler risponda rapidamente: riconosci la ricezione dopo che l'evento è stato salvato e evita lavoro lento dentro la richiesta.

Non ti serve un grande setup di osservabilità per cominciare, ma ti servono segnali. Monitora questi elementi dai log o da dashboard semplici:

  • Picco nelle consegne duplicate (spesso normale, ma salti grandi possono segnalare timeout o problemi del provider)
  • Alto tasso di errori per tipo evento (es. payment failed)
  • Accumulo crescente di eventi bloccati in retry
  • Controlli di mismatch (fattura pagata ma entitlement mancante, subscription revocata ma accesso ancora attivo)
  • Aumento improvviso dei tempi di elaborazione

Se usi AppMaster, conserva lo storage degli eventi in una tabella dedicata nel Data Designer e rendi “mark processed” un punto decisionale singolo e atomico nel tuo Business Process.

Passi successivi: testa, monitora e costruisci anche in un backend no-code

Il testing è dove l'idempotenza si dimostra. Non eseguire solo il percorso felice. Riproduci lo stesso evento più volte, invia eventi fuori ordine e forza timeout così il provider ritenta. La seconda, terza e decima consegna non dovrebbero cambiare nulla.

Prevedi anche il backfilling. Prima o poi vorrai riprocessare eventi passati dopo una correzione di bug, un cambiamento di schema o un incidente del provider. Se il tuo handler è veramente idempotente, il backfilling diventa “replay degli eventi attraverso la stessa pipeline” senza creare duplicati.

Anche il supporto ha bisogno di un piccolo runbook così i problemi non diventano congetture:

  • Trova l'event ID e verifica se è registrato come processed.
  • Controlla il record invoice o subscription e conferma stato e timestamp attesi.
  • Revisiona il record entitlement (che accesso è stato concesso, quando e perché).
  • Se necessario, riesegui l'elaborazione per quel singolo event ID in una modalità di reprocess sicura.
  • Se i dati sono incoerenti, applica una azione correttiva singola e registrala.

Se vuoi implementare questo senza scrivere molto boilerplate, AppMaster (appmaster.io) ti permette di modellare le tabelle core e costruire il flusso webhook in un Business Process visuale, generando comunque codice sorgente reale per il backend.

Prova a costruire l'handler webhook end-to-end in un backend generato no-code e assicurati che rimanga sicuro sotto retry prima di aumentare traffico e ricavi.

FAQ

Perché il mio provider di pagamenti invia lo stesso webhook più di una volta?

Le consegne duplicate dei webhook sono normali perché i provider ottimizzano per la consegna almeno una volta. Se il tuo endpoint va in timeout, restituisce un 5xx o cade brevemente la connessione, il provider ritenterà l'invio dello stesso evento finché non riceve una risposta con successo.

Qual è il modo migliore per deduplicare gli eventi webhook?

Usa il event ID unico fornito dal provider (l'identificatore dell'evento webhook), non l'importo della fattura, il timestamp o l'email del cliente. Memorizza quell'ID con una vincolo di unicità in modo che un retry possa essere rilevato immediatamente e ignorato in sicurezza.

Devo salvare l'evento prima di aggiornare i record di fatturazione?

Inserisci prima il record dell'evento, prima di aggiornare fatture, abbonamenti o diritti d'accesso. Se l'inserimento fallisce perché l'ID evento esiste già, interrompi l'elaborazione e restituisci successo in modo che i retry non creino doppi aggiornamenti.

Per quanto tempo dovrei conservare i record di deduplica dei webhook?

Conservali per un periodo sufficiente a coprire retry tardivi e per supportare le indagini. Un valore pratico è 30–90 giorni, e più a lungo (come 6–12 mesi) se gestisci dispute, chargeback o cicli di abbonamento lunghi; poi elimina le righe più vecchie per mantenere le query veloci.

Ho davvero bisogno della verifica della firma se già deduplico gli eventi?

Verifica la firma prima di toccare i dati di fatturazione, poi analizza e valida i campi richiesti. Se la verifica della firma fallisce, rifiuta la richiesta e non scrivere modifiche di fatturazione: la deduplica non ti protegge da eventi falsificati che dicono "pagato".

Come gestisco i timeout dei webhook senza creare duplicati?

Preferisci riconoscere rapidamente la ricezione dopo che l'evento è stato salvato in modo sicuro, e spostare il lavoro pesante in elaborazione in background. Handler lenti causano più timeout, che generano più retry, aumentando la probabilità di aggiornamenti duplicati se qualcosa non è totalmente idempotente.

Cosa devo fare quando gli eventi arrivano fuori ordine?

Applica solo cambiamenti che fanno avanzare lo stato e ignora gli eventi obsoleti. Usa i timestamp degli eventi quando disponibili e una semplice priorità di stato (per esempio, refunded non dovrebbe essere sovrascritto da paid, e canceled non dovrebbe essere sovrascritto da active).

Come posso evitare di concedere l'accesso due volte quando un webhook di rinnovo viene ritentato?

Non creare una nuova riga di entitlement per ogni evento. Usa una regola in stile upsert come “assicurati un entitlement per utente/prodotto/periodo (o per subscription)”, poi aggiorna date/limiti e registra quale event ID ha causato la modifica per finalità di audit.

Perché gli aggiornamenti di fattura e entitlement dovrebbero essere in una transazione?

Scrivi le modifiche a fattura, subscription e entitlement in un'unica transazione database così falliscono o riescono insieme. Questo evita stati divisi come “fattura pagata” ma “nessun accesso concesso”, o “accesso revocato” senza un record di rimborso corrispondente.

Posso implementare questo in sicurezza in AppMaster senza scrivere codice backend personalizzato?

Sì: crea un modello WebhookEvents con un event ID unico, poi costruisci un Business Process che verifica "già visto?" ed esce presto. Modella esplicitamente invoices/subscriptions/entitlements nel Data Designer in modo che retry e replay non generino righe duplicate.

Facile da avviare
Creare qualcosa di straordinario

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

Iniziare