Los motivos de cancelación de una suscripción suelen llegarte antes que la solicitud de reembolso, y Google Play te da muchos más que Apple
Google Play registra los motivos de cancelación de las suscripciones con su encuesta de baja, mientras que Apple solo envía un código de vencimiento. Esto es lo que te dice cada tienda, qué señales anticipan un reembolso o un contracargo y cuánto te cuesta cada una.

Puntos clave
- Google Play pregunta a los suscriptores por qué se van cuando cancelan, y la respuesta llega al desarrollador a través de canceledStateContext.userInitiatedCancellation.cancelSurveyResult en purchases.subscriptionsv2.
- La encuesta de baja de Google Play tiene cinco respuestas que el desarrollador puede leer: uso insuficiente, problemas técnicos, motivos de precio, encontró una app mejor y otro. El texto libre de reasonUserInput solo se rellena cuando el usuario elige otro.
- Una notificación SUBSCRIPTION_CANCELED de Google Play solo incluye el token de compra. El motivo de cancelación hay que obtenerlo con purchases.subscriptionsv2.get, y Google borra todos los campos de cancelación si el usuario restaura la suscripción.
- La App Store Server API de Apple no tiene encuesta de baja. Su campo expirationIntent devuelve uno de cinco códigos: el cliente canceló, error de facturación, sin consentimiento a una subida de precio o conversión de oferta, producto no disponible u otro.
- La notificación DID_CHANGE_RENEWAL_STATUS de Apple con el subtipo AUTO_RENEW_DISABLED puede significar que el App Store desactivó la renovación automática después de que el cliente pidiera un reembolso, no solo que el cliente la apagó.
- Un motivo de cancelación nunca le da al desarrollador voz en un reembolso. Solo el CONSUMPTION_REQUEST de Apple, respondido en 12 horas, y la revisión de contracargos de Google Play mediante orders.reviewrefund, respondida en 24 horas, piden pruebas.
- El suscriptor de Google Play que cancela alegando problemas técnicos es el que más probablemente quiera recuperar su dinero, y en pedidos realizados después del August 3, 2026, un contracargo que gane le cuesta al desarrollador el precio de compra menos la comisión de servicio de Play, más las comisiones del banco.
La mayoría de los suscriptores que acaban recibiendo un reembolso cancelan primero. Esa cancelación lleva un motivo, y las dos tiendas te dan cantidades muy distintas de información. Google Play hace una breve encuesta y envía la respuesta a tu servidor, texto libre incluido. Apple envía un código numérico que indica cómo terminó la suscripción, no por qué el cliente quería irse. Si lees bien ambos, verás venir las solicitudes de reembolso cuando todavía puedes hacer algo al respecto.
Lo que Google Play te dice sobre los motivos de cancelación
Cuando un usuario cancela en el centro de suscripciones de Play, Google le pregunta por qué. La respuesta aparece en el recurso de suscripción que obtienes con purchases.subscriptionsv2.get, dentro de canceledStateContext. Ese objeto solo existe mientras la suscripción está cancelada o vencida, e indica quién la terminó: el usuario, el sistema de Google, tú o un reemplazo, como un cambio de plan.
Cuando fue el usuario, el objeto userInitiatedCancellation contiene dos campos. cancelTime indica cuándo canceló. cancelSurveyResult contiene la respuesta de la encuesta.
| Motivo de la encuesta | Descripción de Google | Lo que suele indicar |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Uso insuficiente de la suscripción | Poco uso, así que poco coste invertido en la cuenta |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Problemas técnicos al usar la app | La señal más fuerte de reembolso y contracargo |
| CANCEL_SURVEY_REASON_COST_RELATED | Motivos relacionados con el precio | Sensibilidad al precio, a veces una renovación inesperada |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | El usuario encontró una app mejor | Ganó un competidor, rara vez hay disputa |
| CANCEL_SURVEY_REASON_OTHERS | Otros motivos | Lee reasonUserInput, las palabras del propio usuario |
| CANCEL_SURVEY_REASON_UNSPECIFIED | Motivo de encuesta no especificado | No hay respuesta con la que trabajar |
La columna de la derecha es nuestra interpretación, no la de Google. Las dos primeras columnas salen directamente de la referencia de la API.
La notificación no incluye el motivo
Una suscripción cancelada dispara una notificación en tiempo real para desarrolladores SUBSCRIPTION_CANCELED, de type 3. Google deja claro que estas notificaciones solo avisan de que cambió el estado de la compra. El payload te da un token de compra y nada más útil, así que tu handler tiene que llamar a purchases.subscriptionsv2.get para leer la respuesta de la encuesta.
La vista de Play Console
No necesitas código para ver los totales. Los informes de suscripciones de Play Console incluyen una tarjeta de cancelaciones que divide la pérdida de suscriptores en voluntaria, involuntaria y otra, y una tarjeta de respuestas a la encuesta de cancelación para los usuarios que decidieron contestar. Las respuestas de texto libre de quienes eligieron otro se pueden descargar como CSV desde la tarjeta de otras respuestas. Esa descarga requiere el permiso View financial data, el mismo que darías a una herramienta que lee tus pedidos.
Lo que Apple te dice y lo que se calla
Apple no tiene ninguna encuesta de cancelación que informe a los desarrolladores. El campo más cercano es expirationIntent, en la información de renovación firmada, y describe cómo terminó una suscripción, no lo que pensaba el cliente.
| expirationIntent | Significado según Apple | Subtipo EXPIRED correspondiente |
|---|---|---|
| 1 | El cliente canceló su suscripción | VOLUNTARY |
| 2 | Error de facturación, como datos de pago no válidos | BILLING_RETRY |
| 3 | Sin consentimiento a una subida de precio o conversión de oferta que lo requería | PRICE_INCREASE |
| 4 | El producto no estaba disponible para la compra al renovar | PRODUCT_NOT_FOR_SALE |
| 5 | Algún otro motivo | Sin subtipo |
El código 1 es el único que describe una decisión del cliente, y no dice nada sobre el motivo. Un cliente que se fue porque la app no paraba de cerrarse y otro que simplemente terminó un proyecto se ven exactamente igual.
La señal escondida en AUTO_RENEW_DISABLED
Hay una notificación de Apple que merece una mirada más atenta. DID_CHANGE_RENEWAL_STATUS con el subtipo AUTO_RENEW_DISABLED suele significar que el cliente desactivó la renovación automática. La documentación de Apple añade un segundo caso: el App Store también desactiva la renovación automática después de que el cliente pida un reembolso.
Así que en iOS, un evento de renovación desactivada puede ser el primer rastro de una solicitud de reembolso. Si la compra es un consumible o una suscripción con renovación automática, puede llegar después un CONSUMPTION_REQUEST, y desde ese momento tienes 12 horas para enviar los datos de consumo. Si llega un evento de renovación desactivada sin ninguna acción visible en tu app, conviene tomarlo como un aviso para tener listos los datos de uso de esa cuenta.
Apple y Google, cara a cara
| Google Play | Apple App Store | |
|---|---|---|
| Pregunta al usuario por qué | Sí, con una encuesta de baja | No hay encuesta visible para el desarrollador |
| Dónde está el motivo | canceledStateContext en purchases.subscriptionsv2 | expirationIntent en la información de renovación |
| Texto libre | reasonUserInput, solo para otro | Ninguno |
| Quién canceló | Usuario, sistema, desarrollador o reemplazo | Se deduce del código y el subtipo |
| Notificación | SUBSCRIPTION_CANCELED, luego llamar a get | DID_CHANGE_RENEWAL_STATUS, EXPIRED |
| Se pierde si el usuario vuelve a suscribirse | Sí, se borra al restaurar | La información de renovación refleja el estado actual |
| Panel | Tarjeta de respuestas a la encuesta de cancelación | Ninguno para motivos |

