Todos os artigos
Guia prático7 min de leitura

O order ID no recibo da App Store mostra o que o cliente comprou e se a Apple já fez o reembolso

O endpoint Look Up Order ID da Apple transforma o order ID do recibo da App Store de um cliente em transações assinadas, com datas e motivos de reembolso. Veja como usá-lo nos e-mails de reembolso, o que ele não faz e como se compara ao order ID do Google Play.

Uma mesa de suporte com um notebook mostrando a caixa de entrada e um iPhone exibindo um recibo de compra, onde o order ID da App Store inicia a conversa sobre reembolso

Principais conclusões

  • A Apple envia por e-mail um recibo com um order ID sempre que um cliente faz compras dentro do app, e o cliente também encontra seus order IDs no histórico de compras da App Store.
  • O endpoint Look Up Order ID da App Store Server API (GET /inApps/v1/lookup/{orderId}) retorna uma ou mais transações assinadas para um order ID válido, então o suporte vê o productId e o purchaseDate sem adivinhar.
  • Uma transação decodificada da App Store traz revocationDate e revocationReason, então consultar o order ID mostra se a Apple já reembolsou a compra. O motivo 1 significa que a Apple reembolsou por um problema real ou percebido dentro do app.
  • O Look Up Order ID retorna OrderLookupStatus 1 e nenhum array signedTransactions quando o order ID não é válido para o seu app, o que indica um recibo errado ou uma compra de outro app.
  • O Look Up Order ID não está disponível no ambiente sandbox da Apple, e o limite em produção é de 10 requisições por segundo por app, aplicado por hora.
  • Desenvolvedores não podem emitir reembolsos da App Store. A Apple decide em reportaproblem.apple.com, e a única etapa de evidência do desenvolvedor é responder a um CONSUMPTION_REQUEST em até 12 horas.
  • O Google Play envia por e-mail um order ID para cada compra única e cada renovação de assinatura, e o desenvolvedor pode buscar esse order ID no Play Console e reembolsar diretamente. O Play Console diz que um reembolso não pode ser revertido.

Antes de responder ao e-mail de reembolso de um cliente de iPhone, peça o order ID da App Store que está no recibo da Apple. Essa única sequência, passada pelo endpoint Look Up Order ID da Apple, diz qual produto ele comprou, quando, e se a Apple já fez o reembolso. Sem ela, você compara uma captura de tela e um endereço de e-mail com o seu banco de dados e torce. Com ela, você sabe em segundos se está falando com um cliente pagante, com um cliente que a Apple já reembolsou ou com alguém segurando um recibo de outro app.

De onde vem o order ID da App Store

A documentação da Apple é específica. Quando os clientes fazem uma ou mais compras dentro do seu app, a App Store envia um recibo por e-mail, e esse recibo contém um order ID. Os clientes também encontram seus order IDs no histórico de compras da App Store. A página de histórico de compras da Apple fica em reportaproblem.apple.com e no app App Store, em Apps e Histórico de Compras, e mostra os últimos 90 dias por padrão, com filtros para compras mais antigas.

Ou seja, o cliente já tem a chave. Seu formulário de suporte só precisa pedir.

Por que um endereço de e-mail não basta

A Apple não compartilha com você o e-mail da Conta Apple do cliente. O endereço que escreve para a sua caixa de suporte pode não ter nada a ver com a conta que pagou. Se você define um appAccountToken na compra, consegue ligar uma transação ao seu próprio ID de usuário, mas só do seu lado. O order ID funciona do lado do cliente, a partir de um recibo que ele encaminha com um toque.

O que o Look Up Order ID retorna

O Look Up Order ID faz parte da App Store Server API, disponível a partir da versão 1.1.0. Você chama GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} com o seu JWT assinado. A Apple diz que a resposta se baseia no histórico de compras dentro do app do cliente, não importa se ele instalou, removeu ou reinstalou o app.

