Que la entrega sea consecuencia del pago, no una tarea que alguien ejecuta
- Publicado el
- • 4 min de lectura•--- vistas
La entrega digital manual tiene una forma que se reconoce desde lejos. Alguien vigila la lista de pedidos, busca un código libre en una hoja de cálculo, lo pega en un correo y lo tacha.
Todas las propiedades de ese sistema se derivan de la persona que está en medio. La entrega tarda lo que esa persona tarde en darse cuenta. Se detiene cuando duerme. Y el mismo código no sale dos veces únicamente porque presta atención, lo cual no es una garantía: es una esperanza con buen historial.
Eventos, no sondeo
El arreglo consiste en colgar la entrega de los eventos que la tienda ya emite:
add_action('woocommerce_order_status_changed', [$this, 'handle'], 10, 4);
Ahora no hay que vigilar nada. Entra el pago, el manejador resuelve un código y el código se adjunta al pedido. Las tres de la madrugada funcionan igual que las tres de la tarde.
Los eventos son preferibles a un cron que rastrea pedidos sin completar por dos motivos: latencia y honestidad. Un rastreador tiene un periodo, y ese periodo es un retraso que decides imponer a cada cliente. Un manejador de eventos se ejecuta cuando ocurre la cosa. Conserva el rastreador como red de seguridad para pedidos cuyo evento se perdió, pero que no sea la vía principal.
Guardar estado, no un tachón
Los códigos deben vivir en una tabla con estado por código, y el motivo no es el orden. Emitir un código y activarlo son hechos distintos. Un código entregado a un cliente que nunca lo canjeó no es lo mismo que uno consumido, y un negocio que no los distingue no puede responder si el cliente recibió realmente aquello por lo que pagó.
Una celda tachada en una hoja de cálculo colapsa ambos hechos en un solo bit. Y lo colapsa de forma destructiva: el estado anterior desaparece.
Una implementación, dos llamantes
Los pedidos rara vez llegan de un solo sitio durante mucho tiempo. Aparece un canal de marketplace y espera la entrega en minutos.
La tentación es escribir una segunda vía de entrega para él, porque la integración vive fuera y no tiene sesión de WordPress. Conviene resistirse. Expón la misma lógica a través de una API autenticada:
POST /wp-json/…/activate-product-code Authorization: Bearer <jwt>
La lógica de entrega queda entonces con exactamente una implementación y dos llamantes. La alternativa de dos implementaciones significa que cualquier cambio futuro en cómo funciona la entrega hay que hacerlo dos veces. Y el día en que alguien lo haga una sola vez, los dos canales empiezan a comportarse distinto. Ese fallo enloquece, porque por separado las dos vías parecen correctas.
Un token, dicho sea de paso, y no una cuenta: darle a una integración una cuenta de administrador le concede todas las capacidades de WordPress para resolver un problema que necesita una.
Haz consultable el canal externo
Si los pedidos vienen de un marketplace, el sistema debe responder con una consulta a la pregunta de qué pedidos llegaron de allí y qué pasó con ellos. Márcalos al crearlos con su origen y su identificador de procedencia.
Sin eso, conciliar los dos sistemas se convierte en una tarea manual periódica, es decir, el trabajo que quitaste de la entrega reaparece en contabilidad. El patrón se repite: todo aquello por lo que vayas a preguntar después, regístralo en el momento en que ocurre. Reconstruirlo más tarde a partir de marcas de tiempo e importes es adivinar con una hoja de cálculo puesta.
Qué le queda al operador
Automatizar la entrega no elimina personas. Cambia lo que hacen: en vez de ejecutar cada entrega, atienden las que fallaron. Es mejor uso de una persona y un trabajo mucho más pequeño, pero solo funciona si los fallos son visibles. Una tubería automatizada que falla en silencio es peor que un proceso manual, porque nadie vigila lo que antes se vigilaba por definición.
Así que el mismo commit que automatiza la entrega debería hacer ruidoso el fallo: una nota en el pedido, un estado que destaque en la lista, una línea de log con el identificador del pedido dentro.
Relacionado
Proyectos

CactusPlay - Tienda de juegos con una red de colaboradores verificados
Antes: los compradores de la CEI comparaban a mano los precios de PlayStation y Xbox entre vendedores dispersos, y cada pedido lo cumplían los propios fundadores. Después: una tienda con catálogo en vivo y un CRM al que podía sumarse cualquier colaborador verificado con datos de pago turcos para tomar pedidos y ganar con ellos. Resultado: más de 20 000 posiciones por hora, cambios de precio que llegan a la tienda y a Yandex.Market sin intervención humana, y un cumplimiento que ya no depende de un solo par de manos.
Artículos
Poner precio a un catálogo contra una tienda que no controlas
Revender significa que tus precios dependen de que otro cambie los suyos. Consultar al cargar la página tumba tu tienda con la suya; una exportación nocturna se queda obsoleta. El camino intermedio es una caché con una estrategia de precio detrás.
Un widget de soporte que ya sabe con quién habla
Pegar un widget de chat en una plantilla funciona hasta que el tema se actualiza, hasta que hay que cambiar un ajuste o hasta que el widget añade una consulta a la base de datos en cada página. Tres decisiones pequeñas lo arreglan todo.
Cobrar a través de una pasarela que pertenece a otro sitio
Cuando la pasarela de pago está contratada por otro sitio, el comprador se marcha y tú tienes que enterarte del resultado de algún modo. Las dos formas en que esta integración suele fallar son una llamada de retorno sin autenticar y dos registros de pedido que se desincronizan.
Disponible para colaboración por contrato
Estoy disponible para colaborar por contrato. Si tiene una idea de proyecto interesante, reserve una llamada por Calendly.
Agenda una llamada de 30 min