Proyecto — App Multi-Club

Actualizado · 21 may 2026

Par o Nada

El club entero, en el bolsillo del socio

Plataforma multi-tenant para clubes de Golf y Pitch & Putt: gestión de socios con roles, campos con hoyos detallados, circuitos por equipos, tarjetas interactivas con QR validadas entre jugadores y cálculo WHS del hándicap, todo bajo un billing por usuario en Stripe.

Multi-tenant
Clubes aislados
4
Roles distintos
3
Modalidades WHS
Stripe
Billing por usuario
Proyecto Completo

Una sola app, cuatro audiencias en juego

El socio entra a ver sus tarjetas y hándicap. El admin del club gestiona socios, circuitos y facturación. El caddie ayuda a meter resultados sobre el campo. El superadmin opera la plataforma. Cada rol ve solo lo suyo, con su propia experiencia.

Socio
Tarjetas, hándicap, simulador
Admin de Club
Socios, circuitos, billing
Caddie
Acompañamiento en campo
Superadmin
Plataforma global
Funcionalidades clave

Lo que ocurre antes, durante y después del torneo

La app cubre el ciclo completo: el club da de alta a sus socios, configura el campo y el circuito, los grupos juegan con tarjeta interactiva y al cierre se publican resultados y se actualiza el hándicap.

Clubes multi-tenant

Cada club vive en su propio espacio aislado con su admin, socios e invitaciones por email. El superadmin ve todos los clubes, los admins solo el suyo.

Campos con hoyos detallados

Cada campo guarda par, stroke index y metros por tee (Blanco, Amarillo, Azul, Rojo). 9 ó 18 hoyos, Golf o Pitch & Putt, con audit log de cambios.

Circuitos y torneos

Circuitos por club con varias jornadas. Individual, parejas o equipos. Tres modalidades de puntuación: Stroke Play Scratch, Stableford HCP y Stableford Scratch.

Grupos con horarios

Generador de grupos por torneo con hora de salida y hoyo de salida (shotgun). El admin reordena, edita y rota grupos con drag & drop.

Tarjeta interactiva pública

Cada grupo recibe un token y un QR. Cualquier jugador del grupo abre la tarjeta sin login, mete resultados hoyo a hoyo y otro jugador valida en cruzado.

Validación cruzada

Cada puntuación lleva el ID del jugador validador y un set paralelo de resultados de validación. Cierre del torneo cuando ambas filas cuadran.

Cálculo WHS del hándicap

Reglas WHS Rule 6.2 implementadas: jugadores plus devuelven golpes en los stroke index altos. Stableford con sun-highlight en hoyos de pickup.

Simulador HCP P&P

Antes de jugar el torneo, el socio simula una ronda sobre cualquier campo y ve cómo cambiaría su hándicap Golf o Pitch & Putt. Útil para previsión.

Billing Stripe por usuario

Suscripción por miembros activos del club. Webhooks Stripe mantienen status, cycle (mensual/anual) y memberCount sincronizados con Firestore.

Invitaciones por email

El admin invita socios por email con un rol asignado (clubadmin, caddie, jugador). Estado pending/accepted/declined, banner de invitaciones en el home.

Histórico de puntuaciones

Cada socio ve su feed cronológico de rondas con desglose de Stableford, eagles, birdies, golpes totales y evolución del hándicap por circuito.

PWA offline-friendly

Instalable en iOS y Android con iconos adaptativos. Sync local con dedup y reconciliación cuando vuelve la red. Cola de escrituras non-blocking.

Flujo de un torneo

Cuatro pasos: del alta al cierre

Lo bonito de Par o Nada es que el club no inventa nada para cada torneo: sigue siempre el mismo flujo y la app guía a cada rol por lo suyo.

PASO 01

Configuración

El admin crea el circuito, elige modalidades, disciplina, género y categorías. Se asignan los socios participantes desde la base del club.

PASO 02

Torneo y grupos

Se da de alta el torneo en una jornada concreta sobre un campo. El generador propone grupos balanceados por hándicap; el admin reordena y fija horarios.

PASO 03

Juego con tarjeta

Cada grupo abre su tarjeta vía QR. Anota golpes hoyo a hoyo, ve sus puntos Stableford en vivo y deja que otro jugador del grupo valide su tarjeta.

PASO 04

Cierre y hándicap

Al cerrar la ronda se calcula el ajuste de hándicap WHS. La puntuación entra al histórico del socio y al leaderboard del circuito automáticamente.

Panel de Superadmin

Operar la plataforma desde un solo panel

Pensado para el equipo que mantiene Par o Nada: vista global de clubes, campos, actividad, datos fantasmas y configuración de precios.

Clubes

Listado global, billing activo, número de miembros, último cobro Stripe.

Campos

Catálogo global de campos y editor de hoyos con historial de cambios.

Usuarios

Vista global de cuentas, búsqueda y promoción a superadmin/clubadmin.

Circuitos

