Todos los artículos
Guía práctica7 min de lectura

El order ID del recibo del App Store te dice qué compró el cliente y si Apple ya se lo reembolsó

El endpoint Look Up Order ID de Apple convierte el order ID del recibo del App Store de un cliente en transacciones firmadas, con fechas y motivos de reembolso. Cómo usarlo ante correos de reembolso, qué no puede hacer y cómo se compara con el order ID de Google Play.

Un puesto de soporte con un portátil con la bandeja de entrada y un iPhone que muestra un recibo de compra, donde el order ID del App Store abre la conversación sobre un reembolso

Puntos clave

  • Apple envía por correo un recibo con un order ID cada vez que un cliente hace compras dentro de la app, y el cliente también puede encontrar sus order ID en su historial de compras del App Store.
  • El endpoint Look Up Order ID de la App Store Server API de Apple (GET /inApps/v1/lookup/{orderId}) devuelve una o más transacciones firmadas para un order ID válido, así que soporte ve el productId y el purchaseDate sin adivinar.
  • Una transacción decodificada del App Store incluye revocationDate y revocationReason, así que buscar el order ID muestra si Apple ya reembolsó la compra. El motivo 1 significa que Apple la reembolsó por un problema real o percibido dentro de la app.
  • Look Up Order ID devuelve OrderLookupStatus 1 y ningún array signedTransactions cuando el order ID no es válido para tu app, lo que delata un recibo equivocado o una compra de otra app.
  • Look Up Order ID no está disponible en el entorno sandbox de Apple, y su límite en producción es de 10 solicitudes por segundo por app, aplicado por horas.
  • Los desarrolladores no pueden emitir reembolsos del App Store. Apple los decide en reportaproblem.apple.com, y la única vía del desarrollador para aportar pruebas es responder a un CONSUMPTION_REQUEST en 12 horas.
  • Google Play envía por correo un order ID por cada compra única y cada renovación de suscripción, y el desarrollador puede buscar ese order ID en Play Console y reembolsarlo directamente. Play Console dice que un reembolso no se puede revertir.

Antes de contestar el correo de reembolso de un cliente de iPhone, pídele el order ID del App Store que aparece en su recibo de Apple. Esa cadena, pasada por el endpoint Look Up Order ID de Apple, te dice qué producto compró, cuándo y si Apple ya se lo reembolsó. Sin ella, comparas una captura de pantalla y un correo con tu base de datos y cruzas los dedos. Con ella, sabes en segundos si hablas con un cliente que paga, con un cliente al que Apple ya devolvió el dinero o con alguien que tiene un recibo de otra app.

De dónde sale el order ID del App Store

La documentación de Apple es concreta. Cuando los clientes hacen una o más compras dentro de tu app, el App Store les envía un recibo por correo, y ese recibo contiene un order ID. Los clientes también pueden encontrar sus order ID en su historial de compras del App Store. La página de historial de compras de Apple está en reportaproblem.apple.com y en la app App Store, en Apps y historial de compras, y muestra los últimos 90 días por defecto, con filtros para compras más antiguas.

Así que el cliente ya tiene la llave. Tu formulario de soporte solo tiene que pedírsela.

Por qué un correo electrónico no basta

Apple no comparte contigo el correo de la Cuenta de Apple del cliente. La dirección que escribe a tu buzón de soporte puede no tener nada que ver con la cuenta que pagó. Si defines un appAccountToken en la compra, puedes vincular una transacción con tu propio ID de usuario, pero solo desde tu lado. El order ID funciona desde el lado del cliente, a partir de un recibo que puede reenviar con un toque.

Qué devuelve Look Up Order ID

Look Up Order ID forma parte de la App Store Server API, disponible desde la versión 1.1.0. Llamas a GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId} con tu JWT firmado. Apple dice que la respuesta se basa en el historial de compras dentro de la app del cliente, tanto si instaló, eliminó o reinstaló la app como si no.

