Guía de uso · Sellix

Sellix detecta automáticamente dónde se está yendo el margen de tu empresa. Esta guía te explica cómo funciona el motor, cómo configurarlo, y cómo usar el WMS subyacente para capturar datos de calidad.

Si ya operás con un sistema propio (ERP, Excel, Memory, Defontana, etc.), Sellix se conecta encima sin reemplazarlo. Si no tenés nada, te incluimos el WMS gratis.

Auditoría IA · qué es y cómo funciona

Sellix es un sistema operativo financiero invisible que corre encima de tu operación. No te gestiona el negocio — te muestra exactamente dónde está perdiéndose tu margen, en dinero real, mes a mes.

Cómo funciona en 4 pasos

1Conexión de datos

Conectás tus sistemas: WMS interno, ERP, Excel maestro, sistema de facturación. Cada empresa elige qué conectar. Si no tenés nada, te damos el WMS de Sellix.

2Calibración

Cargás tus costos operativos reales: costo/hora de operario, target de horas para preparar un pedido, costo de procesar 1 devolución, baseline aceptable de devoluciones por proveedor. Sin esto, los detectores trabajan con valores genéricos. Con esto, te muestran tu dinero.

3El motor corre cada 6 horas

Los 10 detectores escanean tu data buscando patrones de fuga. Cada hallazgo viene con título, descripción, evidencia y money_impact mensual estimado.

4Vos resolvés y suma a tu marcador

En la pantalla "💰 Fugas detectadas" ves las fugas priorizadas por impacto en pesos. Cada vez que resolvés una, suma al "Recuperado · 30 días". Las fugas se auto-resuelven cuando la causa desaparece entre corridas.

Los 10 detectores · Leak Detection Engine

DetectorQué buscaCómo calcula impacto
🎯 Diferencias de stockVariance entre auditoría y stock teóricovariance × cost_uyu del SKU
🧊 Stock muertoSKUs sin movimiento +90 díasqty disponible × cost_uyu
⚠ Errores de operarioOperarios con error rate > 2σ del promedio del equipoerrors × $200 (heurística)
📉 Cancelaciones anómalasSpike de cancelaciones vs baseline 90d$ de facturación cancelada
🐌 Rotación lentaSKUs con stock que cubre +90 días de demanda50% del valor inmovilizado
🚨 Salidas sin escaneoMovimientos de salida que bypassearon escaneo5% del valor de los pedidos afectados
🔴 Margen real negativoSKUs cuyo margen real (precio − cost − devoluciones − daño) es <0(margen real negativo) × volumen mensual
🏭 Fuga por proveedorProveedores con tasa de devolución/daño > baseline(returns_cost + damaged_cost) / 6 meses
⏱ Demoras de preparaciónPromedio order→shipped > target configurado(horas exceso) × $/hora operario
💸 Clientes no rentablesClientes con margen real <10%−margen_real / 3 (mensualizado)

Severidad automática

Cada hallazgo recibe una severidad según el money_impact:

Score por área operativa

Sellix agrupa los hallazgos en 4 áreas y le da a cada una un score de 0 a 100, con semáforo:

ÁreaDetectores que la componen
🏬 DepósitoDiferencias de stock + Salidas sin escaneo + Errores de operario
🛒 ComprasStock muerto + Rotación lenta + Fuga por proveedor
💵 VentasCancelaciones + Margen real negativo + Clientes no rentables
🚛 LogísticaDemoras de preparación

El cálculo: Score = 100 − (impacto_total_área / baseline_mensual) × 100, donde baseline = 5% de tu facturación mensual o $20.000 (lo que sea mayor). Verde ≥80 · Ámbar 50-79 · Rojo <50.

Configurar costos para que las cuentas sean tuyas

Andá a "💰 Fugas detectadas" → botón "⚙ Costos" arriba a la derecha. Cargás 5 valores:

ParámetroDefaultCómo calcularlo
Costo/hora de operario$800 UYU(sueldo + cargas + extras) ÷ horas trabajadas mes
Target order → shipped4 horasTu meta operativa razonable
Costo de procesar 1 devolución$500 UYU(tiempo inspección + reingreso + rework + logística inversa)
% de depreciación al dañarse1.0 (pérdida total)0.5 si vendés segundas, 1.0 si tirás
Tasa devolución aceptable proveedor0.03 (3%)El % típico de tu industria

Apenas guardás, el motor re-corre con tus parámetros.


WMS subyacente · captura de datos

Si no tenés un sistema operativo de depósito, te damos el de Sellix. El WMS captura la data que después el motor analiza.

Qué es Sellix WMS

Sellix es un sistema operativo de depósito para empresas chicas y medianas: lleva el control físico de cada unidad, exige escaneo en puerta para que no salga nada sin registrar, te permite mover stock entre depósitos con confirmación remota del camionero, y se integra con tu sistema de facturación electrónica para emitir el CFE automáticamente al despachar.

Conceptos básicos