Campo ou comportamentoO que diz a documentação da AppleO que o suporte faz com isso
OrderLookupStatus 0Order ID válido. A resposta contém um array com uma ou mais transações assinadasDecodifique cada uma e leia a compra
OrderLookupStatus 1A resposta não contém um array signedTransactionsTrate o order ID como inválido para o seu app. Peça o recibo certo
productId e purchaseDateA Apple indica esses campos para o atendimento ao clienteConfirme o que foi comprado e quando
revocationDateO momento em que a App Store reembolsou a transação ou a revogou do Compartilhamento FamiliarSe existir, a Apple já devolveu o dinheiro ao cliente
revocationReason0: reembolsada por outros motivos, como uma compra acidental. 1: reembolsada por um problema real ou percebido dentro do seu appUm 1 é um sinal de produto, não só um chamado de suporte
appAccountTokenO UUID que você define na compra, se definirLigue o pedido ao seu próprio registro de usuário
price e currencyA Apple diz para não usá-los na conciliação de receitaUse os relatórios do App Store Connect para o dinheiro
SandboxO endpoint não está disponível no ambiente sandboxTeste apenas com order IDs de produção
Limite de requisições10 requisições por segundo por app, aplicado por hora. O excesso recebe HTTP 429 com um cabeçalho Retry-AfterSobra para uma equipe de suporte, não para varreduras em massa

É um recibo válido para o meu app?

Essa é a primeira pergunta que o OrderLookupStatus responde. Um 1 significa que o order ID não corresponde a compras no seu app. Os casos comuns são um erro de digitação, um recibo de outro app ou um recibo que nem é da App Store. Não reembolse, não dê crédito e não restaure nada com um 1. Peça ao cliente para conferir o recibo de novo.

A Apple já reembolsou esta compra?

Confira o revocationDate em cada transação decodificada. Se estiver preenchido, a Apple já reembolsou essa compra ou a revogou do Compartilhamento Familiar, e o cliente já tem o dinheiro de volta. Suas App Store Server Notifications deveriam ter enviado um REFUND para a mesma transação, então essa também é uma forma barata de confirmar que o seu servidor de fato revogou o acesso.

Um desenvolvedor compara um recibo impresso da App Store com linhas de transações em um notebook, conferindo um order ID da App Store antes de responder a um pedido de reembolso

O que o order ID não faz na App Store

Ele não emite reembolso. Desenvolvedores não têm botão de reembolso na App Store. A Apple decide os reembolsos, e o artigo de suporte dela manda os clientes para reportaproblem.apple.com, onde escolhem “I'd like to”, depois “Request a refund”, selecionam um motivo e escolhem o item. A Apple também diz que uma cobrança pendente não pode ser reembolsada até o cliente receber o recibo por e-mail.

O único lugar em que você tem voz é o CONSUMPTION_REQUEST da Apple. Quando um cliente pede reembolso à Apple, ela pode enviar essa notificação, e você tem 12 horas para responder com Send Consumption Information. A consulta por order ID é uma ferramenta de suporte. Ela não abre essa janela nem a estende.

Quanto custa um e-mail de reembolso quando você pula a consulta

Suporte sem order ID é por onde o dinheiro vaza em silêncio. Três padrões aparecem de novo e de novo.

  • Cortesia em cima de um reembolso. A Apple reembolsa a compra, o cliente também escreve para você e o suporte concede créditos grátis ou um mês extra. Cada crédito que você dá roda em computação, chamadas de API e armazenamento que você paga, em uma conta que já foi reembolsada.
  • Acesso que nunca foi revogado. Se o seu tratamento de REFUND falhou, o cliente reembolsado continua gerando uso. Uma consulta que mostra um revocationDate enquanto o seu banco ainda diz ativo é um relatório de bug com preço.
  • Conta errada, correção errada. Restaurar ou dar crédito à conta por trás de um e-mail encaminhado, quando o order ID pertence a outra pessoa, entrega serviço pago a quem nunca comprou.

Nenhum desses casos precisa de disputa ou prazo para doer. São só respostas de suporte dadas sem fatos. Uma chamada de API por chamado acaba com o chute.

revocationReason 1 significa que eu errei?

Não necessariamente. A Apple diz que o motivo 1 significa que ela reembolsou a compra por um problema real ou percebido dentro do seu app. A palavra percebido pesa muito aí. Mas um grupo de reembolsos com motivo 1 em um mesmo produto, depois de uma mesma versão, é o feedback de produto mais claro que a Apple dá. Conte-os.

Como o order ID do Google Play se compara

O Google Play funciona ao contrário. A documentação de faturamento do Google diz que os usuários recebem um e-mail com um order ID único para cada compra de produto único, para a compra inicial da assinatura e para cada renovação recorrente, e que você pode usar o order ID para gerenciar reembolsos no Play Console. Você busca em Gerenciamento de pedidos pelo order ID ou pelo e-mail completo do usuário e depois reembolsa você mesmo.

