Uma compra pendente parece uma venda, mas o dinheiro não chegou, e concedê-la cedo demais dá o produto de graça
Tanto a App Store quanto o Google Play têm um estado de compra pendente, um pedido que a loja aceitou mas ainda não cobrou. Libere antes de o pagamento ser compensado e cada um que não se concretiza é puro custo. Veja como as compras pendentes funcionam em cada loja, quanto custa conceder uma por engano e como lidar com elas sem vazamento.

Principais conclusões
- Uma compra pendente é um pedido real que a loja aceitou mas ainda não cobrou. Seu código vê uma compra nova, mas o dinheiro não chegou, e pode ser que nunca chegue.
- Conceda o direito apenas quando o estado for PURCHASED no Google Play, ou quando a transação estiver concluída na Apple. Nunca libere em um estado PENDING nem no resultado pendente da Apple.
- No Google Play, pagamentos em dinheiro numa loja, transferências bancárias e parte da cobrança pela operadora são liquidados fora de banda, então a compra volta em PENDING, não em PURCHASED, até o cliente pagar de fato.
- Na Apple, uma compra pendente costuma ser Ask to Buy, em que um organizador da família precisa aprová-la. A aprovação pode levar horas ou dias, e a transação concluída chega depois por meio de Transaction.updates.
- Se você liberar em um pedido pendente que depois cancela, terá gasto processamento, chamadas de API, armazenamento ou o pagamento de um consumível em uma cobrança que nunca foi compensada. Ao contrário de um reembolso, não há dinheiro a recuperar, porque nada chegou a ser cobrado.
- A loja avisa você quando um pedido pendente não se concretiza. O Google envia ONE_TIME_PRODUCT_CANCELED, tipo 2, ou SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. A Apple simplesmente nunca entrega uma transação concluída.
- Um pedido pendente pode virar uma venda real enquanto seu app está fechado, então verifique de novo ao voltar: chame queryPurchasesAsync() em onResume() no Google Play, e continue escutando Transaction.updates na Apple.
Alguém toca em comprar no seu app. Seus logs mostram um pedido novo, seu listener de cobrança dispara, e você entrega a mercadoria. Na maioria das compras isso é exatamente o certo. Em uma compra pendente é um erro, porque o pedido existe mas o dinheiro não. O cliente escolheu um método de pagamento que é liquidado depois, a loja ainda espera receber, e você acabou de entregar um recurso pago por uma cobrança que talvez nunca seja compensada. Este é o primo silencioso de um reembolso. Aqui nada é revertido, porque nada chegou a ser cobrado. Você simplesmente deu o produto de graça.
Uma compra pendente é um pedido real em um estado ainda não pago, e tanto a App Store quanto o Google Play têm um. As duas lojas dizem claramente para esperar. A armadilha é que um pedido pendente parece quase idêntico a um concluído no seu código, então uma integração que trata cada compra nova como uma venda entrega mercadoria em pedidos que a loja ainda tenta cobrar. Trate isso corretamente e você não perde nada. Trate errado e cada pagamento lento que não se concretiza é puro custo, entregue às suas custas.
O que é de fato uma compra pendente
Uma compra pendente é um pedido que a loja registrou mas ainda não cobrou. O comprador iniciou o fluxo, a loja aceitou, e a liquidação acontece em algum lugar que seu app não consegue ver. O Google Play chama isso de estado PENDING. A Apple chama de transação pendente, ou diferida. Nomes diferentes, mesmo fato: a loja mantém um pedido aberto enquanto espera receber, e disse a você para não tratar esse pedido como dinheiro.
Google Play: o pagamento acontece em outro lugar
Alguns métodos de pagamento são liquidados fora de banda. Dinheiro em uma loja física, transferências bancárias e parte da cobrança pela operadora exigem passos adicionais entre o toque e a cobrança. Quando um cliente escolhe um deles, o Google retorna a compra no estado PENDING em vez de PURCHASED. Em um pagamento em dinheiro, o cliente recebe um código por notificação e por e-mail, leva-o a uma loja participante e paga ao caixa. Até isso acontecer, o Google não cobrou nada, e você também não. A regra do Google é uma linha: use getPurchaseState() e conceda o direito apenas quando o estado for PURCHASED. Ela também diz para não confirmar uma compra enquanto ela estiver em PENDING, porque a confirmação pertence a um pedido pago, não a um prometido.
Apple: a compra espera o toque de outra pessoa
O estado pendente da Apple significa que a transação precisa de uma ação externa antes de poder ser concluída. A mais comum é Ask to Buy, em que uma criança inicia uma compra e um organizador da família precisa aprová-la. No StoreKit 2, a chamada de compra retorna Product.PurchaseResult.pending. No StoreKit mais antigo, a transação é reportada como diferida. De todo modo, a Apple não cobrou de ninguém, e a transação finalizada, se vier, chega de forma assíncrona por meio de Transaction.updates. Mostre ao cliente um estado de espera e não libere nada até a transação concluída chegar.
Por que conceder uma compra pendente custa dinheiro de verdade
A perda aqui não é do tipo reembolso, em que o dinheiro que você contabilizou é retirado. É pior em um aspecto específico: não há dinheiro a retirar, porque nada chegou a ser cobrado.
Você entrega, e a loja nunca recebe
Quando você libera em um pedido pendente que depois cancela, já gastou para atendê-lo. O processamento que rodou o recurso, as chamadas de API de terceiros que você pagou, o armazenamento que alocou e, para um consumível, o pagamento real da coisa que vendeu. Tudo isso sai pela porta em um pedido que não gerou receita. Um reembolso ao menos parte de uma cobrança que aconteceu. Uma compra pendente concedida por engano nunca teve cobrança alguma, então nem aparece como dinheiro saindo. Aparece como nada, que é exatamente por que é fácil passar despercebido e fácil de repetir.
O sinal de cancelamento, e o que ele significa
A loja de fato avisa você quando um pedido pendente morre. No Google Play, um produto avulso que não se concretiza envia uma notificação ONE_TIME_PRODUCT_CANCELED, tipo 2, e uma assinatura que estava pendente envia SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. Quando esses mesmos pedidos, em vez disso, se concretizam, você recebe ONE_TIME_PRODUCT_PURCHASED, tipo 1, ou SUBSCRIPTION_PURCHASED, tipo 4. Na Apple não há evento de cancelamento a capturar, porque uma transação diferida que é recusada simplesmente nunca se torna uma transação concluída. Se você liberou cedo demais, esse silêncio é a conta.
| Pergunta | Google Play | Apple |
|---|---|---|
| O que a provoca | Dinheiro, transferência bancária, parte da cobrança pela operadora | Aprovação de Ask to Buy, ou outra ação necessária |
| Estado que você vê | PurchaseState PENDING | resultado pendente, ou uma transação diferida |
| Conceda acesso quando | O estado é PURCHASED | A transação está concluída |
| Se concretizou | ONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4) | Transação concluída via Transaction.updates |
| Não se concretizou | ONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20) | Nunca chega uma transação concluída |
| Houve cobrança | Não, só a partir de PURCHASED | Não, só quando a transação é concluída |
A janela, e quem espera por quem
Uma compra pendente não é um relógio contra o qual você corre. É um relógio que, do seu lado, não começou.
O Google Play dá ao cliente dias, não minutos
Um pagamento em dinheiro ou por transferência bancária é liquidado no ritmo do cliente, não no seu. O pedido fica em PENDING até o cliente pagar ou a janela se esgotar e o Google cancelá-lo. Sua própria janela de confirmação de três dias, aquela que reembolsa automaticamente uma compra que você deixa de confirmar, nem começa até a compra passar de PENDING para PURCHASED. Então não há pressa para atender um pedido pendente. Há apenas a disciplina de esperar o estado mudar.
A aprovação da Apple está no telefone do organizador da família
Um pedido de Ask to Buy chega ao dispositivo do organizador como um aviso que ele aprova ou recusa quando puder. Isso pode ser minutos, horas ou um dia depois, e seu app não pode apressá-lo. O único comportamento correto é refletir o estado de espera e deixar o StoreKit lhe entregar a transação concluída se e quando a aprovação vier.

