El envío de información de consumo de Apple ahora pide cinco campos, no doce, y aquí tienes cada uno
Cuando un cliente pide a Apple un reembolso, la carga de Send Consumption Information es tu respuesta. Apple la redujo de doce campos a cinco, tres obligatorios y dos opcionales. Aquí tienes cada campo, los valores que acepta cada uno y la ventana de 12 horas en la que debes enviarla.

Puntos clave
- La carga de Send Consumption Information de Apple ahora lleva cinco campos, frente a los doce anteriores. Tres son obligatorios, customerConsented, deliveryStatus y sampleContentProvided, y dos son opcionales, consumptionPercentage y refundPreference.
- customerConsented es una barrera firme. La propia guía de Apple indica que, si el cliente no aceptó compartir datos de consumo, no envíes la carga en absoluto.
- deliveryStatus lleva tu señal más fuerte. DELIVERED dice que la compra funcionó, y los cuatro valores UNDELIVERED le dicen a Apple que el cliente nunca recibió un producto funcional.
- consumptionPercentage reemplazó al antiguo enum consumptionStatus de cuatro pasos por un número preciso en milliunits, donde 100,000 milliunits significa que el artículo se consumió por completo.
- refundPreference ahora es una cadena, no un número. Los tres valores son DECLINE, GRANT_FULL y GRANT_PRORATED, y expresa una preferencia, no una decisión. Apple sigue siendo quien decide.
- Envías la carga con un PUT al endpoint de Send Consumption Information identificado por el id de la transacción, y Apple devuelve 202 Accepted con un cuerpo vacío. La ventana es de 12 horas después del CONSUMPTION_REQUEST.
- En las suscripciones de renovación automática Apple calcula el consumo por sí misma a partir del tiempo transcurrido, por lo que consumptionPercentage está pensado para compras consumibles y no renovables.
La lista de datos que Apple te pide cuando un cliente quiere un reembolso se ha vuelto mucho más corta. La carga de Send Consumption Information, la única respuesta que un desarrollador puede aportar a una decisión de reembolso de la App Store, solía tener doce campos. Ahora tiene cinco. Apple la recortó alrededor de la WWDC24 y condensó la mayoría de las antiguas preguntas de perfilado de la cuenta en dos sencillas y un número. Menos campos no es una edición menor. Cambia qué evidencia pondera Apple y cambia qué campos no puedes permitirte equivocar.
Aquí está el motivo por el que esto merece tu atención y no es solo una nota sobre el esquema. Esta carga es el único momento en un reembolso de Apple en el que tu versión de la historia llega a la decisión. Un reembolso de un consumible revierte ingresos que ya gastaste dinero real en entregar, y los cinco campos son cómo le dices a Apple que el producto se entregó y se usó. Si pierdes la ventana de 12 horas o rellenas un campo mal, Apple decide solo con la reclamación del cliente.
Qué es Send Consumption Information
Send Consumption Information es el endpoint de la App Store Server API que llamas después de que Apple envíe a tu servidor una notificación CONSUMPTION_REQUEST. Esa notificación significa que un cliente pidió a Apple un reembolso de una compra dentro de la app y Apple quiere tu aporte antes de decidir. Respondes enviando con un PUT un pequeño cuerpo JSON, el ConsumptionRequest, al endpoint. Apple lo lee, lo pondera frente al historial del cliente y toma la decisión. Tú nunca decides el reembolso. Aportas datos.
El cuerpo es toda la interfaz. No hay un formulario aparte, ni apelación, ni un segundo envío que cuente. Lo que envíes en esa única carga es tu caso completo, así que el significado de cada campo importa más de lo que el número de campos sugiere.
Los cinco campos que Apple pide ahora
El ConsumptionRequest actual tiene cinco miembros. Tres son obligatorios y dos son opcionales. Todo lo que Apple solía preguntar sobre la cuenta del cliente, su antigüedad, su gasto de por vida, sus reembolsos de por vida, su tiempo de juego, se ha eliminado de lo que envías.
| Campo | Obligatorio | Tipo | Qué lleva |
|---|---|---|---|
| customerConsented | Sí | Booleano | Si el cliente aceptó compartir datos de consumo con Apple |
| deliveryStatus | Sí | Cadena | Si tu app entregó un producto funcional |
| sampleContentProvided | Sí | Booleano | Si ofreciste una muestra o prueba gratuita antes de la compra |
| consumptionPercentage | No | Entero | Cuánto de la compra se consumió, en milliunits |
| refundPreference | No | Cadena | Tu resultado preferido para la solicitud de reembolso |
customerConsented es la barrera
customerConsented es un booleano, y es el campo que decide si envías algo en absoluto. Registra si el cliente aceptó que compartas datos de consumo con Apple. La guía de Apple es directa: si el cliente no dio su consentimiento, no envíes la información de consumo. Así que no es un campo que pongas en true para reforzar tu caso. Refleja un sí o no real que ya debes tener, y un false aquí significa que el resto de la carga no debe enviarse.
deliveryStatus es el campo que mueve los reembolsos
deliveryStatus es un enum de cadena, y es la palanca más fuerte que tienes. Le dice a Apple si tu app realmente entregó una compra funcional dentro de la app. Un valor dice sí. Los otros cuatro dicen no, cada uno por un motivo distinto, y cada uno le dice a Apple que el cliente tiene una queja legítima.
| Valor | Qué le dice a Apple |
|---|---|
| DELIVERED | La app entregó una compra funcional dentro de la app |
| UNDELIVERED_QUALITY_ISSUE | La compra no se entregó por un problema de calidad |
| UNDELIVERED_WRONG_ITEM | El cliente recibió el artículo equivocado |
| UNDELIVERED_SERVER_OUTAGE | Una caída del servidor detuvo la entrega |
| UNDELIVERED_OTHER | La compra no se entregó por otro motivo |
sampleContentProvided responde a una pregunta de equidad
sampleContentProvided es un booleano. Registra si diste al cliente una muestra gratuita, una prueba o información clara sobre lo que hace la compra antes de que comprara. Un true aquí es una pequeña señal de equidad: el cliente tuvo la oportunidad de saber qué estaba comprando. No decide nada por sí solo, pero es uno de solo tres campos obligatorios, así que Apple claramente lo quiere en cada respuesta.
consumptionPercentage ahora es un número, no un estado
Este es el campo que más cambió. La carga antigua tenía consumptionStatus, un enum de cuatro pasos: UNDECLARED, NOT_CONSUMED, PARTIALLY_CONSUMED, FULLY_CONSUMED. La nueva carga lo reemplaza por consumptionPercentage, un entero medido en milliunits. 100,000 milliunits significa que el artículo se consumió por completo, así que 50,000 es la mitad y 0 es intacto. Un número preciso supera a un cubo de cuatro opciones, porque te permite decir que un cliente agotó el 90 por ciento de un paquete de créditos en lugar de redondear hacia abajo a consumido parcialmente.
Una salvedad que confunde a la gente. En las suscripciones de renovación automática Apple calcula el consumo por sí misma a partir del tiempo transcurrido, así que consumptionPercentage está pensado para compras consumibles y no renovables. Envíalo donde aplique, y deja que Apple lo derive donde no.

