Saltar al contenido
WIBI Centro de ayuda

Integración por archivo (CSV Zetti)

Cargar ventas desde el sistema de facturación con un archivo CSV en formato Zetti: formato, envío y errores.

El sistema de facturación del cliente envía a WIBI un archivo CSV con las ventas, devoluciones y anulaciones del período. WIBI lo procesa en segundo plano: identifica o da de alta al cliente, calcula los puntos con las reglas de la campaña y registra el movimiento en la sucursal que corresponde.

Para quién es: cualquier punto de venta que pueda generar un archivo de texto y hacer un POST HTTP. No hace falta que el sistema del cliente exponga una API: el cliente empuja el archivo a WIBI (por ejemplo, una tarea programada cada hora o al cierre de caja).

1. Conexión

URLhttps://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload
MétodoPOST, multipart/form-data
Campo fileEl archivo (.csv o .txt, tipo text/csv o text/plain). Máximo 10 MB y 50.000 filas.
Campo pUserUsuario del comercio en WIBI (el mismo de la integración del punto de venta).
Campo pPassClave del comercio en WIBI.
Límite30 envíos por minuto.
ProcesamientoAsincrónico: la respuesta confirma la recepción; el archivo se procesa en el minuto siguiente. El resultado se ve en Parámetros > Zetti > Ver panel de uploads.

Respuesta

Siempre HTTP 200 con un JSON. El campo error indica el resultado:

errorSignificado
"0"Archivo recibido. data trae nombre, ruta y fecha de recepción.
"01"Usuario o clave incorrecta.
"02"Falta el archivo, extensión o tipo no permitido, o excede el tamaño.
"03"Error al guardar el archivo (reintentar).
{"error":"0","data":{"id":0,"name":"ventas_20261021.csv","path":"zetti/5b0c...csv","id_user":14253,
 "id_file_version":1,"date_add":"/Date(1792607400000)/","date_process":"/Date(-2208988800000)/",
 "process":false,"process_error":false,"process_log":""}}

2. Formato del archivo

  • Texto UTF-8, una línea por renglón de producto.
  • Separador coma (,). Los textos que contengan comas van entre comillas dobles.
  • Sin fila de encabezado y con 31 columnas en el orden de la tabla (aunque estén vacías). La columna 32 (NroTarjeta) es obligatoria sólo en campañas con tarjeta física; en campañas con tarjeta virtual los archivos de Zetti, de 31 columnas, se procesan igual.
  • Una venta con varios productos ocupa varias líneas con el mismo IdTransaccion; los datos de cabecera y del cliente se toman de la primera.
  • Fechas: dd/mm/aaaa, dd/mm/aaaa hh:mm:ss, aaaa-mm-dd o aaaa-mm-dd hh:mm:ss.
  • Decimales con punto (1250.50) o con coma (1250,50). Si hay miles con punto y decimales con coma (1.250,50) también se interpreta bien.

Columnas

#CampoOblig.Descripción
1IdTransaccionSíNúmero entero positivo, único por comprobante. Agrupa los renglones de la venta y evita duplicados si el archivo se reenvía.
2FechaTransaccionRecom.Fecha (y hora) de la venta. Si viene vacía se toma la fecha de proceso.
3AnuladaNoT, SI, TRUE o 1 = el comprobante es una anulación.
4TipoOperacionRecom.Texto libre. Se reconoce: "anulación" (anula), "devolución" / "nota de crédito" (devuelve puntos), "puntos por alta" / "redención de puntos" (eventos sin productos, se omiten). Cualquier otro valor es venta.
5IdTransaccionAnuladaCond.Obligatorio en anulaciones y devoluciones: IdTransaccion de la venta original.
6NombreSucursalSíNombre de la sucursal. Debe estar en el mapa de sucursales (ver configuración). Sin mapear, la venta queda con error.
7NombreVendedorNoSe guarda como operador del movimiento.
8NombrePromocionNoInformativo, no se procesa.
9NombreProductoRecom.Descripción. Se usa para dar de alta el producto la primera vez.
10CodigoBarraSíIdentifica el producto (EAN/UPC). Sólo dígitos: un renglón sin código numérico se descarta.
11CategoriaNoRubro del producto; se crea como clasificador para promociones e informes.
12MarcaNoInformativo (no se guarda).
13CantidadSíMayor a 0. En devoluciones puede venir negativa (se toma el valor absoluto).
14PrecioVentaSíPrecio unitario con impuestos.
15MontoDescuentoNoDescuento por unidad; se resta del precio unitario.
16PorcentajeDescuentoNoInformativo.
17PuntosNoInformativo. Los puntos los calcula WIBI con las reglas de la campaña.
18PuntosVendedorNoInformativo.
19NombreCanjeNoInformativo.
20NombreClienteRecom.Nombre (para el alta del cliente).
21ApellidoClienteRecom.Apellido.
22FechaNacimientoNoMismos formatos de fecha.
23SexoNoM / F (también masculino, femenino).
24NumeroDocumentoCond.Documento: se toman sólo los dígitos, hasta 10. Obligatorio para dar de alta un cliente nuevo (todo cliente WIBI tiene documento). Sin NroTarjeta identifica al cliente y es su número de tarjeta en WIBI. Con tarjeta física puede omitirse si el cliente ya existe con esa tarjeta; si la tarjeta no tiene cliente y no hay documento, la venta queda con error.
25EmailRecom.Para comunicaciones.
26TelefonoRecom.Para WhatsApp y recordatorios.
27ProvinciaNoDomicilio.
28LocalidadNoDomicilio.
29CalleNoDomicilio.
30NumeroNoDomicilio.
31CodigoPostalNoDomicilio.
32NroTarjetaCond.Tarjeta física del programa (sólo dígitos, hasta 45; se ignoran espacios y guiones). Obligatorio si la campaña usa tarjeta física (sin él la venta se omite); opcional con tarjeta virtual. Si viene, identifica al cliente: se busca por tarjeta y, si no existe, por documento (y se le asigna la tarjeta); un cliente nuevo se da de alta con esa tarjeta. Con letras, la venta se omite.

