Un acquisto in sospeso sembra una vendita, ma il denaro non è arrivato, e concederlo troppo presto regala il prodotto
Sia l'App Store sia Google Play hanno uno stato di acquisto in sospeso, un ordine che lo store ha accettato ma non ancora addebitato. Sbloccalo prima che il pagamento vada a buon fine e ognuno di quelli che salta è puro costo. Ecco come funzionano gli acquisti in sospeso su ciascuno store, quanto costa concederne uno per errore e come gestirli senza perdite.

Punti chiave
- Un acquisto in sospeso è un ordine reale che lo store ha accettato ma non ancora addebitato. Il tuo codice vede un nuovo acquisto, ma il denaro non è arrivato, e potrebbe non arrivare mai.
- Concedi il diritto solo quando lo stato è PURCHASED su Google Play, o quando la transazione è completata su Apple. Non sbloccare mai su uno stato PENDING né sul risultato in sospeso di Apple.
- Su Google Play, i pagamenti in contanti in un negozio, i bonifici bancari e parte dell'addebito tramite operatore vengono regolati fuori banda, così l'acquisto torna in PENDING, non in PURCHASED, finché il cliente non paga davvero.
- Su Apple, un acquisto in sospeso è di solito Ask to Buy, dove un organizzatore della famiglia deve approvarlo. L'approvazione può richiedere ore o giorni, e la transazione completata arriva più tardi tramite Transaction.updates.
- Se sblocchi su un ordine in sospeso che poi si annulla, avrai speso elaborazione, chiamate API, spazio di archiviazione o il pagamento di un consumabile per un addebito mai andato a buon fine. A differenza di un rimborso, non c'è denaro da recuperare, perché non ne è mai stato incassato.
- Lo store ti avvisa quando un ordine in sospeso salta. Google invia ONE_TIME_PRODUCT_CANCELED, tipo 2, o SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. Apple semplicemente non consegna mai una transazione completata.
- Un ordine in sospeso può diventare una vendita reale mentre la tua app è chiusa, quindi ricontrolla al rientro: chiama queryPurchasesAsync() in onResume() su Google Play, e continua ad ascoltare Transaction.updates su Apple.
Qualcuno tocca acquista nella tua app. I tuoi log mostrano un nuovo ordine, il tuo listener di fatturazione scatta, e consegni la merce. Sulla maggior parte degli acquisti è esattamente giusto. Su un acquisto in sospeso è un errore, perché l'ordine esiste ma il denaro no. Il cliente ha scelto un metodo di pagamento che si regola più tardi, lo store aspetta ancora di essere pagato, e hai appena consegnato una funzione a pagamento per un addebito che potrebbe non andare mai a buon fine. Questo è il cugino silenzioso di un rimborso. Qui non viene annullato nulla, perché non è mai stato incassato nulla. Hai semplicemente regalato il prodotto.
Un acquisto in sospeso è un ordine reale in uno stato non ancora pagato, e sia l'App Store sia Google Play ne hanno uno. Entrambi gli store ti dicono chiaramente di aspettare. La trappola è che un ordine in sospeso sembra quasi identico a uno completato nel tuo codice, così un'integrazione che tratta ogni nuovo acquisto come una vendita spedisce merce su ordini che lo store sta ancora cercando di incassare. Gestiscilo correttamente e non perdi nulla. Gestiscilo male e ogni pagamento lento che salta è puro costo, consegnato a tue spese.
Cos'è davvero un acquisto in sospeso
Un acquisto in sospeso è un ordine che lo store ha registrato ma non ancora addebitato. L'acquirente ha avviato il flusso, lo store lo ha accettato, e la regolazione avviene da qualche parte che la tua app non può vedere. Google Play chiama questo lo stato PENDING. Apple lo chiama una transazione in sospeso, o differita. Nomi diversi, stesso fatto: lo store tiene aperto un ordine mentre aspetta di essere pagato, e ti ha detto di non trattare quell'ordine come denaro.
Google Play: il pagamento avviene altrove
Alcuni metodi di pagamento si regolano fuori banda. I contanti in un negozio fisico, i bonifici bancari e parte dell'addebito tramite operatore richiedono passaggi aggiuntivi tra il tocco e l'addebito. Quando un cliente ne sceglie uno, Google restituisce l'acquisto nello stato PENDING invece di PURCHASED. Per un pagamento in contanti, il cliente riceve un codice tramite notifica ed e-mail, lo porta in un negozio aderente e paga alla cassa. Fino a quel momento, Google non ha incassato nulla, e nemmeno tu. La regola di Google è una riga: usa getPurchaseState() e concedi il diritto solo quando lo stato è PURCHASED. Ti dice anche di non confermare un acquisto finché è in PENDING, perché la conferma appartiene a un ordine pagato, non a uno promesso.
Apple: l'acquisto aspetta il tocco di qualcun altro
Lo stato in sospeso di Apple significa che la transazione ha bisogno di un'azione esterna prima di potersi completare. La più comune è Ask to Buy, dove un bambino avvia un acquisto e un organizzatore della famiglia deve approvarlo. In StoreKit 2, la chiamata di acquisto restituisce Product.PurchaseResult.pending. Nel vecchio StoreKit, la transazione viene segnalata come differita. In ogni caso, Apple non ha addebitato nessuno, e la transazione finita, se arriva, arriva in modo asincrono tramite Transaction.updates. Mostra al cliente uno stato di attesa e non sbloccare nulla finché la transazione completata non atterra.
Perché concedere un acquisto in sospeso ti costa denaro vero
La perdita qui non è del tipo rimborso, dove il denaro che avevi contabilizzato viene ritirato. È peggio sotto un aspetto specifico: non c'è denaro da ritirare, perché non ne è mai stato incassato.
Tu consegni, e lo store non incassa mai
Quando sblocchi su un ordine in sospeso che poi si annulla, hai già speso per servirlo. L'elaborazione che ha eseguito la funzione, le chiamate API di terze parti che hai pagato, lo spazio di archiviazione che hai allocato e, per un consumabile, l'effettivo esborso della cosa che hai venduto. Tutto questo esce dalla porta su un ordine che non ha prodotto ricavi. Un rimborso parte almeno da un addebito che è avvenuto. Un acquisto in sospeso concesso per errore non ha mai avuto alcun addebito, quindi non compare nemmeno come denaro in uscita. Compare come nulla, che è esattamente il motivo per cui è facile da non notare e facile da ripetere.
Il segnale di annullamento, e cosa significa
Lo store ti avvisa eccome quando un ordine in sospeso muore. Su Google Play, un prodotto singolo che salta invia una notifica ONE_TIME_PRODUCT_CANCELED, tipo 2, e un abbonamento che era in sospeso invia SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. Quando gli stessi ordini invece vanno a buon fine, ricevi ONE_TIME_PRODUCT_PURCHASED, tipo 1, o SUBSCRIPTION_PURCHASED, tipo 4. Su Apple non c'è un evento di annullamento da intercettare, perché una transazione differita che viene rifiutata semplicemente non diventa mai una transazione completata. Se hai sbloccato troppo presto, quel silenzio è il conto.
| Domanda | Google Play | Apple |
|---|---|---|
| Cosa lo provoca | Contanti, bonifico bancario, parte dell'addebito tramite operatore | Approvazione Ask to Buy, o altra azione richiesta |
| Stato che vedi | PurchaseState PENDING | risultato in sospeso, o una transazione differita |
| Concedi l'accesso quando | Lo stato è PURCHASED | La transazione è completata |
| È andato a buon fine | ONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4) | Transazione completata tramite Transaction.updates |
| È saltato | ONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20) | Non arriva mai una transazione completata |
| È stato incassato denaro | No, non fino a PURCHASED | No, non finché la transazione non si completa |
La finestra, e chi aspetta chi
Un acquisto in sospeso non è un cronometro contro cui corri. È un cronometro che, dal tuo lato, non è partito.
Google Play dà al cliente giorni, non minuti
Un pagamento in contanti o tramite bonifico si regola secondo i tempi del cliente, non i tuoi. L'ordine resta in PENDING finché il cliente non paga o la finestra scade e Google lo annulla. La tua finestra di conferma di tre giorni, quella che rimborsa automaticamente un acquisto che non confermi, non inizia nemmeno finché l'acquisto non passa da PENDING a PURCHASED. Quindi non c'è fretta di servire un ordine in sospeso. C'è solo la disciplina di aspettare che lo stato cambi.
L'approvazione di Apple è sul telefono dell'organizzatore della famiglia
Una richiesta Ask to Buy arriva sul dispositivo dell'organizzatore come un avviso che approva o rifiuta quando ci arriva. Possono essere minuti, ore o un giorno dopo, e la tua app non può fare fretta. L'unico comportamento corretto è riflettere lo stato di attesa e lasciare che StoreKit ti consegni la transazione completata se e quando arriva l'approvazione.

