O Send Consumption Information da Apple agora pede cinco campos, não doze, e aqui está cada um
Quando um cliente pede um reembolso à Apple, a carga do Send Consumption Information é a sua resposta. A Apple a reduziu de doze campos para cinco, três obrigatórios e dois opcionais. Aqui está cada campo, os valores que cada um aceita e a janela de 12 horas em que você a envia.

Principais conclusões
- A carga do Send Consumption Information da Apple agora carrega cinco campos, contra os doze anteriores. Três são obrigatórios, customerConsented, deliveryStatus e sampleContentProvided, e dois são opcionais, consumptionPercentage e refundPreference.
- customerConsented é uma barreira rígida. A própria orientação da Apple é que, se o cliente não concordou em compartilhar dados de consumo, você não envia a carga de forma alguma.
- deliveryStatus carrega o seu sinal mais forte. DELIVERED diz que a compra funcionou, e os quatro valores UNDELIVERED dizem à Apple que o cliente nunca recebeu um produto funcional.
- consumptionPercentage substituiu o antigo enum consumptionStatus de quatro passos por um número preciso em milliunits, onde 100,000 milliunits significa que o item foi totalmente consumido.
- refundPreference agora é uma string, não um número. Os três valores são DECLINE, GRANT_FULL e GRANT_PRORATED, e ele expressa uma preferência, não uma decisão. A Apple ainda decide.
- Você envia a carga com um PUT ao endpoint do Send Consumption Information identificado pelo id da transação, e a Apple retorna 202 Accepted com um corpo vazio. A janela é de 12 horas após o CONSUMPTION_REQUEST.
- Em assinaturas com renovação automática a Apple calcula o consumo por conta própria a partir do tempo decorrido, então consumptionPercentage é destinado a compras consumíveis e não renováveis.
A lista de fatos que a Apple pede quando um cliente quer um reembolso ficou bem mais curta. A carga do Send Consumption Information, a única resposta que um desenvolvedor pode enviar para uma decisão de reembolso da App Store, costumava ter doze campos. Agora tem cinco. A Apple a enxugou por volta da WWDC24 e condensou a maioria das antigas perguntas de perfilamento de conta em duas simples e um número. Menos campos não é uma edição pequena. Muda quais evidências a Apple pondera e muda quais campos você não pode errar.
Aqui está o motivo pelo qual isso merece a sua atenção e não é apenas uma nota sobre o esquema. Essa carga é o único momento em um reembolso da Apple em que o seu lado da história chega à decisão. Um reembolso de um consumível reverte receita que você já gastou dinheiro real para entregar, e os cinco campos são como você diz à Apple que o produto foi entregue e usado. Perca a janela de 12 horas ou preencha um campo errado, e a Apple decide apenas com a reclamação do cliente.
O que é o Send Consumption Information
Send Consumption Information é o endpoint da App Store Server API que você chama depois que a Apple envia ao seu servidor uma notificação CONSUMPTION_REQUEST. Essa notificação significa que um cliente pediu à Apple um reembolso de uma compra dentro do app e a Apple quer a sua contribuição antes de decidir. Você responde enviando com um PUT um pequeno corpo JSON, o ConsumptionRequest, ao endpoint. A Apple o lê, pondera contra o histórico do cliente e toma a decisão. Você nunca decide o reembolso. Você fornece fatos.
O corpo é toda a interface. Não há formulário separado, nem recurso, nem um segundo envio que conte. O que você enviar nessa única carga é o seu caso completo, então o significado de cada campo importa mais do que a quantidade de campos sugere.
Os cinco campos que a Apple pede agora
O ConsumptionRequest atual tem cinco membros. Três são obrigatórios e dois são opcionais. Tudo o que a Apple costumava perguntar sobre a conta do cliente, o tempo de conta dele, o gasto ao longo da vida, os reembolsos ao longo da vida, o tempo de uso, foi removido do que você envia.
| Campo | Obrigatório | Tipo | O que carrega |
|---|---|---|---|
| customerConsented | Sim | Booleano | Se o cliente concordou em compartilhar dados de consumo com a Apple |
| deliveryStatus | Sim | String | Se o seu app entregou um produto funcional |
| sampleContentProvided | Sim | Booleano | Se você ofereceu uma amostra ou teste gratuito antes da compra |
| consumptionPercentage | Não | Inteiro | Quanto da compra foi consumido, em milliunits |
| refundPreference | Não | String | O seu resultado preferido para o pedido de reembolso |
customerConsented é a barreira
customerConsented é um booleano, e é o campo que decide se você envia alguma coisa. Ele registra se o cliente concordou que você compartilhe dados de consumo com a Apple. A orientação da Apple é direta: se o cliente não consentiu, não envie a informação de consumo. Então não é um campo que você marca como true para fortalecer o seu caso. Ele reflete um sim ou não real que você já deve ter, e um false aqui significa que o resto da carga não deve ser enviado.
deliveryStatus é o campo que move os reembolsos
deliveryStatus é um enum de string, e é a alavanca mais forte que você tem. Ele diz à Apple se o seu app realmente entregou uma compra funcional dentro do app. Um valor diz sim. Os outros quatro dizem não, cada um por um motivo diferente, e cada um diz à Apple que o cliente tem uma queixa legítima.
| Valor | O que diz à Apple |
|---|---|
| DELIVERED | O app entregou uma compra funcional dentro do app |
| UNDELIVERED_QUALITY_ISSUE | A compra não foi entregue por causa de um problema de qualidade |
| UNDELIVERED_WRONG_ITEM | O cliente recebeu o item errado |
| UNDELIVERED_SERVER_OUTAGE | Uma queda de servidor interrompeu a entrega |
| UNDELIVERED_OTHER | A compra não foi entregue por outro motivo |
sampleContentProvided responde a uma pergunta de justiça
sampleContentProvided é um booleano. Ele registra se você deu ao cliente uma amostra gratuita, um teste ou informação clara sobre o que a compra faz antes de ele comprar. Um true aqui é um pequeno sinal de justiça: o cliente teve a chance de saber o que estava comprando. Ele não decide nada sozinho, mas é um de apenas três campos obrigatórios, então a Apple claramente o quer em toda resposta.
consumptionPercentage agora é um número, não um status
Este é o campo que mais mudou. A carga antiga tinha consumptionStatus, um enum de quatro passos: UNDECLARED, NOT_CONSUMED, PARTIALLY_CONSUMED, FULLY_CONSUMED. A nova carga o substitui por consumptionPercentage, um inteiro medido em milliunits. 100,000 milliunits significa que o item foi totalmente consumido, então 50,000 é a metade e 0 é intocado. Um número preciso supera um balde de quatro opções, porque permite você dizer que um cliente gastou 90 por cento de um pacote de créditos em vez de arredondar para baixo como consumido parcialmente.
Uma ressalva que confunde as pessoas. Em assinaturas com renovação automática a Apple calcula o consumo por conta própria a partir do tempo decorrido, então consumptionPercentage é destinado a compras consumíveis e não renováveis. Envie onde se aplica, e deixe a Apple derivar onde não se aplica.

