Lee el código de motivo de reembolso que tu servidor ya recibe, y te dice si debes corregir tu app o disputar con el cliente
Cada reembolso que Apple y Google envían a tu servidor lleva un código de motivo. Google Play marca cada anulación con uno de nueve motivos y una fuente, Apple señala si el reembolso culpa a tu app. Aquí tienes lo que significa cada código, cómo clasificarlos en corregir, disputar o aceptar, y cuánto valen en dinero.

Puntos clave
- Cada reembolso que Apple o Google envían a tu servidor lleva un código de motivo de reembolso, y es la única parte de un reembolso que puedes leer después de que el dinero ya se ha movido. Te dice por qué ocurrió el reembolso, lo que te dice qué hacer a continuación.
- La Voided Purchases API de Google Play marca cada anulación con dos números: un voidedReason de 0 a 8 (otro, arrepentimiento, no recibido, defectuoso, compra accidental, fraude, fraude amistoso, contracargo, compra sin confirmar) y un voidedSource de 0 usuario, 1 desarrollador o 2 Google.
- Apple te da una señal más estrecha pero precisa. En una transacción reembolsada, el revocationReason es 1 cuando la App Store reembolsó debido a un problema real o percibido dentro de tu app, y 0 cuando reembolsó por otro motivo, como una compra accidental.
- Los códigos se clasifican en tres grupos. Defectuoso, no recibido, sin confirmar y el código de problema en la app de Apple apuntan a tu producto, así que los corriges. Fraude, fraude amistoso y contracargo son disputas que disputas o previenes. El arrepentimiento y la compra accidental nunca estuvieron en tus manos para detenerlos.
- voidedReason 8, compra sin confirmar, es un reembolso que te facturaste a ti mismo. Google reembolsa y revoca automáticamente cualquier compra que tu app no confirme en tres días, y este código es la forma de encontrar ese error en tu propia integración.
- voidedReason 7, contracargo, es el caro. Para los pedidos de Google Play realizados a partir del 3 de agosto de 2026, un contracargo perdido le cuesta al desarrollador el precio de la compra menos la tarifa de servicio de Play más la tarifa de contracargo del banco, así que contar tus anulaciones con código de contracargo es contar un costo adicional real.
- La Voided Purchases API solo mira 30 días hacia atrás, y filtra por cuándo Google ve la anulación, no por cuándo ocurrió la compra, así que un código de motivo que no captures dentro de esa ventana es un código de motivo que pierdes para siempre.
Cuando Apple o Google reembolsan a uno de tus clientes, el dinero suele haberse ido antes de que tengas voto. Lo que llega a tu servidor después parece un recibo, y la mayoría de los equipos lo tratan como tal. Es más que eso. Cada reembolso lleva un código de motivo de reembolso, y es la única parte de un reembolso que aún puedes leer una vez tomada la decisión. Google Play te dice que el reembolso fue un contracargo, o una solicitud por arrepentimiento, o una compra que tu propia app nunca confirmó. Apple te dice si el reembolso culpó a algo dentro de tu app. Lee ese código y un reembolso deja de ser una línea en un informe y se convierte en una instrucción: corrige esto, disputa esto o deja pasar este. Aquí tienes lo que significa cada código, cómo clasificarlos y cuánto cuesta cada uno.
Qué es realmente un código de motivo de reembolso
Un código de motivo de reembolso es la etiqueta propia de la tienda para explicar por qué se revirtió una compra. Tú no lo estableces y no puedes discutirlo. Llega adjunto al reembolso después del hecho, y las dos tiendas lo exponen en formas distintas y con una resolución muy diferente.
Google Play marca cada anulación con un motivo y una fuente
La Voided Purchases API de Google Play devuelve un registro por cada compra revertida, y cada registro lleva dos enteros que importan. El voidedReason dice por qué se anuló la compra. El voidedSource dice quién lo puso en marcha. Juntos convierten un reembolso escueto en una frase: este pedido se anuló por un contracargo, iniciado por Google, o se anuló por arrepentimiento, iniciado por el usuario. Los lees sondeando la API o suscribiéndote a la notificación de desarrollador en tiempo real que se dispara cuando llega una anulación. En cualquier caso, los dos números son la carga útil que vale la pena conservar.
Apple te da una señal más estrecha, pero precisa
Apple no te entrega un motivo de nueve valores. En una transacción reembolsada, Apple establece revocationReason en uno de dos valores. Un 1 significa que la App Store reembolsó la transacción debido a un problema real o percibido dentro de tu app. Un 0 significa que reembolsó por otro motivo, por ejemplo una compra accidental. El campo aparece solo en transacciones que fueron reembolsadas o revocadas, junto a un revocationDate, dentro de la información firmada de la transacción de la App Store Server Notification REFUND. Dos valores no es mucho, pero el que importa, un 1, es Apple diciéndote que el reembolso fue por tu producto, no por las dudas del cliente.
Los nueve motivos que te da Google Play
El voidedReason de Google es el más rico de los dos, y cada valor vale la pena conocerlo de un vistazo porque cada uno apunta a un lugar distinto. Aquí tienes el conjunto completo, directamente del recurso VoidedPurchase, con lo que cada código te está diciendo realmente que hagas.
| voidedReason | Etiqueta de Google | Lo que el código te está diciendo |
|---|---|---|
| 0 | Otro | Ningún motivo específico registrado. Agrúpalo y vigila el volumen, no el caso aislado. |
| 1 | Arrepentimiento | El cliente cambió de opinión. No había nada mal con tu app. |
| 2 | No recibido | El cliente dice que nunca recibió lo que pagó. Un problema de entrega que revisar. |
| 3 | Defectuoso | La compra no funcionó. Un error del producto, y el código más accionable de esta lista. |
| 4 | Compra accidental | Un clic erróneo o una compra no intencionada. Considera un paso de confirmación más claro. |
| 5 | Fraude | Google marcó la transacción como fraudulenta. No es tu cliente, ni ingresos que ibas a conservar. |
| 6 | Fraude amistoso | El comprador disputó un cargo que hizo y recibió. La evidencia todavía puede tocar este. |
| 7 | Contracargo | El banco revirtió el cargo. El camino más caro, ahora con una tarifa adjunta. |
| 8 | Compra sin confirmar | Tu app nunca confirmó la compra, así que Google la reembolsó automáticamente. Un error en tu código. |
voidedSource te dice quién apretó el gatillo
Junto al motivo se encuentra voidedSource, y responde a una pregunta distinta: quién revirtió esto. Un 0 significa que lo hizo el usuario, mediante autoservicio o un banco. Un 1 significa que lo hizo el desarrollador, que eres tú o tus propias herramientas emitiendo un reembolso. Un 2 significa que lo hizo Google, por su propio criterio, incluido el reembolso automático de una compra sin confirmar. Cuando veas un pico de anulaciones, la fuente es el primer corte. Un muro de fuente 2 es Google actuando sobre tu cuenta, y eso suele ser una señal que apunta de vuelta a tu integración en lugar de a tus clientes.
Clasifica cada reembolso en corregir, disputar o aceptar
La razón por la que un código es útil es que te dice cuál de tres respuestas merece un reembolso. La mayoría de los equipos tratan todos los reembolsos igual y gastan esfuerzo en los que nunca pueden ganar. Los códigos se dividen con claridad.
Corregir: los reembolsos que causó tu producto
Algunos códigos son informes de errores disfrazados de reembolso. Defectuoso (3) y no recibido (2) en Google, y un revocationReason de 1 en Apple, dicen todos lo mismo: el cliente pagó y tu app no entregó. La compra sin confirmar (8) es el más agudo de estos porque la culpa está enteramente en tu código de facturación. Estos son los reembolsos más baratos de eliminar, porque los eliminas corrigiendo algo que es tuyo, no persuadiendo a nadie. Un recuento creciente en este grupo es un defecto del producto con una cifra en dólares adjunta.
Disputar: los reembolsos que alguien está trabajando
Fraude (5), fraude amistoso (6) y contracargo (7) son las disputas. El fraude puro (5) no es tu cliente ni ingresos que ibas a conservar. El fraude amistoso (6), donde el comprador obtuvo exactamente lo que pagó y luego lo disputó, es la única disputa que tu evidencia aún puede mover, y el contracargo (7) es donde se presenta esa evidencia. Cuando uno de estos llega, revocas el acceso si no lo has hecho ya, y donde haya una ventana de revisión abierta la respondes con lo que sabes sobre la cuenta.
Aceptar: los reembolsos que nunca estuvieron en tus manos para detenerlos
El arrepentimiento (1) y la compra accidental (4) son el propio cambio de opinión del cliente. El revocationReason de 0 de Apple también entra aquí. Ninguna función falló y no hubo fraude. Puedes suavizar el grupo de accidentales con una confirmación de compra más clara, pero no puedes disputar un reembolso por arrepentimiento, y el tiempo dedicado a intentarlo es tiempo quitado del grupo de corregir, donde está realmente el dinero.
| Grupo | Códigos de Google | Señal de Apple | Tu acción |
|---|---|---|---|
| Corregir | 2 no recibido, 3 defectuoso, 8 sin confirmar | revocationReason 1 | Encuentra la causa raíz del error de producto o facturación detrás |
| Disputar | 5 fraude, 6 fraude amistoso, 7 contracargo | (aparece vía REFUND, no el motivo) | Revoca el acceso, responde la ventana de revisión con evidencia |
| Aceptar | 1 arrepentimiento, 4 compra accidental | revocationReason 0 | Regístralo, ajusta el flujo de compra, sigue adelante |

