Las imágenes y animaciones salen de una app de demostración construida en Puente Studio con esta misma guía: Reportería comercial · Empresa Demo.
0. Qué vas a construir
El problema. Supuesto del ejemplo: en Empresa Demo SpA el equipo comercial arma planillas a mano con ventas del ERP (el sistema donde registras ventas, compras y stock), presupuesto y año anterior. Cada persona calcula distinto. Nadie sabe para cuántos meses alcanza el stock ni cómo cerrará el mes.
El resultado. Una app web con datos que se actualizan cada noche. Responde cinco preguntas:
- ¿Cuánto vendimos contra el presupuesto y contra el año anterior?
- ¿Cuánto margen y cuántas unidades dejó esa venta?
- ¿Cómo va cada mes, semana, día y tienda?
- ¿Para cuántos meses alcanza el inventario?
- ¿Cómo cerramos el mes y a qué cliente visito primero?

El mapa de la herramienta.
Etapa 1
Cargar
Etapa 2
Ver
Etapa 3
Distribuir
La app del caso real tiene más de 200 funciones. Esta guía enseña el patrón de cada una. Empieza con tres pasos y crece.
1. Los bloques de Puente OS que vas a usar
Apps. Una app es una página web (hecha con React y TypeScript, tecnologías web estándar) que Puente OS publica con un enlace. No tiene servidor propio y lee y escribe datos por la API de tablas.
Tablas. Una tabla es una base de datos con columnas tipadas: texto, número, fecha, sí o no, y lista de opciones. Una consulta devuelve hasta 5.000 filas por página, así que se pagina. Puente OS no tiene claves foráneas: tú eliges qué columnas de texto unen dos tablas. Una tabla admite columnas nuevas y nunca se borra.
Workflows. Un workflow es una secuencia de nodos que corre sin que nadie abra la app. Se activa por reloj (cron), por webhook o una sola vez. En el caso real, un nodo de código Python lee el ERP y escribe en las tablas. Un webhook es una dirección web que activa el workflow. El webhook síncrono devuelve su respuesta de inmediato.
Integraciones. Una integración conecta un sistema externo: ERP, contador de tráfico, correo, Google Sheets. Un nodo de código llama cualquier API. Toda conexión con credenciales vive en un workflow (capítulo 3).
Agentes. Un agente es un asistente de IA que ejecuta tareas con herramientas. El caso real no los usa.
Los límites de plataforma de esta guía se observaron en una app real. Confírmalos en tu cuenta.
2. Antes de construir, levanta tu proceso
2.1 Cuestionario de 12 preguntas
Responde por escrito. Cada respuesta fija una decisión, o perilla, que ajustas según tu empresa. La última columna indica dónde se toma.
| # | Pregunta | Dónde se decide |
|---|---|---|
| 1 | ¿Qué sistema guarda ventas, costos y stock? | Capítulo 3 |
| 2 | ¿Cuáles son tus canales y tiendas? | Paso 1 |
| 3 | ¿Qué ventas excluyes? (arriendos, activos fijos, servicios, intercompañía) | Perilla "Exclusiones" |
| 4 | ¿Cómo se arma el presupuesto (mensual, diario, por tienda)? | Paso 1 |
| 5 | ¿Comparas con la misma fecha o con el mismo día de la semana? | Perilla "Año anterior" |
| 6 | ¿Cuántos meses de stock buscas? ¿En costo o en unidades? | Perilla "Ventana de cobertura" |
| 7 | ¿Alguna bodega atiende a varios canales? | Perilla "Bodegas compartidas" |
| 8 | ¿Qué documento tributario respalda la venta? ¿Qué impuesto lleva? | Perilla "Documento e impuesto" y 3.4 |
| 9 | ¿Qué cifra proyecta alguien a mano? | Perilla "Captura manual" |
| 10 | ¿Quién ve el reporte? ¿Hay datos personales? | Capítulo 4 |
| 11 | ¿A qué hora está libre tu ERP? | Perilla "Ventana de la carga" |
| 12 | ¿Tienes contador de tráfico en tienda? | Paso 4 y 3.3 |
2.2 Cómo elegir por dónde empezar
Puntúa cada módulo del 1 al 5 en dos columnas: cuánto duele hoy y cuántos otros módulos necesita. Puntaje = duele − necesita. Empieza por el mayor. Ante un empate, elige el que usa menos tablas.
| Módulo (ejemplo de Empresa Demo SpA) | Duele | Necesita | Puntaje |
|---|---|---|---|
| Ventas contra presupuesto | 5 | 1 | 4 |
| Inventario y cobertura | 4 | 3 | 1 |
El paso 1 y el paso 2 son la base en cualquier empresa. El resumen ejecutivo (paso 5) y el inventario (paso 6) comparten la foto de cierre de stock. Si construyes el paso 5 primero, construye también esa tabla y su carga.
Paso 1 · Tus tablas y la carga nocturna
Qué resuelve. Define dónde viven los datos y cómo llegan cada noche.
Qué construyes. Las tablas del modelo de datos genérico (empieza por las universales) y un workflow nocturno que las llena.
Una tabla por pregunta, a su grano
El grano es el nivel de detalle de una fila. Define el grano antes de crear la tabla. Una tabla angosta responde más rápido. El caso real tiene varias tablas de ventas con granos distintos.
Modelo de datos genérico
Las columnas van separadas por tipo. fecha es de tipo fecha. Columna "Uso": U = universal, O = opcional.
| Tabla | Grano de una fila | Texto | Fecha y números | Uso |
|---|---|---|---|---|
| Ventas diarias | día × canal × tienda × vendedor × categoría × marca × familia | canal, tienda, vendedor, categoria, marca, familia |
fecha, ano, mes, semana, dia, venta_neta, costo_total, unidades |
U |
Ventas por producto (con canal y tienda si las necesitas) |
producto × día | sku, categoria, marca |
fecha, ano, mes, venta_neta, costo_total, unidades |
U |
| Presupuesto mensual (con tienda y costo) | canal × tienda × categoría × marca × mes | canal, tienda, categoria, marca |
ano, mes, venta_ppto, costo_ppto, unidades_ppto |
U |
| Presupuesto por producto | producto × mes | sku |
ano, mes, venta_ppto, unidades_ppto |
O |
| Presupuesto diario | canal × tienda × mes × día | canal, tienda |
ano, mes, dia, venta_ppto, costo_ppto |
O |
| Tiendas comparables | tienda × año | tienda, una columna por mes con "SSS" o vacío |
ano |
O |
| Boletas por día | día × canal × tienda | canal, tienda |
ano, mes, dia, boletas |
O |
| Tráfico mensual | tienda × mes | tienda |
ano, mes, entradas |
O |
| Stock actual | producto | sku |
stock, costo_stock, venta_90d |
U |
| Stock por almacén y canal (solo cobertura) | producto × almacén × canal | sku, almacen, canal |
stock, costo_stock |
O |
| Foto de cierre | año × mes × producto × almacén | sku, almacen |
ano, mes, valor_stock |
U |
| Maestro de artículos (panel por almacén) | producto | catálogo y precios, sku |
una columna numérica por almacén | O |
| Pedidos abiertos | línea de pedido | doc_num, cliente, canal, marca |
monto |
O |
| Cliente y marca | cliente × marca × mes | cliente, marca |
ano, mes, venta_neta, meta |
O |
| Documentos de venta | línea de documento | sku |
fecha, folio, cantidad, precio_lista, lista_total, venta_neta, margen |
O |
| Captura manual | vista × nombre × año × mes | vista, nombre |
ano, mes, valor |
O |
| Equivalencias de nombres | campo × origen | campo, origen, canonico |
ninguna | U |
Reglas de las tablas
- Períodos como números. Guarda
fechay repiteano,mes,diaysemanaISO como números. La app filtra sin calcular. - Año en cada tabla de presupuesto. El caso real no lo tiene, y por eso el presupuesto solo existe para un año. La app apaga la comparación en otros años. Agrega
anodesde el inicio. - Cálculos que la consulta no hace. La consulta solo suma y cuenta. No multiplica una columna por otra. Guarda precalculado lo que necesites multiplicar (
lista_total,margen). - Equivalencias de nombres. El ERP escribe el mismo nombre de varias formas. La tabla de equivalencias traduce cada grafía a su forma oficial, y todas las cargas la leen.
- Cruces por texto exacto. Presupuesto y venta se unen por
canal,tiendaymarca. Un nombre distinto deja una fila huérfana. - Agrega columnas a la tabla existente. En el caso real se creó una segunda versión de una tabla por ignorar esto, y la tabla vieja quedó para siempre.
La carga nocturna
Cómo funciona. Un workflow con cron (programación por reloj) corre de madrugada, cuando el ERP está libre.
- Calcula la ventana: desde hoy − N días hasta ayer.
- Busca los «días sucios»: documentos creados o anulados con fecha anterior a la ventana. Si existen, alarga la ventana hasta el más antiguo, con un tope.
- Lee del ERP solo la ventana. Aplica exclusiones y equivalencias.
- Por cada tabla destino: lee lo existente, compara por contenido, borra lo que sobra e inserta lo que falta.
- Devuelve un resumen con el conteo por tabla.
Ejemplo. Hoy es 15 de octubre y la ventana de 30 días va del 15 de septiembre al 14 de octubre. Una tienda anuló una factura del 2 de septiembre. El paso 2 de la receta alarga la ventana hasta esa fecha. Sin él, septiembre quedaría distinto del ERP.
Por qué se diseñó así.
- Ventana móvil con comparación por contenido. Una ventana de 60 días superó el tiempo de ejecución y se bajó a 30. Comparar antes de escribir evita reescribir filas iguales.
- Salvaguarda contra lecturas vacías. Protege cada tabla: si la fuente devuelve cero filas, conserva la tabla. Una falla de conexión la vaciaría.
- Fallas aisladas. Las tablas opcionales van en bloques propios. Si el contador de tráfico cae, las ventas ya quedaron escritas.
Cómo lo adaptas. Largo de la ventana, tope de días sucios, horario del cron y exclusiones. Presupuesto y tiendas comparables se cargan desde una planilla.
Cómo verificas. Elige un mes cerrado. Suma la venta neta en tu ERP y en la tabla de ventas diarias. Deben coincidir al peso. Repite con un mes que tuvo anulaciones.
La app muestra en su encabezado la hora de la última carga ("Carga nocturna: 15-oct-2026 03:00 · venta hasta el 14-oct"). Así cualquiera sabe hasta qué día llegan las cifras.
Paso 2 · Ventas contra presupuesto y año anterior
Qué resuelve. Muestra cuánto se vendió contra el presupuesto y contra el año anterior.
Qué construyes.
- Tablas: ventas diarias, ventas por producto, presupuesto mensual, tiendas comparables.
- Vista: cuatro tarjetas (ingreso, unidades, contribución, margen %). Agrega un gráfico mensual contra año anterior y presupuesto, un acumulado, una torta por canal y barras por categoría y marca.
- Opcional: un árbol categoría ▸ marca ▸ familia ▸ producto, que pide los productos al abrir cada familia.

