Vai al contenuto principale
Torna al blog
Abbonamenti Stripe Pagamenti SaaS

Implementare abbonamenti ricorrenti: guida tecnica

Come implementare abbonamenti ricorrenti: architettura, Stripe Billing, RevenueCat, dunning, prorrazioni e pattern di design testati in produzione.

JM
Javier Manzano
CEO & Co-founder • 18 giugno 2026

Gli abbonamenti ricorrenti sono il modello di monetizzazione preferito per app e SaaS perché generano ricavi prevedibili e migliorano il lifetime value del cliente. Ma implementare un sistema di billing ricorrente ben fatto è più complesso di quanto sembri. In questa guida condividiamo i pattern architetturali che usiamo in Soamee per costruire sistemi di abbonamento robusti in produzione.

Perché l’implementazione conta più di quanto pensi

La differenza tra un sistema di abbonamenti mediocre e uno eccellente può rappresentare il 20-30% del tuo MRR. Un buon dunning (gestione dei pagamenti falliti) può recuperare il 40-60% delle transazioni che inizialmente falliscono. Un trial ben progettato può convertire l’80-95% degli utenti che lo iniziano. E prorrazioni corrette evitano dispute con i clienti e perdite per addebiti errati.

Abbiamo visto startup perdere migliaia di euro al mese per implementazioni naive: retry di pagamento tutti alla stessa ora saturando la coda, prorrazioni che non tengono conto dei giorni reali del mese, trial che scadono senza notificare l’utente, e cancellazioni che non liberano correttamente i permessi del piano.

Architettura di un sistema di abbonamenti

Componenti principali

Un sistema di abbonamenti completo ha questi componenti:

  1. Subscription Engine: gestisce lo stato degli abbonamenti (active, trialing, past_due, canceled, paused).
  2. Billing Engine: calcola gli importi da addebitare, prorrazioni e genera fatture.
  3. Payment Processor: esegue gli addebiti (Stripe, Redsys, RevenueCat).
  4. Dunning System: gestisce i retry di pagamenti falliti e la comunicazione all’utente.
  5. Entitlement System: controlla quali funzionalità ha disponibili ogni utente in base al suo piano.
  6. Analytics: metriche di MRR, churn, LTV, conversione del trial.

Pattern di stati

Il ciclo di vita di un abbonamento segue questa macchina a stati:

[trialing] → [active] → [past_due] → [canceled]
     ↓            ↓           ↓
 [canceled]   [paused]   [active] (se il pagamento viene recuperato)

Ogni transizione di stato deve:

  • Aggiornare i permessi dell’utente (entitlements).
  • Inviare la comunicazione adeguata (email, push notification).
  • Registrare l’evento per l’analytics.
  • Eseguire la logica di billing (addebitare, smettere di addebitare, prorare).

Opzione 1: Stripe Billing

Stripe Billing è la nostra raccomandazione predefinita per gli abbonamenti web. Gestisce la complessità del billing ricorrente e ti permette di concentrarti sul tuo prodotto.

Integrazione di base

L’integrazione minima con Stripe Billing prevede:

  1. Creare prodotti e piani in Stripe (via API o dashboard).
  2. Checkout Session per consentire all’utente di abbonarsi con un flusso di pagamento hosted o embeddato.
  3. Webhook per sincronizzare lo stato dell’abbonamento con il tuo database.
  4. Customer Portal per consentire all’utente di gestire il proprio abbonamento (cambiare piano, cancellare, aggiornare il pagamento).

I webhook critici da gestire:

  • customer.subscription.created: nuovo abbonamento creato.
  • customer.subscription.updated: cambio di piano, stato o periodo.
  • customer.subscription.deleted: abbonamento cancellato definitivamente.
  • invoice.paid: pagamento riuscito, attivare/rinnovare l’accesso.
  • invoice.payment_failed: pagamento fallito, avviare il dunning.
  • customer.subscription.trial_will_end: trial in scadenza (3 giorni prima).

Gestione dei trial

