Todos los artículos
Análisis a fondo8 min de lectura

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.

Una mujer en el escritorio de su oficina en casa explorando una gran biblioteca de audiolibros y cursos en un iPad junto a un portátil, el tipo de app con un catálogo enorme que puede enviar a Apple una solicitud de reembolso con la Advanced Commerce API

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 SubscriptionRevoke SubscriptionRequest Transaction Refund
RutaadvancedCommerce/v1/subscription/cancel/{transactionId}advancedCommerce/v1/subscription/revoke/{transactionId}advancedCommerce/v1/transaction/requestRefund/{transactionId}
CubreSuscripciones con renovación automáticaUna suscripción y todos sus elementosCargos únicos y transacciones de suscripción
DevoluciónNingunaFULL o PRORATEDFULL, PRORATED o CUSTOM, por SKU
AccesoContinúa hasta el final del periodoTermina en revocationDateSe fija por elemento con el indicador revoke
Límite en producción5 por segundo5 por segundo5 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

ErrorCódigoQué dice Apple
AlreadyRefundedError4030021La transacción ya se reembolsó
PendingRefundError4000181La transacción tiene reembolsos pendientes
TransactionNotRefundableError4030024La transacción no es reembolsable
TransactionCannotBeRefundedContactSupportError4030025El cliente puede contactar con el soporte de Apple
RefundAmountWithoutCustomError4000155Se 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.

Un desarrollador sostiene un iPhone sobre un registro impreso de transacciones y comprueba qué elemento debe cubrir un reembolso con la Advanced Commerce API

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

RefundHalt

El piloto automático de reembolsos para App Store y Google Play

Seguir leyendo

La próxima solicitud de reembolso ya está en camino.

Configura RefundHalt en el tiempo que tardas en leer otro correo de soporte sobre un reembolso que no llegaste a impugnar.