Estaba revisando el webhook de nuestro checkout y me encontré con que el payload tiene un campo "amount_captured" que no coincide con el "amount_total". En nuestro caso, el total es mayor porque incluye el envío, pero el webhook solo captura el subtotal de los ítems. Ahora me pregunto si esto es un comportamiento esperado de la API de Stripe o si hay algo mal configurado en nuestro flujo, porque el cliente paga todo, pero nuestro sistema solo registra la parte de los productos.
|
Qué pasa si amount_captured no coincide con amount_total en Stripe webhook?
|
|
Puede ser un desajuste entre lo que captura Stripe y lo que calculas como total en tu sistema. amount_captured es la cantidad que Stripe realmente cobró en ese PaymentIntent/Charge; amount_total suele ser el total de la transacción que ves en Checkout o en tu propio pedido, e incluye envío e impuestos. Si amount_captured es menor que amount_total, revisa qué objeto estás mirando (PaymentIntent vs Charge) y si hay una captura parcial. Verifica también la versión de la API y escucha qué evento llega (payment_intent.succeeded, charge.succeeded). Si compartes el payload o el ID del PaymentIntent, te ayudo a mapear los campos.
Me preocupa: el cliente paga todo y el webhook solo te muestra la parte de los ítems. amount_captured debería reflejar lo que se cobró; si el envío no está incluido, podría significar que ese cargo se maneja por separado o que hay un flujo con capturas parciales. Revisa dónde se suma el shipping en tu flujo y si ese monto se incluye en otra captura o en otro evento.
¿Y si el fallo no es Stripe sino el pensamiento lineal del flujo? amount_captured viene del objeto de cobro y puede no incluir shipping si ese cargo se gestiona por separado. No asumas que amount_total en tu sistema coincide con lo que Stripe captura; es mejor mirar los objetos exactos y correlacionarlos por id.
Podría valer la pena replantear: ¿qué significa realmente capturar en este flujo? En Checkout normalmente se captura todo, pero si usas varias fases o cargos, es normal ver amount_captured distinto de amount_total en ciertos eventos. Pregunta solo una cosa: ¿estás esperando un único importe cuando Stripe podría estar usando dos?
Pasos para depurar: identifica el ID del PaymentIntent o del Charge que genera el webhook; consulta ese objeto en Stripe para ver amount, amount_captured y amount_received; mira si la Checkout Session tiene amount_total y si shipping está incluido; revisa si hay otros cargos vinculados a ese pedido; verifica la API version de Stripe para saber qué campos están disponibles; si puedes, comparte redacted payload para confirmar.
No siempre amount_captured tiene que igualar amount_total; el shipping podría estar en otro cargo o en una segunda captura; correlaciona por id antes de sacar conclusiones.
Una mirada más amplia: el concepto de amount_captured pertenece a la facturación y a veces se maneja por separado de la 'orden' total; en sistemas multicanal es común ver dos líneas: productos y envío; puede que el término shipping aparezca como un bloque distinto a nivel de Stripe.
|
|
« Tema anterior | Tema siguiente »
|