Cómo funciona.
- Variación = (venta ÷ venta del año anterior − 1) × 100.
- El año anterior se corta en la misma fecha que el año actual (ayer).
- Con filtro de mes, el acumulado corta en ese mes. Sin filtro de mes, el presupuesto es el anual completo.
- Si la comparación pierde sentido (año sin presupuesto, vendedor o tienda sin presupuesto), la tarjeta muestra "--".
- El filtro de tiendas comparables limita venta, año anterior y presupuesto al mismo conjunto de tiendas. Si deja la vista en cero, se apaga solo.


Ejemplo. Hoy es 15 de octubre. Empresa Demo SpA vendió $9.800.000 del 1 de enero al 14 de octubre. El año anterior, hasta el 14 de octubre, vendió $8.750.000. Variación: +12,0 %. Si la app comparara con el año anterior completo ($10.600.000), mostraría −7,5 %, una caída falsa. El presupuesto anual es $14.000.000: el avance es 70 %.
Por qué se diseñó así.
- Una sola función decide la ventana de tiempo de venta, año anterior y presupuesto. Cuando cada lado la calculaba aparte, uno miraba 1 día y otro 7.
- El corte del año anterior va dentro de la consulta. Parchear cada gráfico repitió errores.
- Tablas precalculadas como camino principal. La tabla agregada responde en menos de un segundo. La tabla general de presupuesto tardaba entre 5 y 20 segundos.
Cómo lo adaptas. Presupuesto anual o a la fecha. Corte del año anterior en ayer o en el último mes cerrado.
Cómo verificas. Fija un mes cerrado. Compara las cuatro tarjetas con una consulta directa al ERP. Elige un año sin presupuesto: aparece "--".
Paso 3 · Margen y unidades
Qué resuelve. Muestra cuánto margen deja cada categoría, tienda y producto, y cuántas unidades se mueven.
Qué construyes.
- Tablas: las del paso 2. El costo presupuestado sale del presupuesto mensual con tienda y costo.
- Vistas: dos pestañas con las tarjetas del paso 2. Margen agrega los diez productos que más contribuyen. Unidades agrega los diez más vendidos y las marcas que superaron el año anterior.