Lista cross-club de circuitos activos para soporte y debugging.

Actividad

Feed de audit logs de los últimos cambios en campos. Quién, qué y cuándo.

Mantenimiento

Configuración de precios globales (price per user) y operaciones de billing.

Datos fantasmas

Detector de cuentas huérfanas, miembros sin perfil y referencias rotas.

Desarrollo

Herramientas internas de seed, migración y limpieza para el equipo dev.

Versión

Endpoint de versión activa con banner de actualización para clientes ya abiertos.

Stack Técnico

Next.js + Firebase + Stripe

App moderna en Next.js 15 con React 19, datos en Firestore con reglas de seguridad por rol y un toque de IA con Genkit para el generador de formatos.

Frontend

App de socios y admins

Next.js 15.5App Router + Turbopack
React 19Server actions
Tailwind CSS 3.4Tokens editoriales
Radix UI + shadcnComponentes accesibles
React Hook Form + ZodFormularios validados
Recharts + qrcode.reactGráficas y QR de tarjeta

Backend

Datos y billing

Firebase AuthEmail + anónima pública
FirestoreMulti-tenant con reglas
Firebase AdminEndpoints privilegiados
StripeCustomers, subs y webhooks
Next API RoutesCapa fina sobre Firestore
Cascade APIBorrados en cascada

IA y Tooling

Extras y calidad

Genkit + Google AIGenerador de formatos
VitestTests del cálculo WHS
PWA + manifestInstalable iOS/Android
date-fnsFechas locales ES
react-phone-number-inputTeléfonos por país
patch-packageHotfixes de deps
En Números

El esfuerzo detrás de Par o Nada

280+
Horas de desarrollo
App + admin + billing
4
Roles distintos
Cada uno con su UX
3
Modalidades WHS
Stroke + 2 Stableford
2
Disciplinas
Golf y Pitch & Putt

Desglose de Esfuerzo por Módulo

Auth, onboarding y roles (global + per-club)30h
Gestión de clubes, miembros e invitaciones35h
Catálogo de campos con hoyos y audit log25h
Circuitos, torneos y generador de grupos40h
Tarjeta interactiva pública + validación cruzada35h
Cálculo WHS, Stableford y simulador de hándicap35h
Billing Stripe (customers, subs, webhooks)30h
Panel superadmin (clubes, datos fantasmas, mantenimiento)25h
PWA, sync offline y reconciliación25h

Estimación total: ~280 horas · Equivalente a ~6 semanas de trabajo de un dev senior

Decisiones Técnicas

¿Por qué se construyó de esta manera?

¿Por qué multi-tenant en una sola app?

Cada club querría su instancia, pero mantener N despliegues es un coste fijo prohibitivo. Con multi-tenant en Firestore (clubs/{clubId} con subcolecciones aisladas y reglas por rol) hay una sola app que escala. El admin de un club solo ve lo suyo, el superadmin ve la plataforma entera. Cero divergencia entre clubes.

¿Por qué Firestore y no SQL?

Las puntuaciones llegan en lotes desde la tarjeta interactiva con sync offline. Firestore facilita escrituras non-blocking, reglas de seguridad por rol/club y subcolecciones jerárquicas (club → circuito → torneo → puntuación). En SQL habría que pelearse con ACLs por fila y resolver el offline a mano.

¿Por qué tarjeta pública con token, no login?

Los jugadores no quieren crear cuenta para anotar resultados en el campo. El admin genera el grupo y reparte un QR. Anonymous Auth de Firebase + reglas de Firestore limitadas a la ruta /tarjetaTokens/{token} dan acceso justo, sin contraseñas. Si abusan, se revoca el token.

¿Por qué validación cruzada entre jugadores?

En golf federativo cada tarjeta la firma otro jugador. La app guarda los resultados originales y los del validador como sets paralelos. Si no cuadran, el admin ve la discrepancia hoyo a hoyo y decide. Es lo mismo que hace el comité federativo, pero digitalizado y trazable.

¿Por qué Stripe con quantity dinámica?

Los clubes pagan por miembros activos. Cuando un socio se da de alta, el webhook actualiza la quantity de la subscription Stripe automáticamente. El admin del club ve el desglose y los superadmins fijan el precio global desde /admin/mantenimiento sin tocar código.

¿Por qué incluir un simulador de hándicap?

Antes de jugar el torneo real, el socio quiere saber cómo va a quedar su hándicap. El simulador toma un campo cualquiera, golpes por hoyo y devuelve el ajuste WHS en tiempo real. Es la mejor manera de educar al socio sobre el efecto de un eagle, un birdie o un pickup.

¿Tu club todavía vive en Excel y WhatsApp?

Si tu club, federación o circuito amateur necesita gestionar socios, torneos y hándicaps sin papeles, te montamos una plataforma como Par o Nada adaptada a tu reglamento y tu marca.

Proyecto desarrollado por Automatiza ToDo · Todos los datos son aproximaciones públicas