I motivi di cancellazione di un abbonamento di solito ti arrivano prima della richiesta di rimborso, e Google Play te ne fornisce molti più di Apple
Google Play registra i motivi di cancellazione degli abbonamenti tramite il suo sondaggio di disdetta, mentre Apple invia solo un codice di scadenza. Ecco cosa ti dice ciascuno store, quali segnali anticipano un rimborso o un chargeback e quanto ti costa ciascuno.

Punti chiave
- Google Play chiede agli abbonati perché se ne vanno quando cancellano, e la risposta arriva allo sviluppatore tramite canceledStateContext.userInitiatedCancellation.cancelSurveyResult in purchases.subscriptionsv2.
- Il sondaggio di disdetta di Google Play ha cinque risposte leggibili dallo sviluppatore: uso insufficiente, problemi tecnici, motivi di costo, trovata un'app migliore e altro. Il testo libero in reasonUserInput viene compilato solo quando l'utente sceglie altro.
- Una notifica SUBSCRIPTION_CANCELED di Google Play contiene solo il token di acquisto. Il motivo della cancellazione va recuperato con purchases.subscriptionsv2.get, e Google cancella tutti i campi relativi alla cancellazione se l'utente ripristina l'abbonamento.
- La App Store Server API di Apple non ha un sondaggio di disdetta. Il suo campo expirationIntent restituisce uno di cinque codici: il cliente ha cancellato, errore di fatturazione, nessun consenso a un aumento di prezzo o a una conversione dell'offerta, prodotto non disponibile, oppure altro.
- La notifica DID_CHANGE_RENEWAL_STATUS di Apple con sottotipo AUTO_RENEW_DISABLED può significare che l'App Store ha disattivato il rinnovo automatico dopo che il cliente ha chiesto un rimborso, non solo che il cliente l'ha spento.
- Un motivo di cancellazione non dà mai allo sviluppatore voce in capitolo su un rimborso. Solo il CONSUMPTION_REQUEST di Apple, a cui rispondere entro 12 ore, e la revisione dei chargeback di Google Play tramite orders.reviewrefund, a cui rispondere entro 24 ore, chiedono prove.
- L'abbonato Google Play che cancella citando problemi tecnici è quello che più probabilmente vorrà indietro i soldi, e per gli ordini effettuati dopo il August 3, 2026 un chargeback vinto da lui costa allo sviluppatore il prezzo d'acquisto meno la commissione di servizio di Play, più le commissioni della banca.
La maggior parte degli abbonati che finiscono per essere rimborsati prima cancella. Quella cancellazione porta con sé un motivo, e i due store te ne forniscono quantità molto diverse. Google Play propone un breve sondaggio e passa la risposta al tuo server, testo libero compreso. Apple invia un codice numerico che dice come è terminato l'abbonamento, non perché il cliente voleva andarsene. Leggili bene entrambi e vedrai arrivare le richieste di rimborso quando puoi ancora fare qualcosa.
Cosa ti dice Google Play sui motivi di cancellazione
Quando un utente cancella dal centro abbonamenti di Play, Google gli chiede perché. La risposta finisce nella risorsa dell'abbonamento che ottieni da purchases.subscriptionsv2.get, sotto canceledStateContext. Quell'oggetto esiste solo mentre l'abbonamento è cancellato o scaduto, e indica chi l'ha terminato: l'utente, il sistema di Google, tu, oppure una sostituzione come un cambio di piano.
Quando è stato l'utente, l'oggetto userInitiatedCancellation contiene due campi. cancelTime indica quando ha cancellato. cancelSurveyResult contiene la risposta al sondaggio.
| Motivo del sondaggio | Descrizione di Google | Cosa segnala spesso |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Uso insufficiente dell'abbonamento | Uso scarso, quindi pochi costi sostenuti sull'account |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Problemi tecnici durante l'uso dell'app | Il segnale più forte di rimborso e chargeback |
| CANCEL_SURVEY_REASON_COST_RELATED | Motivi legati al costo | Sensibilità al prezzo, a volte un rinnovo inatteso |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | L'utente ha trovato un'app migliore | Ha vinto un concorrente, raramente una contestazione |
| CANCEL_SURVEY_REASON_OTHERS | Altri motivi | Leggi reasonUserInput, le parole dell'utente |
| CANCEL_SURVEY_REASON_UNSPECIFIED | Motivo del sondaggio non specificato | Nessuna risposta su cui lavorare |
La colonna di destra è la nostra interpretazione, non quella di Google. Le prime due colonne vengono direttamente dalla documentazione di riferimento dell'API.
La notifica non contiene il motivo
Un abbonamento cancellato genera una notifica in tempo reale per sviluppatori SUBSCRIPTION_CANCELED, di type 3. Google è esplicita: queste notifiche dicono solo che lo stato dell'acquisto è cambiato. Il payload ti dà un token di acquisto e nient'altro di utile, quindi il tuo handler deve chiamare purchases.subscriptionsv2.get per leggere la risposta al sondaggio.
La vista in Play Console
Non serve codice per vedere i totali. I report sugli abbonamenti di Play Console includono una scheda Cancellazioni che divide l'abbandono in volontario, involontario e altro, e una scheda con le risposte al sondaggio di cancellazione per gli utenti che hanno scelto di rispondere. Le risposte a testo libero di chi ha scelto altro si possono scaricare in CSV dalla scheda delle altre risposte. Quel download richiede l'autorizzazione View financial data, la stessa che daresti a uno strumento che legge i tuoi ordini.
Cosa ti dice Apple, e cosa tace
Apple non ha alcun sondaggio di cancellazione che arrivi agli sviluppatori. Il campo più vicino è expirationIntent, nelle informazioni di rinnovo firmate, e descrive come è terminato un abbonamento, non cosa pensava il cliente.
| expirationIntent | Significato secondo Apple | Sottotipo EXPIRED corrispondente |
|---|---|---|
| 1 | Il cliente ha cancellato l'abbonamento | VOLUNTARY |
| 2 | Errore di fatturazione, ad esempio dati di pagamento non validi | BILLING_RETRY |
| 3 | Nessun consenso a un aumento di prezzo o a una conversione dell'offerta che lo richiedeva | PRICE_INCREASE |
| 4 | Il prodotto non era disponibile per l'acquisto al momento del rinnovo | PRODUCT_NOT_FOR_SALE |
| 5 | Qualche altro motivo | Nessun sottotipo |
Il codice 1 è l'unico che descrive una scelta del cliente, e non dice nulla sul motivo. Un cliente che se n'è andato perché l'app continuava a bloccarsi e uno che ha semplicemente finito un progetto sembrano identici.
Il segnale nascosto in AUTO_RENEW_DISABLED
C'è una notifica di Apple che merita uno sguardo più attento. DID_CHANGE_RENEWAL_STATUS con sottotipo AUTO_RENEW_DISABLED di solito significa che il cliente ha disattivato il rinnovo automatico. La documentazione di Apple aggiunge un secondo caso: l'App Store disattiva il rinnovo automatico anche dopo che il cliente ha chiesto un rimborso.
Quindi su iOS un evento di rinnovo disattivato può essere la prima traccia di una richiesta di rimborso. Se l'acquisto è un consumabile o un abbonamento a rinnovo automatico, può seguire un CONSUMPTION_REQUEST, e da quel momento hai 12 ore per inviare i dati di consumo. Un evento di rinnovo disattivato che arriva senza nessuna azione visibile nella tua app conviene trattarlo come un preavviso per preparare i dati d'uso di quell'account.
Apple e Google a confronto
| Google Play | Apple App Store | |
|---|---|---|
| Chiede il motivo all'utente | Sì, con un sondaggio di disdetta | Nessun sondaggio visibile allo sviluppatore |
| Dove si trova il motivo | canceledStateContext in purchases.subscriptionsv2 | expirationIntent nelle informazioni di rinnovo |
| Testo libero | reasonUserInput, solo per altro | Nessuno |
| Chi ha cancellato | Utente, sistema, sviluppatore o sostituzione | Dedotto dal codice e dal sottotipo |
| Notifica | SUBSCRIPTION_CANCELED, poi chiamare get | DID_CHANGE_RENEWAL_STATUS, EXPIRED |
| Perso se l'utente si riabbona | Sì, cancellato al ripristino | Le informazioni di rinnovo riflettono lo stato attuale |
| Dashboard | Scheda delle risposte al sondaggio di cancellazione | Nulla per i motivi |