Stripe supporta i trial nativamente. Configurazioni che raccomandiamo:

  • Trial senza carta: più volume di trial ma minore conversione. Utile per prodotti con effetto rete dove hai bisogno di massa critica.
  • Trial con carta: meno volume ma maggiore conversione (l’utente ha già l’intenzione di pagare). La nostra raccomandazione predefinita.
  • Durata: 7-14 giorni è lo standard. GolfyApp usa 7 giorni con risultati di conversione del 95%.

La chiave della conversione durante il trial è l’attivazione. Se l’utente sperimenta il valore core del prodotto durante il trial, convertirà. La nostra strategia:

  1. Giorno 0: email di benvenuto con guida di avvio rapido.
  2. Giorno 1-2: se non ha usato la funzionalità principale, email con tutorial specifico.
  3. Giorno 5 (trial di 7): promemoria che il trial termina tra 2 giorni + riepilogo del valore ottenuto.
  4. Giorno 6: ultimo promemoria con offerta speciale se converte oggi.

Prorrazioni

Stripe calcola le prorrazioni automaticamente quando un utente cambia piano a metà ciclo. Ci sono tre strategie:

  • create_prorations (default): addebita/accredita la differenza proporzionale. Se l’utente passa dal Piano Base (10 EUR/mese) al Piano Pro (30 EUR/mese) a metà mese, vengono addebitati 10 EUR aggiuntivi per i 15 giorni rimanenti.
  • none: nessuna prorrazione. Il nuovo piano entra in vigore nel prossimo ciclo.
  • always_invoice: generare fattura immediata per la differenza.

Dunning

Stripe ha Smart Retries che usa ML per decidere quando riprovare un pagamento fallito. Integriamo con:

  • Email automatica all’utente quando un pagamento fallisce con link per aggiornare il metodo di pagamento.
  • 3 retry nei successivi 7 giorni con orari variabili.
  • Se dopo 3 tentativi continua a fallire, contrassegnare come past_due e notificare che il servizio verrà sospeso tra 3 giorni.
  • Dopo 10 giorni senza pagamento, cancellare l’abbonamento.

Questa configurazione ci permette di recuperare il 50-60% dei pagamenti falliti.

Opzione 2: RevenueCat per app mobili

Se la tua app vive su iOS e/o Android, gli abbonamenti in-app hanno le loro regole. Apple e Google gestiscono gli addebiti, ma hai bisogno di un backend che unifichi lo stato.

Perché RevenueCat

  • Un SDK, due store: astrae le differenze tra App Store Connect e Google Play Billing.
  • Validazione server-side: valida i receipt automaticamente senza che il tuo backend tocchi le API di Apple/Google.
  • Webhook unificati: un unico endpoint riceve eventi da entrambi gli store.
  • Analytics: metriche di abbonamento unificate (MRR, churn, trial conversion) tra iOS e Android.
  • Esperimenti: A/B testing di pricing e paywall senza pubblicare una nuova versione.

Integrazione con RevenueCat

  1. SDK nell’app: configurare l’SDK di RevenueCat (Swift, Kotlin, React Native, Flutter).
  2. Prodotti negli store: creare prodotti di abbonamento in App Store Connect e Google Play Console.
  3. Mapping in RevenueCat: configurare gli “Entitlements” che mappano prodotti a permessi.
  4. Webhook al tuo backend: sincronizzare lo stato dell’abbonamento con il tuo database.
  5. Paywall: progettare le schermate di acquisto con i componenti di RevenueCat o custom.

Particolarità degli store

Ci sono differenze importanti tra Apple e Google:

  • Commissioni: entrambi applicano il 30% il primo anno, il 15% dal secondo (Small Business Program: 15% dall’inizio se fatturi meno di 1M USD/anno).
  • Grace period: Apple dà 6-16 giorni di grazia per pagamento fallito. Google dà 3-30 giorni configurabili.
  • Cancellazione: su iOS, l’accesso continua fino alla fine del periodo pagato. Su Android, puoi revocare immediatamente o alla fine.
  • Prezzo: Apple richiede prezzi dal suo catalogo predefinito. Google consente prezzi liberi.
  • Family sharing: Apple supporta la condivisione degli abbonamenti in famiglia. Google anche ma con differenze.

