Anexe um appAccountToken a cada compra na App Store, ou você não conseguirá defender o reembolso
A Apple envia ao seu servidor um CONSUMPTION_REQUEST quando um cliente pede reembolso, mas a transação nunca diz quem ele é. O appAccountToken é o UUID que liga uma compra de volta ao seu usuário. Configure-o e você poderá responder à Apple com dados reais. Pule essa etapa e você estará adivinhando.

Principais conclusões
- O appAccountToken é um UUID que você anexa a uma compra na App Store para que a transação resultante aponte de volta ao usuário exato no seu próprio sistema. A Apple o armazena na transação e o retorna em todos os lugares em que essa transação aparece.
- A única regra de formatação que a Apple exige é que o valor seja um UUID válido. Passe qualquer outra coisa, um id, um e-mail, uma string concatenada, e o StoreKit o descarta silenciosamente e retorna o appAccountToken como nil.
- No StoreKit 2 você o configura com uma única opção de compra, Product.PurchaseOption.appAccountToken(_:), usando um UUID estável que você gerou e armazenou para aquela conta.
- Configure-o uma vez na compra original e a Apple mantém o mesmo token em cada renovação, nova tentativa de cobrança e upgrade da cadeia de assinatura.
- Desde 2025, o endpoint Set App Account Token permite que seu servidor anexe um token a compras feitas fora do seu app, como resgates de códigos de oferta e compras promovidas, que o fluxo dentro do app nunca conseguia alcançar.
- O appAccountToken é o que torna o CONSUMPTION_REQUEST da Apple respondível. Sem ele você não consegue mapear o reembolso ao cliente cujo uso você deve descrever dentro da janela de 12 horas.
- Um reembolso que você não consegue identificar é um reembolso que você não consegue defender. Você devolve dinheiro em compras que tinha provas para manter, além do processamento, das chamadas de API e dos repasses que já gastou para entregá-las.
Um cliente pede um reembolso à Apple, a Apple envia ao seu servidor um CONSUMPTION_REQUEST, e você tem doze horas para responder com dados reais sobre como aquela pessoa usou o produto. Então você abre a notificação e percebe que não faz ideia de quem ela é. A transação carrega um originalTransactionId e um id de produto, mas nada que aponte para a conta no seu próprio banco de dados. Essa lacuna é exatamente o que o appAccountToken fecha, e se você não o configurou no momento da compra, não consegue fechá-la depois para aquela venda.
O appAccountToken é um UUID que você anexa a uma compra para que a transação resultante da App Store carregue um ponteiro de volta ao usuário exato no seu sistema. Configure-o, e cada pergunta de reembolso que a Apple fizer sobre aquele cliente chegará com a identidade dele anexada. Pule essa etapa, e você estará adivinhando. Aqui está o que é o campo, como configurá-lo, o novo endpoint que resgata as compras feitas fora do seu app, e quanto o vínculo perdido realmente custa quando um reembolso chega.
O que o appAccountToken realmente é
O appAccountToken é um UUID opaco que você gera e passa ao StoreKit no momento da compra. A Apple o armazena na transação e o retorna nas informações da transação daquela compra, e ele fica lá. Nas palavras da Apple, é "o UUID que associa a transação à conta do usuário no seu próprio serviço". A única regra de formatação é que ele precisa ser um UUID. A Apple não o lê, não valida a que ele corresponde, e não se importa com o que ele significa do seu lado. É um vínculo que você controla.
Como ele vive na transação, ele volta a todos os lugares para onde a transação vai. A transação assinada em uma notificação de servidor, a resposta Get Transaction Info da App Store Server API, e cada renovação de uma cadeia de assinatura carregam o mesmo token se você o configurou na compra original. Um UUID, anexado uma vez, acompanha a cobrança do cliente por toda a duração do relacionamento.
Precisa ser um UUID de verdade, ou ele desaparece silenciosamente
A única regra que a Apple exige é o formato. O StoreKit 2 requer um UUID de RFC 4122. Se você passar uma string concatenada, um id inteiro ou um endereço de e-mail, o StoreKit não lança erro. Ele descarta o valor e a transação volta com o appAccountToken em nil. Os desenvolvedores esbarram nisso constantemente, e o sintoma é sempre o mesmo, alguma variação de "appAccountToken is missing in the transaction payload" nos próprios fóruns da Apple, quase sempre porque o valor passado não era um UUID válido. Gere um UUID de verdade no servidor, armazene-o vinculado à conta, e nunca entregue outra coisa ao StoreKit.
Como configurá-lo no momento da compra
No StoreKit 2 é uma única opção de compra. Gere o UUID no seu servidor quando o usuário se cadastra ou chega pela primeira vez ao checkout, armazene-o no registro da conta dele, e passe esse mesmo valor para a chamada de compra.
A assinatura é Product.PurchaseOption.appAccountToken(_ token: UUID), e uma compra fica assim try await product.purchase(options: [.appAccountToken(token)]). Quando a transação volta, verificada pela App Store Server API ou entregue por uma notificação de servidor, ela carrega aquele UUID, e seu servidor localiza o cliente em uma única consulta.
Use um token estável por conta
Não gere um token novo para cada compra do mesmo usuário. A Apple retorna o token nas renovações, nas novas tentativas de cobrança e nos upgrades da mesma cadeia, então um UUID estável por conta te dá um fio limpo desde a primeira compra até cada evento futuro. Um token que muda a cada compra quebra esse fio e frustra todo o propósito. Uma conta, um token, reutilizado toda vez que aquela conta compra.
O endpoint que resgata as compras fora do app
Até 2025 havia um buraco. Se um cliente resgatava um código de oferta ou fazia uma compra dentro do app promovida direto da App Store, seu app nunca executava o fluxo de compra, então não havia onde configurar o appAccountToken. Essas transações chegavam anônimas e assim permaneciam.
A WWDC 2025 fechou a lacuna com o endpoint Set App Account Token. Seu servidor chama PUT /inApps/v1/transactions/{originalTransactionId}/appAccountToken na App Store Server API com o UUID no corpo, e a Apple configura o token naquela transação. Funciona para todos os tipos de produto, cobre os resgates de códigos de oferta e as compras promovidas, e o valor que você envia sobrescreve qualquer token já presente na transação. Agora você pode associar uma compra depois do fato, a partir do seu servidor, sem que ela jamais passe pelo seu app.

