Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Pedidos duplicados en WooCommerce: por qué aparecen y cómo evitarlos

Un pedido duplicado es un problema doble: confunde al equipo que despacha y, si hubo dos cobros, genera un reclamo y una devolución. Antes de buscar un plugin que «bloquee duplicados», conviene entender por qué se crean.

Las cinco causas habituales

1. Doble clic en «Realizar el pedido»

Si la pasarela de pago tarda en responder, quien compra cree que no pasó nada y vuelve a hacer clic. El checkout de bloques de WooCommerce desactiva el botón mientras procesa, pero temas o checkouts personalizados antiguos a veces no lo hacen.

2. Quien compra vuelve atrás y reintenta

El pago se demoró, la persona vuelve al checkout y paga de nuevo. Queda un pedido pendiente de pago (el primero) y otro procesando (el segundo). No siempre hay doble cobro, pero sí dos pedidos.

3. Avisos de pago que llegan repetidos

Las pasarelas avisan a tu tienda que un pago se completó (un webhook o notificación). Si tu tienda tarda en responder, la pasarela reintenta. Un plugin de pago mal programado puede crear un pedido nuevo con cada aviso en vez de actualizar el existente.

4. Caché en el checkout

Si una caché guarda la página de finalizar compra, varios clientes pueden recibir el mismo formulario con el mismo código de seguridad, y aparecen pedidos mezclados o repetidos.

5. Optimizadores de JavaScript

Herramientas que retrasan o combinan los scripts (de plugins de caché o servicios como el «Rocket Loader» de Cloudflare) pueden hacer que el formulario de pago se envíe dos veces o que el botón no se desactive.

Detectar duplicados

Este comando lista los pedidos de los últimos 7 días que tienen el mismo correo y el mismo total con menos de 10 minutos de diferencia. Ejecútalo con WP-CLI:

wp eval '
$pedidos = wc_get_orders( array( "date_created" => ">" . ( time() - 7 * DAY_IN_SECONDS ), "limit" => -1, "orderby" => "date", "order" => "ASC" ) );
$vistos = array();
foreach ( $pedidos as $p ) {
	$clave = $p->get_billing_email() . "|" . $p->get_total();
	$hora  = $p->get_date_created()->getTimestamp();
	if ( isset( $vistos[ $clave ] ) && $hora - $vistos[ $clave ]["hora"] < 600 ) {
		printf( "#%d y #%d  %s  %s  (%s / %s)\n", $vistos[ $clave ]["id"], $p->get_id(), $p->get_billing_email(), $p->get_total(), $vistos[ $clave ]["estado"], $p->get_status() );
	}
	$vistos[ $clave ] = array( "id" => $p->get_id(), "hora" => $hora, "estado" => $p->get_status() );
}
'

Mira la combinación de estados:

  • pending / processing: hubo un reintento (causa 2). Normalmente solo hay un cobro. Cancela el pendiente.
  • processing / processing: dos pagos completados. Revisa en el panel de la pasarela si hubo dos cobros y reembolsa uno.
  • Varios en la misma hora exacta: doble clic (causa 1) o avisos repetidos (causa 3).

Corregir la causa

  1. Actualiza el plugin de la pasarela de pago. Los duplicados por avisos repetidos suelen estar corregidos en versiones nuevas. Si persiste, repórtalo al soporte de la pasarela con los números de pedido.
  2. Usa el checkout de bloques de WooCommerce si todavía tienes un checkout antiguo o muy personalizado.
  3. Excluye de la caché las páginas de carrito, finalizar compra y mi cuenta, y cualquier URL con wc-ajax.
  4. Excluye el checkout de los optimizadores de JavaScript (en los ajustes del plugin de caché suele haber una lista de exclusiones por página) y desactiva Rocket Loader si usas Cloudflare.
  5. Revisa la velocidad del checkout: si el pago tarda mucho, la gente reintenta. Un servidor lento o un plugin pesado en el checkout es parte del problema.

Pedidos pendientes que se acumulan

Los pedidos pendientes de pago que nunca se pagaron se cancelan solos si tienes activada la opción Mantener en inventario (minutos) en WooCommerce → Ajustes → Productos → Inventario. Con un valor como 60, después de una hora sin pago el pedido se cancela y el stock vuelve. Así los reintentos no dejan basura.

Nunca borres un pedido sospechoso de duplicado sin revisar antes en la pasarela si tiene un cobro asociado. Cancelarlo o reembolsarlo deja registro; borrarlo, no.

¿Tus pedidos duplicados siguen apareciendo? Cuéntanos en el foro qué pasarela de pago usas y qué estados tienen los pedidos repetidos.