Perder notificaciones de reembolso puede costarte los únicos reembolsos que puedes impugnar, y ambas tiendas te permiten recuperarlas si miras a tiempo
Cuando tu servidor pierde una notificación de reembolso, los dos flujos que piden tus pruebas se cierran sin ti. Así reintentan Apple y Google Play, hasta dónde puedes recuperar notificaciones de reembolso perdidas y dónde están los huecos.

Puntos clave
- Apple reintenta cinco veces una entrega fallida de App Store Server Notifications V2, a las 1, 12, 24, 48 y 72 horas del intento anterior, así que el segundo reintento llega unas 13 horas después del primer intento.
- Apple pide responder a un CONSUMPTION_REQUEST en las 12 horas siguientes a recibirlo, así que un servidor que pierde la primera entrega y el reintento de una hora puede ver la solicitud cuando esa ventana probablemente ya ha pasado.
- El endpoint Get Notification History de Apple devuelve las notificaciones V2 de los últimos 180 días en producción, 20 registros por página, y su opción onlyFailures limita los resultados a las notificaciones que nunca llegaron a tu servidor, más las que aún se están reintentando.
- Google Play solo entrega las revisiones de contracargos mediante una PendingRefundReviewNotification, y el pendingRefundToken necesario para llamar a orders.reviewrefund en 24 horas llega en esa notificación. Google no documenta ninguna API aparte que liste las revisiones pendientes.
- Google Cloud Pub/Sub conserva los mensajes sin confirmar 7 días por defecto, con un máximo de 31 días, y borra una suscripción tras 31 días sin actividad de suscriptores salvo que cambies su periodo de caducidad.
- La Voided Purchases API de Google Play recupera reembolsos, revocaciones y contracargos de los últimos 30 días, con una cuota de 6.000 consultas al día y 30 consultas en cualquier periodo de 30 segundos, pero no puede recuperar una revisión de contracargo que nunca respondiste.
- El sandbox de Apple envía cada notificación una sola vez y sin reintentos, así que una rutina de recuperación que solo se ha ejecutado en sandbox nunca se ha probado contra el calendario real de reintentos de Apple.
Perder notificaciones de reembolso es la forma silenciosa en que un desarrollador pierde las dos únicas decisiones de reembolso en las que tiene voz. El CONSUMPTION_REQUEST de Apple y la revisión de contracargos de Google Play empiezan con una notificación, y ambos se cierran con un plazo corto: 12 horas en Apple, 24 horas en Google. Si tu servidor está caído, lento o mal configurado cuando llega ese mensaje, la tienda no te espera. Decide con lo que ya tiene.
La buena noticia es que ninguna de las dos tiendas descarta el mensaje al primer fallo. Apple reintenta y guarda un historial de 180 días que puedes consultar. Google publica a través de Pub/Sub, que conserva durante días los mensajes sin confirmar. La mala noticia es que los tiempos de reintento no encajan con las ventanas de respuesta, y uno de los dos flujos no tiene ninguna API de recuperación.
Cómo entrega cada tienda las notificaciones de reembolso
Apple envía las App Store Server Notifications directamente a una URL HTTPS que configuras en App Store Connect. Google no llama directamente a tu servidor. Publica las notificaciones en tiempo real para desarrolladores (Real-time developer notifications) en un tema de Google Cloud Pub/Sub, y tu suscripción a ese tema las envía a tu endpoint o espera a que tu servidor las extraiga.
| Pregunta | App Store | Google Play |
|---|---|---|
| Canal de entrega | HTTPS POST a tu URL | Tema de Cloud Pub/Sub, push o pull |
| Qué cuenta como éxito | HTTP 200 a 206 | Confirmar el mensaje de Pub/Sub, o un código de éxito en un endpoint push |
| Reintentos | 5 en V2, a las 1, 12, 24, 48 y 72 horas del intento anterior | Pub/Sub reenvía hasta la confirmación o hasta que acaba el periodo de retención |
| Cuánto sobrevive un mensaje perdido | 180 días en Get Notification History | 7 días por defecto en la suscripción, hasta 31 días |
| Reembolso que pide tus pruebas | CONSUMPTION_REQUEST, responder en 12 horas | PendingRefundReviewNotification, responder en 24 horas |
| Respaldo por pull para reembolsos concedidos | Get Notification History, Get Refund History | Voided Purchases API, últimos 30 días |
| Comportamiento en sandbox o pruebas | Un intento, sin reintentos | Send Test Message desde Play Console |
Qué considera Apple un fallo
La documentación de Apple es concreta. Si devuelves cualquier estado de 200 a 206, la entrega termina. Si devuelves un 40x o un 50x, Apple reintenta. Apple también considera fallido cualquier otro código. Cada intento se registra con un sendAttemptResult, y los valores parecen una lista de caídas reales: TIMED_OUT, TLS_ISSUE, CIRCULAR_REDIRECT, NO_RESPONSE, PREMATURE_CLOSE, UNSUCCESSFUL_HTTP_RESPONSE_CODE y algunos más. Para TIMED_OUT, el propio consejo de Apple es comprobar que tu servidor no procesa los mensajes en línea.
Qué considera Google un fallo
En una suscripción push, un código de respuesta de éxito de tu endpoint es la confirmación. En una suscripción pull, tu servidor tiene que confirmar cada mensaje que extrae, o Pub/Sub lo vuelve a entregar. El plazo de confirmación por defecto es de 10 segundos y el máximo es de 600 segundos. La guía de RTDN de Google añade una regla que conviene repetir: una notificación solo dice que algo cambió, así que aun así debes llamar a la Google Play Developer API para obtener el estado completo de la compra.
Por qué el calendario de reintentos de Apple no encaja con la ventana de 12 horas
Los intervalos de reintento de Apple se miden desde el intento anterior, no desde el primero. Si los sumas, obtienes esta cronología para una sola notificación V2 que tu servidor sigue sin recibir.
| Intento | Espera tras el intento anterior | Horas desde el primer intento |
|---|---|---|
| Primera entrega | Ninguna | 0 |
| Reintento 1 | 1 hora | 1 |
| Reintento 2 | 12 horas | 13 |
| Reintento 3 | 24 horas | 37 |
| Reintento 4 | 48 horas | 85 |
| Reintento 5 | 72 horas | 157 |
Apple te pide responder en las 12 horas siguientes a recibir el CONSUMPTION_REQUEST. Si tu servidor está caído en la primera entrega y en el reintento de una hora después, el siguiente intento llega 13 horas después del primero. Apple no dice si una solicitud recibida por primera vez en un reintento obtiene 12 horas nuevas. La lectura prudente es tomar el primer intento como inicio del plazo, lo que significa que los reintentos por sí solos no salvarán una solicitud que perdiste por más de una hora.
¿Reintenta Apple después de un HTTP 400?
Sí, según la documentación. Apple indica los 40x y 50x como los códigos que activan un reintento. En marzo de 2026 un desarrollador informó en los foros de Apple de que los reintentos tras respuestas 400 parecían detenerse, luego dijo que las entregas se reanudaron un día o dos después, y Apple pidió un informe en Feedback Assistant. Toma el comportamiento documentado como la regla y tu propia monitorización como la prueba.
Recupera notificaciones perdidas del App Store con Get Notification History
Get Notification History devuelve las notificaciones de la versión 2 que Apple intentó enviar a tu servidor en el intervalo que elijas. Cada registro incluye el payload firmado completo, así que puedes pasarlo al mismo handler que una notificación en vivo. Cada registro incluye también un array sendAttempts de hasta seis entradas, una por el primer intento y una por cada uno de los cinco reintentos.
- startDate y endDate son obligatorios, y startDate debe estar dentro de los últimos 180 días en producción o de los últimos 30 días en sandbox.
- Pon onlyFailures en true para obtener solo las notificaciones que no han llegado a tu servidor, más las que Apple aún está reintentando.
- Filtra por un notificationType, como CONSUMPTION_REQUEST o REFUND, o por un transactionId para un solo cliente, pero no ambos en la misma solicitud.
- Cada llamada devuelve hasta 20 registros. Sigue llamando con el paginationToken mientras hasMore sea true, y envía el mismo cuerpo de solicitud cada vez.
Hay una salvedad importante para los reembolsos. Apple dice que los registros del historial reflejan el estado de una compra cuando se envió la notificación por primera vez, no el actual. Así que un REFUND recuperado es un hecho del pasado. Antes de revocar el acceso, comprueba el estado actual con los endpoints de transacción o de estado de suscripción.
Las notificaciones V1 no se pueden recuperar así
Get Notification History solo cubre la versión 2. Apple reintenta las notificaciones V1 tres veces, a las 6, 24 y 48 horas del intento anterior, y si todas fallan no hay historial que reproducir. Es un motivo más para pasar a V2 cualquier app que siga en V1.
Recupera notificaciones de reembolso perdidas de Google Play
La red de seguridad de Google es el propio Pub/Sub. Mientras exista tu suscripción, un mensaje que nadie confirmó se queda ahí durante el periodo de retención, 7 días por defecto y hasta 31 días si lo amplías. Cuando tu endpoint vuelve, la entrega se reanuda. Dos ajustes pueden anular eso sin hacer ruido.
- Un tema de mensajes fallidos (dead-letter) saca un mensaje de tu suscripción tras un número fijo de intentos de entrega fallidos. El valor por defecto es 5, y con la política de reintento por defecto de reenvío inmediato, cinco intentos pueden pasar rápido. Si usas uno, vigila ese tema como una segunda bandeja de entrada.
- Una suscripción sin actividad de suscriptores, como conexiones abiertas, pulls activos o pushes correctos, caduca tras 31 días por defecto. Un endpoint que sigue roto durante un mes puede perder la propia suscripción, junto con todo lo que esperaba en ella.
Los reembolsos anulados tienen un respaldo de 30 días
Para los reembolsos que ya ocurrieron, la Voided Purchases API es el respaldo por pull. Lista las compras anuladas de los últimos 30 días, hasta 1.000 por página, con una cuota de 6.000 consultas al día y 30 consultas en cualquier periodo de 30 segundos por app. Pasa type 1 para incluir suscripciones junto a los productos de compra única. Ejecutarla a diario detecta cualquier reembolso que tu canal de notificaciones haya perdido, lo que mantiene fiables los derechos de acceso y las cifras de ingresos.
Las revisiones de contracargos no lo tienen
Una PendingRefundReviewNotification es distinta. Lleva el pendingRefundToken que debes pasar a orders.reviewrefund, y tienes 24 horas desde que la recibes para enviar tu preferencia de reembolso y tus pruebas de uso. Google registra tu primera llamada e ignora el resto. La documentación de Google no describe ningún endpoint que liste las revisiones pendientes, así que si ese mensaje de Pub/Sub se pierde, tus pruebas para ese contracargo se pierden con él.
Lo que cuesta en dinero una notificación de reembolso perdida
Una notificación perdida de un reembolso que ya es definitivo te cuesta trabajo contable. La encuentras después en la Voided Purchases API o en Get Notification History, revocas el acceso si tu política lo exige y tus informes se ponen al día. Molesto, pero barato.
Una notificación perdida en uno de los dos flujos impugnables cuesta dinero de verdad, porque la tienda decide sin tus pruebas. En Apple, eso significa que la decisión de reembolso se toma sin tus datos de consumo. En Google Play, para pedidos realizados después del 3 de agosto de 2026, un contracargo perdido te cuesta el precio de compra menos la comisión de servicio de Play, más la comisión de contracargo que cobra el banco del comprador. Google solo cubre su propia comisión de servicio.
Y el dinero que gastaste en entregar la compra ya se había ido antes de que empezara la disputa.
- Cómputo: tiempo de GPU y de servidor detrás de cada generación, renderizado o respuesta de modelo que el comprador ya usó.
- Llamadas a API: solicitudes a terceros facturadas en el momento en que se hicieron, a menudo por llamada.
- Almacenamiento: archivos y contenido multimedia que creó el comprador, todavía en tu factura de hosting.
- Pagos: participaciones en ingresos ya pagadas a creadores, afiliados o socios por esa venta.
Nada de eso vuelve cuando se aprueba un reembolso. Las pruebas que envías en esas 12 o 24 horas son la única palanca que tienes, y una notificación perdida te la quita.
Una rutina de recuperación que aguanta
- Confirma primero. Guarda el payload en bruto, devuelve un código de éxito y luego procésalo en una cola.
- Consulta Get Notification History de Apple con onlyFailures cada pocos minutos para CONSUMPTION_REQUEST, de modo que una caída cueste minutos de la ventana de 12 horas.
- Ejecuta a diario un barrido de Get Notification History con onlyFailures sobre los últimos días para todos los tipos, y reproduce lo que encuentres.
- Ejecuta a diario una llamada a la Voided Purchases API con type 1 para cada app de Google Play, y concíliala con los reembolsos que ya registraste.
- En Pub/Sub, mantén la retención de mensajes en 7 días o más, configura alertas sobre el tema de mensajes fallidos si tienes uno, y alerta cuando se acumulen mensajes sin entregar.
- Prueba también todo el recorrido en producción. El sandbox de Apple envía cada notificación una sola vez y sin reintentos, y Request a Test Notification junto con Get Test Notification Status muestran exactamente cómo respondió tu servidor.