Cómo funciona.
- Contribución = venta neta − costo. Margen % = contribución ÷ venta neta × 100.
- Los porcentajes de un total se recalculan con sumas.
- Una consulta agrupada de más de 5.000 filas se pide por páginas. El orden incluye todas las columnas del agrupado.
Ejemplo. Una categoría vendió $1.000 con costo $640: contribución $360, margen 36,0 %. El año anterior tuvo 33,0 %: variación +3,0 puntos. Dos tiendas: una vende $100 con margen 50 % y otra $900 con margen 20 %. El promedio simple da 35 %. El margen real es (50 + 180) ÷ 1.000 = 23 %.
Por qué se diseñó así.
- Ratios sobre sumas. Un promedio de porcentajes pesa igual a una tienda chica y a una grande.
- Los diez mejores salen de la tabla por producto. Es liviana. A cambio, esa lista ignora los filtros de canal, tienda, vendedor, semana y día. Dilo en pantalla.
Cómo lo adaptas. Tamaño del ranking. Sugerencias sin probar: costo con o sin gastos indirectos, umbral de color del margen.
Cómo verificas. Suma las contribuciones de todas las categorías. Debe igualar la tarjeta. Cambia un filtro dos veces seguidas: la pantalla debe mostrar el último.
Paso 4 · Resumen por mes, semana y día
Qué resuelve. Entrega una matriz de períodos o de tiendas con venta, unidades, contribución, ticket, tráfico y conversión. Reemplaza la planilla manual.
Qué construyes.
- Tablas: ventas diarias, presupuesto mensual y diario, boletas por día, tráfico mensual, tiendas comparables.
- Vista: selectores de grano (mes, semana, día) y de filas (período o tienda), tarjetas y matriz.

