Un rimborso tramite l'Advanced Commerce API è l'unico modo in cui uno sviluppatore iOS può avviare un rimborso, e l'ultima parola spetta ancora ad Apple
La maggior parte degli sviluppatori iOS non può rimborsare un cliente. Le app che usano l'Advanced Commerce API di Apple possono richiedere un rimborso, revocare un abbonamento o restituire un importo personalizzato. Ecco come funziona ogni endpoint, cosa Apple può ancora rifiutare e dove si perdono i soldi.

Punti chiave
- Un ingegnere di Apple ha dichiarato a giugno 2026 che uno sviluppatore non può emettere direttamente un rimborso per un normale acquisto sull'App Store. L'unico contributo dello sviluppatore sono i dati di consumo e la refundPreference inviati in risposta a un CONSUMPTION_REQUEST.
- Le app approvate per l'Advanced Commerce API di Apple ottengono un endpoint Request Transaction Refund che chiede all'App Store di rimborsare un addebito singolo o una transazione di abbonamento, oltre agli endpoint Revoke Subscription e Cancel a Subscription.
- Per chiamare gli endpoint di rimborso, revoca e annullamento dell'Advanced Commerce API, l'Account Holder dello sviluppatore deve firmare l'Advanced Commerce API Addendum, e Apple afferma che la chiamata restituisce un errore se l'ultima versione non è stata accettata.
- L'endpoint Request Transaction Refund accetta un refundType FULL, PRORATED o CUSTOM, e un refundAmount in millesimi della valuta è ammesso solo con CUSTOM. Apple afferma che l'importo deve includere le imposte in tutte le regioni tranne Canada e Stati Uniti.
- Il campo refundRiskingPreference di Apple vale true per impostazione predefinita, e così l'App Store può inviare un CONSUMPTION_REQUEST sulla richiesta di rimborso dello sviluppatore stesso. Apple chiede una risposta entro 12 ore.
- Gli endpoint di rimborso, revoca e annullamento dell'Advanced Commerce API sono limitati a 5 richieste al secondo per app in produzione, e la sandbox ne ha il 10 per cento.
- Dopo una chiamata riuscita a Revoke Subscription, Apple invia una notifica REFUND e chiede agli sviluppatori di interrompere il servizio a partire dalla sua revocationDate, non prima che la notifica arrivi.
Uno sviluppatore iOS comune non può rimborsare un cliente. A giugno 2026 un App Store Commerce Engineer ha risposto a una domanda sul forum degli sviluppatori con una sola frase: al momento uno sviluppatore non può emettere direttamente un rimborso. C'è un'eccezione, e si trova dentro l'Advanced Commerce API. Le app che Apple approva possono inviare una richiesta di rimborso tramite l'Advanced Commerce API, revocare un abbonamento con restituzione del denaro o chiedere un importo personalizzato. Apple decide comunque se il denaro viene restituito.
Che cos'è l'Advanced Commerce API e chi può usarla
Apple ha rilasciato l'Advanced Commerce API il 23 gennaio 2025. Gestisce gli acquisti In-App di Apple per cataloghi eccezionalmente ampi di acquisti singoli personalizzati, abbonamenti e abbonamenti con componenti aggiuntivi opzionali. Non crei ogni prodotto in App Store Connect. Definisci gli SKU sul tuo server e li invii ad Apple al momento dell'acquisto.
L'accesso viene concesso app per app. Compili un modulo di richiesta, e la pagina dei requisiti di Apple indica tre modelli di business che devono essere centrali nell'app:
- Cataloghi eccezionalmente ampi di acquisti singoli, come audiolibri, lezioni, corsi o mini app.
- Cataloghi eccezionalmente ampi di contenuti in abbonamento, dove l'offerta di ogni creator è un abbonamento a sé.
- Un abbonamento con componenti aggiuntivi opzionali che si rinnovano insieme come un unico acquisto, come canali premium o sport.
Apple consente di candidarsi anche quando un altro programma richiede l'API. Il Mini Apps Partner Program, che paga ai membri l'85% delle vendite In-App idonee nelle mini app ospitate, la richiede.
Gli endpoint di rimborso sono arrivati dopo, e richiedono una firma
La versione 1.1, datata 24 marzo 2025, ha aggiunto Request Transaction Refund e Revoke Subscription. La pagina del programma di Apple dice che le app che offrono contenuti in abbonamento possono anche essere idonee a usare le API Cancel, Revoke e Refund per gestire le disdette, convalidare i contenuti dopo l'acquisto e amministrare i propri cataloghi. Ogni pagina di endpoint aggiunge la stessa condizione: il tuo Account Holder deve firmare l'Advanced Commerce API Addendum, e se l'ultima versione non è accettata, la chiamata restituisce un errore. È l'Addendum, non la documentazione, a elencare i casi d'uso previsti per ogni endpoint.
I tre endpoint, a confronto
| Cancel a Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| Percorso | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| Copre | Abbonamenti a rinnovo automatico | Un abbonamento e tutti i suoi elementi | Addebiti singoli e transazioni di abbonamento |
| Rimborso | Nessuno | FULL o PRORATED | FULL, PRORATED o CUSTOM, per SKU |
| Accesso | Continua fino alla fine del periodo | Termina alla revocationDate | Impostato per elemento con il flag revoke |
| Limite in produzione | 5 al secondo | 5 al secondo | 5 al secondo |
Cancel a Subscription blocca il prossimo addebito
Cancel disattiva il rinnovo automatico. Apple dice che il cliente mantiene l'accesso fino alla fine del periodo in corso. Non viene rimborsato nulla. È la scelta giusta quando un cliente vuole andarsene e ha già usato il tempo che ha pagato.
Revoke Subscription chiude tutto subito
Revoke imposta il rinnovo automatico su false e revoca l'abbonamento con un rimborso totale o proporzionale. Il corpo della richiesta accetta refundReason, refundRiskingPreference, refundType e requestInfo. Apple invia poi una notifica REFUND al tuo endpoint App Store Server Notifications V2. L'indicazione di Apple è precisa: interrompi il servizio a partire dalla revocationDate di quella notifica, e non interromperlo prima che la notifica arrivi.
Request Transaction Refund lavora elemento per elemento
Questo è lo strumento di precisione. Invii un elenco di elementi, e ognuno indica uno SKU, un refundReason, un refundType e un flag revoke. Con CUSTOM invii anche refundAmount in millesimi della valuta, quindi 4990 significa 4,99. Se invii un importo con FULL o PRORATED, Apple lo rifiuta con l'errore 4000155. La risposta contiene una transazione firmata e, per gli abbonamenti, le informazioni di rinnovo firmate.
Apple accetta questi valori di refundReason: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER e MODIFY_ITEMS_REFUND. Un settimo, SIMULATE_REFUND_DECLINE, serve solo per i test in sandbox e su TestFlight, ed esiste perché l'App Store può dire di no.
Apple può ancora rifiutare la tua stessa richiesta di rimborso
Il nome dell'endpoint è onesto. È una richiesta. Due campi mostrano dove sta davvero la decisione.
refundRiskingPreference apre la porta a un controllo sui consumi
Apple descrive refundRiskingPreference come l'impostazione che stabilisce se l'App Store ti chiede dati di consumo per orientare la decisione sul rimborso. Il valore predefinito è true. Quando è true, ricevi un CONSUMPTION_REQUEST per la tua stessa richiesta di rimborso e rispondi tramite Send Consumption Information. Apple chiede agli sviluppatori di rispondere entro 12 ore dalla ricezione di un CONSUMPTION_REQUEST. Impostalo su false e quella notifica non arriva.
Gli errori che ti dicono di no
| Errore | Codice | Cosa dice Apple |
|---|---|---|
| AlreadyRefundedError | 4030021 | La transazione è già stata rimborsata |
| PendingRefundError | 4000181 | La transazione ha rimborsi in sospeso |
| TransactionNotRefundableError | 4030024 | La transazione non è rimborsabile |
| TransactionCannotBeRefundedContactSupportError | 4030025 | Il cliente può contattare il supporto Apple |
| RefundAmountWithoutCustomError | 4000155 | È stato inviato un importo senza CUSTOM |
PendingRefundError è quello da mettere in conto. Una causa probabile è un cliente che ha già chiesto ad Apple tramite Report a Problem prima che il tuo team di assistenza intervenisse. Le regole di idoneità di Apple impongono comunque a queste app di offrire un percorso interno all'app per il rimborso, cioè un link a Report a Problem oppure l'API beginRefundRequest, quindi entrambe le porte restano aperte contemporaneamente.