Il caso PEMAV

In PEMAV abbiamo implementato RevenueCat per gestire abbonamenti su iOS e Android con un unico backend. Gli apprendimenti chiave:

  • La sincronizzazione tra lo stato dello store e il tuo backend può avere ritardi fino a minuti. Progetta per eventual consistency.
  • Gli utenti che cambiano dispositivo (da Android a iOS o viceversa) hanno bisogno di un meccanismo di “restore purchases” robusto.
  • Le offerte introduttive (primo mese gratuito, 3 mesi al 50%) sono molto efficaci negli store e RevenueCat le gestisce bene.

Opzione 3: Billing custom su Redsys

Se per requisiti di commissioni o normativi hai bisogno di usare Redsys per gli abbonamenti, devi costruire la logica di billing tu stesso. Redsys fornisce solo la tokenizzazione e l’addebito; il resto è responsabilità tua.

Architettura con Redsys

  1. Prima transazione: CIT (Cardholder Initiated) con 3D Secure che restituisce un token COF.
  2. Addebiti ricorrenti: MIT (Merchant Initiated) con il token memorizzato, senza intervento dell’utente.
  3. Il tuo billing engine: un servizio che esegue addebiti secondo la logica del tuo piano:
    • Cron job o scheduler che identifica abbonamenti da rinnovare ogni giorno.
    • Logica di retry con backoff esponenziale per pagamenti falliti.
    • Calcolo delle prorrazioni quando l’utente cambia piano.
    • Generazione di fatture con dati fiscali corretti.

Quando ha senso

Raccomandiamo billing custom su Redsys solo quando:

  • Elabori volumi molto alti in Spagna e la differenza di commissioni giustifica lo sviluppo.
  • Hai requisiti normativi che richiedono elaborazione bancaria locale.
  • Il tuo modello di billing è così specifico che né Stripe Billing né nessuna piattaforma lo supporta nativamente.

In tutti gli altri casi, Stripe Billing fa risparmiare mesi di sviluppo e manutenzione.

Pattern di design per gli abbonamenti

Feature flag per piano

Il pattern che usiamo per controllare l’accesso alle funzionalità:

Piano → [Feature Flag] → Entitlements

Esempio:
- Piano Free: max_projects=3, api_calls=1000/mese, no_export
- Piano Pro: max_projects=unlimited, api_calls=50000/mese, export_csv
- Piano Enterprise: everything + sso + audit_logs + api_unlimited

I feature flag vengono caricati all’inizio della sessione e memorizzati in cache. Quando il piano cambia (via webhook), la cache viene invalidata e gli entitlement vengono ricaricati.

Metering per usage-based billing

Se il tuo pricing ha una componente di utilizzo, hai bisogno di un sistema di metering:

  1. Registrare l’utilizzo: ogni azione metered (chiamata API, messaggio, GB) viene registrata in un contatore.
  2. Aggregare per periodo: alla fine del periodo di billing, si calcola il totale.
  3. Reportare a Stripe: Stripe Usage Records API consente di reportare l’utilizzo che viene fatturato automaticamente.

Il trucco è che il metering deve essere eventual consistent ma non perdere eventi. Usiamo Redis per i contatori in tempo reale e PostgreSQL come source of truth con riconciliazione periodica.

Cancellazione con retention

Il flusso di cancellazione è un’opportunità di retention:

  1. Sondaggio sui motivi: perché cancella (prezzo, non usa, alternativa, ecc.).
  2. Offerta contestuale: basata sul motivo:
    • Se è il prezzo → offrire sconto o piano inferiore.
    • Se è mancanza di utilizzo → offrire pausa temporanea (1-3 mesi).
    • Se è un’alternativa → mostrare funzionalità uniche che forse non conosce.
  3. Conferma: se insiste a cancellare, confermare e chiedere se vuole l’accesso fino alla fine del periodo.

