Apple e Google ti permettono di estendere la data di rinnovo di un abbonamento dopo un disservizio, e i loro limiti non si somigliano affatto
Quando la tua app va giù, puoi estendere la data di rinnovo di un abbonamento invece di aspettare le richieste di rimborso. Ecco come funzionano le estensioni di 90 giorni di Apple e il rinvio della fatturazione di Google Play, dove ogni store fissa il limite e quanto ti costa ciascuna opzione.

Punti chiave
- La App Store Server API permette a uno sviluppatore di estendere da 1 a 90 giorni la data di rinnovo di un abbonamento a rinnovo automatico attivo e pagato, per compensare un disservizio, un evento annullato o una diretta interrotta.
- Apple consente due estensioni della data di rinnovo per cliente nell'arco di 365 giorni. Un'estensione non può essere annullata una volta entrata in vigore, e Apple invia al cliente un'email con la nuova data di rinnovo.
- Apple non estende un abbonamento che si trova in un periodo di offerta gratuita, in un nuovo tentativo di addebito, in un periodo di tolleranza la cui data di scadenza è passata, o già scaduto. L'abbonamento deve avere alle spalle almeno un periodo pagato.
- I giorni aggiunti con un'estensione della data di rinnovo di Apple non contano per l'anno di servizio pagato che porta la quota di ricavi da abbonamento dello sviluppatore dal 70% all'85%.
- purchases.subscriptionsv2.defer di Google Play sposta in avanti la prossima data di addebito di un abbonamento da un minimo di un giorno fino a un anno per chiamata. L'utente mantiene l'accesso completo senza alcun addebito, e Google invia una notifica SUBSCRIPTION_DEFERRED.
- Un'estensione della data di rinnovo non restituisce denaro, quindi lo sviluppatore tiene il pagamento ma paga calcolo, storage e chiamate API dei giorni aggiunti senza un rinnovo che li copra. Un rimborso restituisce il prezzo e nulla del denaro già speso per servire quel cliente.
- Se un disservizio ha impedito la consegna di un acquisto in-app e Apple invia un CONSUMPTION_REQUEST, il deliveryStatus onesto è UNDELIVERED_SERVER_OUTAGE, e Apple richiede che consumptionPercentage sia 0 per qualsiasi stato diverso da DELIVERED.
Un disservizio dà a ogni abbonato la motivazione di rimborso più pulita che esista, e non puoi impedirgli di usarla. Quello che puoi fare è restituire i giorni persi prima che qualcuno li chieda. Entrambi gli store ti permettono di estendere la data di rinnovo di un abbonamento, così il cliente riceve tempo gratuito invece di denaro. Apple limita ogni estensione a 90 giorni e ne consente due all'anno. Google ti lascia rinviare la fatturazione fino a un anno per chiamata. Le procedure, le notifiche e il conto che c'è sotto sono abbastanza diversi da rendere insufficiente un unico piano per entrambi.
Cosa fa un disservizio alla tua esposizione ai rimborsi
I rimborsi li decidono gli store, non tu. Sull'App Store, il cliente lo chiede ad Apple e Apple decide. Puoi ricevere una notifica CONSUMPTION_REQUEST e avere 12 ore per inviare dati di consumo tramite Send Consumption Information. Questo è tutto il tuo margine di intervento.
Su Google Play, un acquirente può ottenere un rimborso entro 48 ore dall'acquisto senza che nessuno ti interpelli. Dopo, le richieste arrivano a te. L'unico flusso di Google che chiede le tue prove è un chargeback segnalato per la revisione dello sviluppatore, a cui rispondi tramite orders.reviewrefund entro 24 ore. La decisione della banca su un chargeback è definitiva.
Quindi nessuno dei due store ti offre un modo per bloccare un rimborso. Quello che controlli è se un abbonato si sente ancora penalizzato quando il servizio torna. Tempo extra sull'abbonamento, concesso in fretta e comunicato con chiarezza, è lo strumento che entrambi gli store hanno creato proprio per questo.
Come estendere la data di rinnovo di un abbonamento sull'App Store
La App Store Server API ha due endpoint per questo. Extend a Subscription Renewal Date agisce su un singolo abbonamento, che identifichi tramite il suo originalTransactionId. Extend Subscription Renewal Dates for All Active Subscribers agisce su tutti gli abbonati idonei di un productId, e puoi limitarlo con storefrontCountryCodes quando il disservizio ha colpito solo alcune regioni.
Ogni richiesta contiene tre elementi: extendByDays, un numero da 1 a 90; un extendReasonCode; e un requestIdentifier generato da te. Il codice motivo 3 indica un problema o un disservizio. Il codice 1 è la soddisfazione del cliente, il codice 2 sono altri motivi e il codice 0 è non dichiarato.
Quali abbonamenti Apple estende
Sono idonei solo gli abbonamenti a rinnovo automatico attivi con almeno un periodo già pagato. Apple esclude questi:
- Abbonamenti in un periodo di offerta gratuita, come una prova gratuita.
- Abbonamenti inattivi in stato di nuovo tentativo di addebito.
- Abbonamenti in un periodo di tolleranza per la fatturazione la cui data di scadenza è già passata.
- Abbonamenti che hanno già ricevuto due estensioni della data di rinnovo negli ultimi 365 giorni.
- Abbonamenti scaduti.
In famiglia è incluso senza sforzo. Quando Apple estende un abbonamento acquistato che supporta In famiglia, vengono estesi anche gli abbonamenti dei membri della famiglia. Non puoi agire direttamente sull'abbonamento di un membro della famiglia.
La richiesta massiva è lenta, quindi tieni d'occhio le notifiche
Apple dice che una richiesta per estendere tutti gli abbonati attivi può richiedere ore, o perfino giorni, a seconda di quanti abbonati hai. Una risposta 200 significa solo che Apple la sta elaborando. App Store Server Notifications V2 ti dice com'è andata:
| Notifica | Sottotipo | Cosa significa |
|---|---|---|
| RENEWAL_EXTENDED | nessuno | La data di rinnovo di un abbonamento è stata estesa |
| RENEWAL_EXTENSION | FAILURE | L'estensione di un abbonamento non è riuscita |
| RENEWAL_EXTENSION | SUMMARY | L'intera richiesta massiva è completata |
Per ogni FAILURE, prendi l'originalTransactionId dalla transazione firmata nel payload e riprova con l'endpoint per il singolo abbonamento. Se preferisci interrogare l'API, Get Status of Subscription Renewal Date Extensions ti dice se la richiesta è completata e quante estensioni sono riuscite o fallite.
Come funziona il rinvio della fatturazione di Google Play
La versione di Google è purchases.subscriptionsv2.defer, da chiamare una volta per token di acquisto. Il corpo della richiesta contiene un deferralContext con tre campi. L'etag viene da purchases.subscriptionsv2.get, e la chiamata fallisce se non corrisponde all'etag più recente dell'abbonamento. Il deferDuration indica di quanto spostare la data. E validateOnly, se true, esegue la richiesta come prova senza toccare l'abbonamento.
La guida alla fatturazione di Google fissa l'intervallo da un giorno a un anno per chiamata API. Per andare oltre, chiama di nuovo prima che arrivi la nuova data di scadenza. Per un abbonamento a rinnovo automatico, il rinvio sposta la prossima data di rinnovo. Per un piano prepagato, sposta l'orario di scadenza. In un abbonamento con componenti aggiuntivi, ogni elemento viene rinviato della stessa durata. La risposta elenca il nuovo expiryTime di ogni elemento.
Durante il rinvio l'utente resta abbonato con accesso completo e non paga il tempo extra. Google invia una notifica in tempo reale per sviluppatori SUBSCRIPTION_DEFERRED. Il vecchio purchases.subscriptions.defer è deprecato, quindi il nuovo codice deve usare il metodo v2.
Google non avvisa il tuo cliente, quindi devi farlo tu
Apple invia un'email al cliente dopo ogni estensione riuscita. La guida alla fatturazione di Google non descrive alcun messaggio all'utente. Se lo scopo è prevenire le richieste di rimborso, l'abbonato deve sapere che quel tempo extra esiste. Comunicalo tu, nell'app e via email, dicendo quanti giorni e perché.
Apple e Google a confronto
| Apple App Store | Google Play | |
|---|---|---|
| API | Extend a Subscription Renewal Date, più un endpoint massivo | purchases.subscriptionsv2.defer |
| Durata per richiesta | Da 1 a 90 giorni | Da 1 giorno a 1 anno |
| Frequenza | Due volte per cliente in 365 giorni | Nessun limite indicato; richiama prima della nuova data di scadenza |
| Opzione massiva | Una chiamata per productId, eventualmente per storefront | Una chiamata per token di acquisto |
| Prova gratuita | Non idonea | Non trattato nella guida di Google |
| Notifica | RENEWAL_EXTENDED, RENEWAL_EXTENSION | SUBSCRIPTION_DEFERRED |
| Avviso al cliente | Apple invia un'email | Sta a te |
| Reversibile | No | Non trattato nella guida di Google |
Quanto costa un'estensione rispetto a un rimborso
Un rimborso e un'estensione prendono denaro da posti diversi. Un rimborso restituisce ciò che il cliente ha pagato per il periodo. Tutto ciò che hai già speso per servire quel cliente resta speso: il calcolo di ogni sessione, le chiamate all'API del modello, lo storage e qualsiasi compenso a un creator di cui ha usato i contenuti.
Un'estensione mantiene il pagamento. Il suo costo è il servizio che eroghi senza un rinnovo che lo paghi. Per ogni giorno aggiunto, un abbonato attivo continua a generare gli stessi costi. Per un utente leggero è quasi nulla. Per un utente intensivo di una funzione di IA, 30 giorni extra possono voler dire 30 giorni di chiamate al modello senza ricavi a coprirle. Dimensiona l'estensione sul disservizio, non sulle scuse che vorresti fare.
| Cosa perdi | Rimborso | Estensione della data di rinnovo |
|---|---|---|
| Il pagamento dell'abbonamento | Restituito al cliente | Mantenuto |
| Costi già sostenuti per servire il cliente | Persi | Persi |
| Calcolo, storage e chiamate API nei giorni aggiunti | Nessuno, l'accesso termina | A tuo carico, ancora senza rinnovo |
| L'abbonamento dopo | Termina se il rimborso revoca l'accesso | Attivo, si rinnova alla nuova data |
Il costo in commissioni su Apple
Apple paga il 70% di ogni rinnovo durante il primo anno di servizio pagato di un abbonato e l'85% dopo. La pagina di Apple sugli abbonamenti dice che i giorni di estensione del rinnovo sono esclusi dai giorni di servizio pagato. Quindi un'estensione di 30 giorni sposta di 30 giorni il passaggio di quell'abbonato all'85%. Se fai parte dell'App Store Small Business Program, ricevi già l'85% e questo costo non si applica.
Il costo dei chargeback su Google Play
Per gli ordini effettuati dopo il 3 agosto 2026, un chargeback vinto dal titolare della carta costa a uno sviluppatore Google Play il prezzo d'acquisto meno la commissione di servizio di Play, più le commissioni bancarie. Un disservizio è proprio il tipo di evento che spinge un cliente irritato verso la sua banca. Un rinvio che lo raggiunge prima costa meno di una contestazione che non puoi ribaltare.