refundPreference expressa uma preferência, não um veredito
refundPreference é uma string opcional, e é onde você diz à Apple qual resultado prefere. Ele também mudou de forma. O campo antigo era um número com valores como prefer-grant, prefer-decline e no-preference. O novo é uma string nomeada com três valores.
| Valor | O que você está pedindo |
|---|---|
| GRANT_FULL | Você preferiria que a Apple concedesse um reembolso total |
| GRANT_PRORATED | Você preferiria um reembolso parcial refletindo o que foi usado |
| DECLINE | Você preferiria que a Apple recusasse o reembolso |
O que a Apple removeu, e por que isso importa
O ConsumptionRequest antigo tinha doze campos. Sete deles sumiram do que você envia. accountTenure, lifetimeDollarsPurchased, lifetimeDollarsRefunded, playTime, userStatus, platform e appAccountToken eram a metade de perfilamento de conta da carga, os campos que pediam para você classificar um cliente por quanto tempo ele tinha uma conta, quanto tinha gastado, quanto tinha sido reembolsado e por quanto tempo tinha usado o app.
A Apple os removeu por um motivo que vale a pena notar. Esses campos pediam aos desenvolvedores para entregar um perfil do cliente, e a maioria dos desenvolvedores ou os deixava não declarados ou os adivinhava. Os cinco que restam tratam da compra e da entrega, fatos que você realmente pode verificar a partir dos seus próprios sistemas. A mudança vai de quem o cliente é para o que aconteceu com esta compra específica.
| Carga antiga | Carga atual | |
|---|---|---|
| Total de campos | 12 | 5 |
| Campos obrigatórios | Na prática nenhum imposto | 3 |
| Sinal de consumo | consumptionStatus, quatro baldes | consumptionPercentage, milliunits exatos |
| Preferência de reembolso | Enum numérico | String nomeada, 3 valores |
| Perfilamento de conta | tempo de conta, gasto de vida, reembolsos, tempo de uso, status | Removido |
O endpoint e o relógio
Você envia a carga com um PUT de HTTP ao endpoint do Send Consumption Information, identificado pelo id da transação da compra em disputa: PUT /inApps/v1/transactions/consumption/{transactionId}. Um sucesso retorna 202 Accepted, e o corpo da resposta é vazio. Essa resposta vazia é esperada, não um bug. Ela confirma que a Apple enfileirou os seus dados, e não diz nada sobre o resultado final, que chega depois como uma notificação REFUND ou REFUND_DECLINED.
O relógio é a parte que você não pode esticar. A Apple dá a você 12 horas a partir do CONSUMPTION_REQUEST para responder. Apenas a sua primeira resposta é usada, então a primeira carga tem que ser a completa e correta. A Apple pode enviar o CONSUMPTION_REQUEST mais de uma vez para a mesma compra, mas o prazo de cada um é fixo, e uma revisão manual raramente cabe dentro de 12 horas entre fusos horários e fins de semana.
O que um campo mal tratado custa a você
O dinheiro saiu do prédio antes do reembolso
O reembolso de um consumível não é uma reversão limpa. Quando um cliente pede o dinheiro de volta por um pacote de créditos ou um lote de gerações de IA, você já gastou para entregá-lo: inferência de GPU em cada requisição, chamadas a API de modelos de terceiros cobradas por token, armazenamento do que você produziu, e qualquer pagamento a criadores ou parceiros ligado a esse uso. O preço da loja volta ao cliente. O seu custo de entrega não volta para você. Então um reembolso que você poderia ter contestado não é um evento de ponto de equilíbrio, é uma perda líquida de tudo o que você pagou para atender a conta.
Os cinco campos são como você evita pagar duas vezes
deliveryStatus definido como DELIVERED e um consumptionPercentage alto são os dois fatos que dizem à Apple que o cliente recebeu e usou o produto. Eles são a sua prova de que a computação, as chamadas à API e o armazenamento cumpriram seu papel. Deixe a carga sem enviar e a Apple nunca fica sabendo. Ela decide a partir da reclamação do cliente, o reembolso é mais provável de passar, e você arca tanto com a receita revertida quanto com o custo de entrega por trás dela.
Os estornos são a pior porta, e o silêncio aponta para ela
Um cliente que não consegue satisfação pelo fluxo de reembolso da Apple ainda pode contestar a cobrança com o banco. Um estorno de cartão é definitivo, carrega uma taxa de disputa fixa, e tira a decisão das mãos da Apple e das suas. Responder bem ao CONSUMPTION_REQUEST mantém a disputa dentro do sistema da Apple, onde você tem voz. Ignorá-lo empurra os casos limítrofes para o único canal onde você não tem nenhuma.
Como o RefundHalt lida com isso
Os cinco campos parecem simples até você ter que preenchê-los corretamente, dentro de 12 horas, em cada CONSUMPTION_REQUEST, ligados à transação certa. O RefundHalt captura a notificação, lê os seus próprios registros de entrega e uso daquela compra, e envia a carga automaticamente antes de a janela fechar. deliveryStatus reflete o que os seus registros de fato mostram, consumptionPercentage vem do uso real em vez de um palpite, e refundPreference segue a política que você configurou uma vez. Você tem o reembolso contestável revisado com evidência, não um prazo perdido e uma decisão tomada sem você.
Perguntas frequentes
- Quantos campos o Send Consumption Information da Apple tem agora?
- Cinco. Três são obrigatórios, customerConsented, deliveryStatus e sampleContentProvided, e dois são opcionais, consumptionPercentage e refundPreference. A versão anterior da carga tinha doze campos, e a Apple removeu os de perfilamento de conta como accountTenure, lifetimeDollarsPurchased e userStatus.
- O que significa deliveryStatus em um consumption request?
- deliveryStatus diz à Apple se o seu app entregou uma compra funcional dentro do app. DELIVERED significa que sim. Os quatro valores UNDELIVERED, UNDELIVERED_QUALITY_ISSUE, UNDELIVERED_WRONG_ITEM, UNDELIVERED_SERVER_OUTAGE e UNDELIVERED_OTHER, cada um diz que não, por um motivo declarado. É o sinal mais forte da carga, então deve corresponder aos seus próprios registros.
- consumptionPercentage é uma porcentagem ou um número bruto?
- É um inteiro medido em milliunits, não uma porcentagem simples. 100,000 milliunits significa que o cliente consumiu totalmente a compra, então 50,000 é a metade e 0 é intocado. Ele substituiu o antigo enum consumptionStatus, que só tinha quatro baldes, de não consumido a totalmente consumido.
- Definir refundPreference como DECLINE interrompe o reembolso?
- Não. refundPreference expressa o seu resultado preferido, ele não decide nada. DECLINE diz à Apple que você preferiria que ela não reembolsasse, e GRANT_FULL ou GRANT_PRORATED dizem o oposto, mas a Apple pondera a sua preferência contra o histórico do cliente e a própria política e toma a decisão final.
- E se o cliente não consentiu em compartilhar dados de consumo?
- Então você não deve enviar a carga. customerConsented é um booleano obrigatório, e a orientação da Apple é que, se o cliente não concordou em compartilhar dados de consumo, você não responde ao CONSUMPTION_REQUEST de forma alguma. O consentimento é um sim ou não real que você já deve ter, não um valor que você marca como true para ajudar o seu caso.
- Quanto tempo eu tenho para enviar a informação de consumo?
- 12 horas a partir de quando a Apple envia a notificação CONSUMPTION_REQUEST. Você responde com um PUT ao endpoint do Send Consumption Information, e um sucesso retorna 202 Accepted com um corpo vazio. Apenas a sua primeira resposta é usada, então a primeira carga tem que estar completa, e um processo manual raramente cabe dentro da janela.
Fontes e leituras adicionais
- Apple Developer: ConsumptionRequest
- Apple Developer: Send Consumption Information
- Apple Developer: Send Consumption Information V1
- Apple Developer: deliveryStatus
- Apple Developer: consumptionPercentage
- Apple Developer: refundPreference
- Apple Developer: Explore App Store server APIs for In-App Purchase (WWDC24)
RefundHalt
O piloto automático de reembolsos para App Store e Google Play
Continue lendo
Existe um endpoint que retorna todo o histórico de reembolsos da App Store de um cliente, e aqui está o que ele devolve
O endpoint Get Refund History da Apple retorna o histórico completo de reembolsos da App Store de um cliente como transações assinadas. Aqui está cada campo, como o token revision pagina, por que ele é por cliente e não por app, e quanto custa um reembolso que passa despercebido.
Seu app pode exibir uma folha de solicitação de reembolso dentro do app, e aqui está o que a Apple faz depois que o cliente toca em enviar
A solicitação de reembolso dentro do app da Apple permite que o cliente peça um reembolso sem sair do seu app, numa folha que a Apple constrói e revisa. Aqui está o que o beginRefundRequest retorna, os relógios do CONSUMPTION_REQUEST e das 48 horas que ele dispara no seu servidor, e se vale a pena publicar o botão.