Recom. = recomendado (sin él la venta se procesa igual, pero con menos datos). Cond. = obligatorio sólo en ese caso.

Ejemplo

Una venta de dos productos y la anulación de una venta anterior:

1001,21/10/2026 10:15:00,F,Venta,,Sucursal Centro,Juan Pérez,,Ibuprofeno 400 mg x 20,7790001000012,Medicamentos,Genfar,1,3500.00,0,0,0,0,,Ana,Gómez,15/03/1985,F,30123456,ana@mail.com,5491155550000,Buenos Aires,CABA,Corrientes,1234,1043
1001,21/10/2026 10:15:00,F,Venta,,Sucursal Centro,Juan Pérez,,Protector solar FPS 50 200 ml,7790002000029,Dermocosmética,Isdin,2,12000.00,600.00,5,0,0,,Ana,Gómez,15/03/1985,F,30123456,ana@mail.com,5491155550000,Buenos Aires,CABA,Corrientes,1234,1043
1002,21/10/2026 11:40:00,T,Anulación,987,Sucursal Centro,Juan Pérez,,,,,,0,0,0,0,0,0,,Ana,Gómez,,F,30123456,,,,,,,

3. Configuración en WIBI

En Parámetros > Zetti de la campaña:

  • Comercio de autenticación: el comercio cuyas credenciales (pUser/pPass) envían el archivo.
  • Mapa de sucursales: cada NombreSucursal del CSV (sin distinguir mayúsculas) con su comercio WIBI. Mapear a 0 excluye esa sucursal a propósito (sus ventas se omiten sin error).
  • Categoría de cliente por defecto: la que reciben los clientes nuevos.

4. Reglas de proceso

  • Reenvíos: cada IdTransaccion se procesa una sola vez; reenviar el mismo archivo no duplica puntos.
  • Clientes: si el documento no existe en la campaña, se da de alta con los datos del archivo.
  • Productos: si el código de barras no existe en la red, se da de alta.
  • Anulación: revierte los puntos de la venta original (debe haberse enviado antes).
  • Devolución: descuenta los puntos proporcionales al importe devuelto.

5. Ejemplos de envío

cURL

curl -X POST "https://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload" \
  -F "pUser=USUARIO_COMERCIO" \
  -F "pPass=CLAVE_COMERCIO" \
  -F "file=@ventas_20261021.csv;type=text/csv"

PHP

$ch = curl_init('https://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => [
        'pUser' => 'USUARIO_COMERCIO',
        'pPass' => 'CLAVE_COMERCIO',
        'file'  => new CURLFile('ventas_20261021.csv', 'text/csv'),
    ],
]);
$resp = json_decode(curl_exec($ch), true);
if (($resp['error'] ?? '') !== '0') {
    // reintentar más tarde; registrar $resp['mensaje'] ?? $resp['message']
}

Python

import requests

with open("ventas_20261021.csv", "rb") as f:
    r = requests.post(
        "https://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload",
        data={"pUser": "USUARIO_COMERCIO", "pPass": "CLAVE_COMERCIO"},
        files={"file": ("ventas_20261021.csv", f, "text/csv")},
        timeout=60,
    )
resp = r.json()
if resp.get("error") != "0":
    raise RuntimeError(resp.get("mensaje") or resp.get("message"))

C# (.NET)

using var http = new HttpClient();
using var form = new MultipartFormDataContent();
form.Add(new StringContent("USUARIO_COMERCIO"), "pUser");
form.Add(new StringContent("CLAVE_COMERCIO"), "pPass");
var file = new ByteArrayContent(File.ReadAllBytes("ventas_20261021.csv"));
file.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
form.Add(file, "file", "ventas_20261021.csv");
var resp = await http.PostAsync("https://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload", form);
var json = await resp.Content.ReadAsStringAsync();   // {"error":"0",...}

6. Clientes fuera de Argentina

  • Documento: se conservan sólo los dígitos (hasta 10). Identificadores alfanuméricos como CURP o RFC (México) no sirven: quedarían reducidos a los dígitos de la fecha y se mezclarían clientes. Con tarjeta física, enviarla en la columna 32 (NroTarjeta) y en NumeroDocumento un número propio del cliente (por ejemplo, el celular a 10 dígitos), necesario para el alta de clientes nuevos.
  • Códigos de producto: sólo numéricos. Si el sistema usa SKU alfanuméricos, enviar el código de barras EAN/UPC.
  • Moneda e impuestos: los importes se toman tal cual llegan; la equivalencia de puntos se define en la campaña.

Actualizado el 4 de noviembre de 2026