PerguntaOrder ID da App StoreOrder ID do Google Play
Onde o cliente encontraRecibo por e-mail e histórico de compras da App StoreRecibo por e-mail de cada compra e cada renovação
Como você consultaLook Up Order ID na App Store Server APIBusca em Gerenciamento de pedidos do Play Console
Dá para reembolsar com eleNão. A Apple decideSim. Reembolsos totais, e parciais em compras dentro do app e assinaturas
Janela de evidência para o reembolsoCONSUMPTION_REQUEST, 12 horas, a Apple decideRevisão de chargeback via orders.reviewrefund, 24 horas
Um reembolso pode ser desfeitoNão por vocêNão. O Play Console diz que um reembolso não pode ser revertido

No Google Play, o order ID importa mais porque é você quem aperta o botão. O Play Console diz que reembolsar o pedido de assinatura mais recente remove a assinatura na hora e cancela as renovações futuras, enquanto reembolsar um pedido mais antigo é só reembolso e mantém a assinatura ativa. Reembolsos parciais só são aceitos para pedidos feitos depois de março de 2018, e você não pode reembolsar parcialmente um app pago.

Coloque o order ID no início do seu fluxo de suporte a reembolsos

  • Peça o order ID no formulário de suporte, com uma dica de uma linha: ele está no e-mail do recibo da Apple ou do Google Play.
  • No iOS, chame o Look Up Order ID, decodifique cada transação e mostre ao suporte o productId, o purchaseDate, o revocationDate e o revocationReason em uma única tela.
  • Se o OrderLookupStatus for 1, pare e peça o recibo certo. Não conceda nada.
  • Se o revocationDate estiver preenchido, confirme que o acesso já foi revogado no seu servidor e feche o chamado. Sem cortesia em cima.
  • Se não estiver e o cliente quiser o dinheiro de volta, mande-o para reportaproblem.apple.com e deixe o seu tratamento de CONSUMPTION_REQUEST pronto para a janela de 12 horas. O RefundHalt responde a essa solicitação com os dados de consumo que a Apple pede.
  • No Android, encontre o pedido exato no Play Console antes de reembolsar e escolha de propósito entre só reembolsar e reembolsar e revogar.

Perguntas frequentes

Como consulto um order ID da App Store como desenvolvedor?
Chame o endpoint Look Up Order ID da App Store Server API, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, com o seu JWT assinado. Um order ID válido retorna OrderLookupStatus 0 e uma ou mais transações assinadas, que você decodifica para ler o productId, o purchaseDate e qualquer detalhe de reembolso. O endpoint não está disponível no sandbox.
Onde o cliente encontra o order ID da App Store?
No recibo por e-mail que a Apple envia sempre que ele faz compras dentro do app, e no histórico de compras da App Store, em reportaproblem.apple.com ou em Apps e Histórico de Compras no app App Store. O histórico mostra os últimos 90 dias por padrão, com filtros para compras mais antigas.
Posso reembolsar uma compra da App Store com o order ID?
Não. Desenvolvedores não podem emitir reembolsos da App Store. A Apple decide quando o cliente pede um em reportaproblem.apple.com. A sua participação é responder ao CONSUMPTION_REQUEST da Apple em até 12 horas com Send Consumption Information.
Como sei se a Apple já reembolsou uma compra?
Consulte o order ID e confira o revocationDate em cada transação decodificada. Se estiver preenchido, a Apple reembolsou a compra ou a revogou do Compartilhamento Familiar. revocationReason 0 significa outros motivos, como uma compra acidental, e 1 significa um problema real ou percebido dentro do seu app.
O que significa OrderLookupStatus 1?
Significa que o order ID não é válido para o seu app, e a resposta não tem array signedTransactions. Em geral o cliente mandou um recibo de outro app, digitou o ID errado ou mandou um recibo que não é da App Store. Peça o recibo certo antes de conceder qualquer coisa.

Fontes e leituras adicionais

RefundHalt

O piloto automático de reembolsos para App Store e Google Play

Continue lendo

A próxima solicitação de reembolso já está a caminho.

Configure a RefundHalt no tempo que você levaria para ler mais um e-mail de suporte sobre um reembolso que não conseguiu contestar.