Un reembolso con la Advanced Commerce API es la única forma en que un desarrollador de iOS puede iniciar un reembolso, y Apple sigue teniendo la última palabra
La mayoría de los desarrolladores de iOS no pueden reembolsar a un cliente. Las apps que usan la Advanced Commerce API de Apple pueden solicitar un reembolso, revocar una suscripción o devolver un importe personalizado. Así funciona cada endpoint, lo que Apple aún puede rechazar y dónde se pierde el dinero.

Puntos clave
- Un ingeniero de Apple dijo en junio de 2026 que un desarrollador no puede emitir directamente un reembolso por una compra normal en el App Store. Lo único que aporta el desarrollador son los datos de consumo y la refundPreference que envía en respuesta a un CONSUMPTION_REQUEST.
- Las apps aprobadas para la Advanced Commerce API de Apple obtienen un endpoint Request Transaction Refund que pide al App Store reembolsar un cargo único o una transacción de suscripción, además de los endpoints Revoke Subscription y Cancel a Subscription.
- Para llamar a los endpoints de reembolso, revocación y cancelación de la Advanced Commerce API, el Account Holder del desarrollador debe firmar el Advanced Commerce API Addendum, y Apple indica que la llamada devuelve un error si no se ha aceptado la última versión.
- El endpoint Request Transaction Refund acepta un refundType FULL, PRORATED o CUSTOM, y un refundAmount en milésimas de la moneda solo se admite con CUSTOM. Apple indica que el importe debe incluir impuestos en todas las regiones salvo Canadá y Estados Unidos.
- El campo refundRiskingPreference de Apple vale true por defecto, lo que permite al App Store enviar un CONSUMPTION_REQUEST sobre la propia solicitud de reembolso del desarrollador. Apple pide una respuesta en un plazo de 12 horas.
- Los endpoints de reembolso, revocación y cancelación de la Advanced Commerce API están limitados a 5 solicitudes por segundo por app en producción, y sandbox recibe el 10 por ciento de esa cifra.
- Tras una llamada correcta a Revoke Subscription, Apple envía una notificación REFUND y pide a los desarrolladores que corten el servicio a partir de su revocationDate, no antes de que llegue la notificación.
Los desarrolladores de iOS normales no pueden reembolsar a un cliente. En junio de 2026 un App Store Commerce Engineer respondió a una pregunta en el foro de desarrolladores con una sola frase: por ahora, un desarrollador no puede emitir directamente un reembolso. Hay una excepción, y está dentro de la Advanced Commerce API. Las apps que Apple aprueba pueden enviar una solicitud de reembolso con la Advanced Commerce API, revocar una suscripción con devolución del dinero o pedir un importe personalizado. Apple sigue decidiendo si el dinero se mueve.
Qué es la Advanced Commerce API y quién tiene acceso
Apple lanzó la Advanced Commerce API el 23 de enero de 2025. Gestiona las compras In-App de Apple para catálogos excepcionalmente grandes de compras únicas personalizadas, suscripciones y suscripciones con complementos opcionales. No creas cada producto en App Store Connect. Defines los SKU en tu propio servidor y se los envías a Apple en el momento de la compra.
El acceso se concede app por app. Rellenas un formulario de solicitud, y la página de requisitos de Apple nombra tres modelos de negocio que deben ser centrales en la app:
- Catálogos excepcionalmente grandes de compras únicas, como audiolibros, clases, cursos o mini apps.
- Catálogos excepcionalmente grandes de contenido por suscripción, donde la oferta de cada creador es una suscripción propia.
- Una suscripción con complementos opcionales que se renuevan juntos como una sola compra, como canales premium o deportes.
Apple también permite solicitarla cuando otro programa necesita la API. El Mini Apps Partner Program, que paga a sus miembros el 85% de las ventas In-App que cumplen los requisitos en mini apps alojadas, la exige.
Los endpoints de reembolso llegaron después, y requieren una firma
La versión 1.1, con fecha del 24 de marzo de 2025, añadió Request Transaction Refund y Revoke Subscription. La página del programa de Apple dice que las apps que ofrecen contenido por suscripción también pueden optar a usar las API de Cancel, Revoke y Refund para gestionar cancelaciones, validar contenido tras la compra y administrar sus catálogos. Cada página de endpoint añade la misma condición: tu Account Holder debe firmar el Advanced Commerce API Addendum, y si la última versión no está aceptada, la llamada devuelve un error. Es el Addendum, no la documentación, el que enumera los casos de uso previstos para cada endpoint.
Los tres endpoints, uno al lado del otro
| Cancel a Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| Ruta | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| Cubre | Suscripciones con renovación automática | Una suscripción y todos sus elementos | Cargos únicos y transacciones de suscripción |
| Devolución | Ninguna | FULL o PRORATED | FULL, PRORATED o CUSTOM, por SKU |
| Acceso | Continúa hasta el final del periodo | Termina en revocationDate | Se fija por elemento con el indicador revoke |
| Límite en producción | 5 por segundo | 5 por segundo | 5 por segundo |
Cancel a Subscription detiene el próximo cargo
Cancel desactiva la renovación automática. Apple dice que el cliente conserva el acceso hasta el final del periodo en curso. No se reembolsa nada. Es la opción correcta cuando un cliente quiere irse y ya ha usado el tiempo que pagó.
Revoke Subscription lo termina todo ahora
Revoke pone la renovación automática en false y revoca la suscripción con un reembolso total o prorrateado. Su cuerpo acepta refundReason, refundRiskingPreference, refundType y requestInfo. Después, Apple envía una notificación REFUND a tu endpoint de App Store Server Notifications V2. La instrucción de Apple es concreta: corta el servicio a partir de la revocationDate de esa notificación, y no lo cortes antes de que llegue.
Request Transaction Refund funciona elemento por elemento
Esta es la herramienta precisa. Envías una lista de elementos, y cada uno indica un SKU, un refundReason, un refundType y un indicador revoke. Con CUSTOM también envías refundAmount en milésimas de la moneda, así que 4990 significa 4,99. Si envías un importe con FULL o PRORATED, Apple lo rechaza con el error 4000155. La respuesta incluye una transacción firmada y, en el caso de suscripciones, la información de renovación firmada.
Apple acepta estos valores de refundReason: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER y MODIFY_ITEMS_REFUND. Un séptimo, SIMULATE_REFUND_DECLINE, es solo para pruebas en sandbox y TestFlight, y existe porque el App Store puede decir que no.
Apple aún puede rechazar tu propia solicitud de reembolso
El nombre del endpoint es honesto. Es una solicitud. Dos campos muestran dónde está realmente la decisión.
refundRiskingPreference abre la puerta a una revisión del consumo
Apple describe refundRiskingPreference como la opción que determina si el App Store te pide datos de consumo para fundamentar la decisión de reembolso. Vale true por defecto. Cuando es true, recibes un CONSUMPTION_REQUEST por tu propia solicitud de reembolso y respondes mediante Send Consumption Information. Apple pide a los desarrolladores que respondan en un plazo de 12 horas desde que reciben un CONSUMPTION_REQUEST. Si lo pones en false, esa notificación no llega.
Los errores que te dicen que no
| Error | Código | Qué dice Apple |
|---|---|---|
| AlreadyRefundedError | 4030021 | La transacción ya se reembolsó |
| PendingRefundError | 4000181 | La transacción tiene reembolsos pendientes |
| TransactionNotRefundableError | 4030024 | La transacción no es reembolsable |
| TransactionCannotBeRefundedContactSupportError | 4030025 | El cliente puede contactar con el soporte de Apple |
| RefundAmountWithoutCustomError | 4000155 | Se envió un importe sin CUSTOM |
PendingRefundError es el que debes prever. Una causa probable es un cliente que ya lo pidió a Apple mediante Report a Problem antes de que actuara tu equipo de soporte. Las reglas de elegibilidad de Apple exigen que estas apps ofrezcan de todos modos una vía dentro de la app para pedir un reembolso, ya sea un enlace a Report a Problem o la API beginRefundRequest, así que las dos puertas siguen abiertas a la vez.