Cómo funciona.
- Ticket = venta ÷ boletas. UPT (unidades por boleta) = unidades ÷ boletas. Conversión = boletas ÷ entradas de público, sobre las mismas tiendas y meses.
- Tráfico y conversión existen solo en el grano mensual: el contador entrega meses. En semana y día se apagan.
- Con venta o unidades netas menores o iguales a cero, ticket y UPT quedan en blanco: dominan las devoluciones.
- En semana y día, el año anterior usa el día equivalente: fecha menos 364 días.
- Con filtro de categoría, marca o vendedor se apagan los indicadores por boleta.
- Los períodos futuros muestran presupuesto y año anterior, sin venta ni variación.
Ejemplo. En octubre la Tienda Norte vendió $2.400.000 con 800 boletas y 2.000 unidades: ticket $3.000, UPT 2,5. Con 4.000 entradas en el mes, la conversión es 20 %. El miércoles 14 de octubre de 2026 se compara con el miércoles 15 de octubre de 2025. Un mes con $3.000.000 de presupuesto da $100.000 por día si se prorratea parejo. La planilla real asigna $180.000 a un sábado.
Por qué se diseñó así.
- Presupuesto diario real. El equipo compara contra su planilla diaria, y el prorrateo parejo se alejaba de ella. Las unidades siguen prorrateadas: la fuente no las tiene por día.
- Día equivalente en semana y día. En el comercio pesa el día de la semana. El mes y las tarjetas anuales siguen el calendario.
- Mismo universo en cada ratio y comparación. Boletas y entradas usan las mismas tiendas y meses. Las tiendas comparables limitan venta, año anterior y presupuesto al mismo conjunto. Comparar venta cero con el presupuesto en el futuro daría −100 %.
Cómo lo adaptas. Día equivalente o fecha calendario. Curva diaria o prorrateo. Tráfico y conversión solo con contador.
Cómo verificas. Suma las filas por tienda de un tramo. Venta y año anterior deben dar el total de la matriz (el presupuesto del total puede diferir). Abre un domingo del año en curso y comprueba que compara con el domingo equivalente.
Paso 5 · Resumen ejecutivo del cierre
Qué resuelve. Entrega la foto del mes cerrado por canal, tienda, cliente y marca.
Qué construyes.
- Tablas: ventas diarias, presupuesto mensual, foto de cierre de stock (con su carga mensual, que el paso 6 reutiliza), boletas, tráfico, ventas por cliente.
- Vista: selector de mes de cierre, filtro de marca y cuatro tablas (por canal, tu canal propio, tu canal mayorista por cliente y por marca).

