Proyecto
Sociko
SaaS de control de socios, membresías e ingresos para gimnasios, estudios y clubs en México. El diferenciador es la lista de cobranza: cada socio vencido queda apuntado con su teléfono al lado — con recuperar a uno solo, la suscripción ya se pagó. El dinero del gimnasio nunca pasa por la plataforma.
Pre-lanzamiento — ya en producción Producto propio — en desarrollo Fundador e Ingeniero (Full Stack — Producto, Backend, Infraestructura) Resumen público
Producto propio en pre-lanzamiento, ya en producción y operado en solitario. SaaS multi-tenant que trata datos de socios por cuenta de cada gimnasio; los detalles de implementación se resumen a alto nivel.
Stack
Angular 21TypeScriptTailwind CSS 4Firebase HostingFirestoreFirebase AuthCloud FunctionsStripe ConnectResendPWAGitHub Actions
Impacto
- El check-in del mostrador dice en el momento si el socio está al corriente — y cada vencido que intenta entrar queda apuntado en la lista de cobranza con su teléfono, que es de donde el gimnasio recupera mensualidades.
- Plan anual con dos meses gratis, con recibo al socio y aviso de renovación por correo — el gimnasio deja de perseguir renovaciones de memoria.
- El estatus de la membresía siempre se deriva de la fecha de vencimiento, nunca se guarda: no hay cron volteando banderas ni datos que mientan a medianoche.
- Cobro en línea opcional con cargos directos de Stripe Connect: el pago cae en la cuenta de Stripe del propio gimnasio, a su nombre — la plataforma jamás toca los fondos.
- PWA offline-first: el padrón se sigue consultando en el mostrador aunque se caiga el internet.
Lo que hice
- Modelo de fechas 100% civil (strings YYYY-MM-DD) con regla de lint que prohíbe `new Date()` fuera de un único helper — en un negocio de vencimientos, un desfase de zona horaria deja afuera a un socio que sí pagó.
- Renovaciones mensuales ancladas a la fecha original con clamp de fin de mes, verificado por mutación: 12 renovaciones puntuales suman exactamente un año de calendario.
- Renovación y cobro en una transacción atómica con clave de idempotencia: el doble tap en 'Renovar' no puede duplicar ni el ingreso ni la membresía.
- SEO técnico completo: rutas públicas prerenderizadas a HTML real en el build, metas por página, JSON-LD y sitemap.
- La lista de cobranza entrega el mensaje de WhatsApp ya escrito para cada vencido, así recuperar a uno es un toque y no una tarea.
- Un barrido diario cumple la cláusula de 90 días de los Términos: avisa dos veces antes de cerrar una cuenta inactiva, así lo que promete el texto legal es código y no un párrafo.
Arquitectura
- Angular 21 (signals, standalone components) como PWA sobre Firebase Hosting; Cloud Functions v2 (Node 22) de backend; Firestore multi-tenant con todo documento bajo organizations/{orgId}.
- Los webhooks de Stripe son la única fuente de verdad de planes y feature flags; el cobro opcional a socios usa cargos directos de Connect con application fee.
- Gates de CI (lint + pruebas en las dos capas) con deploy automático a Firebase en cada commit a main.
Etiquetas
SaaSMulti-tenantFitnessStripeFirebasePWALATAMFull Stack
