tiendalab.
IntegracionesActualizado 21 jun 20268 min de lectura

Action Scheduler: por qué tu sincronización con el ERP se atasca (y cómo verlo)

En corto

Action Scheduler es la cola que WooCommerce usa para procesar tareas pesadas —como sincronizar con el ERP— en segundo plano. Se atasca cuando depende de WP-Cron, que solo avanza con las visitas: de noche y fines de semana la cola se apila. El arreglo es darle un cron real del sistema y que el conector encole por diferencias, no por fuerza bruta. La cola se revisa en WooCommerce → Estado → Acciones programadas.

Cuando una tienda WooCommerce conectada a un ERP empieza a "atrasarse" —el stock tarda horas en reflejarse, un pedido no baja, los precios quedan viejos— el primer instinto es culpar a la integración. Casi siempre el problema está un piso más abajo, en una pieza que casi nadie mira: Action Scheduler, el motor de colas que WooCommerce usa para hacer su trabajo pesado en segundo plano. Si la cola se atasca, la sincronía se detiene sin que nada se rompa a la vista. La tienda sigue en línea, bonita, mintiendo.

Qué es Action Scheduler y por qué te importa

Action Scheduler es una librería de colas que viene dentro de WooCommerce. Su trabajo es simple de describir: tomar tareas que no deben correr durante la visita de un cliente —enviar un correo, generar un reporte, sincronizar stock con el ERP— y ejecutarlas más tarde, en lotes, en segundo plano. Cuando ERPSync o cualquier conector baja un pedido al ERP o sube el stock a la web, no lo hace en el instante exacto del evento: encola una acción y Action Scheduler la procesa cuando le toca el turno.

Eso es lo correcto. Hacer una llamada al ERP en medio del checkout sería frágil: si el ERP demora o falla, el cliente vería un error al pagar. La cola desacopla el evento de su procesamiento. El costo de ese desacople es que ahora tienes una cola, y las colas se llenan, se atascan y se quedan sin quien las procese. Entender Action Scheduler es entender por qué tu integración va al día o va atrasada.

Dónde se ve la cola

WooCommerce trae una pantalla para esto que pocos abren: WooCommerce → Estado → Acciones programadas (Scheduled Actions). Ahí está la verdad de tu cola, filtrable por estado:

EstadoQué significa
PendingEncolada, esperando su turno. Unas pocas es normal; miles, no.
In-progressEjecutándose ahora.
CompleteTerminó bien.
FailedFalló. Acá viven los pedidos que no bajaron y el stock que no subió.
CanceledSe anuló antes de correr.

La regla de lectura es directa: una cola sana tiene pocas pending, casi ninguna failed, y las complete avanzan con timestamps recientes. Si ves miles de pending acumulándose o una pila de failed, tu sincronía no está al día aunque el sitio cargue perfecto. Ese es el tablero que hay que mirar antes de declarar "la integración no funciona".

Por qué se atasca: el cron que no es cron

Acá está la causa raíz de la mayoría de las colas detenidas. Por defecto, WordPress no usa el cron del sistema operativo: usa WP-Cron, que no es un reloj real. WP-Cron se dispara con las visitas. Cada vez que alguien entra a la tienda, WordPress revisa "¿hay tareas pendientes?" y procesa unas cuantas. Action Scheduler se monta sobre ese mecanismo.

El problema se ve solo: una tienda B2B mayorista no tiene tráfico parejo. Recibe visitas en horario de oficina y queda muerta de noche y los fines de semana. Si la cola depende de las visitas para avanzar, de madrugada nadie la empuja y las tareas se apilan. Llega el lunes, entra el primer vendedor, y WordPress intenta procesar el fin de semana entero de una vez —y choca contra el límite de tiempo o de memoria de PHP. La cola no avanza; empeora.

El arreglo es desconectar Action Scheduler de las visitas y darle un reloj real. Se desactiva WP-Cron en wp-config.php:

define( 'DISABLE_WP_CRON', true );

Y se agenda un cron del sistema que llame al procesador cada minuto, independiente del tráfico. En un VPS o un hosting administrado para WooCommerce esto es estándar; en un compartido barato muchas veces ni siquiera es posible, y esa es una de las razones por las que una tienda mayorista termina necesitando otro hosting. El cron real es la diferencia entre una cola que avanza a las 3 de la mañana y una que espera a que alguien la visite.

El otro cuello: el catálogo grande

