Come ridurre il churn involontario sull'App Store: billing retry e grace period
Come funzionano billing retry e Billing Grace Period dell'App Store, quali notifiche gestire, cosa può fare la tua app e dove entrano le offerte win-back.
Sull’App Store è Apple ad addebitare il cliente, è Apple a ritentare il pagamento ed è Apple a possedere il pulsante di disdetta. Non puoi ritentare un addebito, cambiare la carta di un cliente o vedere il suo indirizzo email. Questo non significa che tu non possa fare nulla: controlli per quanto tempo il cliente mantiene l’accesso, cosa gli dice la tua app e come reagisci a ogni notifica.
Questa guida copre il billing retry, il Billing Grace Period, le App Store Server Notifications V2 che ti dicono cosa è successo, cosa può fare la tua app, le offerte win-back e le richieste di rimborso. Si attiene alla documentazione di Apple: Reducing involuntary subscriber churn, Enable Billing Grace Period, il riferimento di notificationType, il messaggio billingIssue, Supporting win-back offers in your app e Send Consumption Information (tutti consultati a novembre 2026).
Cosa fa Apple quando un rinnovo fallisce
Quando un rinnovo fallisce per un problema di fatturazione, l’abbonamento entra nello stato di billing retry. La documentazione di Apple dice che l’App Store prova poi a incassare il pagamento per un massimo di 60 giorni.
- Se Apple recupera il pagamento durante il billing retry, l’abbonamento si rinnova. Senza grace period, la nuova data di fatturazione è la data del recupero, quindi i rinnovi successivi si spostano.
- Se il periodo di billing retry finisce senza successo, l’abbonamento scade.
Non scegli il calendario dei tentativi e non puoi avviare un nuovo tentativo. Apple dice però che quando il cliente aggiorna i dati di pagamento, l’App Store tenta subito il rinnovo. Quindi la cosa più utile che puoi fare è convincere il cliente a sistemare il metodo di pagamento.
Billing Grace Period
Per impostazione predefinita, un cliente in billing retry perde l’accesso. Il Billing Grace Period gli permette di mantenere l’accesso completo per un po’ mentre Apple prova a incassare. Lo attivi in App Store Connect, nella sezione Subscriptions della tua app. Secondo la pagina di aiuto di Apple:
| Grace period scelto | Abbonamenti settimanali | Abbonamenti mensili e annuali |
|---|---|---|
| 3 giorni | 3 giorni | 3 giorni |
| 16 giorni | 6 giorni | 16 giorni |
| 28 giorni | 6 giorni | 28 giorni |
Altri punti dalla stessa pagina:
- L’impostazione vale per tutti gli abbonamenti a rinnovo automatico dell’app; non si può impostare per singolo prodotto.
- Scegli se si applica a tutti i rinnovi (comprese prove gratuite e offerte gratuite che diventano a pagamento) o solo ai rinnovi da pagamento a pagamento.
- Puoi attivarlo prima solo in sandbox, poi in produzione.
- Le modifiche possono richiedere fino a 24 ore e si applicano solo ai rinnovi futuri.
- Non si applica agli abbonamenti mensili con impegno di 12 mesi.
- La tua app deve comunque controllare lo stato di rinnovo e dare il servizio completo durante il grace period.
La differenza conta per i ricavi: se Apple recupera il pagamento entro il grace period, i giorni di servizio pagato del cliente e i tuoi ricavi non si interrompono, e l’abbonamento mantiene la data di fatturazione originale. Un recupero dopo il grace period, ma ancora durante il billing retry, rinnova alla data del recupero.
Le notifiche da gestire
Le App Store Server Notifications V2 informano il tuo server di ogni passaggio. Il riferimento di notificationType elenca questi eventi di fatturazione:
| Evento | notificationType |
subtype |
|---|---|---|
| Il rinnovo fallisce, l’abbonamento entra in billing retry | DID_FAIL_TO_RENEW |
nessuno |
| Il rinnovo fallisce, billing retry con Billing Grace Period | DID_FAIL_TO_RENEW |
GRACE_PERIOD |
| L’abbonamento esce dal grace period (il billing retry continua) | GRACE_PERIOD_EXPIRED |
nessuno |
| Il billing retry recupera l’abbonamento | DID_RENEW |
BILLING_RECOVERY |
| Il billing retry finisce senza recupero | EXPIRED |
BILLING_RETRY |
| Il cliente disattiva il rinnovo automatico | DID_CHANGE_RENEWAL_STATUS |
AUTO_RENEW_DISABLED |
| Il cliente riattiva il rinnovo automatico | DID_CHANGE_RENEWAL_STATUS |
AUTO_RENEW_ENABLED |
| L’abbonamento scade dopo la disdetta del cliente | EXPIRED |
VOLUNTARY |
Nota che GRACE_PERIOD_EXPIRED non significa che il cliente se n’è andato. Apple continua a provare; sei tu a smettere di dare accesso.
Puoi anche chiedere lo stato attuale con l’endpoint Get All Subscription Statuses dell’App Store Server API. Il suo campo status vale 1 (attivo), 2 (scaduto), 3 (billing retry), 4 (Billing Grace Period) o 5 (revocato). Le informazioni di rinnovo contengono anche isInBillingRetryPeriod, gracePeriodExpiresDate e un expirationIntent, dove 2 indica un errore di fatturazione e 1 indica che il cliente ha disdetto.
Tratta AUTO_RENEW_DISABLED come un segnale precoce
DID_CHANGE_RENEWAL_STATUS con AUTO_RENEW_DISABLED è quanto di più vicino a una disdetta esista sull’App Store: il cliente ha ancora accesso fino alla fine del periodo, ma non rinnoverà. Non è un pagamento fallito, ma è il momento migliore per un messaggio di retention, perché l’abbonamento è ancora attivo.
Cosa può fare la tua app
Apple è esplicita su quali strumenti hai.
- Lascia che StoreKit mostri il messaggio di fatturazione. Quando un abbonamento è in billing retry, l’App Store invia un messaggio
billingIssue. StoreKit mostra un foglio Billing Problem all’avvio della tua app (o quando lo richiedi), e il cliente può sistemare il metodo di pagamento senza uscire dalla tua app. Apple documenta la frequenza: ogni 24 ore nei giorni da 1 a 3, ogni 72 ore nei giorni da 4 a 16, ogni 96 ore nei giorni da 17 a 30 e ogni 120 ore nei giorni da 31 a 60. Puoi ritardarlo o sopprimerlo, ma se non hai un messaggio migliore, lascialo comparire. - Mostra un tuo messaggio in-app. La guida di Apple sul churn involontario dice che la tua app può comunicare agli utenti che possono evitare di perdere l’accesso risolvendo l’errore di fatturazione, e può aprire con un deep link la pagina Manage Payments del loro account. Controlla prima
expirationIntent, così non mostri un messaggio di fatturazione a chi ha disdetto. - Inserisci un link alla gestione dell’abbonamento.
showManageSubscriptions(in:)(omanageSubscriptionsSheetin SwiftUI) apre lo stesso foglio delle Impostazioni, dove il cliente può vedere, cambiare o disdire l’abbonamento. - Contatta il cliente con i tuoi canali. Se il cliente ha un account da te e ti ha dato un’email, puoi scrivergli. Apple non condivide l’email del cliente, quindi devi associare la transazione App Store al tuo utente, per esempio con un
appAccountTokenimpostato all’acquisto. - Ripristina l’accesso in fretta. Dopo un recupero, StoreKit aggiunge la transazione di rinnovo alla coda. Apple nota che se la tua app è già in esecuzione, l’observer potrebbe non essere chiamato e l’app lo scopre al lancio successivo. Di solito il tuo server lo sa per primo da
DID_RENEW.
Cosa non puoi fare: ritentare l’addebito, cambiare tu il metodo di pagamento, prolungare il billing retry o togliere l’opzione di disdetta di Apple.
Offerte win-back
Una volta che un abbonamento è terminato (data di scadenza passata e rinnovo automatico disattivato), Apple ti permette di proporre un’offerta win-back: un periodo gratuito o scontato per gli ex abbonati idonei. Secondo la guida di Apple:
- Configuri le offerte e le regole di idoneità in App Store Connect: durata dell’abbonamento pagato, tempo dalla scadenza e tempo tra un’offerta riscattata e l’altra.
- I clienti possono trovarle nell’App Store, nelle impostazioni degli abbonamenti del loro account e nella tua app, dove StoreKit può mostrare per impostazione predefinita un foglio con l’offerta win-back.
- App Store Connect assegna a ogni offerta un link diretto che puoi inviare con i tuoi canali, come l’email. Prima di inviarlo, chiama Get All Subscription Statuses e controlla l’array
eligibleWinBackOfferIds, e invia il link solo ai clienti idonei. - Un riscatto dopo la scadenza produce
SUBSCRIBEDcon subtypeRESUBSCRIBE; le transazioni riscattate con un’offerta win-back hannoofferType4.
Per gli abbonati attivi, gli strumenti collegati sono le offerte promozionali e i codici offerta di Apple (il riscatto invia OFFER_REDEEMED).
Richieste di rimborso e CONSUMPTION_REQUEST
I clienti chiedono i rimborsi ad Apple, non a te, ed è Apple a decidere. Quando un cliente richiede un rimborso, l’App Store invia una notifica CONSUMPTION_REQUEST. Se il cliente ha acconsentito a condividere i suoi dati con Apple, puoi rispondere con l’endpoint Send Consumption Information entro 12 ore. Apple dice di usare queste informazioni per orientare le sue decisioni sui rimborsi. Sei responsabile di ottenere un consenso valido, e Apple dice di non usare per questo la richiesta di App Tracking Transparency. Se non hai il consenso, non rispondere.
Quando Apple rimborsa, ricevi REFUND; quando rifiuta un rimborso richiesto tramite la tua app, REFUND_DECLINED; e se un rimborso viene annullato, REFUND_REVERSED.
Una checklist
- Le App Store Server Notifications V2 sono attive e il tuo server gestisce gli eventi di fatturazione qui sopra.
- Il Billing Grace Period è attivo, testato in sandbox e poi abilitato in produzione.
- La tua app concede l’accesso durante il grace period e lo toglie su
GRACE_PERIOD_EXPIRED. - Il messaggio di fatturazione di StoreKit può comparire, oppure è sostituito dal tuo.
- La schermata delle impostazioni ha un link alla gestione dell’abbonamento.
- Ogni acquisto porta un
appAccountToken, così puoi raggiungere il cliente. - Le offerte win-back sono configurate e inviate solo ai clienti idonei.
- Le richieste di consumo ricevono risposta entro 12 ore quando il cliente ha dato il consenso.
Farlo con NoChurn
Apple tiene pagamenti, nuovi tentativi, grace period e pulsante di disdetta; NoChurn non cambia questo. NoChurn legge le tue App Store Server Notifications, associa ogni abbonamento al tuo utente tramite l’appAccountToken e riporta problemi di fatturazione, cambi del rinnovo automatico e rimborsi nella cronologia del cliente e in un punteggio di churn da 0 a 100. Dove Apple lo consente, agisce: messaggi nella tua app o via email con un link alle impostazioni degli abbonamenti di Apple, un flusso di disdetta che la tua app mostra tramite l’API headless prima del link ad Apple, email di win-back a 30, 60 e 90 giorni in base al motivo della disdetta e risposte alle richieste di consumo dai tuoi dati di utilizzo. Vedi NoChurn + App Store.