TérminoQué es
DepósitoEdificio físico donde se guarda mercadería. Podés tener varios.
UbicaciónPosición exacta dentro de un depósito (zona / rack / posición). Cada una puede tener un QR.
SKUCódigo interno de un producto. Ej: SKU-001 = "Aceite girasol 1.5 L".
UnidadCada cosa física rastreable. Podés tener 50 unidades del mismo SKU.
PedidoSolicitud de un cliente con líneas (SKU + cantidad). Estados: pendiente → reservado → picking → packed → ready → shipped.
MovimientoCualquier acción física registrada: ingreso, transfer, picking, salida, daño, devolución. Audit trail inmutable.

Primeros pasos (5 min)

1Crear un depósito

Configuración → Depósitos → "+ Nuevo depósito". Mínimo necesitás uno para arrancar.

2Crear ubicaciones

Configuración → Ubicaciones. Te recomendamos zonas tipo A / B, racks numerados 01 / 02, posiciones 01 a 10. Pegale un QR a cada una si vas a escanear.

3Cargar SKUs

Inventario → SKUs → "+ Nuevo SKU". Definí código, nombre, costo, precio y stock mínimo (te avisamos cuando bajes de ese umbral).

4Ingresar mercadería

Inventario → Ingreso mercadería. Escaneá la ubicación destino y cargá las unidades. Cada unit nueva queda en estado available.

5Hacer un pedido de prueba

Pedidos → "+ Nuevo pedido". Reservá → Pick → Pack → Ready → Door scan. Felicitaciones, despachaste tu primer pedido.

Pedidos · ciclo completo

Cada pedido pasa por 7 estados. Vas a ver el estado actual con un pill de color al lado del nº de pedido:

EstadoQué pasóPróxima acción
pendingRecién creado, aún sin reservar stock.Reservar
reservedStock asignado pero todavía en sus posiciones.Empezar picking
pickingOperario está sacando las unidades del rack.Continuar / cerrar picking
packedTodo recolectado y embalado.Marcar listo
readyListo en zona de despacho.Door scan del operario · o link de retiro al camionero
shippedSalió del depósito · auto-emisión de CFE si está activo.
cancelledAbortado · units liberadas al stock.
Importante: nada sale sin confirmación · pero hay dos rutas válidas. Para que un pedido pase a shipped tiene que haber door scan del operario en puerta, o confirmación del camionero desde el link único que le mandás (con factura, foto de la mercadería y firma digital · ver Links de retiro · camionero remoto más abajo). Cualquiera de las dos cierra el pedido y deja audit trail completo. La regla operativa de Sellix es que siempre quede traza de quién confirmó la salida · esto evita robo, error de despacho y pérdida.

Ingreso de mercadería

Cuando llega mercadería al depósito desde un proveedor, andá a Inventario → Ingreso mercadería. Por cada SKU recibido:

  1. Elegí el SKU.
  2. Indicá la cantidad.
  3. Escaneá (o seleccioná) la ubicación destino.
  4. Confirmá. Se crean N unidades nuevas en estado available en esa ubicación, y queda registrado un movement type inbound.

Picking con escaneo

El operario abre Pedidos → Picking y le aparecen las órdenes asignadas. Por cada línea:

  1. El sistema le dice qué SKU buscar y cuántas unidades.
  2. Escanea cada unit (QR de la unidad o del rack).
  3. Cuando completa todas las líneas, el pedido pasa a packed.

Si el operario escanea un código que no corresponde, el sistema lo rechaza. Esto previene errores de armado.

Salida del depósito · dos rutas válidas

Para cerrar un pedido y pasarlo de ready a shipped tenés dos opciones. Las dos dejan audit trail completo (quién, cuándo, qué) y las dos disparan la facturación si la tenés integrada.

Opción A · Door scan del operario

El operario abre Salida en puerta, escanea el código del pedido (o lo tipea). El sistema valida:

Si todo OK · las units pasan a shipped, el pedido se cierra, y se dispara la emisión del CFE (en el sistema de facturación que ya tenés). Útil cuando tu propio operario carga el camión.

Opción B · Link de retiro al camionero (sin door scan)

Cuando viene un camionero externo a buscar mercadería · en lugar de pedirle a tu operario que esté presente en la puerta, generás un link único, lo mandás al chofer y él lo confirma desde el celular:

Sellix registra timestamp, GPS si lo permitió, IP del dispositivo, factura ingresada, foto y firma. El link queda used y no se puede reusar. Detalles del flujo y configuración del PIN extra en Links de retiro · camionero remoto abajo.

Cuándo usar cuál: door scan para envíos con tu propio camión o tu propio operario en puerta · link de retiro para camioneros externos, transportes contratados, retiros del cliente final, o cualquier caso donde no tenga sentido que tu operario haga papeleo extra.

Links de retiro · camionero remoto F107

Cuando un camionero externo viene a buscar mercadería al depósito, en lugar de hacer él el papeleo o de que tu operario dependa de él, generás un link único que el camionero abre en su celular y confirma el retiro desde ahí.