Lo que te cuesta en dinero un reembolso con la Advanced Commerce API
Reembolsar por iniciativa propia parece más barato que pelear una disputa. Sigue siendo dinero que sale, y la API facilita repetir ciertos errores a gran escala.
Impuestos dentro del importe personalizado
Apple dice que el refundAmount solicitado debe incluir impuestos en todas las regiones salvo Canadá y Estados Unidos. Un equipo que calcula un reembolso CUSTOM a partir del precio del SKU sin impuestos reembolsará de menos a los clientes de todas las demás tiendas, y luego pagará tiempo de soporte para corregir cada caso.
Costes que no vuelven
- Pagos a creadores: en un catálogo de creadores o en una plataforma de mini apps, la parte del creador suele pagarse con la venta. Un reembolso al cliente no la recupera.
- Licencias de contenido: las tarifas por título que se deben a un titular de derechos por un audiolibro o un curso pueden activarse con el acceso, según tu contrato, y un reembolso no las revierte.
- Cómputo: el streaming, la transcodificación y cualquier trabajo de servidor hecho para la compra ya están en tu factura.
- Llamadas a API: los servicios de terceros que cobran por solicitud, desde voz hasta inferencia de modelos, siguen cobrados después del reembolso.
Total cuando querías un solo elemento
Revoke Subscription reembolsa y termina toda la suscripción, complementos incluidos. Si el cliente solo discute un complemento, Request Transaction Refund te permite reembolsar solo ese SKU, con revoke activado únicamente para ese elemento. Llamar a Revoke Subscription por una queja sobre un solo elemento devuelve también los ingresos del plan base.
Una lista de comprobación antes de activar esto
- Confirma que tu Account Holder ha aceptado el Advanced Commerce API Addendum vigente, y configura una alerta para el error que aparece cuando caduca.
- Genera un requestReferenceId UUID nuevo para cada solicitud, y reutiliza el mismo solo para reintentar una llamada que agotó el tiempo.
- Pon en cola las llamadas de reembolso. El límite es de 5 por segundo por app, y un 429 trae una cabecera Retry-After en milisegundos UNIX.
- Prueba los rechazos en sandbox con SIMULATE_REFUND_DECLINE, y recuerda que los límites de sandbox son el 10 por ciento de los de producción.
- Decide refundRiskingPreference caso por caso, y ten listo un respondedor de consumo para la ventana de 12 horas cuando siga en true.
- Corta el acceso solo cuando llegue la notificación REFUND, a partir de su revocationDate.
- Registra el motivo, el importe y el SKU de cada solicitud, para que tu propia tasa de reembolsos sea visible antes que la de Apple.
Preguntas frecuentes
- ¿Puede un desarrollador de iOS reembolsar directamente a un cliente?
- No en una compra normal del App Store. Un ingeniero de Apple dijo en junio de 2026 que un desarrollador no puede emitir directamente un reembolso. Las apps aprobadas para la Advanced Commerce API, con el Addendum firmado, pueden solicitarlo mediante el endpoint Request Transaction Refund, y Apple sigue decidiendo.
- ¿Qué diferencia hay entre Cancel y Revoke en la Advanced Commerce API?
- Cancel desactiva la renovación automática y el cliente conserva el acceso hasta que termina el periodo, sin reembolso. Revoke termina de inmediato la suscripción y todos sus elementos y reembolsa el importe total o prorrateado. Apple envía una notificación REFUND después de una revocación.
- ¿Puedo reembolsar un importe personalizado con la Advanced Commerce API?
- Sí. Pon refundType en CUSTOM y envía refundAmount en milésimas de la moneda. Apple dice que el importe debe incluir impuestos en todas las regiones salvo Canadá y Estados Unidos, y enviar un importe con FULL o PRORATED devuelve el error 4000155.
- ¿Recibiré un CONSUMPTION_REQUEST por un reembolso que solicité yo mismo?
- Puede pasar. refundRiskingPreference vale true por defecto, lo que permite al App Store pedirte datos de consumo mediante un CONSUMPTION_REQUEST, y Apple pide una respuesta en un plazo de 12 horas. Si lo pones en false, Apple dice que esa notificación no se enviará.
- ¿Por qué falló mi solicitud de reembolso con la Advanced Commerce API?
- Revisa el código de error. 4030021 significa que la transacción ya se reembolsó, 4000181 que ya hay un reembolso pendiente, 4030024 que no es reembolsable y 4030025 que el cliente debe contactar con el soporte de Apple. Un Addendum sin firmar o desactualizado también devuelve un error.
Fuentes y lecturas adicionales
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
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.