Quanto ti costa in denaro un rimborso tramite l'Advanced Commerce API
Rimborsare di tua iniziativa sembra più economico che combattere una contestazione. Restano comunque soldi in uscita, e l'API rende facile ripetere alcuni errori su larga scala.
Le imposte dentro l'importo personalizzato
Apple dice che un refundAmount richiesto deve includere le imposte in tutte le regioni tranne Canada e Stati Uniti. Un team che calcola un rimborso CUSTOM partendo dal prezzo dello SKU al netto delle imposte rimborserà meno del dovuto ai clienti di tutti gli altri storefront, e poi pagherà tempo di assistenza per correggere ogni caso.
Costi che non tornano indietro
- Compensi: in un catalogo di creator o in una piattaforma di mini app, la quota del creator viene spesso pagata al momento della vendita. Un rimborso al cliente non la recupera.
- Licenze dei contenuti: i compensi per titolo dovuti a un titolare dei diritti per un audiolibro o un corso possono scattare con l'accesso, a seconda del contratto, e un rimborso non li annulla.
- Calcolo: streaming, transcodifica e qualsiasi lavoro lato server svolto per l'acquisto sono già nella tua fattura.
- Chiamate API: i servizi di terzi fatturati a richiesta, dalla sintesi vocale all'inferenza dei modelli, restano fatturati dopo il rimborso.
Totale quando intendevi un solo elemento
Revoke Subscription rimborsa e chiude l'intero abbonamento, componenti aggiuntivi compresi. Se il cliente contesta un solo componente aggiuntivo, Request Transaction Refund ti permette di rimborsare solo quello SKU, con revoke attivo solo per quell'elemento. Chiamare Revoke Subscription per un reclamo su un solo elemento restituisce anche i ricavi del piano base.
Una checklist prima di attivare queste chiamate
- Verifica che il tuo Account Holder abbia accettato l'Advanced Commerce API Addendum in vigore, e imposta un avviso sull'errore che compare quando scade.
- Genera un nuovo requestReferenceId UUID per ogni richiesta, e riusa lo stesso solo per ritentare una chiamata andata in timeout.
- Metti in coda le chiamate di rimborso. Il limite è di 5 al secondo per app, e una risposta 429 contiene un header Retry-After in millisecondi UNIX.
- Testa i rifiuti in sandbox con SIMULATE_REFUND_DECLINE, e ricorda che i limiti della sandbox sono il 10 per cento di quelli di produzione.
- Decidi refundRiskingPreference caso per caso, e tieni pronto un risponditore sui consumi per la finestra di 12 ore quando resta true.
- Interrompi l'accesso solo quando arriva la notifica REFUND, a partire dalla sua revocationDate.
- Registra motivo, importo e SKU di ogni richiesta, così il tuo tasso di rimborso è visibile a te prima che lo veda Apple.
Domande frequenti
- Uno sviluppatore iOS può rimborsare direttamente un cliente?
- Non per un normale acquisto sull'App Store. Un ingegnere di Apple ha dichiarato a giugno 2026 che uno sviluppatore non può emettere direttamente un rimborso. Le app approvate per l'Advanced Commerce API, con l'Addendum firmato, possono richiederne uno tramite l'endpoint Request Transaction Refund, e la decisione resta ad Apple.
- Qual è la differenza tra Cancel e Revoke nell'Advanced Commerce API?
- Cancel disattiva il rinnovo automatico e il cliente mantiene l'accesso fino alla fine del periodo, senza rimborso. Revoke chiude subito l'abbonamento e tutti i suoi elementi e rimborsa l'importo totale o proporzionale. Apple invia una notifica REFUND dopo una revoca.
- Posso rimborsare un importo personalizzato con l'Advanced Commerce API?
- Sì. Imposta refundType su CUSTOM e passa refundAmount in millesimi della valuta. Apple dice che l'importo deve includere le imposte in tutte le regioni tranne Canada e Stati Uniti, e inviare un importo con FULL o PRORATED restituisce l'errore 4000155.
- Riceverò un CONSUMPTION_REQUEST per un rimborso che ho richiesto io?
- Può succedere. refundRiskingPreference vale true per impostazione predefinita, e così l'App Store può chiederti dati di consumo tramite un CONSUMPTION_REQUEST, e Apple chiede una risposta entro 12 ore. Impostalo su false e, secondo Apple, quella notifica non verrà inviata.
- Perché la mia richiesta di rimborso tramite l'Advanced Commerce API non è andata a buon fine?
- Controlla il codice di errore. 4030021 significa che la transazione è già stata rimborsata, 4000181 che c'è già un rimborso in sospeso, 4030024 che non è rimborsabile e 4030025 che il cliente deve contattare il supporto Apple. Anche un Addendum non firmato o non aggiornato restituisce un errore.
Fonti e approfondimenti
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
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.