| Canal de compra | Onde você configura o appAccountToken | Notas |
|---|---|---|
| Compra dentro do app | Opção de compra do StoreKit no momento da compra | Product.PurchaseOption.appAccountToken(UUID) |
| Resgate de código de oferta | Endpoint Set App Account Token, no servidor | Não há fluxo dentro do app para ancorar, então configure depois |
| Compra dentro do app promovida a partir da App Store | Endpoint Set App Account Token, no servidor | A compra acontece fora do seu app |
| Renovação de assinatura | Nada a fazer | Herdado automaticamente da compra original |
Onde o vínculo perdido custa dinheiro a você
O objetivo do token não são registros organizados. É que a única pergunta de reembolso da Apple para desenvolvedores, o CONSUMPTION_REQUEST, só tem resposta se você conseguir encontrar o cliente a que ela se refere.
Quando um comprador solicita um reembolso de um consumível ou de uma assinatura não renovável, a Apple envia ao seu servidor uma notificação CONSUMPTION_REQUEST e te dá doze horas para responder com Send Consumption Information. Sua resposta são dados sobre aquele cliente específico: quanto do produto ele consumiu, o tempo de conta dele, o gasto ao longo da vida, o status de entrega. O appAccountToken é ele próprio um dos campos dessa solicitação, e mais importante, é como a transação da notificação se associa à conta cujo uso você está prestes a descrever. Sem token, sem consulta, sem resposta precisa.
Quanto uma resposta em branco realmente custa
Um reembolso não identificado força uma escolha ruim. Você pode responder à solicitação de consumo com nada, o que é lido como baixo consumo e empurra a Apple na direção de conceder o reembolso, inclusive a clientes que usaram o produto intensamente. Ou você pode adivinhar. De qualquer forma você está reembolsando compras que tinha provas para defender, e já pagou o custo real de entregá-las.
Esse custo não é o preço de venda. Um consumível que executou um lote de chamadas à API de um modelo, gerou imagens, exportou um vídeo ou disparou um repasse a um criador gastou dinheiro real no momento em que foi entregue. O reembolso devolve o pagamento do cliente. Não devolve a fatura do fornecedor. Multiplique um cliente não identificável por cada reembolso que ele abre, e por cada reembolsador em série que conta com o fato de você não saber quem ele é, e o token que você pulou se torna a linha de código mais cara que você nunca escreveu.
A mesma ideia existe no Android, sob outro nome
O Google Play resolve o problema idêntico com o setObfuscatedAccountId, que anexa um identificador de conta a uma compra para que a revisão de estorno do Google via orders.reviewrefund possa ser respondida contra um usuário real. Loja diferente, mecânica diferente, a mesma lição: anexe a identidade no momento da compra ou você não conseguirá defender a disputa depois. Na App Store, essa ferramenta é o appAccountToken, e ele precisa ser um UUID.
Três hábitos que mantêm o token no lugar
- Gere um UUID por conta e armazene-o. Um token estável por cliente, criado quando ele se cadastra ou no primeiro checkout, salvo no registro dele e reutilizado em cada compra.
- Valide antes de passá-lo. Confirme que o valor é um UUID de verdade no seu código de compra, para que um id malformado nunca possa virar silenciosamente um token nil na transação.
- Preencha as compras feitas fora do app. Quando uma notificação de servidor chega para um resgate de código de oferta ou uma compra promovida sem token, chame o endpoint Set App Account Token para anexar o correto.
Faça essas três coisas e cada transação que a Apple te enviar, incluindo os pedidos de reembolso, chegará já vinculada ao cliente a quem pertence.
Essa é a base da qual o RefundHalt depende. Nós lemos o appAccountToken de cada transação e notificação de servidor, associamos ao uso que já rastreamos para aquela conta, e respondemos à solicitação de consumo da Apple dentro da janela de doze horas com os números reais do cliente. O token é o fio. Configure-o uma vez e sua defesa de reembolsos terá algo em que se segurar.
Perguntas frequentes
- O que é o appAccountToken na App Store?
- O appAccountToken é um UUID que você gera e anexa a uma compra através do StoreKit para que a transação resultante da App Store aponte de volta a uma conta de usuário específica no seu próprio sistema. A Apple o armazena na transação e o retorna nas informações da transação, nas notificações de servidor e em cada renovação da mesma cadeia, o que permite conectar qualquer evento futuro, incluindo um pedido de reembolso, ao cliente certo.
- Por que meu appAccountToken está nil ou ausente?
- Quase sempre porque o valor que você passou não era um UUID válido. O StoreKit 2 exige um UUID de RFC 4122 e descarta silenciosamente qualquer outra coisa, então uma string concatenada, um id inteiro ou um e-mail voltam como um appAccountToken nil enquanto a compra ainda é concluída. A outra causa comum é uma compra feita fora do seu app, como um resgate de código de oferta, onde nenhum fluxo dentro do app foi executado para configurar o token.
- Posso configurar o appAccountToken depois da compra, para códigos de oferta?
- Sim, desde 2025. O endpoint Set App Account Token da App Store Server API permite que seu servidor anexe ou sobrescreva o token em uma transação existente chamando PUT /inApps/v1/transactions/{originalTransactionId}/appAccountToken com o UUID no corpo. Funciona para todos os tipos de produto e foi feito para compras realizadas fora do seu app, como resgates de códigos de oferta e compras dentro do app promovidas.
- O appAccountToken precisa ser um UUID?
- Sim. A única regra de formatação que a Apple exige é que o valor seja um UUID válido. Fora isso ele é opaco, então pode corresponder à chave de conta que você quiser do seu lado, mas se não for um UUID o StoreKit não o armazenará e a transação voltará com o appAccountToken em nil.
- Como o appAccountToken ajuda com reembolsos?
- Quando um cliente solicita um reembolso, a Apple envia um CONSUMPTION_REQUEST e te dá doze horas para responder com dados sobre aquele comprador específico. O appAccountToken é como você associa a transação da notificação à conta cujo uso você precisa relatar, e é um dos campos da própria solicitação de consumo. Sem ele você não consegue responder com o uso real, então a Apple tende a conceder reembolsos que você tinha provas para contestar.
- O appAccountToken deve ser diferente para cada compra?
- Não. Use um UUID estável por conta e reutilize-o em cada compra que aquele usuário fizer. A Apple mantém o token nas renovações e upgrades de uma cadeia de assinatura, então um token estável te dá um vínculo limpo ao longo do tempo. Um token que muda a cada compra quebra esse vínculo e torna mais difícil ligar as transações ao mesmo cliente.
Fontes e leituras adicionais
- Apple Developer: appAccountToken (StoreKit Transaction)
- Apple Developer: Product.PurchaseOption.appAccountToken(_:)
- Apple Developer: Set App Account Token (App Store Server API)
- Apple Developer: appAccountToken (App Store Server API)
- Apple Developer: ConsumptionRequest (Send Consumption Information)
- Apple Developer: Send Consumption Information
- WWDC25: Dive into App Store server APIs for In-App Purchase
RefundHalt
O piloto automático de reembolsos para App Store e Google Play
Continue lendo
Não confirme uma compra do Google Play em três dias e o Google a reembolsa, veja o que isso custa a você
O Google Play reembolsa e revoga automaticamente qualquer compra que seu servidor não confirmar em três dias. É uma falha de integração, não uma decisão do cliente, e é totalmente evitável. Aqui está a regra exata, por que ela dispara e o que cada venda perdida realmente custa.
O abuso reiterado de reembolsos custa a você duas vezes, veja como as lojas deixam você reagir
O cliente que reembolsa repetidas vezes não é um acaso. O abuso de reembolsos custa a você o dinheiro devolvido mais a computação que você já gastou, e ambas as lojas entregam a você um sinal de identidade, o appAccountToken da Apple e o ID de conta ofuscado do Google, para juntar o padrão.