Como lidar com compras pendentes sem vazamento
Todo o trabalho se resume a quatro hábitos. Nenhum deles é difícil, e pular qualquer um é por onde o dinheiro vai embora.
Conceda no estado pago, nunca no pendente
No Google Play, verifique getPurchaseState() e conceda apenas em PURCHASED, e não confirme uma compra enquanto ela estiver em PENDING. Na Apple, libere apenas em uma transação concluída e nunca no resultado pendente. Essa única regra fecha todo o vazamento. Todo o resto é garantir que você de fato perceba quando o estado pago chega.
Verifique de novo quando o app voltar
A transição de pendente para pago costuma acontecer enquanto seu app não está em execução. No Google Play, chame queryPurchasesAsync() no seu handler onResume() para captar pedidos que viraram PURCHASED em segundo plano, e mantenha seu listener de Real-time Developer Notifications como a fonte da verdade do lado do servidor. Na Apple, escute Transaction.updates por toda a vida do app, porque uma transação aprovada pode chegar muito depois de a chamada de compra original ter retornado.
Ative o suporte a pendentes e teste os dois desfechos
O Google exige que você chame enablePendingPurchases() ao construir o BillingClient, e dar suporte a transações pendentes para produtos avulsos é obrigatório, não opcional. Teste antes de publicar. Testadores licenciados recebem dois instrumentos de teste extras para formas de pagamento diferidas, em que o pagamento se conclui automaticamente ou se cancela automaticamente depois de alguns minutos, para que você possa observar de ponta a ponta tanto o caminho do pagamento quanto o caminho da desistência.
Diga ao cliente que o pedido não está concluído
Um comprador pendente é um cliente real no meio de uma compra, não uma falha. Mostre a ele que o pedido espera o pagamento ou uma aprovação, e dê um caminho claro de volta para concluí-lo. Um estado pendente silencioso perde vendas que um bem sinalizado recupera, porque a maioria desses compradores ainda quer a coisa e só tem um passo restante.
Os mesmos feeds de Real-time Developer Notifications e App Store Server Notifications que o RefundHalt já lê para reembolsos e estornos também carregam esses sinais. A notificação de compra que diz que um pedido pendente enfim foi compensado, e a de cancelamento que diz que não foi, chegam ao seu painel ao lado do resto dos seus eventos de receita, então um pedido pendente que não se concretizou é algo que você pode ver em vez de algo que pagou por acidente.
A versão curta
Uma compra pendente é um pedido sem pagamento, e as duas lojas são explícitas em que você deve esperar. O Google Play retorna pedidos em dinheiro, por transferência bancária e parte da cobrança pela operadora em um estado PENDING e diz para conceder acesso apenas em PURCHASED. A Apple retorna uma transação pendente ou diferida para Ask to Buy e outras ações necessárias e entrega a transação concluída depois por meio de Transaction.updates. Libere no estado pago, verifique de novo quando seu app for retomado, ative e teste o suporte a pendentes, e sinalize o pedido em espera para o cliente. Faça isso e uma compra pendente não custa nada. Pule e você entrega um produto pago por uma cobrança que nunca veio, que é a única perda sem recibo para apontar.
Perguntas frequentes
- O que é uma compra pendente?
- Uma compra pendente é um pedido que a loja aceitou mas ainda não cobrou. No Google Play é o estado de compra PENDING, usado para métodos de pagamento que são liquidados depois, como dinheiro, transferência bancária e parte da cobrança pela operadora. Na Apple é uma transação pendente ou diferida, na maioria das vezes uma compra de Ask to Buy esperando a aprovação de um organizador da família. Nos dois casos ainda não se cobrou dinheiro, então você não deve conceder acesso.
- Devo conceder acesso enquanto uma compra está pendente?
- Não. Conceda o direito apenas quando o estado for PURCHASED no Google Play, ou quando a transação estiver concluída na Apple. Se você liberar um recurso enquanto o pedido ainda está pendente e o pagamento nunca for compensado, terá entregado o produto de graça, e não há cobrança a reverter porque nenhuma chegou a ser feita.
- Quais métodos de pagamento causam uma compra pendente no Google Play?
- Métodos de pagamento que são liquidados fora de banda. Pagamentos em dinheiro numa loja física, transferências bancárias e algumas opções de cobrança pela operadora exigem passos adicionais entre o toque e a cobrança, então o Google retorna a compra no estado PENDING em vez de PURCHASED. Em um pagamento em dinheiro, o cliente recebe um código por notificação e e-mail, depois paga em uma loja participante.
- O que é Ask to Buy e como se relaciona com compras pendentes?
- Ask to Buy é o recurso de Family Sharing da Apple que permite a uma criança solicitar uma compra que um organizador da família precisa aprovar. Enquanto a solicitação espera, a compra está no estado pendente da Apple, retornada como Product.PurchaseResult.pending no StoreKit 2 ou como uma transação diferida no StoreKit mais antigo. A transação concluída só chega, por meio de Transaction.updates, se e quando o organizador a aprovar.
- O que acontece se uma compra pendente nunca for paga?
- O pedido é cancelado e nenhum dinheiro troca de mãos. No Google Play você recebe uma notificação ONE_TIME_PRODUCT_CANCELED, tipo 2, para um produto avulso, ou SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20, para uma assinatura. Na Apple, a transação diferida simplesmente nunca se torna uma transação concluída. Se você já tinha concedido acesso, esse é o momento em que a perda se torna real.
- Uma compra pendente é a mesma coisa que um reembolso?
- Não. Um reembolso reverte um pagamento que de fato foi cobrado. Uma compra pendente que não se concretiza nunca foi cobrada em primeiro lugar, então não há nada a reverter e nada aparece em um relatório de reembolsos. Se você a liberou cedo demais, o custo é o processamento, as chamadas de API, o armazenamento ou o consumível que você gastou atendendo um pedido que não gerou receita.
Fontes e leituras adicionais
- 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
O piloto automático de reembolsos para App Store e Google Play
Continue lendo
As renovações falham com mais frequência do que os clientes cancelam, e esse churn involuntário é receita que você ainda pode recuperar
Um cartão recusado, não um toque em cancelar, encerra grande parte das assinaturas, e a loja continua tentando cobrar por semanas. Veja como funcionam o período de carência de cobrança, a nova tentativa de cobrança e a retenção de conta na App Store e no Google Play, e o que o churn involuntário realmente custa a você.
Compras no aplicativo feitas por crianças sem autorização são reembolsadas ao responsável quase sempre, e o custo fica com você
Quando uma criança compra um pacote de moedas no telefone de um responsável, tanto a Apple quanto o Google reembolsam, e nenhum dos dois pergunta a você antes. Os reguladores fizeram assim. Veja como esses reembolsos de compras no aplicativo não autorizadas funcionam em cada loja, a janela de 15 minutos por onde o dinheiro vai, e quanto uma delas realmente custa a você.