Tango eCommerce para WooCommerce
Documentación completa — versión 3.0.0
Guía rápida
- Instalá y activá el plugin. Al activarse crea sus tablas, las opciones por defecto y las tareas programadas.
- Entrá a Tango eCommerce en el menú lateral. Si todavía no hay credenciales, se abre el asistente de configuración.
- Paso 1 · Conexión: elegí la API (Tango eCommerce o Tango Tiendas) y cargá las credenciales. El asistente prueba la conexión antes de avanzar.
- Paso 2 · Depósito y listas: elegí depósitos, lista de precios, condición de venta y talonario de pedido.
- Paso 3 · Sincronización: activá stock, precios, pedidos e importación de productos nuevos, y elegí el intervalo.
- Paso 4 · Notificaciones: copiá la URL del webhook y cargala en Tango.
- Paso 5 · Productos: vinculá por SKU o importá el catálogo, y activá la integración.
- Revisá el Panel y usá Diagnóstico › Verificar con Tango para confirmar que todo esté en verde.
Novedades de la versión 3.0
- Modo Tango eCommerce (Delta 6): credenciales Llave + Token de desarrollador + IdEmpresa + Cuenta de Integración API, con selector de modo en Configuración › Conexión.
- Asistente de configuración en 5 pasos que se abre en la primera visita sin credenciales y se puede retomar.
- Panel con alertas, estado de conexión, cobertura de vinculación, pedidos con error, último webhook y botones Sincronizar ahora / Sincronización completa.
- Configuración por pestañas (Conexión, Sincronización, Pedidos, Webhooks, Avanzado) y Herramientas: liberar bloqueos, exportar/importar configuración en JSON (sin secretos), abrir el asistente.
- Diagnóstico renovado con Verificar con Tango, Reparar tareas programadas y Copiar informe para soporte.
- Stock: múltiples depósitos (suma), stock centralizado (solo eCommerce), descuento opcional de pedidos pendientes, stock de kits y opción para poner en 0 los productos vinculados que no aparecen en Tango.
- Precios: lista de precios de oferta opcional con fechas de vigencia y control de IVA entre la lista y la tienda (solo eCommerce).
- Sincronización incremental con checkpoint y corrida completa periódica.
- Pedidos: forma de cobro por medio de pago, talonario de pedido y de factura, pagos solo cuando corresponde, reintento automático con esperas crecientes, verificación antes de reenviar (evita duplicados) y Reenviar como nuevo pedido para pedidos rechazados.
- Jerarquía de estados de Tango: los estados atrasados ya no hacen retroceder un pedido.
- Facturas: descarga a través del sitio que renueva la URL de Tango cuando vence, visible en el admin y en "Mi cuenta".
- Checkout por bloques: campos DNI / CUIT y condición frente al IVA, con validación de dígito verificador del CUIT.
- Seguridad: credenciales encriptadas con libsodium, campos secretos enmascarados, webhook con respuesta 401 explícita.
- WP-CLI: comandos
wp tango catalog …para sincronizar, ver estado y listar productos sin vincular. - Filtros para desarrolladores para personalizar pedidos, estados, checkout y la API.
1. Introducción
Tango eCommerce para WooCommerce es un plugin de WordPress que conecta una tienda WooCommerce con Tango Gestión / Tango Punto de Venta. Sincroniza productos, stock, precios y contenido desde Tango, envía los pedidos de la tienda a Tango y trae de vuelta su estado y la factura electrónica.
1.1 Dos APIs de Tango
| Tango eCommerce (recomendada) | Tango Tiendas (legado) | |
|---|---|---|
| Versión de Tango | Delta 6 o superior | Delta 4 / Delta 5 |
| Servidor | https://{llave}.connect.axoft.com/api/eCommerce/ (vía Tango Connect) | https://tiendas.axoft.com/api/Aperture/ |
| Credenciales | Llave + Token de desarrollador + IdEmpresa + Cuenta de Integración API | Access Token |
| Cancelación de órdenes notificada por Tango (OrderCancelled) | Sí | No |
| Stock centralizado / control de IVA de la lista | Sí | No |
Las instalaciones nuevas arrancan en modo Tango eCommerce. Las que vienen de v2 con un Access Token cargado siguen en modo Tango Tiendas hasta que se cambie a mano.
1.2 Qué hace
- Productos: importación inicial del catálogo, alta automática de artículos nuevos y vinculación de productos existentes por SKU, código alternativo o código de barras.
- Stock: suma de uno o varios depósitos, stock centralizado (eCommerce), descuento opcional de pedidos pendientes y cálculo de stock de kits.
- Precios: precio regular desde una lista de Tango y, opcionalmente, precio de oferta desde otra lista con sus fechas de vigencia. Control de IVA entre la lista y la tienda.
- Contenido y categorías: título, descripciones y categoría gestionada por Tango.
- Pedidos: envío automático y asíncrono (no frena el checkout), forma de cobro por medio de pago, pagos solo cuando corresponde, cancelación, reintentos automáticos y reenvío manual.
- Estados y facturas: el estado de Tango se refleja en WooCommerce; la factura en PDF queda disponible en el pedido, en los emails y en "Mi cuenta", y el enlace se renueva solo cuando la URL de Tango vence.
- Checkout: campos DNI / CUIT (con validación de dígito verificador) y condición frente al IVA, en el checkout clásico y en el de bloques.
- Administración: asistente de configuración, panel con alertas, diagnóstico con informe para soporte, registro de actividad exportable, cajas "Tango eCommerce" en la edición de pedidos y productos, exportación/importación de la configuración.
- Compatible con HPOS (High-Performance Order Storage). Sin carga extra en el frontend para los visitantes: las clases se cargan solo cuando hacen falta.
2. Requisitos
2.1 En Tango (modo Tango eCommerce)
- Tango Gestión o Tango Punto de Venta Delta 6 o superior.
- Producto eCommerce activo en Tango Billing.
- Empresa vinculada con Tango Connect y con eCommerce.
- Una Cuenta de Integración API creada en la puesta en marcha de eCommerce.
2.2 En Tango (modo Tango Tiendas, legado)
- Tango Gestión o Tango Punto de Venta Delta 4 / Delta 5.
- Licencia Tango Tiendas Full activa y empresa asociada en Nexo › Tiendas.
- Módulo de Tesorería.
2.3 En el sitio
| Componente | Mínimo |
|---|---|
| WordPress | 5.8 (probado hasta 6.8) |
| WooCommerce | 5.0 (probado hasta 10.2) |
| PHP | 7.4 |
| Action Scheduler | Incluido en WooCommerce. Necesario para enviar pedidos y procesar webhooks en segundo plano. |
| Salida HTTPS | TLS 1.2 o superior hacia Tango. |
| Certificado SSL | Necesario para recibir webhooks: Tango solo notifica a URLs HTTPS con TLS 1.2+. |
| libsodium (extensión sodium de PHP) | Recomendado: con ella las credenciales se guardan encriptadas. |
3. Instalación
- Copiá la carpeta
wc-tango-tiendasenwp-content/plugins/(o subí el ZIP desde Plugins › Añadir nuevo › Subir plugin). - Activá el plugin. Al activarse crea sus tablas, las opciones por defecto y las tareas programadas.
- Entrá a Tango eCommerce en el menú lateral. Si todavía no hay credenciales, se abre el asistente de configuración.
wc-tango-tiendas. Desinstalar el plugin no borra tablas ni opciones.4. Asistente de configuración
El asistente (Tango eCommerce › Asistente de configuración, slug wc-tango-setup) tiene 5 pasos. Cada paso se guarda por separado: podés saltear uno, salir y retomarlo. También se abre desde Configuración › Avanzado › Herramientas › Abrir asistente.
4.1 Paso 1: Conexión
Elegí la API y cargá las credenciales. Al guardar, el asistente prueba la conexión y no avanza si falla.
Tango eCommerce: cuatro datos
| Dato | Dónde se obtiene | Para qué se usa |
|---|---|---|
| Llave Tango | Número de llave del sistema Tango, con la barra (ej. 123456/000). En Tango: Administrador General › Administrador de licencias, en los datos de la licencia. La empresa tiene que tener Tango Connect activo. | Arma la URL de Tango Connect: 123456/000 → https://123456-000.connect.axoft.com/api/eCommerce/ |
| Token de desarrollador | En el menú web de Tango (Tango Nexo): menú de usuario › Desarrollador › Generar. Copiá el «Token de desarrollador» completo. | Header ApiAuthorization. |
| IdEmpresa | Entrá al menú web de Tango con la empresa de la tienda: es el número que sigue a company/ en la dirección del navegador (en …/company/117/menu/10023 es 117). También es la columna IDEmpresa de la tabla Empresa en la base de diccionario. Es numérico. | Header Company. |
| Cuenta de Integración API | En Tango: Ventas › eCommerce › Cuentas de integración API (creada en la puesta en marcha de eCommerce). Escribí el nombre exacto, con mayúsculas y espacios. | Parámetro ?Cuenta= en el envío de pedidos. Sin ella Tango rechaza los pedidos. |
Cada credencial muestra en pantalla dónde encontrarla en Tango y un enlace a la guía oficial de Axoft.
Tango Tiendas (legado)
Pegá el Access Token, que se obtiene en Tango Tiendas (Nexo) desde la opción Api › Obtener, con un nombre de referencia.
POST Dummy). La Cuenta de Integración API se valida en modo best-effort: se envía a Order/Batch un lote vacío, que Tango siempre rechaza (nunca crea órdenes); si la respuesta es "cuenta is not registered", la prueba falla. Cualquier otra respuesta no confirma ni descarta la cuenta, así que la verificación definitiva es el primer pedido.4.2 Paso 2: Depósito y listas
Elegí (se cargan desde Tango):
- Depósitos que abastecen la tienda: uno o varios. Con varios, el stock publicado es la suma. Sin selección se usan todos.
- Lista de precios que se publica.
- Condición de venta (habitualmente 1 = Contado).
- Talonario de pedido (0 = el predeterminado de la Cuenta de Integración).
4.3 Paso 3: Sincronización
Activá o desactivá stock, precios, pedidos e importación de productos nuevos, y elegí cada cuántos minutos corre la sincronización periódica.
4.4 Paso 4: Notificaciones (webhook)
Copiá la URL de notificaciones (incluye un secreto, no la compartas) y cargala en Tango siguiendo los pasos de la sección Webhooks. Si el sitio no usa HTTPS, el paso avisa que Tango no va a poder notificar; podés seguir y configurarlo después. La sincronización periódica funciona igual sin webhook.
4.5 Paso 5: Productos
- Vincular por SKU: si ya tenés productos en WooCommerce. No crea nada.
- Importar productos: crea los artículos que faltan, con stock y precio. Activa la integración y hay que mantener la pestaña abierta mientras corre.
- Activar la integración al finalizar: con la integración activa empiezan a enviarse pedidos y a sincronizarse stock y precios.
Al finalizar vas al Panel.
5. Configuración
Tango eCommerce › Configuración (admin.php?page=wc-tango-settings&tab=<pestaña>). Cada pestaña se guarda por separado: guardar una no modifica las otras.
5.1 Conexión
| Ajuste (opción) | Default | Descripción |
|---|---|---|
| Integración activa (wc_tango_enabled) | No | Con la integración desactivada no se envían pedidos ni se actualizan stock y precios. Las credenciales se conservan. |
| Modo de API (wc_tango_api_mode) | ecommerce (tiendas si se actualizó desde v2 con token) | Tango eCommerce o Tango Tiendas (legado). |
| Llave Tango (wc_tango_ecom_key) | — | Formato 000000/000. Se muestra la URL resultante. |
| Token de desarrollador (wc_tango_ecom_api_token) | — | Secreto, se guarda encriptado. Se muestra enmascarado. |
| IdEmpresa (wc_tango_ecom_company_id) | — | Numérico. |
| Cuenta de Integración API (wc_tango_ecom_account) | — | Nombre exacto de la cuenta. |
| Stock centralizado (wc_tango_ecom_centralize_stock) | No | Solo eCommerce. Pide los saldos centralizados (Centraliza=true) cuando la empresa centraliza el stock de varias sucursales. Si no, Tango devuelve los saldos de la sucursal local. |
| Access Token (wc_tango_access_token) | — | Solo Tango Tiendas. Secreto, se guarda encriptado. |
El botón Probar conexión usa lo escrito en el formulario sin guardarlo; los campos secretos vacíos usan el valor guardado. En eCommerce también intenta validar la Cuenta de Integración API. Dejar vacío un campo secreto y guardar no lo borra.
5.2 Sincronización
| Ajuste (opción) | Default | Descripción |
|---|---|---|
| Stock (wc_tango_sync_stock) | Sí | Actualiza el stock de los productos vinculados desde los depósitos elegidos. |
| Precios (wc_tango_sync_prices) | Sí | Actualiza el precio regular desde la lista elegida. |
| Importar productos nuevos (wc_tango_auto_import_new) | Sí | Crea en WooCommerce los artículos nuevos de Tango (cada 15 minutos). |
| Depósitos (wc_tango_warehouse_code) | Vacío (= todos) | Códigos separados por coma. Con varios, el stock es la suma. |
| Lista de precios (wc_tango_price_list_number) | 1 | Lista que se publica como precio regular. |
| Lista de precios de oferta (wc_tango_sale_price_list_number) | Vacío (= sin oferta) | El precio de esa lista, dentro de sus fechas de vigencia, se publica como precio de oferta. Si es igual a la lista regular se ignora. Las ofertas cargadas a mano se respetan. |
| Si la lista y la tienda difieren en IVA (wc_tango_price_tax_mode) | none (Avisar) | Solo eCommerce. Avisar: publica el precio tal cual y deja una advertencia. Convertir (adjust): ajusta con la tasa estándar base de la tienda. |
| Sincronización periódica cada (wc_tango_stock_cron_interval) | 5 min | Entre 1 y 60. Aplica a stock, precios, estados de pedidos y contenido. Con webhook funcionando alcanza con 15 a 30 minutos. |
| Sincronización completa de stock y precios cada (wc_tango_catalog_full_sync_hours) | 24 h | Entre 0 y 168. Entre corridas completas solo se piden los cambios recientes. 0 = solo la primera corrida es completa. |
5.3 Pedidos
| Ajuste (opción) | Default | Descripción |
|---|---|---|
| Enviar pedidos a Tango (wc_tango_sync_orders) | Sí | Envío automático. Los que fallan por un error temporal se reintentan solos (hasta 5 intentos). |
| Enviar pedidos aún no pagados (wc_tango_send_unpaid_orders) | Sí | Envía también los pedidos en espera (transferencia, pago pendiente); el pago se informa después como modificación. Desactivado: el pedido se envía recién cuando se paga. |
| Talonario de pedido (wc_tango_counterfoil) | 0 | Talonario con el que Tango genera el pedido (OrderCounterfoil). 0 = el predeterminado de la Cuenta de Integración. |
| Talonario de factura (wc_tango_invoice_counterfoil) | 0 | Opcional. Talonario con que Tango factura (InvoiceCounterfoil). 0 = no se envía. |
| Condición de venta (wc_tango_sale_condition) | 1 | Código de condición de venta de Tango. |
| ¿La condición de venta es Contado? (wc_tango_sale_condition_is_cash) | auto (Detectar desde Tango) | Solo con Contado se informan los pagos del pedido. "Detectar" usa el dato Cash de la condición (se guarda 12 h en caché). |
| Provincia por defecto (wc_tango_default_province_code) | 0 (CABA) | Se usa si no se reconoce la provincia del cliente; queda advertencia en el registro y nota en el pedido. |
| Enviar la lista de precios en el pedido (wc_tango_send_price_list) | No | Envía PriceListNumber para que Tango tome el desglose impositivo de esa lista. Si la lista no existe, Tango deja la orden observada. |
| Forma de cobro predeterminada (wc_tango_default_payment_method) | A02 | Para los medios de pago sin asignación. |
| Medios de pago (wc_tango_payment_method_map) | Vacío | Forma de cobro de Tango para cada medio de pago de WooCommerce: A01…A10 (Formas de cobro Web API), MPA (MercadoPago), PPA (PayPal), PUA (PayU), TPA (Todo Pago). Los disponibles dependen de lo configurado en Tango. |
Refrescar datos de Tango borra la caché de condiciones de venta y del IVA de las listas (12 h). Usalo si cambiaste algo de eso en Tango.
5.4 Webhooks
No tiene opciones de formulario. Muestra la URL de notificaciones con el botón Copiar, Generar secreto nuevo (invalida la URL anterior: hay que actualizarla en Tango), las instrucciones según el modo, los eventos a tildar, la última notificación recibida y la cola de Action Scheduler. Ver la sección Webhooks.
5.5 Avanzado
| Ajuste (opción) | Default | Descripción |
|---|---|---|
| Descontar pedidos pendientes (wc_tango_discount_pending_orders) | No | Resta del stock publicado las cantidades comprometidas en pedidos pendientes de Tango (DiscountPendingOrders=true). |
| Poner en 0 el stock de productos vinculados que no aparecen en Tango (wc_tango_zero_missing_stock) | Sí en instalaciones nuevas; No en las actualizadas desde v2 | Solo en la sincronización completa de stock y solo si la lectura terminó sin errores ni cortes. Los kits no se tocan. |
| Estrategia de detección (wc_tango_sync_strategy) | hybrid | Solo Tango Tiendas. Híbrida (incremental + revisión completa periódica) o solo incremental (legacy). En eCommerce siempre se combina incremental con revisión completa. |
| Revisión completa del catálogo cada (wc_tango_full_scan_interval) | 6 h | Entre 1 y 48. Recorre todo el catálogo para detectar artículos nuevos que la consulta incremental no devolvió. |
| Artículos con escala (wc_tango_import_scale_articles) | simple | simple: cada combinación talle/color se importa como producto simple. skip: no se importan (se vinculan a mano con variaciones). |
| Origen de la categoría (wc_tango_category_fallback_mode) | official_only | Solo la clasificación oficial de Tango, o clasificación oficial y, si falta, la descripción adicional (la parte anterior al primer " - ": GOMITAS - MOGUL → GOMITAS). |
| Modo depuración (wc_tango_debug_mode) | No | Registra el detalle de cada llamada en WooCommerce › Estado › Registros (fuente wc-tango-tiendas). Genera mucho volumen. |
Herramientas (al pie de Avanzado)
- Liberar bloqueos: cada sincronización toma un bloqueo para no correr dos veces a la vez; si un proceso se cortó, el bloqueo puede quedar hasta 10 minutos. También muestra y libera los bloqueos de pedidos.
- Exportar / importar configuración: JSON con todos los ajustes, sin credenciales ni secretos (máximo 512 KB al importar).
- Abrir asistente.
6. Webhooks (notificaciones de Tango)
Tango avisa a una URL de tu sitio cada vez que cambia el stock, un precio o el estado de un pedido. El webhook no es obligatorio, pero es muy recomendado: sin él los cambios tardan hasta el próximo intervalo de sincronización.
6.1 URL de notificaciones
| Modo | URL |
|---|---|
| Tango eCommerce | https://tu-sitio/wp-json/wct/v1/wh?k=<clave> |
| Tango Tiendas | https://tu-sitio/wp-json/wc-tango/v1/webhook?secret=<secreto> (sin cambios desde v2) |
- En eCommerce la URL es corta porque Tango acepta hasta 80 caracteres en «URL de notificaciones»;
<clave>son los primeros 16 caracteres del secreto. Configuración › Webhooks y el asistente avisan si la URL igual supera los 80 caracteres (el dominio es demasiado largo para Tango). - Las dos rutas están siempre activas y procesan lo mismo.
- Autenticación: el secreto completo por
?secret=o por el headerX-Tango-Webhook-Secret, o la clave corta por?k=. Si falta o no coincide la respuesta es 401. UnGETa la URL responde 200 (Tango lo usa para validar la URL). - Procesamiento: el webhook responde 200 de inmediato y el trabajo se hace en Action Scheduler (grupo
wc-tango-tiendas). Las notificaciones repetidas se ignoran mientras haya una igual en cola (y, para pedidos, durante 2 minutos). Si la consulta a Tango falla por un error temporal se reprograma hasta 3 veces. - Con la integración desactivada responde 200 (
disabled) y no procesa nada.
6.2 Configurarlo en Tango eCommerce
- En Tango, abrí Ventas › eCommerce › Cuentas de integración API y editá la cuenta que usa la tienda.
- Activá Envía notificaciones y pegá la URL de Configuración › Webhooks en URL de notificaciones.
- Tildá todas las notificaciones de órdenes (Observada, Procesada, Rechazada, Facturada, Cancelada, Factura disponible) y las de actualización de Precios y Saldos (y Saldos centralizados si usás stock centralizado). Guardá.
- Modificá el stock o el precio de un artículo vinculado y verificá en Configuración › Webhooks que llegue la notificación.
6.3 Configurarlo en Tango Tiendas
- En Tango Tiendas, entrá a API › Notificaciones.
- Pegá la URL y tildá los eventos de stock, precios, pedidos y facturas (todos los de la tabla de abajo salvo
OrderCancelled). - Guardá y verificá en Configuración › Webhooks que llegue la primera notificación.
6.4 Tópicos
| Tópico | Modo | Acción |
|---|---|---|
| StockProductUpdate | Ambos | Lee el saldo por Id, ignora otros depósitos y recalcula el SKU (y sus kits). |
| PriceProductUpdate | Ambos | Lee el precio por Id; solo aplica la lista configurada (y la de oferta). |
| OrderProcessed | Ambos | Estado EN PROCESO. |
| OrderObserved | Ambos | Estado OBSERVADA (queda advertencia en el registro). |
| OrderRejected | Ambos | Estado RECHAZADA. |
| OrderBilled | Ambos | Trae la factura y pasa a FACTURADA (eCommerce) o FINALIZADA (Tiendas). |
| InvoiceFile | Ambos | Trae número y PDF de la factura. |
| OrderCancelled | Solo eCommerce | Estado CANCELADA. |
| ProductUpdate, ProductContentUpdate, ProductDescriptionUpdate | Si llegan | Se aceptan (no figuran en la documentación de eCommerce): reconcilian el contenido del producto. |
7. Productos
7.1 Vinculación
Un producto o variación de WooCommerce está vinculado con un artículo de Tango cuando el plugin puede resolver su SKU de Tango. Orden de resolución:
- Tabla de vínculos
{prefix}tango_product_map. - Meta
_tango_sku_code(campo SKU en Tango del producto o de la variación). - SKU nativo de WooCommerce.
Vincular por SKU compara el SKU de WooCommerce con el código, el código alternativo y el código de barras de Tango. Los productos sin vincular no reciben stock, precios ni contenido. También podés vincular a mano desde la caja Tango eCommerce del producto (Vincular manualmente, buscando en Tango). En productos variables, cada variación necesita su propio SKU en Tango.
7.2 Importación inicial
Productos › Importar productos lee el catálogo de Tango página por página y crea como productos simples publicados los artículos habilitados que no existen, con precio (mismas reglas que la sincronización de precios) y stock (mismas reglas que la de stock, incluidos kits). Guarda el código de barras en _barcode. Corre por lotes desde el navegador.
7.3 Productos nuevos
Cada 15 minutos, hasta 50 por corrida (requiere Importar productos nuevos activo):
- Tango eCommerce: consulta incremental por fecha de actualización (relee un día, porque Tango compara por día) más una revisión completa cada
wc_tango_full_scan_intervalhoras. La primera corrida es siempre completa. - Tango Tiendas: estrategia híbrida (últimas 24 h + revisión completa periódica) o incremental.
- El artículo tiene que estar habilitado en Tango y tener SKU.
- Productos › Solo en Tango › Escanear Tango ahora lista los artículos sin producto en WooCommerce.
7.4 Artículos con escala (talle/color)
No se crean productos variables automáticamente (la API no devuelve el artículo base). Según wc_tango_import_scale_articles, se importan como simples (simple) o se omiten (skip); para usar variaciones hay que vincular cada variación a mano con su SKU de Tango.
7.5 Contenido
En cada intervalo de sincronización, para los productos vinculados, Tango es la fuente del título (Description), la descripción corta (AdditionalDescription) y la descripción larga. La reconciliación es incremental y solo escribe cuando algo cambió.
7.6 Categorías
La categoría gestionada por Tango se resuelve por la clasificación oficial (ProductsFolderClassifier + ProductsFolder) y, si está habilitado, por la descripción adicional. Las categorías asignadas a mano se conservan. Para recalcular los productos ya vinculados: Productos › Resincronizar categorías (corre en segundo plano con Action Scheduler).
8. Stock (Tango › WooCommerce)
- Multi-depósito: se consulta cada depósito configurado y el stock de un SKU es la suma de la cantidad física (
Quantity) de esos depósitos. Sin depósitos configurados se usan todos. - Stock centralizado (solo eCommerce): con la opción activa se piden los saldos centralizados. Sin ella, Tango devuelve los saldos de la sucursal local.
- Pedidos pendientes: solo si Descontar pedidos pendientes está activo se resta la cantidad comprometida (
EngagedQuantity). - Kits: Tango no informa stock de kits. El plugin lo calcula como el mínimo de
piso(disponible del componente / cantidad por kit). La composición de los kits se guarda 12 h; un cambio de stock de un componente recalcula sus kits. Si un componente no está en los depósitos configurados, el kit queda en 0. - El resultado se redondea hacia abajo a un entero y nunca es negativo. Se escribe con las funciones de WooCommerce y activa "Gestionar inventario" en el producto.
- Frecuencia: tiempo real con el webhook
StockProductUpdate; corrida periódica incremental (solo saldos modificados desde la última corrida exitosa) y una corrida completa cadawc_tango_catalog_full_sync_hourshoras.
8.1 Poner en 0 los productos que no aparecen en Tango
Con Poner en 0 el stock de productos vinculados que no aparecen en Tango activo (default en instalaciones nuevas), una corrida completa y sin cortes pone en 0 los productos vinculados explícitamente (tabla de vínculos o campo SKU en Tango) cuyo SKU no vino en la lectura de los depósitos configurados. Los vinculados solo por coincidencia de SKU nativo y los kits no se tocan. El resultado queda en el mensaje de la última corrida de stock.
Desactivada (default al actualizar desde v2), esos productos conservan el último stock, como en v2.
9. Precios (Tango › WooCommerce)
- Se actualiza el precio regular desde la lista configurada. Solo se escriben los productos cuyo precio cambió, con las funciones de
WC_Product. - Ofertas manuales: nunca se tocan. Si dejan de ser menores que el regular, WooCommerce deja de mostrarlas como oferta.
- Lista de oferta (opcional): su precio vigente se publica como precio de oferta con las fechas de vigencia de Tango (las ofertas futuras quedan programadas). Las ofertas gestionadas por Tango cuyo SKU ya no está en la lista se quitan en las corridas completas.
- Control de IVA (solo eCommerce): se compara
IvaIncludedde la lista con "Precios con impuestos" de WooCommerce; segúnwc_tango_price_tax_modese avisa o se convierte con la tasa estándar base. En Tango Tiendas no hay dato para comparar. - Frecuencia: igual que stock (webhook
PriceProductUpdate+ incremental + completa periódica).
10. Pedidos (WooCommerce › Tango)
10.1 Cuándo se envían
- Cuando el pedido llega a un estado enviable: Procesando, En espera o Completado (filtro
wc_tango_sendable_statuses). También al confirmarse el pago y al terminar el checkout (clásico y por bloques). - Con Enviar pedidos aún no pagados desactivado, solo se envían pedidos pagados.
- El envío siempre es asíncrono (Action Scheduler): nunca frena el checkout ni el admin. Sin Action Scheduler el pedido no se envía y queda una nota.
- Cada pedido se envía una sola vez; un bloqueo por pedido evita envíos dobles.
- Con Enviar pedidos a Tango desactivado no sale ningún pedido automático, tampoco los que ya estaban en cola ni los reintentos. Un envío encolado que corre con la opción apagada queda en ERROR reintentable (
[tango_sync_disabled], sin gastar intentos, con nota en el pedido) y se envía solo unos 5 minutos después de reactivar la opción. Los botones manuales de la caja del pedido siguen funcionando.
10.2 Qué se envía
| Dato | Origen |
|---|---|
| OrderID / OrderNumber | ID y número del pedido de WooCommerce. Después de un reenvío como nuevo pedido, OrderID pasa a {ID}-R{n}. |
| Renglones | SKU en Tango (o SKU de WooCommerce), código de producto, código de variante, cantidad y precio unitario con impuestos. |
| Cliente | CustomerID (ID del cliente, o del pedido si es invitado), DNI/CUIT, tipo de documento (96 DNI, 80 CUIT si tiene 11 dígitos), condición frente al IVA (CF por defecto), email, nombre, razón social, dirección separada en calle y número, provincia, teléfono. |
| Envío | Dirección de envío (o de facturación), costo, provincia, días de entrega lunes a viernes. |
| Totales | Total, TotalDiscount (cupones y cargos negativos), FinancialSurcharge (cargos), validados con Total = Σ renglones + envío + recargos − descuentos y redondeo a 2 decimales "al par". Las diferencias se absorben como recargo/descuento con advertencia en el pedido. |
| Depósito | Primer depósito configurado (WarehouseCode). |
| Talonarios | OrderCounterfoil e InvoiceCounterfoil si están configurados. |
| Lista de precios | PriceListNumber si está activo "Enviar la lista de precios". Si esa lista no incluye IVA, los importes van netos y Tango calcula los impuestos. |
| Comentario | Nota del cliente (hasta 280 caracteres). |
Provincias: el código de provincia de WooCommerce (Argentina) se traduce a la tabla de provincias de Tango (0 CABA, 1 Buenos Aires, 2 Catamarca, 3 Córdoba, 4 Corrientes, 5 Entre Ríos, 6 Jujuy, 7 Mendoza, 8 La Rioja, 9 Salta, 10 San Juan, 11 San Luis, 12 Santa Fe, 13 Santiago del Estero, 14 Tucumán, 16 Chaco, 17 Chubut, 18 Formosa, 19 Misiones, 20 Neuquén, 21 La Pampa, 22 Río Negro, 23 Santa Cruz, 24 Tierra del Fuego; el 15 no existe). También reconoce nombres escritos a mano. Si no la reconoce usa la provincia por defecto y lo avisa.
10.3 Formas de cobro y pagos
- Los pagos (
CashPayments,PaidTotal) solo se informan si la condición de venta es Contado y el pedido está pagado. En cualquier otro caso se envíaPaidTotal = 0. - Forma de cobro: la asignada al medio de pago en Configuración › Pedidos, o la predeterminada (
A02). Por ejemplo,MPApara MercadoPago. PaymentID: el ID de transacción de la pasarela si es numérico (por ejemplo MercadoPago); si no,{ID de pedido}1(con el número de reenvío intercalado si el pedido se reenvió como nuevo).- Contra reembolso (
cod) cuenta como pagado recién cuando el pedido está Completado (filtrowc_tango_unpaid_gateways). - Pedido enviado sin pago que después se paga: se reenvía como modificación con el pago, siempre que en Tango siga INGRESADA o RECIBIDA. Si ya avanzó, queda una nota para registrar el cobro a mano en Tango.
- Un solo pago por pedido (
CashPaymentscon el total). No se informan pagos parciales ni en cuotas.
10.4 Errores, reintentos y backoff
- Si el envío falla, el pedido queda con estado local ERROR, una nota con el detalle (errores de validación listados por campo) y el error en la pantalla Pedidos.
- Reintento automático (cada 15 minutos) para errores temporales o de configuración: falta de conexión, 429, 5xx, credenciales inválidas, cuenta no registrada. Espera 5, 10, 20 y 40 minutos entre intentos; máximo 5 intentos.
- Los errores de datos (400 con
errors,isOk:false, SKU faltante, sin email, totales) no se reintentan solos y salen de la cola: corregí el dato y usá Reintentar. Un reintento manual reinicia el contador de intentos. - Pedidos › Reintentar pedidos con error respeta esas esperas.
| Tipo de error | ¿Se reintenta solo? | Qué hacer |
|---|---|---|
| Red, 429, 5xx | Sí | Nada; se reintenta. |
| 401, cuenta no registrada, faltan credenciales | Sí | Corregí la configuración; el próximo reintento lo envía. |
| tango_sync_disabled | Sí, al reactivar Enviar pedidos a Tango (no gasta intentos) | Reactivá la opción; sale en unos 5 minutos. |
| 400 con errors, isOk:false, SKU faltante, sin email, totales | No (sale de la cola) | Corregí el dato y usá Reintentar en el pedido. |
10.5 Verificación antes de reenviar
Si el envío terminó en timeout, error 5xx o respuesta ilegible, Tango pudo haber recibido el pedido igual. El plugin guarda el OrderID y, antes de reenviar, consulta a Tango: si el pedido está, lo marca como recibido ("el pedido sí llegó a Tango a pesar del error de envío; no se reenvía") y no lo duplica. Si esa consulta también falla, cuenta como un intento más. La consulta periódica y los webhooks hacen lo mismo.
10.6 Reenvío y modificación
Reenviar (caja del pedido o pantalla Pedidos) manda el pedido de nuevo con el mismo OrderID, lo que Tango toma como modificación. Solo se acepta mientras el pedido está INGRESADA o RECIBIDA. El CustomerID se mantiene entre envíos.
10.7 Pedido rechazado: reenviar como nuevo pedido
Si Tango rechazó el pedido, el botón pasa a ser Reenviar como nuevo pedido: se corrige el dato y se envía como una orden nueva con OrderID {ID}-R{n} (por ejemplo 1234-R1; filtro wc_tango_resubmit_order_id), porque Tango no acepta reenviar un OrderID rechazado. Los IDs de pago y envío también cambian. Los OrderID anteriores quedan en la meta _tango_order_ref_history y en una nota del pedido. Solo es manual.
10.8 Pedidos enviados con la otra API
Un pedido enviado con Tango Tiendas no se puede modificar ni cancelar por Tango eCommerce (ni al revés). Si cambiás de modo de API, esos pedidos dejan de consultarse; al intentar reenviarlos o cancelarlos queda la nota "Este pedido se envió con Tango Tiendas; gestionalo manualmente en Tango" y se gestionan directamente en Tango. Si volvés al modo anterior, el pedido vuelve a gestionarse normalmente.
10.9 Cancelación
- Desde WooCommerce: al pasar el pedido a Cancelado se envía en segundo plano el pedido completo (el último payload enviado) con
CancelOrder=true,CancelDateyCancelReason. No se envía si Tango ya lo tiene cancelado, anulado o rechazado. Tango acepta la cancelación con el pedido RECIBIDA (o EN PROCESO / FINALIZADA, solo para pasarlo a CANCELADA). Con otros estados (por ejemplo FACTURADA) hay que anular en Tango. - Desde Tango:
OrderCancelled(eCommerce) o la consulta periódica pasan el pedido a Cancelado sin reenviar la cancelación a Tango.
10.10 Estados
El estado de Tango llega por webhook o por la consulta periódica. La consulta periódica revisa los pedidos enviados con el modo de API activo en los últimos 60 días (filtro wc_tango_poll_max_age_days) que no llegaron a un estado final, y los facturados de los últimos 15 días que todavía no tienen PDF. En eCommerce, GET Order y GET Invoices se filtran por la Cuenta de Integración API configurada, así que nunca se mezclan órdenes de otras cuentas de la misma empresa.
| Estado en Tango | Estado en WooCommerce |
|---|---|
| INGRESADA, PENDIENTE | Sin cambio |
| RECIBIDA, EN PROCESO | Procesando, solo si el pedido está pagado (si no, queda como está y se agrega una nota). Evita que WooCommerce marque como pagado y mande el email al cliente de un pedido impago. Filtro wc_tango_processing_requires_paid. |
| OBSERVADA | En espera, solo si el pedido no está pagado. Un pedido pagado no se pasa a En espera: queda la nota privada y el estado en Tango. Filtro wc_tango_observed_holds_paid_orders. |
| FACTURADA, FINALIZADA | Completado |
| RECHAZADA | Fallido |
| CANCELADA, CANCELADA APROB, ANULADA | Cancelado |
| ERROR (estado local) | El pedido no se pudo enviar. |
Jerarquía de estados: cada estado de Tango tiene un rango (INGRESADA < PENDIENTE < RECIBIDA = OBSERVADA < EN PROCESO < FACTURADA = FINALIZADA < RECHAZADA = CANCELADA = ANULADA). Un estado de rango menor al guardado (webhook atrasado, consulta vieja) se ignora. Filtro wc_tango_status_ranks.
Además, solo se permiten ciertas transiciones en WooCommerce (por ejemplo, un pedido Completado o Cancelado no se reabre). Se puede cambiar con wc_tango_order_status_map y wc_tango_allow_status_transition. Cada cambio deja una nota "Tango: estado …" en el pedido.
11. Facturas
- Con
OrderBilled,InvoiceFileo la consulta periódica (que sigue buscando el PDF hasta 15 días después del envío) se guardan tipo, número, URL del PDF y su vencimiento (InvoiceFileExpiration). - La URL de Tango vence. El plugin nunca muestra la URL directa: el enlace "Factura" pasa por
admin-post.php?action=wc_tango_invoice, que pide una URL nueva a Tango si la guardada venció (como máximo una vez por minuto por pedido). - La factura se ve en la edición del pedido, en la pantalla Pedidos y en "Mi cuenta" (botón Factura y detalle del pedido), y en los emails.
- El enlace exige la clave del pedido o permisos sobre él, y solo redirige a URLs https.
- El número de factura puede llegar antes que el PDF. Con el pedido abierto, Actualizar estado la vuelve a pedir.
| Mensaje | Qué significa |
|---|---|
| La factura todavía no está disponible | Tango todavía no tiene el comprobante publicado. El plugin vuelve a preguntar como máximo una vez por minuto por pedido: esperá un minuto y reintentá. |
| No tiene permiso para ver esta factura | El enlace se copió sin el parámetro key (clave del pedido) y el usuario no está logueado o no tiene permisos sobre el pedido. |
| La URL de la factura no es segura (se requiere https) | Tango devolvió una URL http o mal formada. Usá Actualizar estado más tarde; si persiste, consultá con Tango. |
12. Checkout: DNI/CUIT y condición frente al IVA
- Campo DNI / CUIT (obligatorio, filtro
wc_tango_checkout_dni_required) y Condición frente al IVA (Consumidor Final, Responsable Inscripto, Monotributo, Exento; filtrowc_tango_checkout_iva_options). - Checkout clásico: los campos van en la sección de facturación.
- Checkout por bloques: van en la sección de contacto (API de campos adicionales de WooCommerce). En v2 el checkout por bloques no pedía documento.
- Validación: DNI de 7 u 8 dígitos o CUIT de 11 con dígito verificador. Responsable Inscripto, Monotributo y Exento exigen CUIT.
- Se guardan en el pedido como
_billing_dniy_billing_iva_category, y se muestran en el admin, en los emails y en "Mi cuenta". - Al enviar el pedido, el tipo de documento se decide por el largo:
96DNI,80CUIT.
Para hacer el documento opcional:
add_filter( 'wc_tango_checkout_dni_required', '__return_false' );
13. Pantallas del plugin
Todas están en el menú lateral Tango eCommerce.
| Pantalla | Slug | Qué tiene |
|---|---|---|
| Panel | wc-tango-tiendas | Alertas, estado de la conexión, productos vinculados, pedidos con error, último webhook, última y próxima corrida de cada sincronización con Sincronizar ahora y Sincronización completa, pedidos por estado en Tango. |
| Pedidos | wc-tango-orders | Pedidos vinculados con Tango, filtros por estado, búsqueda por n.º de pedido, ID de Tango o factura, Reenviar / Reintentar / Reenviar como nuevo pedido, Ver payload, Ver error, PDF de factura, Reintentar pedidos con error. El menú muestra un contador de pedidos con error. |
| Productos | wc-tango-products | Pestañas Vinculados / Sin vincular en WooCommerce / Solo en Tango, Importar productos, Vincular por SKU, Resincronizar categorías, sincronizar o desvincular un producto. |
| Registro | wc-tango-logs | Actividad por tipo (stock, precios, pedidos, estados, webhooks, facturas, productos, importación, contenido, categorías) y estado, con detalle de request/response, Exportar CSV y Vaciar registro. |
| Configuración | wc-tango-settings | Pestañas Conexión, Sincronización, Pedidos, Webhooks y Avanzado. |
| Diagnóstico | wc-tango-diagnostics | Chequeos de entorno, conexión, webhooks, tareas programadas y base de datos; Verificar con Tango (conexión, depósitos, lista de precios, condición, talonarios); Reparar tareas programadas; Copiar informe para soporte (sin secretos). |
| Asistente | wc-tango-setup | Oculto en el menú; se abre desde el Panel o desde Avanzado. |
13.1 Caja "Tango eCommerce" en pedidos
En la edición de cada pedido: estado en Tango, ID, intentos, último error, factura y los botones Enviar a Tango / Reintentar envío / Reenviar, Actualizar estado y Ver payload (muestra exactamente lo que se envía).
13.2 Caja "Tango eCommerce" en productos
En la edición de cada producto: vincular manualmente buscando en Tango, sincronizar ahora, quitar vínculo, últimos cambios de stock y precio, y los campos SKU en Tango y Código de producto Tango. Cada variación tiene sus propios campos SKU en Tango y Código de variante Tango.
13.3 Registro
El registro se limpia solo una vez por día: guarda 30 días y como máximo 10.000 registros. Registro › Vaciar registro lo borra a mano. El CSV exportado neutraliza las celdas que empiezan con =, +, -, @, tabulación o retorno de carro (les antepone ') para evitar inyección de fórmulas al abrirlo en una planilla.
14. Tareas programadas
| Hook | Frecuencia | Qué hace |
|---|---|---|
| wc_tango_sync_stock_cron | Intervalo configurado | Stock (incremental / completa). |
| wc_tango_sync_prices_cron | Intervalo configurado (+150 s) | Precios. |
| wc_tango_sync_order_status_cron | Intervalo configurado (+60 s) | Estados de pedidos y facturas (hasta 200 pedidos por corrida, enviados en los últimos 60 días). |
| wc_tango_sync_product_content_cron | Intervalo configurado (+210 s) | Contenido de productos. |
| wc_tango_sync_new_products_cron | 15 minutos | Productos nuevos. |
| wc_tango_retry_failed_orders_cron | 15 minutos | Reintento de pedidos con error. |
| wc_tango_cleanup_logs_cron | Diaria | Borra registros de más de 30 días y deja como máximo 10.000. |
Acciones asíncronas (Action Scheduler): wc_tango_async_send_order, wc_tango_async_poll_order, wc_tango_async_stock_update, wc_tango_async_price_update, wc_tango_async_order_event, wc_tango_async_product_content_update, wc_tango_resync_category_batch.
Las tareas faltantes se reprograman solas al entrar al admin, o con Diagnóstico › Reparar tareas programadas. Desactivar el plugin las elimina.
15. WP-CLI
wp tango catalog sync-stock [--full] # stock (--full ignora el checkpoint) wp tango catalog sync-prices [--full] # precios wp tango catalog sync-products [--full-scan] # productos nuevos (--full-scan recorre todo el catálogo) wp tango catalog sync-content [--full] # contenido (título y descripciones) wp tango catalog status # última corrida, checkpoints y cobertura de vinculación wp tango catalog reset-checkpoint <stock|prices|products|content> # la próxima corrida será completa wp tango catalog unmapped [--source=wc|tango] [--limit=50] [--refresh] # productos sin vincular wp tango validate-category-sync --sku=ABC123 --product_id=456 [--fallback-mode=official_or_additional_description] [--apply]
Todos los comandos (salvo status y unmapped --source=wc) requieren la integración activa. validate-category-sync corre en modo prueba salvo que se pase --apply.
16. Migración desde v2
Hay dos cosas distintas, que se pueden hacer en momentos distintos: actualizar el plugin de v2 a v3 (la tienda sigue usando Tango Tiendas y no hay que cambiar nada en Tango) y pasar de Tango Tiendas a Tango eCommerce (cuando se actualiza Tango a Delta 6 y se habilita eCommerce). Recomendación: actualizá primero el plugin, verificá que todo siga funcionando en modo Tiendas, y recién después cambiá de API.
16.1 Antes de actualizar
- Backup de la base de datos y de
wp-content/plugins/wc-tango-tiendas. - Si es posible, probá primero en un staging.
- Anotá el valor actual de Talonario (ver más abajo).
- Revisá que no haya una importación de productos en curso.
16.2 Qué pasa automáticamente al actualizar
La migración corre sola en la primera carga después de actualizar. Activar el plugin corre la misma migración.
| Qué | Resultado |
|---|---|
| Modo de API | Si había un Access Token cargado, wc_tango_api_mode queda en tiendas. La tienda sigue conectada a Tango Tiendas como antes. |
| Access Token | Se encripta con libsodium (si el servidor la tiene). Sigue funcionando igual. |
| Tabla {prefix}tango_order_map | Se agregan las columnas tango_invoice_expiration, api_mode, send_attempts, last_error y sent_at. Los pedidos ya enviados conservan sus datos. |
| Pedidos enviados con v2 | Se marcan con api_mode = 'tiendas' y sent_at = last_sync: siguen consultándose y cancelándose por Tiendas, y el corte de 60 días también se les aplica. |
| Opciones nuevas | Se crean con sus valores por defecto; las existentes no se tocan. Excepción: Poner en 0 el stock de productos vinculados que no aparecen en Tango queda desactivada en actualizaciones. |
| Tareas programadas | Se agrega wc_tango_retry_failed_orders_cron (cada 15 minutos). |
| Menú | Pasa a llamarse Tango eCommerce. Los enlaces viejos a pestañas de configuración redirigen a Configuración. |
| Asistente | Si había token, la configuración inicial se marca como completada y el asistente no se abre solo. Está en Configuración › Avanzado › Herramientas. |
| Webhook | La URL y el secreto no cambian. No hay que tocar nada en Tango Tiendas. |
| Integración | Si estaba activa, sigue activa. |
En el Panel va a aparecer una alerta recordando que se usa la API legada de Tango Tiendas. Es informativa.
16.3 Cambios de comportamiento en pedidos
| Tema | v2 | v3 |
|---|---|---|
| Provincias | Códigos por orden alfabético (Chaco = 3, Córdoba = 5…), incluía el 15; provincia desconocida = CABA sin avisar. | Tabla de provincias de Tango (Córdoba = 3, Chaco = 16…; el 15 no se usa). Provincia desconocida = Provincia por defecto, con advertencia y nota. |
| Talonario | Se enviaba como InvoiceCounterfoil (talonario de factura). | wc_tango_counterfoil es Talonario de pedido (OrderCounterfoil). Nuevo Talonario de factura (wc_tango_invoice_counterfoil, opcional). |
| Forma de cobro | Siempre A02. | Configurable por medio de pago. Default A02. |
| Pagos | Siempre PaidTotal = Total y un pago, aunque no estuviera pagado. | Solo si la condición de venta es Contado y el pedido está pagado; si no, PaidTotal = 0. El pago posterior se informa como modificación. |
| Contra reembolso | Pagado desde el envío. | Pagado recién cuando el pedido está Completado. |
| Oferta manual | Se borraba si quedaba mayor o igual al nuevo precio regular. | No se toca nunca. |
| Checkout por bloques | Sin campo DNI: los pedidos llegaban sin documento. | DNI / CUIT (obligatorio) y Condición frente al IVA. |
| RECIBIDA, EN PROCESO | Procesando aunque el pedido no estuviera pagado. | Procesando solo si está pagado; si no, queda como está con una nota. |
| OBSERVADA | En espera solo por webhook. | En espera por webhook y por consulta, salvo que el pedido esté pagado. |
| Estados que llegan tarde | Se aplicaban (podían "retroceder" el pedido). | Se ignoran los de rango menor al guardado. |
| RECHAZADA | Fallido, sin forma de reenviar. | Fallido; se puede corregir y Reenviar como nuevo pedido ({ID}-R{n}). |
| Enviar pedidos a Tango desactivado | Los ya encolados salían igual. | Frena también los encolados y los reintentos; quedan en ERROR reintentable y salen al reactivar. |
Qué hacer con el talonario
- Si en v2 tenías 0: no hay que hacer nada.
- Si en v2 tenías un talonario de factura: copialo a Talonario de factura y poné en Talonario de pedido el talonario de pedidos correcto (o 0 para usar el predeterminado). Si no lo corregís, Tango va a recibir un talonario de factura como talonario de pedido.
Otros cambios que se notan
- Cancelación: se envía en segundo plano con el pedido completo; una cancelación que llega desde Tango ya no rebota hacia Tango.
- Reintentos: hasta 5 intentos con esperas de 5, 10, 20 y 40 minutos, y verificación en Tango antes de reenviar después de un timeout o un 5xx.
- Totales: los importes se envían con impuestos y se valida la fórmula de total; las diferencias se ajustan como recargo/descuento con advertencia.
- Stock: suma de varios depósitos, kits y descuento opcional de pedidos pendientes; corridas incrementales con una completa cada 24 h.
- Contenido: el título y las descripciones de los productos vinculados se toman de Tango.
- Los clientes creados en Tango con pedidos de v2 pueden tener la provincia equivocada; la v3 no los corrige retroactivamente.
16.4 Verificación después de actualizar (modo Tiendas)
- Diagnóstico › Verificar con Tango: todo en verde (o advertencias entendidas).
- Configuración › Conexión: modo "Tango Tiendas (legado)" y Probar conexión correcto.
- Configuración › Pedidos: talonario de pedido y de factura, provincia por defecto, medios de pago.
- Panel: corridas recientes de stock y precios sin errores; sin alerta de token que no se puede descifrar.
- Configuración › Webhooks: llega una notificación al modificar stock o precio en Tango.
- Pedido de prueba con el checkout que use la tienda: llega con DNI, provincia, forma de cobro y pago correctos (Ver payload).
- Decidido si se activa Poner en 0 el stock de productos vinculados que no aparecen en Tango.
16.5 Pasar de Tango Tiendas a Tango eCommerce
- Pedidos en curso de Tiendas: después del cambio, los enviados por Tiendas dejan de consultarse y no se modifican ni cancelan por eCommerce. Esperá a que lleguen a un estado final, o anotá cuáles quedan abiertos para seguirlos en Tango.
- Credenciales: Configuración › Conexión › elegí Tango eCommerce › completá llave, token, IdEmpresa y Cuenta de Integración API › Probar conexión › Guardar cambios. El Access Token de Tiendas queda guardado por si hay que volver atrás.
- Stock: activá Stock centralizado si la empresa centraliza el stock de varias sucursales y revisá Depósitos y Lista de precios.
- IVA de la lista: elegí Avisar o Convertir y mirá si aparece la advertencia en el Panel después de la primera corrida.
- Pedidos: usá Refrescar datos de Tango y revisá talonarios, condición de venta y medios de pago.
- Webhook: la URL cambia a la versión corta (
…/wp-json/wct/v1/wh?k=…). Cargala en la Cuenta de Integración API (ver Webhooks) y quitá la URL de Tango Tiendas › API › Notificaciones. - Pedido de prueba: verificá en la caja Tango eCommerce del pedido que quede enviado y con ID de Tango.
- Corrida completa: en el Panel, Sincronización completa en stock y precios (o
wp tango catalog sync-stock --fullysync-prices --full). Para releer productos nuevos y contenido:wp tango catalog reset-checkpoint productsyreset-checkpoint content.
17. Limitaciones conocidas
- Artículos con escala (talle/color): no se crean productos variables automáticamente. Se importan como simples o se omiten; para usar variaciones hay que vincular cada variación a mano.
- Descontar pedidos pendientes: la documentación de Tango no aclara si el comprometido llega en
Quantity(negativo) o enEngagedQuantity. El plugin restaEngagedQuantity; no está confirmado contra un Tango real. Con modo depuración se registra una fila de muestra para verificarlo. - Contenido: Tango eCommerce no documenta un webhook de contenido; los cambios llegan por la reconciliación periódica. Los cambios hechos a mano en WooCommerce se pisan.
- Probar conexión valida la Cuenta de Integración API solo en modo best-effort; la confirmación definitiva es el primer pedido.
- Los pedidos enviados con la otra API se gestionan a mano en Tango. Los pedidos de más de 60 días dejan de consultarse.
- Sin Action Scheduler los pedidos no se envían y los webhooks se procesan en el mismo request.
- Un solo pago por pedido. No se informan pagos parciales ni en cuotas.
- Las modificaciones solo se aceptan con el pedido INGRESADA/RECIBIDA en Tango.
- Pedidos con fecha de más de 30 días: Tango puede rechazarlos (queda advertencia).
- El pedido se asigna solo al primer depósito configurado (filtro
wc_tango_order_warehouse_code). - Días de entrega fijos de lunes a viernes (filtro
wc_tango_order_shipping). - Stock en enteros: las cantidades fraccionarias se redondean hacia abajo.
- Las fechas de vigencia de precios asumen que Tango y WordPress están en la misma zona horaria.
- Stock centralizado, control de IVA de la lista y
OrderCancelledexisten solo en Tango eCommerce. - Solo moneda corriente (limitación de la API de Tango).
18. Solución de problemas y FAQ
18.1 Por dónde empezar
- Diagnóstico › Verificar con Tango: prueba la conexión y valida depósitos, lista de precios, condición de venta y talonarios. Los chequeos en rojo dicen qué corregir.
- Panel: las alertas de arriba y la tarjeta de cada sincronización.
- Registro: filtrá por estado Error; cada fila muestra el request y la respuesta de Tango.
- WooCommerce › Estado › Registros, fuente
wc-tango-tiendas: avisos y errores internos. Con Modo depuración se agrega el detalle de cada llamada; desactivalo al terminar.
18.2 Errores de conexión
| Mensaje / código | Causa | Qué hacer |
|---|---|---|
| 401 "Token de desarrollador o IdEmpresa inválidos" (eCommerce) | Token vencido, mal copiado, o IdEmpresa que no corresponde. Tango no distingue cuál de los dos. | Generá un token nuevo (menú de usuario › Desarrollador › Generar), verificá el IdEmpresa y probá. |
| 401 "El Access Token de Tango Tiendas es inválido o venció" (Tiendas) | Token de Tiendas revocado o regenerado. | Generá uno nuevo en Tango Tiendas › API y cargalo en Configuración › Conexión. |
| "La Cuenta de Integración API «X» no existe en Tango" | El nombre de la cuenta no coincide (Tango responde "X is not registered."). | Copiá el nombre exacto (mayúsculas, espacios). Guardá y usá Reintentar en los pedidos afectados. |
| "La API de Tango eCommerce no respondió en … (404)" | Llave mal escrita, o empresa no vinculada con Tango Connect / eCommerce. | Revisá la llave (000000/000) y la URL que muestra Configuración › Conexión. |
| "No se pudo conectar con …" | Sin salida HTTPS, DNS, firewall, TLS menor a 1.2, Tango Connect fuera de línea, timeout (30 s). | Pedile al hosting que verifique salida HTTPS con TLS 1.2+. El filtro wc_tango_api_timeout amplía el timeout. |
| "La respuesta de … no es válida (no es JSON)" | Llave incorrecta o una página de error intermedia (proxy, WAF). | Revisá la llave y si el hosting intercepta las salidas. |
| 429 "Tango limitó temporalmente las consultas" | Límite de consultas simultáneas, compartido entre las empresas de la instalación de Tango. | Esperá. Si pasa seguido, subí el intervalo y apoyate en los webhooks. |
| 5xx "Tango devolvió un error temporal" | Problema del lado de Tango. | Se reintenta solo. Si persiste, consultá con Tango. |
| 400 "Tango rechazó los datos enviados: Campo: mensaje" | eCommerce valida el JSON y devuelve el detalle por campo. | Corregí el dato del pedido y reintentá. |
18.3 Las credenciales "desaparecieron"
Los tokens se guardan encriptados con una clave derivada de la sal AUTH_KEY/AUTH_SALT de wp-config.php. Si las sales cambiaron (migración, regeneración de sales, staging con otro wp-config.php) o el servidor nuevo no tiene la extensión sodium, el token no se puede descifrar y el Panel muestra una alerta. Volvé a cargar el Token de desarrollador (o el Access Token) en Configuración › Conexión.
18.4 El pedido no se envía
- Integración activa y Enviar pedidos a Tango activo.
- Estado del pedido: solo se envían Procesando, En espera o Completado.
- Pedidos no pagados: con Enviar pedidos aún no pagados desactivado, el pedido espera a estar pagado.
- Action Scheduler: en WooCommerce › Estado › Acciones programadas, buscá
wc_tango_async_send_order. - Caja Tango eCommerce del pedido: si dice "No enviado", usá Enviar a Tango.
18.5 Pedido en ERROR por datos inválidos
| Mensaje | Solución |
|---|---|
| El producto «X» no tiene código SKU de Tango asignado | Vinculá el producto (campo SKU en Tango o Vincular por SKU). |
| El producto «X» del pedido ya no existe en la tienda | El producto fue borrado. Cargá el pedido a mano en Tango. |
| El pedido no tiene email de facturación | Completá el email en el pedido y reintentá. |
| Customer.DocumentNumber, IVACategoryCode | Revisá DNI / CUIT y condición frente al IVA (RI, Monotributo y Exento requieren CUIT). |
| SKUCode / ProductCode inexistente | El SKU vinculado no existe en Tango o está deshabilitado. |
| OrderCounterfoil / InvoiceCounterfoil | Talonario inexistente o del tipo equivocado. Elegilo desde el selector en Configuración › Pedidos. |
| Order total doesn't add up | El plugin absorbe las diferencias como recargo o descuento; diferencias grandes suelen venir de plugins de descuentos o cargos que no usan cupones o cargos de WooCommerce. |
18.6 Webhooks
- Nunca llega una notificación: verificá HTTPS con TLS 1.2+, que la URL esté completa en Tango (con
?k=o?secret=), que la integración esté activa y que ningún firewall / WAF bloqueewp-json. UnGETahttps://tu-sitio/wp-json/wct/v1/whdevuelve{"status":"ok"}. - Error 401 ("Webhook: Invalid or missing secret."): el secreto de la URL cargada en Tango no coincide (después de Generar secreto nuevo, de copiar la URL sin el parámetro o al copiar la base de otro sitio). Copiá de nuevo la URL y reemplazala en Tango.
- Llegan pero no se aplican: revisá la cola de Action Scheduler; un saldo de un depósito no configurado o de un SKU no vinculado se ignora; solo se aplican las filas de la lista configurada.
18.7 Stock y precios
- Revisá la tarjeta Stock / Precios del Panel y usá Sincronizar ahora o Sincronización completa.
- Un depósito de más o de menos explica la mayoría de las diferencias de stock.
- Si la corrida incremental no trae un cambio viejo:
wp tango catalog reset-checkpoint stock. - Un producto sigue con stock aunque en Tango no tiene: activá Poner en 0 el stock de productos vinculados que no aparecen en Tango.
- Si el Panel avisa que la lista y la tienda difieren en IVA, elegí Convertir o ajustá los impuestos de WooCommerce.
18.8 Las tareas programadas no corren
En Diagnóstico, si falta alguna, Reparar tareas programadas. Si DISABLE_WP_CRON está en true, tiene que haber un cron del servidor que llame a wp-cron.php.
Configurar un cron real del servidor
En wp-config.php:
define( 'DISABLE_WP_CRON', true );
Y una tarea cada 5 minutos (crontab):
*/5 * * * * curl -s https://tudominio.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1 # Con WP-CLI, alternativa más robusta: */5 * * * * cd /ruta/a/wordpress && wp cron event run --due-now > /dev/null 2>&1
Sin acceso al servidor, usá un servicio externo que llame a wp-cron.php?doing_wp_cron cada 5 minutos (UptimeRobot, cron-job.org, EasyCron) y no desactives WP-Cron.
18.9 Preguntas frecuentes
¿Cada cuánto se sincroniza?
| Qué | Frecuencia |
|---|---|
| Stock, precios, estados de pedidos, contenido | Cada "Sincronización periódica cada" (default 5 minutos, 1 a 60). |
| Corrida completa de stock y precios | Cada 24 horas (configurable). |
| Productos nuevos | Cada 15 minutos (fijo). |
| Reintento de pedidos con error | Cada 15 minutos (fijo). |
| Con webhook | Stock, precios y estados de pedidos en segundos. |
¿Tengo que configurar el webhook?
No es obligatorio, pero es muy recomendado. Con el webhook funcionando, un intervalo de 15 a 30 minutos alcanza.
¿Qué pasa si desactivo la integración?
No se envían pedidos ni se actualiza nada; los webhooks responden 200 sin procesar. Las credenciales y la configuración se conservan.
¿Puedo copiar la configuración de staging a producción?
Sí: Configuración › Avanzado › Herramientas › Exportar JSON e Importar en el otro sitio. Las credenciales no viajan: cargalas a mano. La URL del webhook de cada sitio es distinta.
¿Cómo pido soporte?
Diagnóstico › Verificar con Tango y después Copiar informe (no incluye credenciales ni secretos). Sumá el CSV del Registro filtrado por Error y, si el problema es un pedido, su Ver payload y la nota de error.
19. Para desarrolladores
19.1 Filtros
| Filtro | Argumentos | Para qué |
|---|---|---|
| wc_tango_order_payload | $payload, $order, $sync | Modificar el JSON completo del pedido antes de enviarlo. |
| wc_tango_order_item | $line, $item, $order | Modificar cada renglón. |
| wc_tango_order_customer | $customer, $order | Modificar el bloque Customer. |
| wc_tango_order_shipping | $shipping, $order | Modificar el bloque Shipping (por ejemplo, días de entrega). |
| wc_tango_customer_code | $code, $order | Código de cliente de Tango (Customer.Code; por defecto la meta _tango_customer_code). |
| wc_tango_document_type | $type, $document, $order | Tipo de documento (96 DNI, 80 CUIT). |
| wc_tango_iva_category_code | $code, $order | Condición frente al IVA enviada. |
| wc_tango_province_code | $code, $state, $country, $order, $context | Código de provincia de facturación (billing) o envío (shipping). |
| wc_tango_order_warehouse_code | $code, $order | Depósito del pedido (por defecto el primero configurado). |
| wc_tango_sale_condition_code | $code, $order | Condición de venta del pedido. |
| wc_tango_sale_condition_is_cash | $is_cash, $code, $order | Si la condición es Contado (habilita informar pagos). |
| wc_tango_payment_method_code | $code, $gateway, $order | Forma de cobro de Tango del pago. |
| wc_tango_order_is_paid | $paid, $order | Si el pedido cuenta como pagado. |
| wc_tango_unpaid_gateways | array( 'cod' ) | Medios de pago que cuentan como pagados recién al completarse el pedido. |
| wc_tango_sendable_statuses | array( 'processing', 'on-hold', 'completed' ) | Estados de WooCommerce que disparan el envío. |
| wc_tango_order_prices_include_tax | $included, $order | Enviar importes con o sin impuestos. |
| wc_tango_absorb_total_difference | true, $difference, $order | Devolver false para que un pedido cuyos totales no cuadran falle en lugar de ajustarse. |
| wc_tango_cancel_reason | $reason, $order | Motivo de cancelación enviado a Tango. |
| wc_tango_cancel_order_payload | $payload, $order | JSON de cancelación. |
| wc_tango_order_status_map | $map | Tabla estado de Tango → estado de WooCommerce (null = sin cambio). |
| wc_tango_allow_status_transition | $ok, $current, $target, $order | Permitir o bloquear un cambio de estado originado en Tango. |
| wc_tango_status_ranks | $ranks | Rango de cada estado de Tango; un estado de rango menor al guardado se ignora. |
| wc_tango_processing_requires_paid | true, $order, $status | Devolver false para que RECIBIDA / EN PROCESO pasen a Procesando aunque el pedido no esté pagado. |
| wc_tango_observed_holds_paid_orders | false, $order, $status | Devolver true para que OBSERVADA pase a En espera también los pedidos pagados. |
| wc_tango_poll_max_age_days | 60 | Antigüedad máxima (días desde el envío) de los pedidos que revisa la consulta periódica. |
| wc_tango_resubmit_order_id | $order_id, $order, $count | OrderID de un pedido rechazado reenviado como nuevo (por defecto {ID}-R{n}). |
| wc_tango_checkout_iva_options | $options | Opciones de condición frente al IVA del checkout. |
| wc_tango_checkout_dni_required | true | Hacer opcional el DNI / CUIT. |
| wc_tango_api_timeout | 30 | Timeout de las llamadas a Tango (segundos). |
| wc_tango_api_base_url | $url, $mode | URL base de la API (por ejemplo, para apuntar a un staging o a un mock). |
| wc_tango_api_page_size | $size, $endpoint, $mode | Tamaño de página de los listados. |
| wc_tango_api_max_pages | 500, $endpoint | Máximo de páginas por listado (al cortar se registra un error). |
El plugin no define acciones (do_action) propias además de las tareas programadas.
// Ejemplo: que los pedidos cuyos totales no cuadran fallen en lugar de ajustarse add_filter( 'wc_tango_absorb_total_difference', '__return_false' );
19.2 API interna
- Acceso a componentes:
wc_tango_tiendas()->api,->order_sync,->stock_sync,->price_sync,->product_import,->product_map,->content_sync,->category_sync,->logger. - Ajustes y credenciales: usá siempre
WC_Tango_Settings(get_api_mode(),get_credentials(),get_secret(),get_warehouse_codes(), etc.). Los tokens están encriptados: no los leas conget_option(). - Los métodos de catálogos del cliente de la API (
get_warehouses(),get_price_lists(),get_sale_conditions(),get_counterfoils(), etc.) ahora devuelven directamente las filas; en v2 devolvían{Data: [...]}. - Los nombres de hooks de cron y de Action Scheduler no cambiaron respecto de v2.
19.3 Tablas de base de datos
| Tabla | Contenido |
|---|---|
| {prefix}tango_sync_log | Registro de actividad (tipo, dirección, entidad, estado, mensaje, request y response). Se limpia a diario: 30 días y máximo 10.000 filas. |
| {prefix}tango_product_map | Vínculo producto/variación de WooCommerce ↔ SKU, código de producto y de variante de Tango; fecha de última sincronización de stock y precio. |
| {prefix}tango_order_map | Vínculo pedido de WooCommerce ↔ orden de Tango: estado, número y URL de factura, tango_invoice_expiration, api_mode, send_attempts, last_error, sent_at, last_sync. |
| {prefix}tango_sync_history | Historial de cambios de stock y precio por producto (30 días). |
Las tablas se crean y actualizan con dbDelta al activar o actualizar el plugin. Desinstalar el plugin no borra tablas ni opciones.
Metadatos principales
- Pedido:
_tango_order_id,_tango_order_ref,_tango_order_ref_history,_tango_resubmissions,_tango_last_payload,_tango_last_error,_tango_sent_unpaid,_tango_invoice_number,_tango_invoice_type,_tango_invoice_url,_tango_invoice_expiration,_billing_dni,_billing_iva_category. - Producto / variación:
_tango_sku_code,_tango_product_code,_tango_variant_code,_barcode,_tango_kit,_tango_sale_managed,_tango_content_checksum.
19.4 Opciones
Todas las opciones usan el prefijo wc_tango_; las de cada pestaña figuran en la sección Configuración. Otras opciones relevantes:
| Opción | Notas |
|---|---|
| wc_tango_webhook_secret | Secreto aleatorio de 32 caracteres por sitio, comparado en tiempo constante. Se puede regenerar desde Configuración › Webhooks. |
| wc_tango_setup_completed | yes/no. Marca el asistente de configuración como completado. |
| wc_tango_db_version | Versión del esquema; dispara la migración automática al actualizar. |
19.5 Seguridad
- Credenciales encriptadas con libsodium (
sodium_crypto_secretbox), con clave derivada de la salAUTHde WordPress. Sin libsodium se guardan en texto plano. - Los campos secretos se muestran enmascarados (
••••••••1234); vaciar el campo no borra el valor guardado. - La exportación de configuración y el informe de diagnóstico no incluyen credenciales ni secretos.
- Todas las acciones AJAX y formularios usan nonces y exigen la capacidad
manage_woocommerce(Administrador y Gestor de tienda). - Las llamadas a Tango usan HTTPS con verificación de certificado (
sslverify).
20. Planes y licencias
| Plan | Precio | Dónde corre la sincronización | Incluye |
|---|---|---|---|
| Mensual | US$89/mes | Servidor dedicado de Arandano | Actualizaciones y soporte técnico |
| Anual | US$599/año | Servidor dedicado de Arandano | Actualizaciones y soporte técnico |
| Lifetime | US$789 pago único | En el mismo servidor de tu WordPress | Licencia perpetua para un sitio |
Mirá el detalle de cada plan y contratalo desde la página de Tango eCommerce.
Documentación de Tango eCommerce para WooCommerce v3.0.0 — Octubre 2026