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.
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
| URL | https://apiv2.wibi.com.ar/onzecrm/integraciones/zetti/upload |
|---|---|
| Método | POST, multipart/form-data |
Campo file | El archivo (.csv o .txt, tipo text/csv o text/plain). Máximo 10 MB y 50.000 filas. |
Campo pUser | Usuario del comercio en WIBI (el mismo de la integración del punto de venta). |
Campo pPass | Clave del comercio en WIBI. |
| Límite | 30 envíos por minuto. |
| Procesamiento | Asincró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:
| error | Significado |
|---|---|
"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-ddoaaaa-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
| # | Campo | Oblig. | Descripción |
|---|---|---|---|
| 1 | IdTransaccion | Sí | Número entero positivo, único por comprobante. Agrupa los renglones de la venta y evita duplicados si el archivo se reenvía. |
| 2 | FechaTransaccion | Recom. | Fecha (y hora) de la venta. Si viene vacía se toma la fecha de proceso. |
| 3 | Anulada | No | T, SI, TRUE o 1 = el comprobante es una anulación. |
| 4 | TipoOperacion | Recom. | 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. |
| 5 | IdTransaccionAnulada | Cond. | Obligatorio en anulaciones y devoluciones: IdTransaccion de la venta original. |
| 6 | NombreSucursal | Sí | Nombre de la sucursal. Debe estar en el mapa de sucursales (ver configuración). Sin mapear, la venta queda con error. |
| 7 | NombreVendedor | No | Se guarda como operador del movimiento. |
| 8 | NombrePromocion | No | Informativo, no se procesa. |
| 9 | NombreProducto | Recom. | Descripción. Se usa para dar de alta el producto la primera vez. |
| 10 | CodigoBarra | Sí | Identifica el producto (EAN/UPC). Sólo dígitos: un renglón sin código numérico se descarta. |
| 11 | Categoria | No | Rubro del producto; se crea como clasificador para promociones e informes. |
| 12 | Marca | No | Informativo (no se guarda). |
| 13 | Cantidad | Sí | Mayor a 0. En devoluciones puede venir negativa (se toma el valor absoluto). |
| 14 | PrecioVenta | Sí | Precio unitario con impuestos. |
| 15 | MontoDescuento | No | Descuento por unidad; se resta del precio unitario. |
| 16 | PorcentajeDescuento | No | Informativo. |
| 17 | Puntos | No | Informativo. Los puntos los calcula WIBI con las reglas de la campaña. |
| 18 | PuntosVendedor | No | Informativo. |
| 19 | NombreCanje | No | Informativo. |
| 20 | NombreCliente | Recom. | Nombre (para el alta del cliente). |
| 21 | ApellidoCliente | Recom. | Apellido. |
| 22 | FechaNacimiento | No | Mismos formatos de fecha. |
| 23 | Sexo | No | M / F (también masculino, femenino). |
| 24 | NumeroDocumento | Cond. | 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. |
| 25 | Recom. | Para comunicaciones. | |
| 26 | Telefono | Recom. | Para WhatsApp y recordatorios. |
| 27 | Provincia | No | Domicilio. |
| 28 | Localidad | No | Domicilio. |
| 29 | Calle | No | Domicilio. |
| 30 | Numero | No | Domicilio. |
| 31 | CodigoPostal | No | Domicilio. |
| 32 | NroTarjeta | Cond. | 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
NombreSucursaldel CSV (sin distinguir mayúsculas) con su comercio WIBI. Mapear a0excluye 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
IdTransaccionse 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