refundPreference expresa una preferencia, no un veredicto
refundPreference es una cadena opcional, y es donde le dices a Apple qué resultado preferirías. También cambió de forma. El campo antiguo era un número con valores como prefer-grant, prefer-decline y no-preference. El nuevo es una cadena con nombre y tres valores.
| Valor | Qué estás pidiendo |
|---|---|
| GRANT_FULL | Preferirías que Apple concediera un reembolso completo |
| GRANT_PRORATED | Preferirías un reembolso parcial que refleje lo que se usó |
| DECLINE | Preferirías que Apple rechazara el reembolso |
Qué eliminó Apple, y por qué importa
El ConsumptionRequest antiguo tenía doce campos. Siete de ellos ya no están en lo que envías. accountTenure, lifetimeDollarsPurchased, lifetimeDollarsRefunded, playTime, userStatus, platform y appAccountToken eran la mitad de perfilado de la cuenta de la carga, los campos que te pedían clasificar a un cliente por cuánto tiempo tenía una cuenta, cuánto había gastado, cuánto le habían reembolsado y cuánto tiempo había usado la app.
Apple los eliminó por un motivo que vale la pena señalar. Esos campos pedían a los desarrolladores entregar un perfil del cliente, y la mayoría de los desarrolladores o los dejaban sin declarar o los adivinaban. Los cinco que quedan tratan sobre la compra y la entrega, datos que realmente puedes verificar desde tus propios sistemas. El cambio va de quién es el cliente a qué pasó con esta compra concreta.
| Carga antigua | Carga actual | |
|---|---|---|
| Total de campos | 12 | 5 |
| Campos obligatorios | En la práctica ninguno impuesto | 3 |
| Señal de consumo | consumptionStatus, cuatro cubos | consumptionPercentage, milliunits exactos |
| Preferencia de reembolso | Enum numérico | Cadena con nombre, 3 valores |
| Perfilado de la cuenta | antigüedad, gasto de por vida, reembolsos, tiempo de juego, estado | Eliminado |
El endpoint y el reloj
Envías la carga con un PUT de HTTP al endpoint de Send Consumption Information, identificado por el id de la transacción de la compra en disputa: PUT /inApps/v1/transactions/consumption/{transactionId}. Un éxito devuelve 202 Accepted, y el cuerpo de la respuesta está vacío. Esa respuesta vacía es esperada, no un fallo. Confirma que Apple puso tus datos en cola, y no te dice nada sobre el resultado final, que llega después como una notificación REFUND o REFUND_DECLINED.
El reloj es la parte que no puedes estirar. Apple te da 12 horas desde el CONSUMPTION_REQUEST para responder. Solo se usa tu primera respuesta, así que la primera carga tiene que ser la completa y correcta. Apple puede enviar el CONSUMPTION_REQUEST más de una vez para la misma compra, pero el plazo de cada uno es fijo, y una revisión manual rara vez cabe dentro de 12 horas entre zonas horarias y fines de semana.
Qué te cuesta un campo mal gestionado
El dinero salió del edificio antes que el reembolso
El reembolso de un consumible no es una reversión limpia. Para cuando un cliente pide que le devuelvan su dinero por un paquete de créditos o un lote de generaciones de IA, tú ya gastaste para entregarlo: inferencia de GPU en cada solicitud, llamadas a API de modelos de terceros facturadas por token, almacenamiento de lo que produjiste, y cualquier pago a creadores o socios ligado a ese uso. El precio de la tienda vuelve al cliente. Tu coste de entrega no vuelve a ti. Así que un reembolso que podrías haber impugnado no es un evento de equilibrio, es una pérdida neta de todo lo que pagaste por atender la cuenta.
Los cinco campos son cómo evitas pagar dos veces
deliveryStatus configurado en DELIVERED y un consumptionPercentage alto son los dos datos que le dicen a Apple que el cliente recibió y usó el producto. Son tu prueba de que el cómputo, las llamadas a la API y el almacenamiento cumplieron su función. Deja la carga sin enviar y Apple nunca lo sabe. Decide a partir de la reclamación del cliente, el reembolso es más probable que se conceda, y tú te comes tanto los ingresos revertidos como el coste de entrega detrás.
Los contracargos son la peor puerta, y el silencio apunta a ella
Un cliente que no consigue satisfacción a través del flujo de reembolsos de Apple todavía puede disputar el cargo con su banco. Un contracargo de tarjeta es definitivo, conlleva una tarifa de disputa fija, y saca la decisión de las manos de Apple y de las tuyas. Responder bien al CONSUMPTION_REQUEST mantiene la disputa dentro del sistema de Apple, donde tienes voz. Ignorarlo empuja los casos límite hacia el único canal donde no tienes ninguna.
Cómo lo gestiona RefundHalt
Los cinco campos parecen simples hasta que tienes que rellenarlos correctamente, dentro de 12 horas, en cada CONSUMPTION_REQUEST, ligados a la transacción correcta. RefundHalt capta la notificación, lee tus propios registros de entrega y uso de esa compra, y envía la carga automáticamente antes de que se cierre la ventana. deliveryStatus refleja lo que tus registros muestran realmente, consumptionPercentage viene del uso real en lugar de una suposición, y refundPreference sigue la política que configuraste una vez. Consigues que el reembolso impugnable se revise con evidencia, no un plazo perdido y una decisión tomada sin ti.
Preguntas frecuentes
- ¿Cuántos campos tiene ahora el Send Consumption Information de Apple?
- Cinco. Tres son obligatorios, customerConsented, deliveryStatus y sampleContentProvided, y dos son opcionales, consumptionPercentage y refundPreference. La versión anterior de la carga tenía doce campos, y Apple eliminó los de perfilado de la cuenta como accountTenure, lifetimeDollarsPurchased y userStatus.
- ¿Qué significa deliveryStatus en un consumption request?
- deliveryStatus le dice a Apple si tu app entregó una compra funcional dentro de la app. DELIVERED significa que sí. Los cuatro valores UNDELIVERED, UNDELIVERED_QUALITY_ISSUE, UNDELIVERED_WRONG_ITEM, UNDELIVERED_SERVER_OUTAGE y UNDELIVERED_OTHER, cada uno dice que no, por un motivo declarado. Es la señal más fuerte de la carga, así que debe coincidir con tus propios registros.
- ¿consumptionPercentage es un porcentaje o un número en bruto?
- Es un entero medido en milliunits, no un porcentaje simple. 100,000 milliunits significa que el cliente consumió la compra por completo, así que 50,000 es la mitad y 0 es intacto. Reemplazó al antiguo enum consumptionStatus, que solo tenía cuatro cubos, de no consumido a consumido por completo.
- ¿Poner refundPreference en DECLINE detiene el reembolso?
- No. refundPreference expresa tu resultado preferido, no decide nada. DECLINE le dice a Apple que preferirías que no reembolsara, y GRANT_FULL o GRANT_PRORATED le dicen lo contrario, pero Apple pondera tu preferencia frente al historial del cliente y su propia política y toma la decisión final.
- ¿Qué pasa si el cliente no consintió compartir datos de consumo?
- Entonces no deberías enviar la carga. customerConsented es un booleano obligatorio, y la guía de Apple es que, si el cliente no aceptó compartir datos de consumo, no respondes al CONSUMPTION_REQUEST en absoluto. El consentimiento es un sí o no real que ya debes tener, no un valor que pones en true para ayudar a tu caso.
- ¿Cuánto tiempo tengo para enviar la información de consumo?
- 12 horas desde que Apple envía la notificación CONSUMPTION_REQUEST. Respondes con un PUT al endpoint de Send Consumption Information, y un éxito devuelve 202 Accepted con un cuerpo vacío. Solo se usa tu primera respuesta, así que la primera carga tiene que estar completa, y un proceso manual rara vez cabe dentro de la ventana.
Fuentes y lecturas adicionales
- 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
El piloto automático de reembolsos para App Store y Google Play
Seguir leyendo
Hay un endpoint que devuelve todo el historial de reembolsos de App Store de un cliente, y esto es lo que entrega
El endpoint Get Refund History de Apple devuelve el historial completo de reembolsos de App Store de un cliente como transacciones firmadas. Aquí tienes cada campo, cómo pagina el token revision, por qué es por cliente y no por app, y cuánto te cuesta un reembolso que se te escapa.
Tu app puede mostrar una hoja de solicitud de reembolso dentro de la app, y esto es lo que hace Apple cuando el cliente toca enviar
La solicitud de reembolso dentro de la app de Apple permite que un cliente pida un reembolso sin salir de tu app, en una hoja que Apple construye y revisa. Esto es lo que devuelve beginRefundRequest, los relojes de CONSUMPTION_REQUEST y de 48 horas que arranca en tu servidor, y si vale la pena publicar el botón.