Campo o comportamientoLo que dice la documentación de AppleQué hace soporte con ello
OrderLookupStatus 0Order ID válido. La respuesta contiene un array de una o más transacciones firmadasDecodifica cada una y lee la compra
OrderLookupStatus 1La respuesta no contiene un array signedTransactionsTrata el order ID como no válido para tu app. Pide el recibo correcto
productId y purchaseDateApple los señala como los campos para dar soporte al clienteConfirma qué se compró y cuándo
revocationDateEl momento en que el App Store reembolsó la transacción o la revocó de En familiaSi existe, Apple ya devolvió el dinero al cliente
revocationReason0: reembolsada por otros motivos, como una compra accidental. 1: reembolsada por un problema real o percibido dentro de tu appUn 1 es una señal de producto, no solo un ticket de soporte
appAccountTokenEl UUID que defines en la compra, si lo definesVincula el pedido con tu propio registro de usuario
price y currencyApple dice que no se usen para conciliar ingresosUsa los informes de App Store Connect para el dinero
SandboxEl endpoint no está disponible en el entorno sandboxPrueba solo con order ID de producción
Límite de solicitudes10 solicitudes por segundo por app, aplicado por horas. El exceso recibe HTTP 429 con un encabezado Retry-AfterDe sobra para un equipo de soporte, no para barridos masivos

¿Es un recibo válido para mi app?

Esa es la primera pregunta que responde OrderLookupStatus. Un 1 significa que el order ID no corresponde a compras de tu app. Los casos habituales son una errata, un recibo de otra app o un recibo que ni siquiera es del App Store. No reembolses, no des crédito ni restaures nada con un 1. Pide al cliente que revise el recibo otra vez.

¿Apple ya reembolsó esta compra?

Revisa revocationDate en cada transacción decodificada. Si tiene valor, Apple ya reembolsó esa compra o la revocó de En familia, y el cliente ya tiene su dinero. Tus App Store Server Notifications deberían haber enviado un REFUND para la misma transacción, así que también es una forma barata de confirmar que tu servidor de verdad revocó el acceso.

Un desarrollador compara un recibo impreso del App Store con filas de transacciones en un portátil, revisando un order ID del App Store antes de responder a una solicitud de reembolso

Lo que el order ID no puede hacer en el App Store

No puede emitir un reembolso. Los desarrolladores no tienen botón de reembolso en el App Store. Apple decide los reembolsos, y su artículo de soporte envía a los clientes a reportaproblem.apple.com, donde eligen “I'd like to”, luego “Request a refund”, escogen un motivo y seleccionan el artículo. Apple también dice que un cargo pendiente no se puede reembolsar hasta que el cliente tenga el recibo por correo.

El único momento en que tienes voz es el CONSUMPTION_REQUEST de Apple. Cuando un cliente pide un reembolso a Apple, Apple puede enviar esa notificación, y tienes 12 horas para responder con Send Consumption Information. La búsqueda por order ID es una herramienta de soporte. No abre esa ventana ni la amplía.

Lo que cuesta un correo de reembolso cuando te saltas la búsqueda

El soporte sin order ID es por donde el dinero se escapa en silencio. Hay tres patrones que se repiten una y otra vez.

  • Regalos encima de un reembolso. Apple reembolsa la compra, el cliente también te escribe y soporte le da créditos gratis o un mes extra. Cada crédito que regalas consume cómputo, llamadas a API y almacenamiento que pagas tú, en una cuenta a la que ya le devolvieron el dinero.
  • Acceso que nunca se revocó. Si tu gestión de REFUND falló, el cliente reembolsado sigue generando uso. Una búsqueda que muestra un revocationDate mientras tu base de datos dice activo es un informe de error con precio.
  • Cuenta equivocada, arreglo equivocado. Restaurar o dar crédito a la cuenta detrás de un correo reenviado, cuando el order ID pertenece a otra persona, da servicio de pago a alguien que nunca lo compró.

Ninguno de estos casos necesita una disputa ni un plazo para hacer daño. Son simples respuestas de soporte dadas sin datos. Una llamada a la API por ticket elimina las conjeturas.

¿revocationReason 1 significa que hice algo mal?

No necesariamente. Apple dice que el motivo 1 significa que reembolsó la compra por un problema real o percibido dentro de tu app. La palabra percibido pesa mucho ahí. Pero un grupo de reembolsos con motivo 1 en un mismo producto, después de una misma versión, es la señal de producto más clara que te da Apple. Cuéntalos.

Cómo se compara el order ID de Google Play