In GolfyApp, questo flusso di retention riduce la cancellazione volontaria del 30%.

Metriche da tracciare

Un sistema di abbonamenti senza analytics è come guidare senza tachimetro. Le metriche minime:

  • MRR (Monthly Recurring Revenue): ricavi ricorrenti normalizzati al mese.
  • Churn rate: percentuale di abbonati che cancellano per mese (volontario + involontario).
  • Trial conversion rate: percentuale di trial che convertono a pagamento.
  • Expansion MRR: ricavi aggiuntivi da upgrade e add-on.
  • Net Revenue Retention: misura se i clienti esistenti spendono di più o di meno nel tempo (target: >100%).
  • LTV: valore totale che genera un cliente durante la sua vita (MRR / churn rate).
  • Dunning recovery rate: percentuale di pagamenti falliti che vengono recuperati.

Implementazione passo dopo passo

Settimana 1-2: Fondamenta

  1. Definire piani e pricing.
  2. Creare prodotti in Stripe / configurare RevenueCat.
  3. Implementare checkout / paywall.
  4. Configurare webhook di base (created, updated, deleted).
  5. Implementare entitlement system (feature flag per piano).

Settimana 3: Trial e conversione

  1. Configurare trial (durata, con/senza carta).
  2. Implementare email automatiche durante il trial.
  3. Configurare Customer Portal / schermata di gestione abbonamento.
  4. Implementare flusso di upgrade/downgrade con prorrazioni.

Settimana 4: Dunning e retention

  1. Configurare Smart Retries in Stripe.
  2. Implementare email di pagamento fallito con link di aggiornamento.
  3. Implementare flusso di cancellazione con retention.
  4. Configurare analytics di abbonamento.

Settimana 5+: Ottimizzazione

  1. A/B testing di pricing e paywall.
  2. Ottimizzazione della comunicazione durante il trial.
  3. Analisi delle coorti e churn per segmento.
  4. Implementazione del metering se applicabile.

Errori comuni da evitare

  1. Non gestire il webhook invoice.payment_failed: senza dunning, perdi il 20-40% dei rinnovi per pagamenti falliti.
  2. Prorrazioni errate: non calcolare correttamente i giorni del periodo corrente genera dispute.
  3. Race condition nei webhook: Stripe può inviare webhook fuori ordine. Il tuo sistema deve essere idempotente.
  4. Non memorizzare in cache gli entitlement: consultare il piano ad ogni request è un collo di bottiglia. Metti in cache e invalida via webhook.
  5. Trial senza attivazione: un trial dove l’utente non sperimenta il valore core ha 0% di conversione.
  6. Cancellazione immediata senza accesso: se cancelli e interrompi l’accesso immediatamente, l’utente sente di aver perso denaro (ha pagato il periodo ma non può usarlo).

Conclusione

Implementare abbonamenti ricorrenti correttamente richiede di pensare all’intero ciclo di vita: dall’acquisizione (trial) alla retention (dunning, cancellazione con offerte) passando per l’espansione (upgrade, add-on). La tecnologia esiste (Stripe Billing, RevenueCat) per non reinventare la ruota, ma la logica di business che costruisci sopra fa la differenza tra un’azienda che cresce e una che perde clienti per stillicidio.

Se hai bisogno di implementare un sistema di abbonamenti nella tua app o piattaforma, contatta il nostro team. Abbiamo costruito sistemi di billing in produzione con tassi di conversione del 95% e recovery rate del 60%.

Non perderti nulla

JM

Javier Manzano

CEO & Co-founder in Soamee

Appassionato di tecnologia e sviluppo software. Condividendo conoscenze e esperienze per aiutare altri sviluppatori a crescere.

Ti è piaciuto questo articolo?

Se hai bisogno di aiuto con il tuo progetto di sviluppo, siamo qui per te.

Prenota una call gratuita →