Cómo funciona

1La secretaria genera el link

Desde la lista de pedidos (estado packed o ready) clickea "🚚 Link", carga el nº de factura, datos del chofer, opcional PIN, opcional expiración.

2Le manda el link al camionero

Aparece un botón "📋 Copiar link" y "💬 Abrir WhatsApp" con un mensaje prearmado. Pegá el link en el WhatsApp del chofer.

3El camionero lo abre en su celular

Ve los datos del pedido (cliente, items), tipea el nº de factura, opcionalmente saca foto de la mercadería, firma con el dedo, y confirma.

4Sellix registra todo

Timestamp, GPS (si lo permitió), IP, factura ingresada, foto, firma. La orden queda shipped. El link queda used y no se puede reusar.

Cuándo usar PIN extra

Si el envío es de alto valor o vas a mandar el link por un canal compartido (un grupo de WhatsApp, email a una secretaría), activá el PIN. Pasale los 4 dígitos al chofer por mensaje privado o llamada. El sistema le pide ambos para confirmar.

Si algo sale mal

Cualquier link activo lo podés revocar desde Retiros (camionero) → fila → Revocar. El camionero ya no va a poder confirmar con ese link, vas a tener que generar uno nuevo.

Transferencias entre depósitos F108

Mover stock del depósito A al B con doble confirmación: el camionero confirma despacho al salir de A y recepción al llegar a B. Las units quedan en estado in_transit mientras tanto, así sabés en todo momento dónde está la mercadería.

1Crear la transferencia

Operación → Transferencias → "+ Nueva transferencia". Elegí depósito origen y destino, agregá líneas (SKU + cantidad). Sellix reserva automáticamente las units en el origen.

2Generar link de despacho

Botón "Despachar →". Se crea un link tipo retiro pero marcado como transfer_dispatch.

3El camionero confirma al salir

Abre el link, ingresa nº de remito, foto, firma, GPS. Las units pasan a in_transit y la transfer queda en estado in_transit.

4Generar link de recepción

Botón "Generar recepción →". Le mandás este link a quien recibe en el depósito destino.

5Confirmar recepción

El receptor abre el link, ingresa nº de remito, confirma. Las units pasan a available en una ubicación del depósito destino, y la transfer cierra como received.

Si el depósito destino todavía no tiene ubicaciones cargadas, Sellix crea automáticamente una ubicación temporal INGRESO/AUTO/PENDIENTE donde dejar la mercadería. Después podés re-ubicarla manualmente en su rack definitivo.

Devoluciones · RMA workflow completo F109

Cuando un cliente devuelve mercadería, Sellix te lleva todo el flow: motivo categorizado, inspección por línea, decisión final (vuelve a stock / dañado / reembolso / reposición).

Crear una RMA

Desde la lista de pedidos, encontrá uno en estado shipped y clickeá "↩ Devolver". O andá a Devoluciones → "+ Nueva devolución".

  1. Elegí el motivo: defectuoso, error de despacho, cliente cambió de idea, dañado en tránsito, producto equivocado, otro.
  2. Detalle libre (qué reportó el cliente).
  3. Líneas con SKU + cantidad devuelta.
  4. Confirmar — Sellix asigna un nº RMA tipo RMA-2026-0042.

Inspección al recibir la devolución

Cuando llega la mercadería al depósito, andá a la RMA y clickeá "Inspeccionar →". Por cada línea cargás:

CondiciónDecisiónQué hace Sellix
goodRestockLas units vuelven a available en una ubicación de retornos del depósito.
damagedDamagedLas units pasan a estado damaged, no vuelven al stock vendible.
cualquieraRefund onlySin cambio de inventario · registra el monto reembolsado.
cualquieraReplacementSin cambio de inventario · queda nota para que armes una orden de reposición.

Cerrar la RMA

Cuando todas las líneas tienen condición + decisión, clickeás "✓ Cerrar y aplicar". Sellix dispara los cambios de inventario y deja un movement type return o damage según corresponda.

Depósitos y ubicaciones

Configuración → Depósitos. Cada depósito tiene nombre y dirección. Podés tener uno solo o varios (con plan Enterprise tenés multi-depósito completo).

Configuración → Ubicaciones. Estructura recomendada: Zona / Rack / Posición. Por ejemplo: A / 01 / 03. Asignále un QR único a cada ubicación para que los operarios escaneen en lugar de tipear.

SKUs y stock mínimo

Cada SKU tiene código (único, ej SKU-001), nombre, categoría, costo, precio, y opcional un stock mínimo. Si las units disponibles bajan de ese mínimo, Sellix te manda una alerta por email (configurable en Alertas).

Operarios y permisos

Configuración → Equipo. Tres roles:

Alertas y resumen diario F111

Configuración → Alertas. Tres tipos de alertas + el resumen diario:

El "📧 Test resumen diario" te manda un email al instante con los KPIs de ayer, para que veas cómo queda antes de activarlo.

Facturación electrónica