Google Play funciona al revés. La documentación de facturación de Google dice que los usuarios reciben un correo con un order ID único por cada compra de producto único, por la compra inicial de la suscripción y por cada renovación recurrente, y que puedes usar el order ID para gestionar reembolsos en Play Console. Buscas en Gestión de pedidos por order ID o por el correo completo del usuario, y luego lo reembolsas tú mismo.

PreguntaOrder ID del App StoreOrder ID de Google Play
Dónde lo encuentra el clienteRecibo por correo e historial de compras del App StoreRecibo por correo de cada compra y cada renovación
Cómo lo buscasLook Up Order ID en la App Store Server APIBúsqueda en Gestión de pedidos de Play Console
Puedes reembolsar con élNo. Apple decideSí. Reembolsos totales, y parciales en compras dentro de la app y suscripciones
Ventana de pruebas para el reembolsoCONSUMPTION_REQUEST, 12 horas, Apple decideRevisión de contracargo mediante orders.reviewrefund, 24 horas
Se puede deshacer un reembolsoNo por tiNo. Play Console dice que un reembolso no se puede revertir

En Google Play, el order ID importa más porque eres tú quien pulsa el botón. Play Console dice que reembolsar el pedido de suscripción más reciente elimina la suscripción de inmediato y cancela las renovaciones futuras, mientras que reembolsar un pedido anterior es solo reembolso y deja la suscripción activa. Los reembolsos parciales solo se admiten para pedidos hechos después de marzo de 2018, y no puedes reembolsar parcialmente una app de pago.

Pon el order ID al principio de tu flujo de soporte de reembolsos

  • Pide el order ID en tu formulario de soporte, con una pista de una línea: está en el correo del recibo de Apple o de Google Play.
  • En iOS, llama a Look Up Order ID, decodifica cada transacción y muestra a soporte el productId, el purchaseDate, el revocationDate y el revocationReason en una sola pantalla.
  • Si OrderLookupStatus es 1, detente y pide el recibo correcto. No concedas nada.
  • Si revocationDate tiene valor, confirma que el acceso ya está revocado en tu servidor y cierra el ticket. Sin regalos encima.
  • Si no tiene valor y el cliente quiere su dinero, envíalo a reportaproblem.apple.com y ten listo tu manejador de CONSUMPTION_REQUEST para la ventana de 12 horas. RefundHalt responde a esa solicitud con los datos de consumo que pide Apple.
  • En Android, encuentra el pedido exacto en Play Console antes de reembolsar, y elige a conciencia entre solo reembolso y reembolso con revocación.

Preguntas frecuentes

¿Cómo busco un order ID del App Store como desarrollador?
Llama al endpoint Look Up Order ID de la App Store Server API, GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}, con tu JWT firmado. Un order ID válido devuelve OrderLookupStatus 0 y una o más transacciones firmadas que decodificas para leer el productId, el purchaseDate y cualquier dato de reembolso. El endpoint no está disponible en sandbox.
¿Dónde encuentra un cliente su order ID del App Store?
En el recibo por correo que Apple envía cada vez que hace compras dentro de la app, y en su historial de compras del App Store, en reportaproblem.apple.com o en Apps y historial de compras dentro de la app App Store. El historial muestra los últimos 90 días por defecto, con filtros para compras más antiguas.
¿Puedo reembolsar una compra del App Store con el order ID?
No. Los desarrolladores no pueden emitir reembolsos del App Store. Apple los decide cuando el cliente pide uno en reportaproblem.apple.com. Tu aporte es responder al CONSUMPTION_REQUEST de Apple en 12 horas con Send Consumption Information.
¿Cómo sé si Apple ya reembolsó una compra?
Busca el order ID y revisa revocationDate en cada transacción decodificada. Si tiene valor, Apple reembolsó la compra o la revocó de En familia. revocationReason 0 significa otros motivos, como una compra accidental, y 1 significa un problema real o percibido dentro de tu app.
¿Qué significa OrderLookupStatus 1?
Significa que el order ID no es válido para tu app, y la respuesta no tiene array signedTransactions. Normalmente el cliente envió un recibo de otra app, escribió mal el ID o envió un recibo que no es del App Store. Pide el recibo correcto antes de conceder nada.

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.