RefundHalt recibe por ti las notificaciones de ambas tiendas y responde automáticamente a los CONSUMPTION_REQUEST y a las revisiones de contracargos dentro de sus plazos, para que no seas tú quien vigila el reloj.
Preguntas frecuentes
- ¿Durante cuánto tiempo sigue Apple reintentando una notificación del servidor del App Store fallida?
- Unos seis días y medio en la versión 2. Apple reintenta cinco veces, a las 1, 12, 24, 48 y 72 horas del intento anterior, así que el último reintento llega 157 horas después de la primera entrega. Las notificaciones de la versión 1 tienen tres reintentos, a las 6, 24 y 48 horas del intento anterior.
- ¿Hasta cuándo puedo recuperar notificaciones del servidor del App Store perdidas?
- 180 días en producción. El endpoint Get Notification History de Apple devuelve las notificaciones de la versión 2 de los últimos 180 días, o de los últimos 30 días en sandbox, 20 registros por llamada, y la opción onlyFailures limita los resultados a las notificaciones que nunca llegaron a tu servidor.
- ¿Reintenta Apple una notificación si mi servidor devuelve HTTP 400?
- Sí, según la documentación de Apple. Apple reintenta cuando tu servidor devuelve un estado 40x o 50x, y considera éxito de 200 a 206. Cualquier otro estado también cuenta como fallido.
- ¿Puedo recuperar una revisión de contracargo de Google Play perdida?
- Solo mientras el mensaje de Pub/Sub siga existiendo. El pendingRefundToken que necesitas para orders.reviewrefund llega en la PendingRefundReviewNotification, y Google no documenta ninguna API que liste las revisiones pendientes, así que los mensajes sin confirmar de la suscripción, conservados 7 días por defecto, son tu única copia.
- ¿Cómo encuentro los reembolsos de Google Play que mi servidor no recibió?
- Llama a la Voided Purchases API. Devuelve las compras anuladas de los últimos 30 días, incluidos reembolsos, revocaciones y contracargos, con hasta 1.000 resultados por página y una cuota de 6.000 consultas al día por app. Pasa type 1 para incluir suscripciones.
Fuentes y lecturas adicionales
- Apple Developer: Responding to App Store Server Notifications
- Apple Developer: Get Notification History
- Apple Developer: NotificationHistoryRequest
- Apple Developer: Send Consumption Information
- Android Developers: Real-time developer notifications reference
- Android Developers: Help Google dispute chargebacks
- Google Play Developer API: Voided Purchases API
- Google Cloud: Pub/Sub subscription properties
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
El piloto automático de reembolsos para App Store y Google Play
Seguir leyendo
Las solicitudes de reembolso excesivas pueden costarte más que los propios reembolsos, porque ambas tiendas las tratan como una señal de calidad
La directriz 5.6.4 de Apple cita las solicitudes de reembolso excesivas como señal de que una app no cumple los estándares de calidad, y el acuerdo de distribución de Google le permite retirar apps de desarrolladores nuevos por su tasa de reembolsos. Esto es lo que dice cada tienda, lo que cuesta una retirada y cómo mantenerte a salvo.
Verifica las notificaciones del servidor de App Store antes de actuar sobre un reembolso, porque cualquiera puede enviar datos a tu URL de webhook
Una notificación de reembolso no es más que una petición HTTPS hasta que compruebas su firma. Así se verifican las notificaciones del servidor de App Store y los mensajes RTDN de Google Play, qué firma cada tienda y cuánto te cuesta un reembolso falsificado o rechazado por error.