Aun con un cron real, una cola puede atascarse por volumen. Un catálogo de miles de SKU que sincroniza por fuerza bruta —reencolar todo el inventario cada vez— genera más acciones de las que el procesador alcanza a vaciar en su ventana. La cola crece más rápido de lo que se drena.

La solución no es procesar más fuerte, es encolar menos. Una integración bien hecha sincroniza por diferencias: solo encola lo que cambió desde la última corrida, no el catálogo completo. Y procesa por lotes acotados, con un tope de acciones por tanda, para no reventar el límite de PHP. Esto no se configura desde la pantalla de WooCommerce; es una decisión de cómo está construido el conector. Es, otra vez, la diferencia entre un plugin genérico y una integración mantenida: el genérico suele encolar todo cada vez porque es lo simple de programar, y funciona hasta que el catálogo crece.

Cuando una acción falla

Una acción en failed no es ruido para ignorar: es un pedido que no llegó al ERP o un cambio de stock que no subió a la web. Cada falla guarda un log con el motivo, y los motivos se repiten:

  • El ERP no respondió a tiempo. Timeout. La acción debería reintentar sola, con espera creciente, no morir al primer intento.
  • Dato rechazado. El ERP devolvió un error de validación —un RUT mal formado, un producto que no existe de su lado—. Eso no se arregla reintentando; hay que corregir el dato.
  • Acción duplicada. Un reintento sin clave única hizo que el ERP generara el documento dos veces. Por eso los pedidos deben bajar de forma idempotente: que reintentar la misma acción no cobre ni facture dos veces.

Una integración seria trata la cola como lo que es —infraestructura crítica— y avisa cuando se llena de fallas, en lugar de dejar que se acumulen silenciosas hasta que un cliente reclama que su pedido nunca llegó. El caso difícil no es que falle una vez; es que falle sin que nadie se entere. Ese silencio es exactamente el problema que resolvemos cuando heredamos una tienda que "andaba bien" hasta que dejó de sincronizar.

La cola no se rompe con estruendo. Se llena de a poco, en silencio, y un día el stock de la web lleva tres días atrasado y nadie sabe desde cuándo.

Qué revisar si tu sincronía va atrasada

Antes de tocar el conector, mira la cola. El orden importa:

  1. Abre WooCommerce → Estado → Acciones programadas y cuenta las pending y las failed.
  2. Si hay miles de pending acumuladas, sospecha del cron: confirma que haya un cron real del sistema y no WP-Cron dependiente de visitas.
  3. Si hay muchas failed, abre los logs y separa los timeouts (problema de capacidad o de reintentos) de los rechazos de datos (problema de origen).
  4. Si la cola crece más rápido de lo que se vacía, el conector está encolando de más: necesita sincronizar por diferencias y por lotes, no por fuerza bruta.

La cola de Action Scheduler es el pulso de tu integración. Una tienda conectada de verdad la tiene siempre baja y al día, con un reloj propio que la empuja aunque no entre nadie. Si la tuya se llena de noche y se descuadra los lunes, el problema no es WooCommerce ni el ERP: es la pieza del medio que nadie estaba mirando. Si quieres que alguien la mire por ti —y responda cuando se atasca a las dos de la mañana— eso es justamente la permanencia que un theme instalado y abandonado nunca te va a dar.

Preguntas frecuentes

¿Dónde veo la cola de Action Scheduler en WooCommerce?
En WooCommerce → Estado → Acciones programadas. Ahí se ven las acciones por estado: pending (esperando), in-progress, complete, failed y canceled. Una cola sana tiene pocas pending, casi ninguna failed y las complete avanzan con timestamps recientes.
¿Por qué la sincronización con el ERP se atrasa de noche y se descuadra los lunes?
Porque por defecto Action Scheduler depende de WP-Cron, que solo se dispara con las visitas. Una tienda B2B no tiene tráfico de noche ni fines de semana, así que la cola se apila y el lunes WordPress intenta procesar todo de golpe, chocando contra el límite de PHP. El arreglo es desactivar WP-Cron y agendar un cron real del sistema.
¿Qué significa que una acción quede en estado failed?
Es un pedido que no bajó al ERP o un cambio de stock que no subió a la web. Cada falla guarda un log: los timeouts indican que el ERP no respondió a tiempo y deberían reintentarse solos; los rechazos de datos (un RUT mal formado, un producto inexistente) no se arreglan reintentando, hay que corregir el dato.

Software que funciona conectado.

Partamos por un diagnóstico de tu WooCommerce. Te decimos qué se puede hacer y qué no, con un plan priorizado.