Configuración → Facturación. Sellix no emite el CFE directamente — se conecta a tu sistema (Memory, Defontana, Bantotal, Conecta-Uy, o cualquiera vía webhook custom). Al confirmar el despacho, Sellix le manda los datos del pedido a tu sistema, y tu sistema emite el CFE en DGI.

Si tu proveedor no está pre-integrado, usá la opción Webhook custom. Esto es lo que más usa la mayoría: tu dev arma un endpoint que recibe el POST de Sellix.


📡 Integración DGI · webhook custom

Documentación técnica para el dev de tu sistema de facturación. Acá está todo lo que necesita saber para que tu sistema reciba los datos de cada despacho y emita el CFE.

Estructura del payload

Sellix hace POST al endpoint que vos configuraste, con los datos del pedido despachado en JSON.

Headers

Content-Type: application/json
User-Agent: Sellix-WMS/1.0 (+https://sellix.lat)
X-Sellix-Timestamp: 1735689600
X-Sellix-Signature: sha256=a4b2c8...   (sólo si tenés webhook_secret configurado)
Authorization: <el auth_header que configuraste, opcional>

Body

{
  "sellix_order_id": 12345,
  "order_number": "ORD-2026-00042",
  "shipped_at": "2026-05-05T14:32:18.123Z",
  "total_uyu": 18450.50,
  "client": {
    "name": "Distribuidora Acme S.A.",
    "rut": "210000000018",
    "type": "business",
    "delivery_address": "Av. Italia 1234, Montevideo"
  },
  "lines": [
    {
      "sku": "SKU-001",
      "name": "Aceite girasol 1.5L",
      "qty": 24,
      "unit_price_uyu": 285,
      "subtotal_uyu": 6840
    },
    {
      "sku": "SKU-014",
      "name": "Arroz Pony 1kg",
      "qty": 30,
      "unit_price_uyu": 145,
      "subtotal_uyu": 4350
    }
  ]
}

Respuesta esperada

Tu sistema debe responder con 200 o 201 y un JSON con al menos uno de:

{
  "invoice_id": "CFE-12345",          // o "id" o "cfe_id"
  "invoice_url": "https://...",        // o "url" o "cfe_url"
  "status": "ok"
}

Sellix guarda invoice_id y invoice_url en la orden. Si tu sistema no devuelve nada útil, es OK también — el llamado se considera exitoso si responde 2xx.

Si respondés 4xx o 5xx, Sellix considera que falló y entra en cola de reintentos automáticos (ver más abajo).

Verificación HMAC F113

Cada llamado de Sellix viene firmado para que puedas verificar que vino de Sellix y no de un atacante. Te lo damos como header X-Sellix-Signature y un X-Sellix-Timestamp para prevenir ataques de replay.

Receta

computed = HMAC_SHA256(webhook_secret, timestamp + "." + body)
válido si computed == header X-Sellix-Signature (sin el prefijo "sha256=")

El timestamp son segundos Unix. El body es el JSON tal cual te llegó (no lo re-serialices, usá el raw body).

Ejemplos por lenguaje

const crypto = require('crypto');
const express = require('express');
const app = express();

const WEBHOOK_SECRET = process.env.SELLIX_WEBHOOK_SECRET;
const FIVE_MIN = 5 * 60;

// Importante: usar express.raw para preservar el body exacto
app.post('/sellix-webhook',
  express.raw({ type: 'application/json' }),
  (req, res) => {
    const ts  = req.header('X-Sellix-Timestamp');
    const sig = (req.header('X-Sellix-Signature') || '').replace(/^sha256=/, '');
    const body = req.body.toString('utf8');

    // Verificar timestamp dentro de la ventana (anti replay)
    const age = Math.abs(Math.floor(Date.now() / 1000) - parseInt(ts, 10));
    if (!ts || age > FIVE_MIN) return res.status(401).json({ error: 'timestamp_expired' });

    // Verificar firma
    const expected = crypto
      .createHmac('sha256', WEBHOOK_SECRET)
      .update(ts + '.' + body)
      .digest('hex');
    if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
      return res.status(401).json({ error: 'invalid_signature' });
    }

    const data = JSON.parse(body);
    // emitir CFE en tu sistema...
    const cfe = await emitirCFE(data);

    res.json({ invoice_id: cfe.id, invoice_url: cfe.url });
  });
<?php
$WEBHOOK_SECRET = getenv('SELLIX_WEBHOOK_SECRET');

$body = file_get_contents('php://input');
$ts   = $_SERVER['HTTP_X_SELLIX_TIMESTAMP'] ?? '';
$sig  = preg_replace('/^sha256=/', '', $_SERVER['HTTP_X_SELLIX_SIGNATURE'] ?? '');

// Timestamp dentro de 5 minutos
if (!$ts || abs(time() - intval($ts)) > 300) {
    http_response_code(401);
    die(json_encode(['error' => 'timestamp_expired']));
}