Dónde una cancelación se convierte en reembolso
Una cancelación detiene el próximo cobro. No devuelve el último. Que el dinero vuelva o no depende del flujo de reembolso al que llegue el cliente después, y la mayoría de esos flujos funcionan sin ti.
- En Google Play, un comprador puede obtener por su cuenta un reembolso dentro de las 48 horas posteriores a la compra, y lo decide Google.
- Los reembolsos a través del soporte de Google o de Apple los decide la tienda.
- El CONSUMPTION_REQUEST de Apple pide tus datos de consumo, con un plazo de 12 horas.
- La revisión de contracargos de Google Play pide pruebas mediante orders.reviewrefund, con un plazo de 24 horas. La decisión del banco sobre un contracargo es definitiva.
Un motivo de cancelación no cambia ninguna de esas reglas. Lo que cambia es lo pronto que sabes qué cliente está descontento, y si tus pruebas están listas cuando llega uno de los dos flujos que las piden.
Lo que te cuesta cada motivo
La respuesta de la encuesta también es una guía aproximada de lo que ya te ha costado atender una cuenta, que es el dinero que te queda en las manos cuando hay un reembolso.
Problemas técnicos
Este es el caro. El cliente usó el producto lo suficiente para encontrarse con problemas, así que ya pagaste el cómputo de sus sesiones, las llamadas a la API del modelo que generaron sus peticiones, el almacenamiento de lo que creó y cualquier pago debido a un creador cuyo contenido usó. Si luego obtiene un reembolso, el precio se devuelve y esos costes se quedan contigo. Si acude a su banco en Google Play, un pedido realizado después del August 3, 2026 te cuesta el precio de compra menos la comisión de servicio de Play, más las comisiones del banco.
Motivos de precio
Una queja por el precio te cuesta menos de lo que parece, salvo que esconda una renovación inesperada. Esa es la historia clásica de un contracargo, así que comprueba si la cancelación llegó justo después de un cobro de renovación y si se enviaron tus recordatorios de renovación.
Uso insuficiente
Poco uso significa costes de servicio bajos, así que aquí un reembolso devuelve sobre todo dinero que no te costó mucho ganar. También es el motivo en el que unos datos de consumo honestos, si Apple los pide, muestran exactamente qué usó el cliente y qué no.
Encontró una app mejor
Estos clientes rara vez disputan nada. Se fueron con un competidor. El motivo sirve para decisiones de producto y casi nunca para defenderte de un reembolso.
Una rutina para leer los motivos de cancelación
- Con cada SUBSCRIPTION_CANCELED de Google Play, llama a purchases.subscriptionsv2.get y guarda canceledStateContext junto con el token de compra y cancelTime.
- Guarda reasonUserInput tal cual cuando el motivo sea otro. Es el único texto libre que te da cualquiera de las dos tiendas.
- Con cada DID_CHANGE_RENEWAL_STATUS de Apple con AUTO_RENEW_DISABLED, registra el evento y recupera el uso de esa cuenta, por si llega un CONSUMPTION_REQUEST.
- Con cada notificación EXPIRED de Apple, registra el subtipo y expirationIntent para que la baja voluntaria y los fallos de facturación no se mezclen.
- En las cancelaciones de Google Play por problemas técnicos, revisa tus registros de errores de esa cuenta y contacta con el cliente antes de que él contacte con su banco.
- Mantén registros de uso por cuenta, para que un CONSUMPTION_REQUEST tenga respuesta en menos de 12 horas y una revisión de contracargo en menos de 24.
Preguntas frecuentes
- ¿Cómo veo por qué canceló un suscriptor de Google Play?
- Llama a purchases.subscriptionsv2.get y lee canceledStateContext.userInitiatedCancellation.cancelSurveyResult. El campo del motivo contiene la respuesta de la encuesta, y reasonUserInput contiene texto libre cuando el usuario eligió otro. Play Console también muestra los totales en la tarjeta de respuestas a la encuesta de cancelación.
- ¿Apple les dice a los desarrolladores por qué un cliente canceló una suscripción?
- No. Apple no tiene una encuesta de baja visible para los desarrolladores. El campo expirationIntent indica cómo terminó la suscripción, con códigos para cliente canceló, error de facturación, sin consentimiento a una subida de precio, producto no disponible u otro, pero no el motivo del cliente.
- ¿La notificación SUBSCRIPTION_CANCELED incluye el motivo de cancelación?
- No. Las notificaciones en tiempo real para desarrolladores de Google Play solo indican que cambió el estado de la compra. Obtén la suscripción con purchases.subscriptionsv2.get para leer el motivo y guárdalo de inmediato, porque Google borra los campos de cancelación si el usuario restaura la suscripción.
- ¿Una notificación AUTO_RENEW_DISABLED de Apple puede indicar una solicitud de reembolso?
- Sí. La documentación de Apple dice que el subtipo AUTO_RENEW_DISABLED cubre tanto que el cliente desactive la renovación automática como que el App Store la desactive después de que el cliente pida un reembolso.
- ¿Puedo retirar el acceso cuando un suscriptor cancela?
- En Google Play no, mientras todavía tenga derecho. Google dice que un suscriptor que canceló conserva el acceso hasta el final del ciclo de facturación, y retirarlo antes infringe la política de suscripciones de Google Play. Usa expiryTime para decidir cuándo termina el acceso.
Fuentes y lecturas adicionales
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- 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.