Volver

Zelterm ERP

ERP multi-tenant para pymes de servicio técnico: órdenes de reparación, POS multimoneda, inventario con trazabilidad, garantías/devoluciones y facturación SUNAT.

Resumen

Zelterm nace para las pymes de servicio técnico, que no tenían un sistema accesible: las opciones existentes eran demasiado costosas. Me inspiré en mi etapa como vendedor de componentes electrónicos. La plataforma les da orden — registrar cada reparación, cómo llegó el producto y qué se hizo — con una trazabilidad que además los protege ante posibles reclamos. Reemplaza cuadernos y hojas de cálculo con una sola herramienta: órdenes de servicio, punto de venta, inventario con seguimiento por número de serie y facturación electrónica SUNAT. Tampoco termina en el checkout: las garantías y devoluciones post-venta quedan ligadas a la venta original, de forma trazable, cubriendo todo el ciclo de vida de la venta.

Decisiones clave

Multi-tenant desde una sola base de datos

Arranqué con una única base de datos compartida para lanzar rápido y con bajo costo. El plan de escalado es una tabla business con un database_id que enrute cada negocio a su propia base cuando el volumen lo justifique — una evolución gradual en vez de sobre-ingeniería desde el día uno.

Soporte multi-régimen fiscal peruano

Los talleres peruanos operan bajo distintos regímenes tributarios — NRUS (solo boletas, sin obligación de facturación electrónica), RER, RMT y Régimen General — cada uno con reglas propias para emitir comprobantes. El producto tenía que funcionar incluso sin facturación electrónica activa, y calcular precios con o sin IGV según el régimen del negocio. Entender el negocio peruano real, no solo el Régimen General, moldeó el modelo de datos desde el inicio.

Multimoneda y multipago en todo el sistema

El sistema se configura en soles o dólares, pero al emitir el primer comprobante la moneda queda bloqueada por consistencia contable. Propagar esa regla por ventas, inventario y reportes fue el mayor reto: cada flujo podía introducir bugs de conversión.

Facturación SUNAT tercerizada (Nubefact)

En vez de construir el conector fiscal desde cero, integré un proveedor autorizado. La complejidad se reduce a enviar bien los datos, cumpliendo la normativa peruana con mucho menos riesgo.

Autenticación con dual-token JWT

accessToken de corta duración más un refreshToken de 7 días en cookie httpOnly. El logout se invalida de forma stateless: un campo lastLogoutAt en el usuario rechaza cualquier token emitido antes de esa marca, sin tabla de sesiones ni blacklist en Redis.

Despliegue gestionado ahora, VPS después

Elegí Vercel + Railway para desplegar rápido y validar sin fricción de infraestructura. Cuando crezca la base de clientes migraré a un VPS por costo — una decisión que tomo cuando la demanda lo justifique, no antes.

Observabilidad en Postgres antes que Redis

En vez de sumar Redis desde el día uno para cache/observabilidad, usé lo que ya tenía: un log de queries lentas más un interceptor que marca requests lentos directamente en Postgres. Redis queda para cuando el tráfico real lo justifique — el mismo patrón de evolución gradual que uso en multi-tenant y hosting.

Desarrollo asistido por agentes (Claude Code + MCP)

Monté agentes especializados —frontend, backend, verificación, auditoría y testing— con skills que codifican cómo trabajaría yo. Incluso una skill que me interroga si una feature es realmente necesaria, para que el software escale de a pocos sin cargar complejidad innecesaria desde el inicio.

Retos y aprendizajes
  • Propagar la lógica multimoneda por todo el sistema generó bugs de conversión que fui corrigiendo flujo por flujo hasta dejarlos consistentes.
  • Los cron jobs con I/O larga (reintentos de facturación, sincronización) necesitaban evitar ejecución concurrente entre instancias. Empecé con pg_advisory_lock, pero se trababa con el pool de conexiones (pg.Pool); lo resolví con un lease lock propio sobre una tabla de control — más simple y confiable que el advisory lock de Postgres en este contexto.
  • Reforcé la seguridad y el manejo de ventas a medida que entendía mejor los casos reales del negocio.
  • Prioricé terminarlo bien antes que rápido: solo reemplazo algo cuando aprendo una forma más eficiente que la que ya tengo.