// Verificar firma
$expected = hash_hmac('sha256', $ts . '.' . $body, $WEBHOOK_SECRET);
if (!hash_equals($expected, $sig)) {
    http_response_code(401);
    die(json_encode(['error' => 'invalid_signature']));
}

$data = json_decode($body, true);
// emitir CFE en tu sistema...
$cfe = emitirCFE($data);

header('Content-Type: application/json');
echo json_encode(['invoice_id' => $cfe['id'], 'invoice_url' => $cfe['url']]);
import hmac, hashlib, os, time
from flask import Flask, request, jsonify, abort

WEBHOOK_SECRET = os.environ['SELLIX_WEBHOOK_SECRET'].encode()
app = Flask(__name__)

@app.post('/sellix-webhook')
def sellix_webhook():
    body = request.get_data()              # raw bytes
    ts   = request.headers.get('X-Sellix-Timestamp', '')
    sig  = request.headers.get('X-Sellix-Signature', '').removeprefix('sha256=')

    # Timestamp dentro de 5 minutos
    if not ts or abs(int(time.time()) - int(ts)) > 300:
        abort(401, 'timestamp_expired')

    # Verificar firma
    expected = hmac.new(
        WEBHOOK_SECRET,
        f'{ts}.{body.decode()}'.encode(),
        hashlib.sha256
    ).hexdigest()
    if not hmac.compare_digest(expected, sig):
        abort(401, 'invalid_signature')

    data = request.get_json()
    # emitir CFE en tu sistema...
    cfe = emitir_cfe(data)
    return jsonify(invoice_id=cfe['id'], invoice_url=cfe['url'])
El secret lo ves en Configuración → Facturación → "🔐 Tu webhook secret". Tenés un botón "📋 Copiar" y otro "🔄 Rotar" si pensás que se filtró.

Política de reintentos F113

Si tu endpoint responde 4xx o 5xx, o si hay timeout (>20 s), o si Sellix no puede llegar al server, el llamado entra en cola de reintentos automáticos. La frecuencia es backoff progresivo:

IntentoTiempo desde el primer fallo
1 (original)al confirmar despacho
2+5 min
3+15 min
4+30 min
5+1 h
6+2 h
7+4 h
8+8 h
9 (último)+16 h

Total: ~32 hs de ventana de reintentos. Después de 9 intentos, Sellix se rinde — la entrada queda en el log con estado fallido y vas a tener que reintentar manualmente.

Reintento manual

En Configuración → Facturación → Historial de emisiones, cualquier fila fallida tiene un botón "🔄 Reintentar". Útil si arreglaste algo en tu sistema y querés despachar la emisión sin esperar al próximo intento programado.

Idempotencia

Tu endpoint debe ser idempotente — si recibís el mismo sellix_order_id dos veces, no emitas dos CFE. Lo más fácil es checkear en tu base si ya tenés un CFE para ese order_id antes de emitir.

Ejemplo de cómo NO romper la idempotencia: usá INSERT ... ON CONFLICT DO NOTHING con sellix_order_id como key única en tu tabla de emisiones. Si tu sistema no soporta eso, query antes de emitir.

🔌 Cómo conectar tu sistema DGI con Sellix

Guía paso a paso para enchufar el sistema de facturación electrónica que ya tenés (Memory, Defontana, Bantotal, Conecta-Uy o el que sea) con Sellix. Tiempo estimado: 30-60 minutos con tu dev o el soporte de tu proveedor.

Punto clave: Sellix nunca tiene credenciales DGI. Tu acceso a DGI vive en tu sistema de facturación · Sellix sólo se conecta con tu sistema, no con DGI directamente. Eso simplifica todo · vos seguís facturando como siempre, Sellix lee la data y te muestra dónde se va el margen.

Qué necesitás antes de arrancar

1. Tu sistema de facturación electrónica activo

El que ya estás usando para emitir CFE en DGI. Si no tenés ninguno, primero contratá uno (Memory, Conecta-Uruguay, Defontana, Bantotal y otros). Sellix no es certificado DGI · es la capa de inteligencia que va arriba.

2. Acceso técnico al sistema (URL del API + tu API key del proveedor)

Pedile a tu proveedor o a tu administrador del sistema:

DatoDónde se obtiene
URL del endpoint APIDocumentación del proveedor o panel de configuración. Ej: https://api.memory.com.uy/v2/
API key / token de tu cuentaPanel del proveedor → Integraciones / API. Cada proveedor lo llama distinto: access_token, integration_key, secret.
RUT de tu empresaTu RUT de DGI · ya lo tenés. Sellix lo usa para identificar comprobantes en el log.
Tipo de comprobante por defaulte-Factura, e-Ticket, e-Remito · según tu operación. Lo decidís vos en cada despacho o lo dejás como default.
Importante: tu acceso DGI (certificados, llaves privadas, password de DGI) NO va en Sellix. Eso queda en tu sistema · ya lo configuraste cuando contrataste al proveedor. Lo único que vamos a usar es la API key del proveedor, que te identifica a vos como cliente del proveedor.