Cómo funciona.
- Meta = presupuesto del mes completo. Variación contra meta = (venta ÷ meta − 1) × 100.
- MOI (meses de inventario) = valor del stock al cierre ÷ costo de venta del mes.
- MOS (meses de stock) = valor del stock al cierre ÷ costo presupuestado promedio de los 3 meses siguientes.
- En noviembre el MOS promedia solo diciembre. Solo existe para el año que tiene presupuesto.
- Color: menos de 1 rojo, menos de 3 ámbar, 3 o más verde.
Ejemplo. Al cierre de septiembre el stock vale $1.200.000 a costo y el costo de venta del mes fue $400.000: MOI = 3,0 (verde). El costo presupuestado de octubre a diciembre es $1.500.000, o $500.000 por mes: MOS = 2,4 (ámbar). En diciembre no hay meses siguientes y el MOS queda vacío.
Por qué se diseñó así.
- Foto congelada del stock. Al mirar septiembre, el stock es el del 30 de septiembre.
- El stock sin canal sigue en el total. Se oculta de la tabla por canal a pedido del negocio. El total de la empresa lo conserva.
Cómo lo adaptas. Ventana del MOS, costo o unidades, umbrales de color.
Cómo verificas. Calcula a mano el MOI de un canal con el stock de tu ERP al último día de un mes cerrado. Si el mes no tuvo movimientos nuevos, una nueva foto de cierre da el mismo valor.
Paso 6 · Inventario y cobertura
Qué resuelve. Muestra el stock por categoría, marca, familia y producto, y cuántos meses de venta cubre.
Qué construyes.
- Tablas: stock actual, stock por almacén y canal (solo para la cobertura), foto de cierre, maestro de artículos, ventas por producto y tienda, presupuesto mensual y por producto.
- Vista: un árbol de unas 16 columnas (venta, año anterior, unidades, contribución, presupuesto, stock, valor, MOI, MOS).
- Un buscador de producto y un panel de stock por almacén, que lee el maestro ancho. Una descarga del maestro.


Cómo funciona.
- El árbol carga filas agregadas. Los productos de una familia se piden al abrirla.
- MOI = costo del stock ÷ costo de venta mensual de los 3 meses cerrados anteriores. Con foto de cierre, usa el costo de venta del mes.
- MOS = costo del stock ÷ costo presupuestado mensual de los 3 meses siguientes.
- Una bodega compartida atiende a varios canales. Al filtrar por canal, el stock se muestra completo. El MOI y el MOS usan solo la parte de ese canal. Esa parte = costo de venta del canal ÷ costo de venta de todos los canales de la bodega.
Ejemplo. La bodega central tiene $600.000 de stock a costo. Atiende al Canal A (costo de venta anual $300.000) y al Canal B ($100.000). El Canal A usa 75 %: $450.000. El Canal B usa 25 %: $150.000. Sin reparto, el MOI del Canal B sería cuatro veces más alto.
Por qué se diseñó así.
- Árbol agregado y productos bajo demanda. Unas 600 filas cargan en unos 2 segundos. Los productos esperan a que se abra su familia.
- Stock completo en pantalla y reparto solo en la cobertura. Acuerdo con el negocio: el stock real se muestra completo y el reparto solo corrige la cobertura.
- El panel por almacén sale de una tabla ancha. Una fila por producto y una columna por almacén. La tabla por almacén y canal repite la bodega compartida en cada canal y triplica su stock al sumar. Por eso solo sirve a la cobertura.
Cómo lo adaptas. Meses de la ventana, costo o unidades, criterio del reparto.
Cómo verificas. Suma el valor del stock de las filas de nivel superior: debe igualar tu ERP. Filtra los canales de una bodega compartida: sus partes suman el costo total de la bodega.
Paso 7 · Seguimiento comercial con proyección de cierre
Qué resuelve. Compara meta y venta por canal, proyecta cómo cierra el mes e indica a qué cliente visitar primero.
Qué construyes.
- Tablas: ventas diarias, presupuesto mensual, pedidos abiertos, cliente y marca, captura manual.
- Vista A, por canal: Meta, Margen y Real por mes, el acumulado del año (YTD) y el mes en curso con Empuje y Cierre proyectado.
- Vista B, por cliente y marca: Meta anual, mensual y acumulada, venta real, cumplimiento, cuánto venderle y prioridad.
- Workflow de guardado del Empuje, con ruta fija: borra, inserta y registra quién cambió.