Dove una cancellazione diventa un rimborso
Una cancellazione blocca il prossimo addebito. Non restituisce l'ultimo. Se i soldi tornano indietro dipende da quale flusso di rimborso il cliente raggiunge dopo, e la maggior parte di questi flussi funziona senza di te.
- Su Google Play un acquirente può ottenere da solo un rimborso entro 48 ore dall'acquisto, e decide Google.
- I rimborsi tramite l'assistenza di Google o di Apple vengono decisi dallo store.
- Il CONSUMPTION_REQUEST di Apple chiede i tuoi dati di consumo, con una finestra di 12 ore.
- La revisione dei chargeback di Google Play chiede prove tramite orders.reviewrefund, con una finestra di 24 ore. La decisione della banca su un chargeback è definitiva.
Un motivo di cancellazione non cambia nessuna di queste regole. Quello che cambia è quanto presto sai quale cliente è insoddisfatto, e se le tue prove sono pronte quando arriva uno dei due flussi che le chiedono.
Quanto ti costa ogni motivo
La risposta al sondaggio è anche un'indicazione approssimativa di quanto ti è già costato servire un account, cioè i soldi che un rimborso ti lascia sul groppone.
Problemi tecnici
Questo è quello costoso. Il cliente ha usato il prodotto abbastanza da incontrare problemi, quindi hai già pagato il calcolo dietro le sue sessioni, le chiamate all'API del modello generate dalle sue richieste, lo storage di ciò che ha creato e qualsiasi compenso dovuto a un creator di cui ha usato i contenuti. Se poi ottiene un rimborso, il prezzo torna indietro e quei costi restano a te. Se su Google Play si rivolge alla sua banca, un ordine effettuato dopo il August 3, 2026 ti costa il prezzo d'acquisto meno la commissione di servizio di Play, più le commissioni della banca.
Motivi di costo
Una lamentela sul prezzo ti costa meno di quanto sembri, a meno che non nasconda un rinnovo inatteso. È la classica storia da chargeback, quindi controlla se la cancellazione è arrivata subito dopo un addebito di rinnovo e se i tuoi promemoria di rinnovo sono stati inviati.
Uso insufficiente
Uso scarso significa costi di servizio bassi, quindi qui un rimborso restituisce soprattutto soldi che non ti è costato molto guadagnare. È anche il motivo in cui dati di consumo onesti, se Apple li chiede, mostrano esattamente cosa il cliente ha usato e cosa no.
Trovata un'app migliore
Questi clienti contestano raramente qualcosa. Sono passati a un concorrente. Il motivo è utile per le decisioni di prodotto e quasi mai per difendersi da un rimborso.
Una routine per leggere i motivi di cancellazione
- A ogni SUBSCRIPTION_CANCELED di Google Play, chiama purchases.subscriptionsv2.get e salva canceledStateContext insieme al token di acquisto e a cancelTime.
- Salva reasonUserInput parola per parola quando il motivo è altro. È l'unico testo libero che ti dà uno qualsiasi dei due store.
- A ogni DID_CHANGE_RENEWAL_STATUS di Apple con AUTO_RENEW_DISABLED, registra l'evento e recupera l'utilizzo di quell'account, nel caso arrivi un CONSUMPTION_REQUEST.
- A ogni notifica EXPIRED di Apple, registra il sottotipo e expirationIntent, così l'abbandono volontario e gli errori di fatturazione non si confondono.
- Per le cancellazioni su Google Play dovute a problemi tecnici, controlla i log degli errori di quell'account e contatta il cliente prima che lui contatti la sua banca.
- Conserva log di utilizzo per account, così un CONSUMPTION_REQUEST riceve risposta entro 12 ore e una revisione di chargeback entro 24.
Domande frequenti
- Come vedo perché un abbonato Google Play ha cancellato?
- Chiama purchases.subscriptionsv2.get e leggi canceledStateContext.userInitiatedCancellation.cancelSurveyResult. Il campo del motivo contiene la risposta al sondaggio, e reasonUserInput contiene il testo libero quando l'utente ha scelto altro. Play Console mostra anche i totali nella scheda delle risposte al sondaggio di cancellazione.
- Apple dice agli sviluppatori perché un cliente ha cancellato un abbonamento?
- No. Apple non ha un sondaggio di disdetta visibile agli sviluppatori. Il campo expirationIntent dice come è terminato l'abbonamento, con codici per cliente che ha cancellato, errore di fatturazione, nessun consenso a un aumento di prezzo, prodotto non disponibile o altro, ma non il motivo del cliente.
- La notifica SUBSCRIPTION_CANCELED include il motivo della cancellazione?
- No. Le notifiche in tempo reale per sviluppatori di Google Play dicono solo che lo stato dell'acquisto è cambiato. Recupera l'abbonamento con purchases.subscriptionsv2.get per leggere il motivo e salvalo subito, perché Google cancella i campi relativi alla cancellazione se l'utente ripristina l'abbonamento.
- Una notifica AUTO_RENEW_DISABLED di Apple può indicare una richiesta di rimborso?
- Sì. La documentazione di Apple dice che il sottotipo AUTO_RENEW_DISABLED copre sia il cliente che disattiva il rinnovo automatico sia l'App Store che lo disattiva dopo che il cliente ha chiesto un rimborso.
- Posso revocare l'accesso quando un abbonato cancella?
- Su Google Play no, finché ne ha ancora diritto. Google dice che un abbonato che ha cancellato mantiene l'accesso fino alla fine del ciclo di fatturazione, e togliere l'accesso prima viola le norme di Google Play sugli abbonamenti. Usa expiryTime per decidere quando termina l'accesso.
Fonti e approfondimenti
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Il pilota automatico dei rimborsi per App Store e Google Play
Continua a leggere
Le richieste di rimborso eccessive possono costarti più dei rimborsi stessi, perché entrambi gli store le trattano come un segnale di qualità
La linea guida 5.6.4 di Apple indica le richieste di rimborso eccessive come segnale che un'app non rispetta gli standard di qualità, e l'accordo di distribuzione di Google le consente di rimuovere le app dei nuovi sviluppatori in base ai tassi di rimborso. Ecco cosa dice ciascuno store, quanto costa una rimozione e come restarne alla larga.
Verifica le notifiche server dell'App Store prima di agire su un rimborso, perché chiunque può inviare richieste al tuo URL di webhook
Una notifica di rimborso è solo una richiesta HTTPS finché non ne controlli la firma. Ecco come verificare le notifiche server dell'App Store e i messaggi RTDN di Google Play, che cosa firma ciascuno store e quanto ti costa un rimborso falsificato o respinto per errore.