Os motivos de cancelamento de assinatura costumam chegar antes do pedido de reembolso, e o Google Play entrega muito mais deles que a Apple
O Google Play registra os motivos de cancelamento de assinaturas com sua pesquisa de cancelamento, e a Apple envia só um código de expiração. Veja o que cada loja informa, quais sinais apontam para um reembolso ou chargeback a caminho e quanto cada um custa para você.

Principais conclusões
- O Google Play pergunta aos assinantes por que estão saindo quando cancelam, e a resposta chega ao desenvolvedor por canceledStateContext.userInitiatedCancellation.cancelSurveyResult em purchases.subscriptionsv2.
- A pesquisa de cancelamento do Google Play tem cinco respostas que o desenvolvedor consegue ler: pouco uso, problemas técnicos, questões de preço, encontrou um app melhor e outro. O texto livre em reasonUserInput só é preenchido quando o usuário escolhe outro.
- Uma notificação SUBSCRIPTION_CANCELED do Google Play traz apenas o token de compra. O motivo do cancelamento precisa ser buscado com purchases.subscriptionsv2.get, e o Google apaga todos os campos de cancelamento se o usuário restaurar a assinatura.
- A App Store Server API da Apple não tem pesquisa de cancelamento. O campo expirationIntent traz um de cinco códigos: cliente cancelou, erro de cobrança, sem consentimento a um aumento de preço ou conversão de oferta, produto indisponível ou outro.
- A notificação DID_CHANGE_RENEWAL_STATUS da Apple com o subtipo AUTO_RENEW_DISABLED pode significar que a App Store desativou a renovação automática depois que o cliente pediu reembolso, e não só que o cliente a desligou.
- Um motivo de cancelamento nunca dá ao desenvolvedor voz em um reembolso. Só o CONSUMPTION_REQUEST da Apple, respondido em 12 horas, e a análise de chargeback do Google Play via orders.reviewrefund, respondida em 24 horas, pedem evidências.
- O assinante do Google Play que cancela citando problemas técnicos é o que mais provavelmente vai querer o dinheiro de volta, e para pedidos feitos depois de August 3, 2026, um chargeback que ele ganhe custa ao desenvolvedor o preço da compra menos a taxa de serviço do Play, mais as tarifas do banco.
A maioria dos assinantes que acabam reembolsados cancela antes. Esse cancelamento vem com um motivo, e as duas lojas entregam quantidades bem diferentes dessa informação. O Google Play faz uma pesquisa rápida e repassa a resposta ao seu servidor, inclusive com texto livre. A Apple envia um código numérico que diz como a assinatura terminou, não por que o cliente quis sair. Leia os dois direito e você verá os pedidos de reembolso chegando enquanto ainda dá para fazer alguma coisa.
O que o Google Play informa sobre motivos de cancelamento
Quando um usuário cancela na central de assinaturas do Play, o Google pergunta o motivo. A resposta aparece no recurso de assinatura que você obtém com purchases.subscriptionsv2.get, dentro de canceledStateContext. Esse objeto só existe enquanto a assinatura está cancelada ou expirada, e diz quem encerrou a assinatura: o usuário, o sistema do Google, você ou uma substituição, como uma troca de plano.
Quando foi o usuário, o objeto userInitiatedCancellation tem dois campos. cancelTime diz quando ele cancelou. cancelSurveyResult guarda a resposta da pesquisa.
| Motivo da pesquisa | Descrição do Google | O que costuma indicar |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Pouco uso da assinatura | Uso baixo, então pouco custo investido na conta |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Problemas técnicos ao usar o app | O sinal mais forte de reembolso e chargeback |
| CANCEL_SURVEY_REASON_COST_RELATED | Questões relacionadas a preço | Sensibilidade a preço, às vezes uma renovação inesperada |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | O usuário encontrou um app melhor | Um concorrente venceu, raramente vira disputa |
| CANCEL_SURVEY_REASON_OTHERS | Outros motivos | Leia reasonUserInput, as palavras do próprio usuário |
| CANCEL_SURVEY_REASON_UNSPECIFIED | Motivo da pesquisa não especificado | Nenhuma resposta para trabalhar |
A coluna da direita é a nossa leitura, não a do Google. As duas primeiras colunas vêm direto da referência da API.
A notificação não traz o motivo
Uma assinatura cancelada dispara uma notificação do desenvolvedor em tempo real SUBSCRIPTION_CANCELED, type 3. O Google deixa claro que essas notificações só avisam que o estado da compra mudou. O payload traz um token de compra e nada mais útil, então seu handler precisa chamar purchases.subscriptionsv2.get para ler a resposta da pesquisa.
A visão do Play Console
Você não precisa de código para ver os totais. Os relatórios de assinaturas do Play Console incluem um card de cancelamentos que divide o churn em voluntário, involuntário e outro, e um card de respostas da pesquisa de cancelamento para os usuários que escolheram responder. As respostas em texto livre de quem escolheu outro podem ser baixadas como CSV no card de outras respostas. Esse download exige a permissão View financial data, a mesma que você daria a uma ferramenta que lê seus pedidos.
O que a Apple informa, e o que ela deixa de fora
A Apple não tem nenhuma pesquisa de cancelamento que chegue aos desenvolvedores. O campo mais próximo é expirationIntent, nas informações de renovação assinadas, e ele descreve como a assinatura terminou, não o que o cliente pensou.
| expirationIntent | Significado para a Apple | Subtipo EXPIRED correspondente |
|---|---|---|
| 1 | O cliente cancelou a assinatura | VOLUNTARY |
| 2 | Erro de cobrança, como dados de pagamento inválidos | BILLING_RETRY |
| 3 | Sem consentimento a um aumento de preço ou conversão de oferta que o exigia | PRICE_INCREASE |
| 4 | O produto não estava disponível para compra na renovação | PRODUCT_NOT_FOR_SALE |
| 5 | Algum outro motivo | Sem subtipo |
O código 1 é o único que descreve uma escolha do cliente, e ele não diz nada sobre a motivação. Um cliente que saiu porque o app vivia travando e outro que simplesmente terminou um projeto parecem idênticos.
O sinal escondido em AUTO_RENEW_DISABLED
Uma notificação da Apple merece atenção especial. DID_CHANGE_RENEWAL_STATUS com o subtipo AUTO_RENEW_DISABLED normalmente significa que o cliente desativou a renovação automática. A documentação da Apple acrescenta um segundo caso: a App Store também desativa a renovação automática depois que o cliente pede reembolso.
Então, no iOS, um evento de renovação desativada pode ser o primeiro sinal de um pedido de reembolso. Se a compra for um consumível ou uma assinatura com renovação automática, um CONSUMPTION_REQUEST pode vir em seguida, e a partir daí você tem 12 horas para enviar os dados de consumo. Um evento de renovação desativada que chega sem nenhuma ação visível no seu app merece ser tratado como um aviso para deixar prontos os dados de uso daquela conta.
Apple e Google lado a lado
| Google Play | Apple App Store | |
|---|---|---|
| Pergunta o motivo ao usuário | Sim, com uma pesquisa de cancelamento | Nenhuma pesquisa visível para o desenvolvedor |
| Onde fica o motivo | canceledStateContext em purchases.subscriptionsv2 | expirationIntent nas informações de renovação |
| Texto livre | reasonUserInput, só para outro | Nenhum |
| Quem cancelou | Usuário, sistema, desenvolvedor ou substituição | Deduzido do código e do subtipo |
| Notificação | SUBSCRIPTION_CANCELED, depois chamar get | DID_CHANGE_RENEWAL_STATUS, EXPIRED |
| Perdido se o usuário assinar de novo | Sim, apagado ao restaurar | As informações de renovação refletem o estado atual |
| Painel | Card de respostas da pesquisa de cancelamento | Nenhum para motivos |