Quando un'estensione non è lo strumento giusto
L'acquisto non era un abbonamento
Le estensioni della data di rinnovo valgono solo per gli abbonamenti. Se un disservizio ha compromesso un consumabile o uno sblocco una tantum, consegna di nuovo l'articolo. Se Apple invia un CONSUMPTION_REQUEST per quell'acquisto, segnala cosa è successo. Il campo deliveryStatus di Apple ha un valore apposito, UNDELIVERED_SERVER_OUTAGE, e Apple dice che qualsiasi stato diverso da DELIVERED deve accompagnarsi a consumptionPercentage impostato a 0.
Il cliente ha già usato entrambe le estensioni Apple
Il limite di Apple è di due estensioni per cliente in 365 giorni. Due disservizi in un anno le esauriscono, e un terzo ti lascia senza nulla da offrire tramite lo store. Tieni traccia di quante estensioni ha usato ogni originalTransactionId, così le notifiche FAILURE della richiesta massiva non ti colgono di sorpresa.
Il cliente è in prova gratuita
Apple non estende un abbonamento in un periodo di offerta gratuita. Un utente in prova ha perso giorni gratuiti, non pagati, quindi il rischio di rimborso è basso. Se vuoi farti perdonare, un messaggio in-app costa meno di qualsiasi chiamata API.
Una checklist per il prossimo disservizio
- Registra quando il disservizio è iniziato e finito, e quali prodotti e regioni ha colpito.
- Scegli un numero di giorni che copra il tempo perso. Su Apple, usa il codice motivo 3 e resta tra 1 e 90.
- Su Apple, invia una richiesta massiva per productId, limitata con storefrontCountryCodes quando sono state colpite solo alcune regioni.
- Ascolta le notifiche RENEWAL_EXTENSION FAILURE e riprova ciascuna con l'endpoint per il singolo abbonamento.
- Su Google Play, scorri i token di acquisto attivi, leggi ogni etag, esegui prima con validateOnly e poi rinvia davvero.
- Avvisa tu gli abbonati Google Play del tempo extra, visto che Google non lo fa.
- Aggiorna la scadenza dei diritti di accesso a partire da RENEWAL_EXTENDED e SUBSCRIPTION_DEFERRED, non dai tuoi calcoli sulle date.
- Conserva log di utilizzo per account, così se arriva comunque una richiesta di rimborso o un chargeback, le tue prove sono pronte entro 12 ore per Apple ed entro 24 ore per Google.
Domande frequenti
- Quante volte posso estendere la data di rinnovo di un abbonamento sull'App Store?
- Due volte per cliente in 365 giorni. Ogni estensione può andare da 1 a 90 giorni, e un abbonamento che ha già ricevuto due estensioni negli ultimi 365 giorni non è idoneo per un'altra.
- Apple avvisa il cliente quando estendo il suo abbonamento?
- Sì. Dopo un'estensione della data di rinnovo riuscita, Apple invia al cliente un'email con la data di rinnovo aggiornata. La guida alla fatturazione di Google Play non descrive nessun messaggio simile, quindi su Android conviene avvisare tu gli abbonati.
- Per quanto tempo posso rinviare un abbonamento Google Play?
- La guida alla fatturazione di Google indica da un giorno a un anno per chiamata a purchases.subscriptionsv2.defer. Per rinviare oltre, richiama l'API prima che arrivi la nuova data di scadenza. L'utente mantiene l'accesso completo e non paga il periodo rinviato.
- Posso annullare un'estensione della data di rinnovo di Apple?
- No. Apple dice che, una volta entrata in vigore un'estensione del rinnovo di un abbonamento, non c'è modo di annullarla. Controlla il prodotto, il numero di giorni e gli storefront prima di inviare la richiesta.
- Un'estensione della data di rinnovo incide sulla mia quota di ricavi dell'85% su Apple?
- Sì. Apple esclude i giorni di estensione del rinnovo dai giorni di servizio pagato, quindi un'estensione ritarda il passaggio di un abbonato dal 70% all'85% di tanti giorni quanti ne hai aggiunti. Gli sviluppatori dell'App Store Small Business Program ricevono già l'85%.
- Posso estendere un abbonamento in prova gratuita?
- Non sull'App Store. Apple esclude gli abbonamenti in un periodo di offerta gratuita, oltre a quelli in nuovo tentativo di addebito, con periodo di tolleranza scaduto o già scaduti. Sono idonei solo gli abbonamenti attivi con almeno un periodo pagato.
Fonti e approfondimenti
- Apple Developer: Extending the renewal date for auto-renewable subscriptions
- Apple Developer: Extend a Subscription Renewal Date
- Apple Developer: Extend Subscription Renewal Dates for All Active Subscribers
- Apple Developer: extendReasonCode
- Apple Developer: Auto-renewable subscriptions
- Apple Developer: deliveryStatus
- Google Play Developer API: purchases.subscriptionsv2.defer
- Google Play Billing: Manage subscriptions and one-time purchases
- Google Play Billing: Subscription lifecycle
- 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.