Come gestire gli acquisti in sospeso senza perdite
Tutto il lavoro si riduce a quattro abitudini. Nessuna è difficile, e saltarne anche solo una è da dove se ne va il denaro.
Concedi sullo stato pagato, mai su quello in sospeso
Su Google Play, controlla getPurchaseState() e concedi solo su PURCHASED, e non confermare un acquisto finché è in PENDING. Su Apple, sblocca solo su una transazione completata e mai sul risultato in sospeso. Questa singola regola chiude l'intera perdita. Tutto il resto riguarda l'assicurarti di accorgerti davvero quando arriva lo stato pagato.
Ricontrolla quando l'app torna in primo piano
Il passaggio da in sospeso a pagato spesso avviene mentre la tua app non è in esecuzione. Su Google Play, chiama queryPurchasesAsync() nel tuo handler onResume() per raccogliere gli ordini diventati PURCHASED in background, e mantieni il tuo listener di Real-time Developer Notifications come fonte di verità lato server. Su Apple, ascolta Transaction.updates per tutta la vita dell'app, perché una transazione approvata può arrivare molto dopo che la chiamata di acquisto originale è tornata.
Abilita il supporto agli acquisti in sospeso e testa entrambi gli esiti
Google richiede di chiamare enablePendingPurchases() quando costruisci il BillingClient, e supportare le transazioni in sospeso per i prodotti singoli è obbligatorio, non facoltativo. Testalo prima di pubblicare. I tester con licenza ottengono due strumenti di test aggiuntivi per le forme di pagamento differito, dove il pagamento si completa automaticamente o si annulla automaticamente dopo un paio di minuti, così puoi osservare da capo a fondo sia il percorso del pagamento sia quello del fallimento.
Di' al cliente che l'ordine non è concluso
Un acquirente in sospeso è un cliente reale nel mezzo di un acquisto, non un fallimento. Mostragli che l'ordine aspetta il suo pagamento o un'approvazione, e dagli una via chiara per tornare a completarlo. Uno stato in sospeso silenzioso perde vendite che uno ben etichettato recupera, perché la maggior parte di questi acquirenti vuole ancora la cosa e ha solo un passo rimasto.
Gli stessi feed di Real-time Developer Notifications e App Store Server Notifications che RefundHalt legge già per rimborsi e storni portano anche questi segnali. La notifica di acquisto che dice che un ordine in sospeso è finalmente andato a buon fine, e quella di annullamento che dice di no, atterrano nella tua dashboard accanto al resto dei tuoi eventi di ricavo, così un ordine in sospeso che è saltato è qualcosa che puoi vedere invece di qualcosa che hai pagato per sbaglio.
La versione breve
Un acquisto in sospeso è un ordine senza pagamento, ed entrambi gli store sono espliciti sul fatto che dovresti aspettare. Google Play restituisce gli ordini in contanti, tramite bonifico e parte dell'addebito tramite operatore in uno stato PENDING e ti dice di concedere l'accesso solo su PURCHASED. Apple restituisce una transazione in sospeso o differita per Ask to Buy e altre azioni richieste e consegna la transazione completata più tardi tramite Transaction.updates. Sblocca sullo stato pagato, ricontrolla quando la tua app riprende, abilita e testa il supporto agli acquisti in sospeso, ed etichetta l'ordine in attesa per il cliente. Fai questo e un acquisto in sospeso non ti costa nulla. Saltalo e consegni un prodotto a pagamento per un addebito che non è mai arrivato, che è l'unica perdita senza una ricevuta da indicare.
Domande frequenti
- Cos'è un acquisto in sospeso?
- Un acquisto in sospeso è un ordine che lo store ha accettato ma non ancora addebitato. Su Google Play è lo stato di acquisto PENDING, usato per i metodi di pagamento che si regolano più tardi come contanti, bonifico bancario e parte dell'addebito tramite operatore. Su Apple è una transazione in sospeso o differita, il più delle volte un acquisto Ask to Buy in attesa dell'approvazione di un organizzatore della famiglia. In entrambi i casi non è ancora stato incassato denaro, quindi non dovresti concedere l'accesso.
- Dovrei concedere l'accesso mentre un acquisto è in sospeso?
- No. Concedi il diritto solo quando lo stato è PURCHASED su Google Play, o quando la transazione è completata su Apple. Se sblocchi una funzione mentre l'ordine è ancora in sospeso e il pagamento non va mai a buon fine, hai consegnato il prodotto gratis, e non c'è alcun addebito da annullare perché non ne è mai stato fatto uno.
- Quali metodi di pagamento causano un acquisto in sospeso su Google Play?
- I metodi di pagamento che si regolano fuori banda. I pagamenti in contanti in un negozio fisico, i bonifici bancari e alcune opzioni di addebito tramite operatore richiedono passaggi aggiuntivi tra il tocco e l'addebito, così Google restituisce l'acquisto nello stato PENDING invece di PURCHASED. Per un pagamento in contanti, il cliente riceve un codice tramite notifica ed e-mail, poi paga in un negozio aderente.
- Cos'è Ask to Buy, e come si collega agli acquisti in sospeso?
- Ask to Buy è la funzione Family Sharing di Apple che consente a un bambino di richiedere un acquisto che un organizzatore della famiglia deve approvare. Mentre la richiesta è in attesa, l'acquisto è nello stato in sospeso di Apple, restituito come Product.PurchaseResult.pending in StoreKit 2 o come una transazione differita nel vecchio StoreKit. La transazione completata arriva, tramite Transaction.updates, solo se e quando l'organizzatore la approva.
- Cosa succede se un acquisto in sospeso non viene mai pagato?
- L'ordine viene annullato e nessun denaro cambia di mano. Su Google Play ricevi una notifica ONE_TIME_PRODUCT_CANCELED, tipo 2, per un prodotto singolo, o SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20, per un abbonamento. Su Apple, la transazione differita semplicemente non diventa mai una transazione completata. Se avevi già concesso l'accesso, quello è il momento in cui la perdita diventa reale.
- Un acquisto in sospeso è la stessa cosa di un rimborso?
- No. Un rimborso annulla un pagamento che è stato effettivamente incassato. Un acquisto in sospeso che salta non è mai stato addebitato in primo luogo, quindi non c'è nulla da annullare e nulla compare in un report dei rimborsi. Se l'hai sbloccato troppo presto, il costo è l'elaborazione, le chiamate API, lo spazio di archiviazione o il consumabile che hai speso servendo un ordine che non ha prodotto ricavi.
Fonti e approfondimenti
- Android Developers: Integrate the Google Play Billing Library (PENDING purchase state, grant entitlement only on PURCHASED, enablePendingPurchases, queryPurchasesAsync, cash payment code flow, three-day acknowledgement window begins on transition to PURCHASED)
- Android Developers: Real-time developer notifications reference (OneTimeProductNotification ONE_TIME_PRODUCT_PURCHASED=1 and ONE_TIME_PRODUCT_CANCELED=2; SubscriptionNotification SUBSCRIPTION_PURCHASED=4 and SUBSCRIPTION_PENDING_PURCHASE_CANCELED=20)
- Android Developers: Test Google Play Billing (license testers get delayed-payment test instruments that auto-complete or auto-cancel for testing pending transactions)
- Apple Developer: Product.PurchaseResult (the pending case, returned when a purchase needs action such as Ask to Buy approval before it completes)
- Apple Developer: SKPaymentTransactionState.deferred (a transaction whose final status is pending an external action such as Ask to Buy)
- Apple Developer: Transaction.updates (StoreKit delivers transaction updates, including ones approved later, asynchronously)
RefundHalt
Il pilota automatico dei rimborsi per App Store e Google Play
Continua a leggere
I rinnovi falliscono più spesso di quanto i clienti annullino, e quel churn involontario è ricavo che puoi ancora recuperare
Una carta rifiutata, non un tocco su annulla, mette fine a gran parte degli abbonamenti, e lo store continua a provare a incassare per settimane. Ecco come funzionano il periodo di tolleranza della fatturazione, il nuovo tentativo di addebito e la sospensione dell'account su App Store e Google Play, e quanto ti costa davvero il churn involontario.
Gli acquisti in-app non autorizzati dai bambini vengono quasi sempre rimborsati al genitore, e il costo lo sostieni tu
Quando un bambino compra un pacchetto di monete sul telefono di un genitore, sia Apple sia Google lo rimborsano e nessuno dei due ti chiede prima. Sono i regolatori ad averlo costruito così. Ecco come funzionano questi rimborsi di acquisti in-app non autorizzati su ciascuno store, la finestra di 15 minuti in cui il denaro se ne va e quanto ti costa davvero uno di essi.