Todos os artigos
Deep dive7 min de leitura

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.

Um celular ao lado de uma pilha fina de formulários de papel com a maioria das páginas arrancadas, ilustrando a carga do Send Consumption Information da Apple reduzida de doze campos para cinco

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.

CampoObrigatórioTipoO que carrega
customerConsentedSimBooleanoSe o cliente concordou em compartilhar dados de consumo com a Apple
deliveryStatusSimStringSe o seu app entregou um produto funcional
sampleContentProvidedSimBooleanoSe você ofereceu uma amostra ou teste gratuito antes da compra
consumptionPercentageNãoInteiroQuanto da compra foi consumido, em milliunits
refundPreferenceNãoStringO 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.

ValorO que diz à Apple
DELIVEREDO app entregou uma compra funcional dentro do app
UNDELIVERED_QUALITY_ISSUEA compra não foi entregue por causa de um problema de qualidade
UNDELIVERED_WRONG_ITEMO cliente recebeu o item errado
UNDELIVERED_SERVER_OUTAGEUma queda de servidor interrompeu a entrega
UNDELIVERED_OTHERA 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.

Um celular mostrando um anel de progresso circular preenchido cerca de dois terços, ilustrando consumptionPercentage medido em milliunits onde 100,000 significa totalmente consumido

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.

ValorO que você está pedindo
GRANT_FULLVocê preferiria que a Apple concedesse um reembolso total
GRANT_PRORATEDVocê preferiria um reembolso parcial refletindo o que foi usado
DECLINEVocê 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 antigaCarga atual
Total de campos125
Campos obrigatóriosNa prática nenhum imposto3
Sinal de consumoconsumptionStatus, quatro baldesconsumptionPercentage, milliunits exatos
Preferência de reembolsoEnum numéricoString nomeada, 3 valores
Perfilamento de contatempo de conta, gasto de vida, reembolsos, tempo de uso, statusRemovido

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

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.