Todos los artículos
Deep dive9 min de lectura

Una compra pendiente parece una venta, pero el dinero no ha llegado, y concederla antes de tiempo regala el producto

Tanto App Store como Google Play tienen un estado de compra pendiente, un pedido que la tienda ha aceptado pero aún no ha cobrado. Si lo desbloqueas antes de que se liquide el pago, cada uno que se cae es puro coste. Aquí tienes cómo funcionan las compras pendientes en cada tienda, cuánto cuesta conceder una por error y cómo gestionarlas sin fugas.

Un cajero entregando un pequeño paquete envuelto por encima del mostrador de una tienda bajo una luz cálida, ilustrando una compra pendiente en la que la mercancía se mueve antes de que se liquide el pago

Puntos clave

  • Una compra pendiente es un pedido real que la tienda ha aceptado pero aún no ha cobrado. Tu código ve una compra nueva, pero el dinero no ha llegado, y puede que nunca llegue.
  • Concede el derecho solo cuando el estado sea PURCHASED en Google Play, o cuando la transacción se haya completado en Apple. Nunca desbloquees con un estado PENDING ni con el resultado pendiente de Apple.
  • En Google Play, los pagos en efectivo en una tienda, las transferencias bancarias y parte de la facturación a través del operador se liquidan fuera de línea, así que la compra vuelve en PENDING, no en PURCHASED, hasta que el cliente paga de verdad.
  • En Apple, una compra pendiente suele ser Ask to Buy, donde un organizador de la familia tiene que aprobarla. La aprobación puede tardar horas o días, y la transacción completada llega más tarde a través de Transaction.updates.
  • Si desbloqueas con un pedido pendiente que luego se cancela, habrás gastado cómputo, llamadas a API, almacenamiento o el pago de un consumible en un cargo que nunca se liquidó. A diferencia de un reembolso, no hay dinero que recuperar, porque nunca se cobró nada.
  • La tienda te avisa cuando un pedido pendiente se cae. Google envía ONE_TIME_PRODUCT_CANCELED, tipo 2, o SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. Apple sencillamente nunca entrega una transacción completada.
  • Un pedido pendiente puede convertirse en una venta real mientras tu app está cerrada, así que vuelve a comprobarlo al regresar: llama a queryPurchasesAsync() en onResume() en Google Play, y sigue escuchando Transaction.updates en Apple.

Alguien toca comprar en tu app. Tus registros muestran un pedido nuevo, tu listener de facturación se dispara y entregas la mercancía. En la mayoría de las compras eso es exactamente lo correcto. En una compra pendiente es un error, porque el pedido existe pero el dinero no. El cliente eligió un método de pago que se liquida más tarde, la tienda todavía espera cobrar, y acabas de entregar una función de pago por un cargo que quizá nunca se liquide. Este es el primo silencioso de un reembolso. Aquí no se revierte nada, porque nunca se cobró nada. Simplemente regalaste el producto.

Una compra pendiente es un pedido real en un estado aún no pagado, y tanto App Store como Google Play tienen uno. Ambas tiendas te dicen claramente que esperes. La trampa es que un pedido pendiente se parece casi por completo a uno completado en tu código, así que una integración que trata cada compra nueva como una venta entrega mercancía en pedidos que la tienda todavía intenta cobrar. Gestiónalo bien y no pierdes nada. Gestiónalo mal y cada pago lento que se cae es puro coste, entregado a tu cuenta.

Qué es en realidad una compra pendiente

Una compra pendiente es un pedido que la tienda ha registrado pero aún no ha cobrado. El comprador inició el flujo, la tienda lo aceptó, y la liquidación ocurre en un lugar que tu app no puede ver. Google Play llama a esto el estado PENDING. Apple lo llama una transacción pendiente, o diferida. Nombres distintos, mismo hecho: la tienda mantiene un pedido abierto mientras espera cobrar, y te ha dicho que no trates ese pedido como dinero.

Google Play: el pago ocurre en otro sitio

Algunos métodos de pago se liquidan fuera de línea. El efectivo en una tienda física, las transferencias bancarias y parte de la facturación a través del operador requieren pasos adicionales entre el toque y el cargo. Cuando un cliente elige uno, Google devuelve la compra en el estado PENDING en lugar de PURCHASED. En un pago en efectivo, el cliente recibe un código por notificación y por correo, lo lleva a una tienda participante y paga al cajero. Hasta que eso ocurre, Google no ha cobrado nada, y tú tampoco. La regla de Google es una línea: usa getPurchaseState() y concede el derecho solo cuando el estado sea PURCHASED. También te dice que no confirmes una compra mientras esté en PENDING, porque la confirmación corresponde a un pedido pagado, no a uno prometido.

Apple: la compra espera el toque de otra persona