La trampa de los 30 días que hace fácil perder los códigos de motivo
Hay un límite estricto por el lado de Google que convierte esto de una función de informes en una fecha límite. Si no estás capturando los códigos de forma continua, los estás perdiendo.
La Voided Purchases API solo mira 30 días hacia atrás
Google es explícito en que la API solo puede mostrar compras anuladas de los últimos 30 días. Las anulaciones más antiguas no se devuelven sin importar qué startTime pases, y el propio valor de startTime no puede establecerse antes de hace 30 días. Peor para una integración ingenua, la ventana de 30 días se mide por cuándo los sistemas de Google ven una compra como anulada, no por cuándo se hizo la compra ni siquiera por el voidedTimeMillis del registro. Así que un código de motivo de reembolso que no extraigas dentro de esa ventana desaparece, y un trabajo de exportación mensual con cualquier hueco descartará silenciosamente las anulaciones que fue demasiado lento para captar.
Cuánto valen los códigos de motivo en dinero
Dos códigos llevan un precio específico, y leerlos es cómo pones un número a problemas que de otro modo se esconden dentro de una tasa de reembolso agregada.
Un código es una factura que te escribiste a ti mismo
voidedReason 8, compra sin confirmar, es el ejemplo más claro de un reembolso que causaste. Google Play requiere que tu app confirme una compra dentro de los tres días de otorgar la habilitación, y si no lo haces, Google reembolsa automáticamente el pedido y revoca el artículo. Cada anulación marcada con 8 es una venta real, de un cliente que quería el producto, devuelta porque una llamada para confirmar la compra nunca se disparó. El monto perdido es el precio de venta completo más el cómputo, las llamadas a la API y el almacenamiento que ya gastaste entregándolo. Este no es un reembolso que negocias. Es un error que cierras, y el código es cómo lo encuentras.
El código de contracargo ahora lleva una tarifa
voidedReason 7, contracargo, cambió de costo el 3 de agosto de 2026. Para los pedidos de Google Play realizados a partir de esa fecha, un contracargo perdido le cuesta al desarrollador el precio de la compra menos la tarifa de servicio de Play, más la tarifa de contracargo del banco, mientras que Google cubre solo su propia tarifa de servicio. Como las tarifas de contracargo son fijas y los precios de los productos no, en una compra dentro de la app barata la tarifa por sí sola puede superar lo que el cliente pagó. Contar tus anulaciones con código 7 es ahora contar una partida, no solo una venta perdida, que es exactamente por qué el grupo de contracargos merece su propia fila en cualquier informe de reembolsos que construyas.
| Código de motivo | Lo que te cuesta | Por qué importa el código |
|---|---|---|
| 8 Compra sin confirmar | Precio de venta completo más el costo de entrega, en una venta que el cliente quería | Es autoinfligido, así que el código es un rastreador de errores |
| 7 Contracargo (pedido a partir del 3 de agosto de 2026) | Precio de venta menos la tarifa de servicio de Play, más la tarifa de contracargo del banco | El único código que añade una tarifa además de la venta perdida |
| 3 Defectuoso | Precio de venta más el costo de entrega, repetido por cada cliente que topa con el error | El volumen en este código dimensiona un defecto de producto en dólares |
| 1 Arrepentimiento | Precio de venta, y el costo de entrega que ya gastaste | Costo real, pero no uno que un cambio de código pueda recuperar |
Cómo se alinean Apple y Google
Las dos tiendas responden a la misma pregunta con resoluciones distintas, así que un informe de reembolsos entre tiendas tiene que normalizarlas en lugar de esperar que coincidan.
| Pregunta | App Store | Google Play |
|---|---|---|
| Dónde vive el código | revocationReason en la transacción firmada de la notificación REFUND | voidedReason en la Voided Purchases API y su notificación |
| Cuántos motivos | Dos: 1 problema en tu app, 0 otro | Nueve, del 0 otro al 8 compra sin confirmar |
| Quién lo hizo | No se desglosa | voidedSource: 0 usuario, 1 desarrollador, 2 Google |
| Hasta cuándo puedes leer | Disponible en la transacción cuando la consultes | Solo los últimos 30 días de anulaciones |
| La señal más precisa | Un 1 significa que el reembolso es sobre tu producto | Los códigos 3, 8 y 7 apuntan cada uno a un costo distinto y corregible |
Las tiendas nunca te darán el mismo código para el mismo reembolso, y está bien. Lo que importa es que ambas te entregan un motivo legible por máquina, y ambas recompensan a un equipo que lo lee. El único bit de Apple te dice cuándo un reembolso es culpa de tu producto. Los nueve motivos de Google y su indicador de fuente te dicen qué error de producto, qué disputa y qué brecha de facturación autoinfligida estás mirando. Ningún código detiene un reembolso. Ambos te dicen qué hacer para que el próximo no ocurra.
RefundHalt captura el código de motivo en cada reembolso en el momento en que llega, en ambas tiendas, y lo retiene bien dentro de la ventana de 30 días de Google para que nada se escape. Clasifica cada anulación en corregir, disputar o aceptar, así que un pico en el código 3 defectuoso te llega como una alerta de producto y un pico en el código 8 sin confirmar te llega como un error de integración, no como una vaga caída en los ingresos. Responde el CONSUMPTION_REQUEST de Apple en 12 horas y la revisión de contracargo de Google Play en 24, y revoca el acceso en el momento en que llega un reembolso o un contracargo. No puedes cambiar el código que una tienda estampa en un reembolso. Puedes asegurarte de leer cada uno y actuar sobre los que realmente te corresponde corregir.
Preguntas frecuentes
- ¿Qué es un código de motivo de reembolso en la App Store y Google Play?
- Es la etiqueta propia de la tienda para explicar por qué se revirtió una compra, entregada a tu servidor con el reembolso. La Voided Purchases API de Google Play devuelve un voidedReason de 0 a 8 y un voidedSource de 0 usuario, 1 desarrollador o 2 Google. Apple establece revocationReason en 1 cuando el reembolso se debió a un problema dentro de tu app, o en 0 por otro motivo, como una compra accidental. Tú no estableces el código ni puedes cambiarlo, pero leerlo te dice si el reembolso apunta a tu producto, a una disputa o a un cambio de opinión del cliente.
- ¿Cuáles son los valores de voidedReason de Google Play?
- Hay nueve: 0 otro, 1 arrepentimiento, 2 no recibido, 3 defectuoso, 4 compra accidental, 5 fraude, 6 fraude amistoso, 7 contracargo y 8 compra sin confirmar. Cada uno lo devuelve por cada compra anulada la Voided Purchases API junto a un voidedSource que dice quién inició la anulación. Los códigos 2, 3 y 8 apuntan a problemas en tu propia app, los códigos 5, 6 y 7 son disputas, y los códigos 1 y 4 son la propia decisión del cliente.
- ¿Qué significa un revocationReason de 1 en Apple?
- Significa que la App Store reembolsó la transacción debido a un problema real o percibido dentro de tu app, en contraste con un valor de 0, que significa que el reembolso ocurrió por otro motivo, como una compra accidental. El campo aparece solo en transacciones reembolsadas o revocadas, junto a un revocationDate, dentro de la información firmada de la transacción de la App Store Server Notification REFUND. Un 1 es Apple diciéndote que el reembolso fue sobre tu producto.
- ¿Por qué Google reembolsó una compra con el código de motivo sin confirmar?
- Porque tu app no confirmó la compra a tiempo. Google Play requiere que confirmes una compra dentro de los tres días de otorgar la habilitación, y si no lo haces, Google reembolsa automáticamente el pedido y revoca el artículo, marcando la anulación con voidedReason 8. Es un reembolso que causaste con un error de facturación, no una solicitud del cliente, así que la solución está en tu código de procesamiento de compras y no en ninguna negociación.
- ¿Hasta cuándo hacia atrás puedo leer los códigos de motivo de reembolso?
- En Google Play, solo 30 días. La Voided Purchases API devuelve las anulaciones de los últimos 30 días e ignora cualquier startTime más antiguo que eso, y mide la ventana por cuándo Google ve la anulación, no por cuándo se hizo la compra. Un código que no captures dentro de los 30 días se pierde, así que deberías suscribirte a la notificación de compra anulada en tiempo real o sondear con un calendario bien dentro de la ventana. El revocationReason de Apple permanece en la transacción cuando la consultes.
Fuentes y lecturas adicionales
- Google Play Developer API: REST Resource purchases.voidedpurchases (voidedReason and voidedSource values)
- Google Play Developer API: Method purchases.voidedpurchases.list (30-day lookback window)
- Google Play: Voided Purchases API overview
- Apple Developer: revocationReason (App Store Server Notifications)
- Apple Developer: Transaction.RevocationReason (StoreKit)
- Apple Developer: Handling refund notifications (revocationDate and revocationReason on REFUND)
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility (August 3, 2026)
- Google Play Billing: Integrate the Google Play Billing Library (acknowledge within three days or auto-refund)
RefundHalt
El piloto automático de reembolsos para App Store y Google Play
Seguir leyendo
Las compras dentro de la app no autorizadas hechas por menores casi siempre se reembolsan al progenitor, y tú asumes el coste
Cuando un menor compra un paquete de monedas en el teléfono de su progenitor, tanto Apple como Google lo reembolsan y ninguno te pregunta antes. Los reguladores lo diseñaron así. Aquí verás cómo funcionan estos reembolsos de compras dentro de la app no autorizadas en cada tienda, la ventana de 15 minutos por donde se va el dinero, y lo que uno te cuesta en realidad.
Nunca fue tuyo el impuesto del reembolso de la app, así que un reembolso te cuesta tu parte, no el total del recibo
Reembolsa una compra dentro de la app y el recibo muestra el precio más el impuesto volviendo atrás. El impuesto nunca fue tu dinero. Apple y Google lo cobran y lo remiten como comerciante registrado, y luego lo revierten en un reembolso sin tocar tu parte. Esto es lo que cuesta de verdad un reembolso, y la única configuración en la que el impuesto pasa a ser tuyo.