3. Dev o soporte técnico de tu proveedor (durante el setup)

Si tu proveedor está en nuestra lista de presets (Memory, Defontana, Bantotal, Conecta-Uy), no necesitás dev · es config. Si tu proveedor no está, o tenés un sistema custom, necesitás un dev por 1-2 horas para armar el receptor del webhook.

Cómo conectar según tu proveedor

Conectar Memory con Sellix

  1. Entrá a tu cuenta de Memory: memory.com.uy
  2. Andá a Configuración → Integraciones / API y generá un access token de tipo "lectura + emisión".
  3. Copiá la URL del API que te dan (típicamente https://api.memory.com.uy/v2/) y el token.
  4. En Sellix · andá a Configuración → Facturación · elegí proveedor "Memory" · pegá la URL y el token. Probá la conexión.
  5. Para que Memory le avise a Sellix cada vez que emite un CFE: pedile a soporte de Memory que configure un webhook saliente apuntando a tu URL de Sellix (te la mostramos en el panel 📥 Eventos entrantes) con tu API key de Sellix como header X-Sellix-API-Key.

Conectar Conecta-Uruguay con Sellix

  1. Logueate en el panel de Conecta-Uruguay.
  2. Andá a Mi cuenta → API / Integraciones · habilitá API access y copiá tu integration key.
  3. En Sellix · Configuración → Facturación · proveedor "Conecta-Uruguay" · pegá la URL del endpoint de Conecta y la key.
  4. Conecta-Uruguay tiene módulo de webhooks salientes nativo · configurá el evento "CFE emitido" apuntando a la URL de Sellix con tu API key como header.

Conectar Defontana con Sellix

  1. Entrá a tu Defontana cloud → Administración → Integraciones.
  2. Generá un API client con permisos de lectura de comprobantes y consulta de stock/clientes.
  3. Vas a recibir un client_id + secret. Pegalos en Sellix → Configuración → Facturación · proveedor "Defontana".
  4. Defontana no tiene webhooks salientes nativos en todos los planes. Si tu plan los soporta, configuralos. Si no, pedile al soporte de Defontana que active el módulo o que tu dev arme un cron job (5-15 min) que consulte los CFE nuevos y los empuje a Sellix.

Conectar Bantotal con Sellix

  1. Bantotal es típicamente self-hosted o on-premise · necesitás coordinar con tu dpto de IT.
  2. Pedile al admin de tu Bantotal que habilite el módulo de integraciones y genere credenciales API.
  3. Configurá en Sellix la URL interna de tu Bantotal y las credenciales · proveedor "Bantotal".
  4. Para que Bantotal avise a Sellix de cada emisión, tu IT puede armar un trigger en la base de datos o un servicio middleware que escuche CFEs nuevos y haga POST a Sellix con tu API key.

Conectar tu sistema propio o uno no listado

Si tu sistema de facturación es un desarrollo propio o un proveedor que no está en la lista, usá el modo Webhook custom. Necesitás un dev por unas horas:

  1. En Sellix · Configuración → Facturación · elegí proveedor "Webhook custom" · pegá la URL del endpoint de tu sistema que recibe los datos.
  2. Sellix te genera un webhook_secret · copialo y configuralo en tu sistema receptor.
  3. Tu dev arma el endpoint receptor que valida el HMAC, lee el JSON con los datos del despacho y llama a tu sistema DGI para emitir el CFE.
  4. Para el flujo inverso (tu sistema → Sellix): tu dev arma un job que cada vez que se emite un CFE, hace POST a la URL de Sellix con tu API key. Más abajo está el formato del JSON exacto.

Eventos entrantes · tu sistema → Sellix F128

Cuando tu sistema de facturación emite algo (factura, devolución, ajuste de stock), te conviene avisarle a Sellix para que el motor de detección tenga los datos al día. Sin esto, tendrías que subir Excel manualmente cada cierto tiempo.

URL del endpoint

POST https://sellix.lat/api/inbound/event

Headers

Content-Type: application/json
X-Sellix-API-Key: slx_

La API key la generás desde Sellix → Integraciones · API · al crearla, marcá scope "write".

Body · 4 tipos de evento

1. Venta creada (la más importante · cuando emitís un CFE)

{
  "event_type": "sale.created",
  "external_id": "A-12345",
  "source": "memory",
  "data": {
    "order_number": "A-12345",
    "shipped_at": "2026-05-06T14:30:00Z",
    "total_uyu": 18450.50,
    "external_invoice_id": "CFE-A-001-0012345",
    "external_invoice_url": "https://...",
    "client": {
      "name": "Distribuidora Acme S.A.",
      "rut": "210000000018",
      "type": "business"
    },
    "lines": [
      { "sku": "SKU-001", "name": "Aceite girasol 1.5L", "qty": 24, "unit_price_uyu": 285 },
      { "sku": "SKU-014", "name": "Arroz Pony 1kg", "qty": 30, "unit_price_uyu": 145 }
    ]
  }
}

2. SKU alta o modificación

{
  "event_type": "sku.upserted",
  "external_id": "SKU-001",
  "data": {
    "sku": "SKU-001",
    "name": "Aceite girasol 1.5L",
    "cost_uyu": 220,
    "price_uyu": 285,
    "category": "Almacén",
    "min_stock": 50
  }
}

3. Devolución / nota de crédito

{
  "event_type": "return.created",
  "external_id": "NC-2026-0042",
  "data": {
    "order_number": "A-12345",
    "reason": "defect",
    "lines": [
      { "sku": "SKU-001", "qty": 3, "condition": "damaged", "refund_amount": 855 }
    ]
  }
}

4. Ajuste de stock (entrada o salida no atribuible a una venta)

{
  "event_type": "stock.adjusted",
  "external_id": "ADJ-2026-0099",
  "data": {
    "sku": "SKU-001",
    "delta_qty": 50,         // positivo = entrada · negativo = salida
    "reason": "purchase"     // purchase | damage | inventory_correction | other
  }
}

Respuesta exitosa

{
  "ok": true,
  "event_id": 12345,
  "result": "order_upserted",
  "ref": "A-12345",
  "order_id": 678
}

Idempotencia · cómo evitar duplicados

Si mandás el mismo external_id dos veces para el mismo event_type, Sellix detecta el duplicado y devuelve el resultado del original sin procesar de nuevo:

{
  "ok": true,
  "duplicate": true,
  "event_id": 12345,
  "result": { ... }
}

Esto te permite reintentar sin miedo si tu llamado falló por timeout o red.

Ejemplo de receptor en Node.js

const fetch = require('node-fetch');

async function notifySellix(eventType, externalId, data) {
  const res = await fetch('https://sellix.lat/api/inbound/event', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Sellix-API-Key': process.env.SELLIX_API_KEY,
    },
    body: JSON.stringify({
      event_type: eventType,
      external_id: externalId,
      source: 'mi_sistema',
      data,
    }),
  });
  return await res.json();
}

