← Volver a proyectos

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