Cómo funciona.
- Cierre proyectado = Real del mes + Pedidos abiertos + Empuje.
- Empuje es lo que una persona estima vender además de lo anterior. Se teclea por fila y los totales suman sus filas.
- Cumplimiento del mes = Cierre proyectado ÷ Meta del mes × 100.
- Meta mensual = Meta anual ÷ 12. Cuánto venderle = el mayor entre 0 y (Meta acumulada, que incluye el mes en curso, − Real de los meses cerrados).
- Cumplimiento (vista B) = Real de los meses cerrados ÷ (Meta mensual × meses cerrados) × 100.
- Prioridad = 1 + clientes de la misma marca con un "cuánto venderle" mayor.
Ejemplo. El Canal Mayorista tiene meta mensual de $1.000.000. Al día 14 lleva $520.000, con pedidos abiertos por $180.000 y un Empuje de $150.000. Cierre proyectado = 520 + 180 + 150 = $850.000. Cumplimiento: 85 %. Vista B: el Cliente A con la Marca X tiene meta anual $1.200.000 y mensual $100.000. Su meta acumulada a octubre es $1.000.000 y vendió $780.000 hasta septiembre. Cuánto venderle: $220.000. Cumplimiento: 780 ÷ 900 = 86,7 %.
Por qué se diseñó así.
- Replica la planilla que el equipo ya usa. Cada fórmula se verificó contra el archivo.
- El cierre se calcula y el Empuje se teclea. Así funciona la planilla.
- Guardar reemplaza la fila. La API de tablas con clave no actualiza una fila: hay que borrar la anterior e insertar la nueva. Variante recomendada: el guardado pasa por un workflow con ruta fija que hace ambos pasos. Si dejas la escritura directa desde la app, anótala como excepción (capítulo 4, punto 5). Después limpia la caché (copia temporal) para que el valor no desaparezca al releer.
Cómo lo adaptas. Componentes del cierre (con o sin pedidos abiertos), mes editable, reemplazo o historial. Meta mensual plana (anual ÷ 12) o real mes a mes.
Cómo verificas. Teclea un Empuje y recarga la página. El valor sigue ahí, con una sola fila en la tabla de captura. Borra el valor y comprueba que la fila desaparece.
Paso 8 · Documentos de venta
Qué resuelve. Permite buscar una boleta o factura por su folio y ver cada línea con su precio y margen.
Qué construyes.
- Tabla: una fila por línea de documento, solo para los canales donde importa (por ejemplo, tu canal de tiendas propias).
- Vista: caja de búsqueda, tres vistas (Documento, Detalle, Producto), totales de la selección, filtro de margen negativo y ventana con la boleta completa.

Cómo funciona.
- Una búsqueda de solo dígitos busca el folio exacto. Si no existe, busca un tramo de código de producto. Otro texto busca por contenido.
- La paginación ocurre en el servidor: 100 filas por página. El orden incluye todas las columnas del agrupado de cada vista, más desempates. Verifícalo en cada vista.
- Margen % = (venta neta − costo) ÷ venta neta. Descuento = lista − pagado, con lista que incluye impuesto y pagado = venta neta × (1 + impuesto).
Ejemplo. El folio 4821 tiene 2 unidades. Lista con impuesto: $23.800. Venta neta sin impuesto: $17.000. Costo: $12.000. Con IVA de 19 %, pagado = 17.000 × 1,19 = $20.230. Descuento = 23.800 − 20.230 = $3.570, o 15,0 %. Margen = 5.000 ÷ 17.000 = 29,4 %. Precio neto: $8.500 por unidad.