// En tu trigger de "CFE emitido":
await notifySellix('sale.created', 'A-12345', {
  order_number: 'A-12345',
  total_uyu: 18450.50,
  client: { name: 'Acme', rut: '210000000018' },
  lines: [{ sku: 'SKU-001', qty: 24, unit_price_uyu: 285 }],
});

Eventos salientes · Sellix → tu sistema

El flujo inverso está documentado en la sección Estructura del payload más abajo. Funciona así: cuando confirmás un despacho desde Sellix (door scan o link del camionero), Sellix le manda un POST a la URL de tu sistema que vos configuraste, con los datos del pedido. Tu sistema emite el CFE en DGI con esa data y te devuelve el invoice_id. Sellix lo guarda en la orden.

Diagrama del flujo completo:
  Despacho operativo en Sellix
         ↓ (POST con datos del pedido)
  Tu sistema de facturación
         ↓ (llamada a DGI con tus credenciales)
  DGI emite CFE
         ↓ (response con número CFE)
  Tu sistema responde a Sellix con invoice_id
         ↓
  Sellix guarda invoice_id en la orden

  PARALELO (cuando tu sistema emite algo por su cuenta):
  Tu sistema emite CFE / nota crédito / ajusta stock
         ↓ (POST a /api/inbound/event con tu API key)
  Sellix ingesta y dispara motor de detección
         ↓
  Aparecen las fugas en tu panel

FAQ

¿Puedo desactivar la auto-emisión y emitir manualmente?

Sí. En Configuración → Facturación, desmarcá "Emitir CFE automáticamente al cerrar el pedido". Después podés emitir manualmente desde el detalle de cada pedido (sirve igual si el cierre fue por door scan o por link al camionero).

¿Qué pasa si mi sistema responde lento?

Sellix espera hasta 20 segundos. Si tu endpoint tarda más, se considera timeout y entra en reintentos. Lo recomendable: respondé rápido (200 inmediato) y procesá la emisión en un job aparte.

¿Puedo usar Sellix sin facturación electrónica?

Sí. La integración es opcional. Sellix funciona como WMS puro y vos seguís emitiendo CFE en tu sistema actual sin integrar.

¿El camionero necesita instalar una app?

No. El link de retiro es una PWA — se abre en cualquier celular con un browser moderno. Si quiere, puede tocar "Agregar a inicio" para que quede como ícono, pero no es obligatorio.

¿Qué pasa si el camionero no tiene internet?

Necesita conectividad para abrir el link y confirmar. Si está offline, va a tener que conectarse cuando llegue (o usar datos móviles). Versiones futuras pueden incluir modo offline con sync diferido.

¿Puedo borrar movimientos o pedidos?

No. Por diseño Sellix mantiene un audit trail inmutable. Lo que sí podés es cancelar un pedido (libera units) o marcar como damaged una unit que se rompió.

¿Cuántos pedidos por mes soporta?