Onde um cancelamento vira reembolso
Um cancelamento interrompe a próxima cobrança. Ele não devolve a última. Se o dinheiro volta ou não depende de qual fluxo de reembolso o cliente alcança em seguida, e a maioria desses fluxos funciona sem você.
- No Google Play, o comprador pode conseguir sozinho um reembolso em até 48 horas após a compra, e quem decide é o Google.
- Reembolsos pelo suporte do Google ou da Apple são decididos pela loja.
- O CONSUMPTION_REQUEST da Apple pede seus dados de consumo, com prazo de 12 horas.
- A análise de chargeback do Google Play pede evidências via orders.reviewrefund, com prazo de 24 horas. A decisão do banco sobre um chargeback é definitiva.
Um motivo de cancelamento não muda nenhuma dessas regras. O que ele muda é quão cedo você sabe qual cliente está insatisfeito, e se suas evidências estão prontas quando chega um dos dois fluxos que as pedem.
Quanto cada motivo custa para você
A resposta da pesquisa também é um guia aproximado de quanto a conta já custou para ser atendida, que é o dinheiro que fica na sua mão quando há um reembolso.
Problemas técnicos
Este é o caro. O cliente usou o produto o bastante para encontrar problemas, então você já pagou a computação das sessões dele, as chamadas à API do modelo que as solicitações dele geraram, o armazenamento do que ele criou e qualquer repasse devido a um criador cujo conteúdo ele usou. Se depois ele conseguir um reembolso, o preço volta e esses custos ficam com você. Se ele recorrer ao banco no Google Play, um pedido feito depois de August 3, 2026 custa a você o preço da compra menos a taxa de serviço do Play, mais as tarifas do banco.
Questões de preço
Uma reclamação de preço custa menos do que parece, a não ser que esconda uma renovação inesperada. Essa é a história clássica de chargeback, então verifique se o cancelamento veio logo depois de uma cobrança de renovação e se seus lembretes de renovação foram enviados.
Pouco uso
Pouco uso significa custo baixo de atendimento, então um reembolso aqui devolve principalmente dinheiro que não custou muito para ganhar. É também o motivo em que dados de consumo honestos, se a Apple pedir, mostram exatamente o que o cliente usou e o que não usou.
Encontrou um app melhor
Esses clientes raramente contestam alguma coisa. Eles foram para um concorrente. O motivo é útil para decisões de produto e quase nunca para a defesa contra reembolsos.
Uma rotina para ler motivos de cancelamento
- A cada SUBSCRIPTION_CANCELED do Google Play, chame purchases.subscriptionsv2.get e salve canceledStateContext com o token de compra e cancelTime.
- Salve reasonUserInput literalmente quando o motivo for outro. É o único texto livre que qualquer uma das lojas entrega.
- A cada DID_CHANGE_RENEWAL_STATUS da Apple com AUTO_RENEW_DISABLED, registre o evento e puxe o uso daquela conta, caso venha um CONSUMPTION_REQUEST.
- A cada notificação EXPIRED da Apple, registre o subtipo e expirationIntent para que churn voluntário e falhas de cobrança não se misturem.
- Para cancelamentos do Google Play por problemas técnicos, confira seus logs de erro daquela conta e entre em contato antes que o cliente procure o banco.
- Mantenha logs de uso por conta, para que um CONSUMPTION_REQUEST seja respondido em menos de 12 horas e uma análise de chargeback em menos de 24.
Perguntas frequentes
- Como vejo por que um assinante do Google Play cancelou?
- Chame purchases.subscriptionsv2.get e leia canceledStateContext.userInitiatedCancellation.cancelSurveyResult. O campo de motivo guarda a resposta da pesquisa, e reasonUserInput guarda o texto livre quando o usuário escolheu outro. O Play Console também mostra os totais no card de respostas da pesquisa de cancelamento.
- A Apple informa aos desenvolvedores por que um cliente cancelou uma assinatura?
- Não. A Apple não tem pesquisa de cancelamento visível para desenvolvedores. O campo expirationIntent diz como a assinatura terminou, com códigos para cliente cancelou, erro de cobrança, sem consentimento a um aumento de preço, produto indisponível ou outro, mas não a motivação do cliente.
- A notificação SUBSCRIPTION_CANCELED inclui o motivo do cancelamento?
- Não. As notificações do desenvolvedor em tempo real do Google Play só dizem que o estado da compra mudou. Busque a assinatura com purchases.subscriptionsv2.get para ler o motivo e salve-o na hora, porque o Google apaga os campos de cancelamento se o usuário restaurar a assinatura.
- Uma notificação AUTO_RENEW_DISABLED da Apple pode indicar um pedido de reembolso?
- Sim. A documentação da Apple diz que o subtipo AUTO_RENEW_DISABLED cobre tanto o cliente desativando a renovação automática quanto a App Store desativando-a depois que o cliente pediu reembolso.
- Posso revogar o acesso quando um assinante cancela?
- No Google Play, não enquanto ele ainda tiver direito. O Google diz que um assinante que cancelou mantém o acesso até o fim do ciclo de cobrança, e remover o acesso antes viola a política de assinaturas do Google Play. Use expiryTime para decidir quando o acesso termina.
Fontes e leituras adicionais
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
O piloto automático de reembolsos para App Store e Google Play
Continue lendo
Pedidos de reembolso excessivos podem custar mais do que os próprios reembolsos, porque as duas lojas os tratam como um sinal de qualidade
A diretriz 5.6.4 da Apple aponta pedidos de reembolso excessivos como sinal de que um app não atende aos padrões de qualidade, e o contrato de distribuição do Google permite remover apps de desenvolvedores novos com base na taxa de reembolso. Veja o que cada loja diz, quanto custa uma remoção e como ficar longe dela.
Verifique as notificações do servidor da App Store antes de agir sobre um reembolso, porque qualquer pessoa pode enviar dados para a sua URL de webhook
Uma notificação de reembolso é apenas uma requisição HTTPS até você conferir a assinatura. Veja como verificar as notificações do servidor da App Store e as mensagens RTDN do Google Play, o que cada loja assina e quanto custa um reembolso forjado ou rejeitado por engano.