Rimborsi e acquisti annullati su Google Play: cosa farne
Come funzionano rimborsi, revoche e chargeback per gli abbonamenti Google Play: notifiche di acquisto annullato, Voided Purchases API e revisione rimborsi.
Su Google Play, i soldi possono tornare a un abbonato in diversi modi: l’utente ottiene un rimborso, lo rimborsi tu dalla Play Console o dall’API, un acquisto non viene mai confermato, oppure il pagamento subisce un chargeback. Google raggruppa tutti questi casi sotto un unico termine: un voided purchase (acquisto annullato). Se concedi accesso o crediti dal tuo backend, devi sapere di ognuno di essi.
Questa guida spiega dove compaiono gli acquisti annullati, cosa ti dice Google su ciascuno, la nuova revisione dei rimborsi per i chargeback e come rispondere. Si attiene alla documentazione di Google: il riferimento delle notifiche in tempo reale per sviluppatori, le best practice di sicurezza sugli acquisti annullati, la gestione degli acquisti rifiutati, il ciclo di vita degli abbonamenti e il riferimento della Google Play Developer API per voided purchases, orders.refund e orders.reviewrefund (tutti consultati a novembre 2026).
Cosa conta come acquisto annullato
La pagina sulla sicurezza di Google definisce gli acquisti annullati come “acquisti che sono stati annullati, revocati o oggetto di chargeback”, ed elenca le cause principali:
- L’acquisto viene annullato dall’utente, dallo sviluppatore o da Google, compresi gli acquisti annullati automaticamente perché non sono mai stati confermati. Per gli abbonamenti, significa annullare l’acquisto stesso, non solo disattivare il rinnovo.
- L’acquisto subisce un chargeback.
- Lo sviluppatore annulla o rimborsa un ordine e seleziona l’opzione “revoke”.
Una normale disdetta dell’abbonamento (l’utente ferma il rinnovo) non è un acquisto annullato. È un evento SUBSCRIPTION_CANCELED, e l’utente mantiene l’accesso fino alla fine del periodo.
Rimborsare, revocare o entrambi
Hai tre azioni, e fanno cose diverse:
| Azione | API | Soldi | Accesso |
|---|---|---|---|
| Solo rimborso | orders.refund senza revoke |
Rimborsati | Mantenuto |
| Rimborso e revoca | orders.refund con revoke=true, o purchases.subscriptionsv2.revoke con rimborso totale |
Rimborsati | Terminato subito |
| Disdetta | purchases.subscriptionsv2.cancel |
Non rimborsati | Mantenuto fino alla fine del periodo |
Punti della documentazione di Google da conoscere:
orders.refundnon può rimborsare ordini più vecchi di tre anni. Conrevokeimpostato a true, l’accesso termina subito e, per un abbonamento ricorrente, tutti i pagamenti futuri si fermano.- La guida all’integrazione di Google dice che le revoche dello sviluppatore e i rimborsi con revoca attivano notifiche e compaiono nella Voided Purchases API con
voidedSourceimpostato su sviluppatore. Per gli abbonamenti, ricevi siaSUBSCRIPTION_REVOKEDsia unaVoidedPurchaseNotification. - Un rimborso senza revoca “non attiva una notifica di revoca o di acquisto annullato”. Se lo usi, registralo tu.
- Se non confermi un nuovo abbonamento entro tre giorni, l’utente viene rimborsato automaticamente e l’acquisto viene revocato. Google chiede di non affidarsi a questo meccanismo per rifiutare gli acquisti: revoca e rimborsa esplicitamente.
Dove compaiono gli acquisti annullati
In tempo reale: VoidedPurchaseNotification
Se la tua app Play ha attive le notifiche in tempo reale per sviluppatori, un acquisto annullato arriva come voidedPurchaseNotification con:
purchaseToken: l’acquisto annullato.orderId: l’ordine esatto. Per gli abbonamenti, ogni rinnovo ha il proprio ID ordine, quindi questo ti dice quale pagamento è stato annullato.productType:1abbonamento,2prodotto una tantum.refundType:1rimborso totale,2rimborso parziale basato sulla quantità (solo per acquisti con più quantità).
Google nota che questo basta per “individuare l’acquisto e l’ordine giusti per adeguare il diritto di accesso”. Per gli abbonamenti, una revoca invia anche una notifica di abbonamento SUBSCRIPTION_REVOKED; la guida al ciclo di vita dice di revocare subito il diritto di accesso dell’utente in quel caso.
In blocco: la Voided Purchases API
purchases.voidedpurchases.list è un’API a richiesta. Dal riferimento dell’API:
- Copre gli ultimi 30 giorni:
startTimenon può essere più vecchio. - Di default restituisce solo i prodotti una tantum. Passa
type=1per includere gli abbonamenti. - Ogni record ha un
voidedReason:0Other,1Remorse,2Not_received,3Defective,4Accidental_purchase,5Fraud,6Friendly_fraud,7Chargeback,8Unacknowledged_purchase. - E un
voidedSource:0utente,1sviluppatore,2Google.
I codici motivo sono la parte più utile, perché la notifica non li include. Un’avvertenza dalla pagina sulla sicurezza: gli acquisti annullati “senza alcun contenuto da recuperare associato non sono esposti dalla Voided Purchases API”.
Usa entrambi: la notifica per agire in pochi secondi, e una richiesta giornaliera all’API per avere i motivi e recuperare ciò che ti è sfuggito.
Chargeback: la revisione del rimborso
Google ha aggiunto un modo per permettere agli sviluppatori di dire la loro su alcuni chargeback. Quando un utente richiede un chargeback che necessita della revisione dello sviluppatore, ricevi una pendingRefundReviewNotification. Secondo il riferimento RTDN, dovresti valutare la richiesta e inviare “un suggerimento sul rimborso e prove di utilizzo dell’acquisto entro 24 ore” chiamando orders.reviewrefund. Al momento le revisioni in sospeso supportano solo CHARGEBACK come motivo.
Il corpo della richiesta, secondo il riferimento dell’API:
| Campo | Significato |
|---|---|
pendingRefundToken |
Dalla notifica; obbligatorio |
refundPreference |
APPROVE, DECLINE o NEUTRAL; obbligatorio |
sampleContentProvided |
Se hai offerto un campione gratuito, una prova o una descrizione prima dell’acquisto; obbligatorio |
consumptionPercentageMilliunits |
Facoltativo, da 0 a 100.000 (45.200 significa 45,2%) |
consumptionUsageEvents |
Elenco facoltativo di eventi di utilizzo (ora, descrizione dell’elemento, indirizzo IP, posizione, account o profilo ID offuscato); gli elenchi con più di 1.000 elementi vengono rifiutati |
La notifica include obfuscatedAccountId e obfuscatedProfileId se li hai impostati all’acquisto. Senza di essi, faticherai a trovare l’utilizzo dell’utente entro 24 ore.
Sii sincero. Se l’utente non ha potuto usare ciò per cui ha pagato, APPROVE è la risposta giusta. Se ha usato l’abbonamento per tutto il periodo, un DECLINE con eventi di utilizzo concreti è ciò a cui serve il campo.
Cosa fare con ogni acquisto annullato
La guida alla sicurezza di Google raccomanda, a seconda del motivo e dello storico dell’utente:
- Recuperare gli elementi non usati, come la valuta in-app concessa.
- Più avvertimenti: un avviso in-app per un primo caso, misure più forti per i casi ripetuti.
- Disattivare temporaneamente gli acquisti mentre indaghi.
- Limitare l’accesso alla tua app in casi estremi e ripetuti.
- Chiamare la Voided Purchases API più spesso quando rilevi acquisti annullati.
Per un’app in abbonamento, una policy pratica è questa:
| Motivo | Risposta suggerita |
|---|---|
| Acquisto accidentale, pentimento | Termina l’accesso per il periodo rimborsato; nessun avvertimento. Magari chiedi un feedback |
| Non ricevuto, difettoso | Trattalo come un bug del prodotto; indaga sull’account dell’utente |
| Acquisto non confermato | Sistema l’elaborazione degli acquisti; è un tuo bug, non dell’utente |
| Frode, friendly fraud, chargeback | Termina l’accesso, segnala l’account, blocca i nuovi acquisti fino alla revisione |
Errori comuni
- Gestire solo
SUBSCRIPTION_CANCELED. Significa “smetti di rinnovare”, non “rimborsato”. Le revoche arrivano comeSUBSCRIPTION_REVOKEDe notifiche di acquisto annullato. - Rimborsare senza revoca e dimenticarsene. Nessuna notifica te lo ricorderà.
- Interrogare l’API meno di una volta al mese. Tutto ciò che ha più di 30 giorni sparisce dall’API.
- Nessun account ID offuscato. Non puoi rispondere in tempo a una revisione del rimborso se non riesci a trovare l’utente.
- Punire i rimborsi per pentimento come le frodi. I codici motivo esistono proprio per distinguerli.
Farlo con NoChurn
NoChurn legge le tue notifiche in tempo reale per sviluppatori di Google Play e la Voided Purchases API, così rimborsi, revoche e chargeback compaiono nella cronologia di ogni cliente con il loro motivo e alimentano il churn score. Su Google Play, in NoChurn i rimborsi sono in sola lettura: le decisioni di rimborso e le revisioni dei rimborsi restano a te e a Google, e pagamenti e nuovi tentativi restano a Google. Per abbinare gli acquisti ai clienti, imposta un account ID offuscato all’acquisto. Vedi NoChurn + Google Play.