El estado pendiente de Apple significa que la transacción necesita una acción externa antes de poder completarse. La más común es Ask to Buy, donde un niño inicia una compra y un organizador de la familia tiene que aprobarla. En StoreKit 2, la llamada de compra devuelve Product.PurchaseResult.pending. En el StoreKit anterior, la transacción se informa como diferida. En cualquier caso, Apple no ha cobrado a nadie, y la transacción finalizada, si llega, arriba de forma asíncrona a través de Transaction.updates. Muestra al cliente un estado de espera y no desbloquees nada hasta que aterrice la transacción completada.

Por qué conceder una compra pendiente te cuesta dinero de verdad

La pérdida aquí no es del tipo reembolso, donde el dinero que contabilizaste se retira. Es peor en un aspecto concreto: no hay dinero que retirar, porque nunca se cobró nada.

Tú entregas y la tienda nunca cobra

Cuando desbloqueas con un pedido pendiente que después se cancela, ya has gastado para servirlo. El cómputo que ejecutó la función, las llamadas a API de terceros que pagaste, el almacenamiento que reservaste y, para un consumible, el pago real de lo que vendiste. Todo eso sale por la puerta en un pedido que no generó ingresos. Un reembolso al menos parte de un cargo que sí ocurrió. Una compra pendiente concedida por error nunca tuvo cargo alguno, así que ni siquiera aparece como dinero que sale. Aparece como nada, que es justo la razón por la que es fácil pasarla por alto y fácil de repetir.

La señal de cancelación y qué significa

La tienda sí te avisa cuando un pedido pendiente muere. En Google Play, un producto de pago único que se cae envía una notificación ONE_TIME_PRODUCT_CANCELED, tipo 2, y una suscripción que estaba pendiente envía SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20. Cuando esos mismos pedidos sí prosperan, recibes ONE_TIME_PRODUCT_PURCHASED, tipo 1, o SUBSCRIPTION_PURCHASED, tipo 4. En Apple no hay evento de cancelación que capturar, porque una transacción diferida que se rechaza sencillamente nunca se convierte en una transacción completada. Si desbloqueaste antes de tiempo, ese silencio es la factura.

PreguntaGoogle PlayApple
Qué la provocaEfectivo, transferencia bancaria, parte de la facturación del operadorAprobación de Ask to Buy, u otra acción requerida
Estado que vesPurchaseState PENDINGresultado pendiente, o una transacción diferida
Concede acceso cuandoEl estado es PURCHASEDLa transacción se ha completado
ProsperóONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4)Transacción completada vía Transaction.updates
Se cayóONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20)Nunca llega una transacción completada
Se cobró dineroNo, no hasta PURCHASEDNo, no hasta que la transacción se completa

La ventana y quién espera a quién

Una compra pendiente no es un reloj contra el que compites. Es un reloj que, desde tu lado, no ha empezado.

Google Play da al cliente días, no minutos

Un pago en efectivo o por transferencia bancaria se liquida según el calendario del cliente, no el tuyo. El pedido permanece en PENDING hasta que el cliente paga o la ventana se agota y Google lo cancela. Tu propia ventana de confirmación de tres días, la que reembolsa automáticamente una compra que no confirmas, ni siquiera empieza hasta que la compra pasa de PENDING a PURCHASED. Así que no hay prisa por servir un pedido pendiente. Solo está la disciplina de esperar a que el estado cambie.

La aprobación de Apple está en el teléfono del organizador de la familia

Una solicitud de Ask to Buy llega al dispositivo del organizador como un aviso que aprueba o rechaza cuando puede. Eso puede ser minutos, horas o un día después, y tu app no puede acelerarlo. El único comportamiento correcto es reflejar el estado de espera y dejar que StoreKit te entregue la transacción completada si la aprobación llega y cuando llegue.

Una caja de cartón sellada junto a un reloj de arena sobre un escritorio, ilustrando una compra pendiente en la que la mercancía está lista pero el pago aún no se ha liquidado

Cómo gestionar las compras pendientes sin fugas

Todo el trabajo se reduce a cuatro hábitos. Ninguno es difícil, y saltarse cualquiera de ellos es por donde se va el dinero.

Concede en el estado pagado, nunca en el pendiente

En Google Play, comprueba getPurchaseState() y concede solo en PURCHASED, y no confirmes una compra mientras esté en PENDING. En Apple, desbloquea solo en una transacción completada y nunca en el resultado pendiente. Esta única regla cierra toda la fuga. Todo lo demás consiste en asegurarte de que de verdad te enteras cuando llega el estado pagado.

Vuelve a comprobar cuando la app regresa

La transición de pendiente a pagado suele ocurrir mientras tu app no se está ejecutando. En Google Play, llama a queryPurchasesAsync() en tu manejador onResume() para recoger los pedidos que pasaron a PURCHASED en segundo plano, y mantén tu listener de Real-time Developer Notifications como la fuente de verdad del lado del servidor. En Apple, escucha Transaction.updates durante toda la vida de la app, porque una transacción aprobada puede llegar mucho después de que la llamada de compra original haya vuelto.