Por qué se diseñó así.
- Lista total y margen precalculados en la carga. La consulta no multiplica columnas.
- Paginación en el servidor. El navegador recibe 100 filas.
- Folio como búsqueda principal. El folio impreso es numérico. En el caso real ningún código de producto tiene solo dígitos. Confirma lo mismo en tu catálogo.
Cómo lo adaptas. Documento tributario, impuesto, canales incluidos.
Cómo verificas. Busca una boleta impresa por su folio: el total pagado coincide con el papel. Busca un folio inexistente: aparece un mensaje claro.
Paso 9 · Exportación
Qué resuelve. Entrega la información en un archivo CSV para analizarla en una planilla.
Qué construyes.
- Un botón de descarga en las vistas que lo necesiten.
- Un control de cuadre en la descarga más grande, con tolerancia mínima. Incluye una revisión de productos repetidos.
Cómo funciona.
- Cada fila del CSV es un registro plano, sin subtotales ni porcentajes.
- La línea 1 trae los encabezados. Sin título, notas ni filas extra.
- Los números llevan coma decimal. El archivo lleva marca BOM para que la planilla lea las tildes.
- Una celda de texto que empieza con
=,+,-o@recibe un apóstrofo delante. Así la planilla no la ejecuta como fórmula. - Las tablas grandes se piden en páginas de 5.000 filas. Cada descarga tiene su tope.
- Control de cuadre: antes de entregar el archivo, la app suma cada columna y la compara con el total de la pantalla.
Ejemplo. El detalle por producto tiene 3.200 filas y su venta suma $9.800.000, igual que la pantalla: se entrega. Con $9.790.000, la descarga falla.
En la app de demostración, el botón Descargar CSV está al pie de la pestaña Ventas (ver la imagen del paso 2). Junto al botón, la app confirma cuántas filas bajó y que el total cuadra con la pantalla.
Por qué se diseñó así.
- CSV plano. Una tabla dinámica suma o promedia mal los subtotales y porcentajes.
- Sin metadatos. Las filas extra rompían las tablas dinámicas.
- Un archivo que no cuadra no se entrega. Un archivo erróneo destruye la confianza en todo el reporte.
Cómo lo adaptas. Separador, formato decimal, tope por descarga.
Cómo verificas. Abre el archivo en tu planilla y crea una tabla dinámica. La suma de la venta iguala el total de la pantalla.
3. Conecta tus sistemas externos
3.1 El patrón: el workflow como proxy seguro
Fuera de Puente OS
Sistemas externos
ERP, contador de tráfico y correo
Servidor de Puente OS
Workflow
lee, limpia, compara y escribe
Servidor de Puente OS
Tablas
datos precalculados
Navegador
App
lee las tablas
La app lee las tablas. El workflow habla con el sistema externo y escribe en las tablas. Hay tres razones:
- El navegador no abre conexiones a bases de datos. Un ERP sobre SQL Server u otra base pide una conexión directa, que solo un servidor abre.
- El secreto queda en el servidor. Todo lo que viaja al navegador es público.
- Cuota de terceros. Un proveedor con una consulta diaria se agota si cada usuario lo llama desde su navegador.
3.2 Sistemas del caso, por función
| Función | Ejemplos de mercado |
|---|---|
| ERP o sistema de gestión (ventas, costos, stock, pedidos) | SAP Business One, Defontana, Odoo, Softland |
| Contador de tráfico de tienda | RetailNext, ShopperTrak, Dor |
| Envío de correo | SendGrid, Resend, Mailgun, Gmail |
3.3 Reglas por tipo de conexión
ERP. Usa una cuenta de solo lectura. Lee sin bloquear tablas. Pasa los filtros del usuario como parámetros y nunca pegados al texto de la consulta. Documenta las reglas de la consulta: exclusiones, descuentos, notas de crédito.
Contador de tráfico. Cuida la cuota diaria del proveedor. El proveedor corrige su historial: recarga el año en curso cada noche. Pon esta carga en un bloque propio y mantén un mapa de cada contador a su tienda.
Correo y PDF. El workflow genera el informe, lo guarda en una tabla de una fila y envía el enlace. Una URL firmada vence (en el caso real, a las 8 horas): adjunta el PDF o avisa. Prueba el PDF con tus tildes.
3.4 Variantes por país
| Variable | Chile | México | Perú |
|---|---|---|---|
| Impuesto a las ventas | IVA 19 % | IVA 16 % | IGV 18 % |
| Documento de venta | Boleta o factura electrónica con folio | Factura electrónica (CFDI) con folio fiscal | Boleta o factura electrónica con serie y número |
| Moneda | Peso chileno, sin decimales | Peso mexicano | Sol |
| Horario de verano | Cambia dos veces al año | Casi todo el país no lo usa | No lo usa |
Elige zona horaria local si el disparador la acepta. Con UTC (hora universal), la hora local de la carga se desplaza dos veces al año. Elige una ventana con holgura.
4. Seguridad y publicación
- Permisos mínimos. La app lee. Si tu cuenta ofrece credenciales de solo lectura, úsalas. La captura manual del paso 7 escribe por un workflow con ruta fija. Una escritura directa es una excepción (punto 5). Los workflows de carga usan otra credencial, que vive en el servidor.
- Lo que ve el navegador es público. Una app compartida por enlace entrega todo su código. Una credencial de escritura dentro de la app permite que cualquiera escriba en tus tablas.
- Los secretos viven en el servidor. Guarda cada clave en un solo lugar. Nunca pegues credenciales en un documento o un chat. Fija la versión de cada librería del workflow.
- Datos personales fuera de las tablas públicas. Nombres de vendedores y clientes, comentarios libres e identificadores tributarios no deben llegar a una tabla que lee una app pública.
- Escritura desde la app, con cuidado. Una captura manual directa desde el navegador la puede usar cualquiera con el enlace. Borrar e insertar en dos llamadas carece de atomicidad: si falla la segunda, el valor anterior se pierde. Lo mejor es una escritura por workflow, con ruta fija y registro de quién cambió qué.
- Cargas que no se rompen en silencio. Borrar todo y luego insertar deja la tabla vacía durante la corrida: compara por contenido. Protege cada tabla contra una lectura vacía: si la fuente devuelve cero filas, conserva la tabla. Haz que el workflow falle de forma visible. Si falta un dato secundario, avisa en pantalla.
- Verifica que el cron corre. Revisa la primera ejecución al día siguiente. En el caso real, tres cargas pasaron cuatro semanas sin correr porque su programación nunca se registró. Cada semana, revisa la fecha de la última fila de cada tabla.
- Apaga lo que no se usa. Un workflow de respaldo con acciones que nadie llama sigue expuesto. El del caso ofrecía 6 acciones y la app usaba 2. Cuando entra en acción, muestra cifras con reglas distintas, sin avisar. Apaga las acciones sin uso. Avisa en pantalla cuando el respaldo esté activo. Una carga sin lector gasta cuota.
- Publica con método. Construye con datos de prueba, compara cada cifra con el ERP y deja que un solo responsable publique.
5. Adáptalo a tu empresa
5.1 Tabla de perillas
| Perilla | Opciones | Cuándo elegir cada una |
|---|---|---|
| Ventana de la carga | 7, 30 o 60 días | Corta si el ERP casi no corrige el pasado. Larga si hay muchas anulaciones. Redúcela si la ejecución se corta por tiempo |
| Año anterior | Día equivalente (−364) o fecha calendario | Día equivalente si la venta depende del día de la semana. Calendario si vendes por proyectos |
| Presupuesto con filtro de mes | Anual completo o a la fecha | Anual para el avance del año. A la fecha para el mes en curso |
| Ventana de cobertura | 3, 6 o 12 meses | Sugerencia sin probar: 3 para moda y temporada corta, 6 a 12 para productos estables |
| Bodegas compartidas | Reparto por costo de venta, unidades o presupuesto | Costo de venta si es tu dato más confiable |
| Exclusiones | Arriendos, activos fijos, servicios, intercompañía | Lo que finanzas no cuente como venta comercial |
| Captura manual | Una fila por clave o historial | Historial si necesitas auditar cambios |
| Documento e impuesto | Boleta, factura, CFDI; 16 %, 18 %, 19 % | El que respalda tu venta, guardado como variable única |
5.2 Variantes por tamaño e industria
Las variables de país (impuesto, documento, moneda, horario) están en 3.4.
| Caso | Qué incluir o cambiar |
|---|---|
| Una tienda o un canal | Pasos 1 a 3 |
| 2 a 20 tiendas, 2 o 3 canales | Pasos 1 a 6 |
| Cadena con mayoristas | Todos los pasos |
| Servicios (sugerencia sin probar) | Omite el paso 6, porque no hay stock |
6. Checklist final y glosario
6.1 Checklist
- Respondí las 12 preguntas del cuestionario.
- Cada tabla tiene su grano, dueño y lector anotados, y la de presupuesto lleva columna de año.
- La carga tiene ventana móvil, días sucios con tope y comparación por contenido.
- La carga protege cada tabla contra una lectura vacía y aísla las tablas opcionales.
- Cada módulo pasó la prueba de su sección "Cómo verificas".
- Una comparación muestra "--" cuando falta la base.
- La app usa una credencial de solo lectura. La captura manual pasa por un workflow, o queda anotada como excepción. Ninguna credencial de escritura está en el código de la app.
- Apagué los workflows y las cargas sin uso.
6.2 Glosario
| Término | Significado |
|---|---|
| Perilla | Decisión que ajustas según tu empresa |
| ERP | Sistema donde registras ventas, compras y stock |
| Ticket | Venta ÷ boletas |
| UPT | Unidades por boleta |
| Bodega compartida | Almacén que atiende a más de un canal |
| Día equivalente | Fecha menos 364 días: cae el mismo día de la semana |
| Días sucios | Fechas pasadas con documentos creados o anulados en los últimos días |
| Grano | Nivel de detalle de una fila |
| MOI | Meses de inventario: stock a costo ÷ costo de venta mensual |
| MOS | Meses de stock: stock a costo ÷ costo presupuestado mensual futuro |
| SSS | Tiendas comparables: existían en ambos períodos |
| YTD | Acumulado desde enero hasta el último mes cerrado |
Construye la tuya con el equipo de Puente
Cada relación parte con un piloto de un mes: levantamos tu proceso y construimos contigo el primer módulo, conectado a los sistemas que ya usas.
Agenda una demo