Plan Starter: hasta 500/mes. Pro: hasta 5.000/mes. Enterprise: ilimitado. Internamente Sellix corre sobre SQLite que aguanta tranquilo decenas de miles de movimientos por día — la migración a PostgreSQL está prevista para clientes Enterprise con multi-tenant.

Términos y condiciones

Última actualización: mayo 2026 · vigente para todos los clientes activos.

1. Sobre Sellix

Sellix es un servicio de software como servicio (SaaS) que se conecta al sistema de gestión que ya usa tu empresa (ERP, sistema de stock, sistema de facturación) para detectar fugas operativas y de margen. Sellix nunca actúa como agente fiscal, nunca emite documentos tributarios, y nunca se conecta directamente con DGI · todos los datos vienen del sistema que ya tenés y que vos administrás.

2. Suscripción y facturación

La contratación es mensual (o anual con descuento), por transferencia bancaria. Sin permanencia mínima · podés cancelar avisando con 30 días de anticipación. Los precios mostrados son finales · sin costos ocultos.

3. Garantía 10×

Si en los primeros 30 días Sellix no detecta fugas operativas por al menos 10 veces tu ticket mensual, te devolvemos el setup completo. La garantía aplica a todos los planes y no requiere justificación · solo escribirnos a negocioluchocarbone23@gmail.com.

4. Tu data

Tu data es tuya. Sellix la procesa para correr los detectores y mostrarte hallazgos. No la vendemos, no la compartimos con terceros, no la usamos para entrenar modelos. Si te das de baja, podés exportarla en CSV/Excel y la borramos de nuestros servidores en menos de 7 días.

5. Disponibilidad

Hacemos lo razonable para mantener el servicio disponible 99% del tiempo. No nos responsabilizamos por interrupciones causadas por proveedores de infraestructura (Render, AWS), DGI, sistemas del cliente, o eventos de fuerza mayor. El status del servicio en tiempo real está en /status.

6. Limitación de responsabilidad

Sellix te muestra hallazgos basados en la data que vos cargás o nos conectás. Las decisiones operativas (cambiar precios, dar de baja productos, negociar con proveedores) son siempre tuyas. Nuestra responsabilidad máxima ante cualquier reclamo se limita al monto que pagaste en los últimos 12 meses.

7. Modificaciones

Si cambian estos términos, te avisamos por mail con 30 días de anticipación. Si no estás de acuerdo, podés cancelar la suscripción sin penalidad.

Política de privacidad

Última actualización: mayo 2026.

Qué data guardamos

Para que Sellix funcione, almacenamos: el nombre y email del usuario administrador, datos de la empresa (razón social, RUT), y la data operativa que vos nos importás o conectás (productos, movimientos, ventas, compras, clientes, proveedores). No tocamos credenciales tributarias · esas viven en tu sistema.

Cookies

Solo cookies esenciales para mantener la sesión y guardar tu preferencia de idioma. No usamos cookies de marketing ni tracking de terceros. Sin Google Analytics, sin Facebook Pixel, sin retargeting.

Servidores

Tu data vive en servidores en Uruguay (Render, infraestructura cumple con estándares SOC 2). Los backups automáticos van a un bucket cifrado.

Tus derechos

Podés pedir en cualquier momento: copia de toda tu data en CSV/JSON, corrección de información incorrecta, o eliminación total de tu cuenta. Escribinos a negocioluchocarbone23@gmail.com y respondemos en menos de 72 horas.

Contacto

Para cualquier pregunta sobre privacidad o uso de datos: negocioluchocarbone23@gmail.com

Seguridad de la información

Última actualización: junio 2026.

Cifrado de datos

Toda comunicación entre tu navegador y Sellix viaja por HTTPS (TLS 1.3). Las credenciales de conectores externos (Google Drive, WhatsApp Business) se guardan cifradas con AES-256-GCM · clave derivada del JWT secret del servidor. Nadie, ni el equipo de Sellix, puede leer tus tokens sin acceso al servidor.

Multi-tenant blindado

Cada empresa cliente tiene su propio business_id en todas las queries de la base de datos. Los datos de una empresa jamás cruzan con los de otra. Esto es enforced por linter automatizado en cada deploy.

Privacidad PII y OpenAI

Cuando Sellix usa OpenAI (asesor IA o lector universal v2 cuando un archivo es ambiguo), los nombres de tus clientes, proveedores, RUTs y emails se anonimizan ANTES de enviar el prompt. La IA ve "CLIENT_001" en lugar de "COFAS". Los aliases son únicos por empresa · ningún cliente comparte mapping con otro. Podés ver tu estado actual en privacy-dashboard.html.

Backups

Cada noche a las 03:00 UTC se hace snapshot automático de la base de datos (gzip + SHA256). Retención 30 días por defecto. Los backups quedan en disco del servidor · NUNCA se mandan por mail ni a servicios de terceros.

Reglas duras del producto (enforced por código)

Reportar vulnerabilidad

Si descubrís un problema de seguridad, escribinos privadamente a negocioluchocarbone23@gmail.com. Respondemos en 48 horas y acreditamos a quien reporte issues legítimos.