Activa el soporte de pendientes y prueba ambos finales

Google exige que llames a enablePendingPurchases() cuando construyes el BillingClient, y admitir transacciones pendientes para productos de pago único es obligatorio, no opcional. Pruébalo antes de publicar. Los testers con licencia obtienen dos instrumentos de prueba adicionales para formas de pago diferidas, donde el pago se completa automáticamente o se cancela automáticamente al cabo de un par de minutos, para que puedas observar de principio a fin tanto la ruta de pago como la ruta de caída.

Dile al cliente que el pedido no está terminado

Un comprador pendiente es un cliente real en medio de una compra, no un fallo. Muéstrale que el pedido espera su pago o una aprobación, y dale un camino claro de vuelta para terminarlo. Un estado pendiente silencioso pierde ventas que uno bien etiquetado recupera, porque la mayoría de estos compradores todavía quieren la cosa y solo les queda un paso.

Los mismos flujos de Real-time Developer Notifications y App Store Server Notifications que RefundHalt ya lee para reembolsos y contracargos también llevan estas señales. La notificación de compra que dice que un pedido pendiente por fin se liquidó, y la de cancelación que dice que no, aterrizan en tu panel junto al resto de tus eventos de ingresos, así que un pedido pendiente que se cayó es algo que puedes ver en lugar de algo que pagaste por accidente.

La versión corta

Una compra pendiente es un pedido sin pago, y ambas tiendas son explícitas en que debes esperar. Google Play devuelve los pedidos en efectivo, por transferencia bancaria y parte de la facturación del operador en un estado PENDING y te dice que concedas acceso solo en PURCHASED. Apple devuelve una transacción pendiente o diferida para Ask to Buy y otras acciones requeridas, y entrega la transacción completada más tarde a través de Transaction.updates. Desbloquea en el estado pagado, vuelve a comprobar cuando tu app se reanude, activa y prueba el soporte de pendientes, y etiqueta el pedido en espera para el cliente. Haz eso y una compra pendiente no te cuesta nada. Sáltatelo y entregarás un producto de pago por un cargo que nunca llegó, que es la única pérdida sin recibo al que señalar.

Preguntas frecuentes

¿Qué es una compra pendiente?
Una compra pendiente es un pedido que la tienda ha aceptado pero aún no ha cobrado. En Google Play es el estado de compra PENDING, usado para métodos de pago que se liquidan más tarde, como el efectivo, la transferencia bancaria y parte de la facturación del operador. En Apple es una transacción pendiente o diferida, casi siempre una compra de Ask to Buy que espera la aprobación de un organizador de la familia. En ambos casos aún no se ha cobrado dinero, así que no deberías conceder acceso.
¿Debería conceder acceso mientras una compra está pendiente?
No. Concede el derecho solo cuando el estado sea PURCHASED en Google Play, o cuando la transacción se haya completado en Apple. Si desbloqueas una función mientras el pedido sigue pendiente y el pago nunca se liquida, habrás entregado el producto gratis, y no hay cargo que revertir porque nunca se hizo ninguno.
¿Qué métodos de pago provocan una compra pendiente en Google Play?
Los métodos de pago que se liquidan fuera de línea. Los pagos en efectivo en una tienda física, las transferencias bancarias y algunas opciones de facturación del operador requieren pasos adicionales entre el toque y el cargo, así que Google devuelve la compra en el estado PENDING en lugar de PURCHASED. En un pago en efectivo, el cliente recibe un código por notificación y correo, y luego paga en una tienda participante.
¿Qué es Ask to Buy y cómo se relaciona con las compras pendientes?
Ask to Buy es la función de Family Sharing de Apple que permite a un niño solicitar una compra que un organizador de la familia debe aprobar. Mientras la solicitud espera, la compra está en el estado pendiente de Apple, devuelto como Product.PurchaseResult.pending en StoreKit 2 o como una transacción diferida en el StoreKit anterior. La transacción completada solo llega, a través de Transaction.updates, si el organizador la aprueba y cuando lo hace.
¿Qué ocurre si una compra pendiente nunca se paga?
El pedido se cancela y no cambia dinero de manos. En Google Play recibes una notificación ONE_TIME_PRODUCT_CANCELED, tipo 2, para un producto de pago único, o SUBSCRIPTION_PENDING_PURCHASE_CANCELED, tipo 20, para una suscripción. En Apple, la transacción diferida sencillamente nunca se convierte en una transacción completada. Si ya habías concedido acceso, ese es el momento en que la pérdida se vuelve real.
¿Es una compra pendiente lo mismo que un reembolso?
No. Un reembolso revierte un pago que sí se cobró. Una compra pendiente que se cae nunca se cobró en primer lugar, así que no hay nada que revertir y no aparece nada en un informe de reembolsos. Si la desbloqueaste antes de tiempo, el coste es el cómputo, las llamadas a API, el almacenamiento o el consumible que gastaste sirviendo un pedido que no generó ingresos.

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.