← Volver a proyectos

Proyecto

Numa — Punto de venta con facturación CFDI integrada

SaaS multi-tenant de punto de venta y administración para pymes mexicanas. La cuña es la facturación CFDI 4.0 dentro del producto en vez de vendida como complemento, más el cobro self-serve — los POS gratuitos de este mercado son gratis porque amarran al comercio a su propia terminal.

En desarrollo — núcleo cerrado, billing en curso Producto propio — en desarrollo Fundador e Ingeniero (Full Stack — Producto, Backend, Infraestructura) Repositorio privado — pre-lanzamiento

Producto propio en desarrollo activo para el mercado mexicano. El núcleo multi-tenant, los roles y las invitaciones están construidos y probados; catálogo, inventario, ventas y facturación CFDI son las fases en curso. Aún sin lanzamiento público.

Stack

Angular 20TypeScriptSCSSPWA (offline-first)FirebaseFirestoreFirebase AuthCloud Functions v2 (Node 22)Firebase StorageFirebase Emulator SuiteStripeResendGCP

Impacto

  • Acoté el producto a un solo mercado, lo que retiró la maquinaria de multimoneda y tasa de cambio diaria y adelantó la facturación CFDI 4.0 de una fase posterior al MVP a una previa al lanzamiento.
  • Catálogo, inventario, POS, facturación CFDI 4.0 y cajas y finanzas cerrados y probados; lo que falta para lanzar es el cobro del SaaS, no el producto.
  • La facturación va dentro del producto — en México un POS que no timbra CFDI no compite con las suites contables establecidas.
  • Cobro self-serve con Stripe, frente a competidores que todavía dan de alta y cobran de forma manual.
  • Construido íntegramente contra el Firebase Emulator Suite, así que el producto llegó a un núcleo multi-tenant probado con cero gasto en la nube antes de lanzar.

Lo que hice

  • Retiré el soporte de Venezuela en un solo refactor: salieron el job diario de tasa BCV, el IGTF, la multimoneda USD/VES, el selector de país en el alta y la rama 'VE', y createTenant ahora siembra MXN e IVA 16% directamente.
  • Las fechas de negocio se resuelven en la zona horaria del comercio, configurable por tenant y con America/Mexico_City por defecto — México tiene cuatro husos y un corte de caja cerrado en el equivocado parte el día en dos.
  • El aislamiento multi-tenant lo fuerzan las reglas de Firestore con una suite de pruebas propia (24/24), después de que una revisión temprana encontrara una escalada de rol donde los match solapados se unen con OR.
  • Los campos que pertenecen al backend, como el estado de suscripción y la configuración del tenant, son inmutables desde el cliente.
  • Alta por invitación con permisos granulares por miembro: acceptInvite exige correo verificado y todo texto controlado por el usuario se escapa antes de llegar al HTML del correo.
  • El estado de sesión nunca se filtra entre cuentas — el contexto del tenant se descarta al cambiar de uid y se limpia en cada cierre de sesión.
  • Los SDKs de Firebase se cargan por getters diferidos en vez de imports eager; el cambio bajó el bundle inicial de 654 KB a 225 KB y lo mantiene cerca de 290 KB conforme entran funcionalidades.
  • Cada fase cierra con una revisión de código multi-agente antes de avanzar: 16 hallazgos corregidos en la Fase 0 y 13 en la Fase 1.
  • Los combos cobran y descuentan como una unidad pero consumen como receta: vender un combo descuenta cada componente del inventario, así el anaquel no miente por culpa de un paquete.
  • El estado de la suscripción se deriva de las fechas y nunca de un campo guardado — activo, gracia y suspendido se calculan, así una escritura fallida no deja una cuenta cancelada con cara de pagada.
  • Factura global de las ventas del día sin RFC, que es el caso que de verdad rompe a un POS mexicano a la hora del corte.

Arquitectura

  • Monorepo: apps/web (PWA en Angular, offline-first con IndexedDB y persistencia de Firestore) + functions (Node 22, TypeScript)
  • Modelo Firestore multi-tenant: platform/ para configuración global y planes del SaaS; tenants/{tenantId}/ para miembros, catálogo, inventario, ventas, cajas, banco, cuentas por cobrar y gastos
  • Callable functions para la creación de tenants y operaciones privilegiadas; la configuración del tenant se siembra con MXN e IVA 16%
  • Seguridad por reglas de Firestore con exclusiones explícitas para members e invites, ya que los match solapados se combinan con OR
  • El timbrado de CFDI 4.0 vía PAC es una fase propia previa al lanzamiento; Stripe cobra el SaaS en MXN
  • Desarrollo local primero: el Emulator Suite completo (auth, firestore, functions, storage, pub/sub, tasks) en puertos propios

Etiquetas

SaaSMulti-tenantPOSPWAOffline-firstFirebaseStripeLATAMFull Stack