Proyecto · App Multi-Club
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.

Capacidades demostradas

Cuando el dato tiene consecuencias oficiales

Un resultado deportivo no es un dato cualquiera: modifica el hándicap federativo de una persona y decide quién gana un torneo. Eso obliga a construir con un nivel de integridad que la mayoría de aplicaciones no necesita.

Integridad de la competición, por diseño

Solo el dueño de una tarjeta puede firmarla, el desacuerdo con el marcador se ve y frena la firma, y una tarjeta anulada deja constancia del motivo. Fuera del grupo, nadie toca nada.

Por qué tiene mérito

Cada una de esas reglas nació de un caso real de conflicto en un club. Se aplican en el servidor, no en la pantalla: aunque alguien manipule la aplicación desde su móvil, la regla se cumple igual porque quien manda es la base de datos.

Reglas en servidorAuditoríaFirma cruzada

El hándicap se calcula, nunca se teclea

El hándicap del jugador lo calcula el sistema según la norma mundial vigente, por disciplina (golf y pitch and putt), y el jugador puede ver de dónde sale cada número.

Por qué tiene mérito

Es una norma con casos límite de verdad: vueltas a medias, rondas sin marcador, valoraciones distintas por salida y por recorrido. Se auditó la aplicación entera contra el reglamento federativo, cruzando texto normativo con comportamiento real del código.

WHSNormativa federativaCálculo verificado

Formatos de competición configurables, no cerrados

Cada club decide el formato de su torneo: cuadros de eliminatorias, circuitos por equipos, de cuántos en cuántos se sale al campo y qué cuenta para la clasificación.

Por qué tiene mérito

Lo fácil es fijar un formato en el código y que todos se adapten. Aquí el reparto de grupos de salida es una pieza central que usan tanto la aplicación como las herramientas internas, así que añadir un formato nuevo no obliga a tocar lo que ya funciona.

Match playCircuitosArquitectura modular

El catálogo de campos se alimenta solo

Dar de alta un campo de golf no es teclear 18 hoyos a mano: el sistema lee la web oficial del club y extrae la tarjeta, las valoraciones y las láminas de cada hoyo.

Por qué tiene mérito

Además cruza lo que publica el club con lo que ya tiene la ficha y emite un informe de qué falta o qué está ilegible. Es automatización de la carga de datos, la tarea que normalmente hunde el lanzamiento de una plataforma de este tipo.

Extracción automáticaControl de calidad de datos

Publicada en Google Play, y funcionando sin cobertura

La app está en la tienda oficial de Android. Y en mitad del campo, donde casi nunca hay señal, se sigue anotando: los golpes se guardan en el móvil y se sincronizan al recuperar cobertura.

Por qué tiene mérito

Trabajar sin conexión obliga a resolver qué pasa cuando dos jugadores anotan el mismo hoyo desde móviles distintos y luego se reencuentran. La reconciliación está diseñada para que nunca se pierda un golpe ni se dupliquen las tarjetas.

Google PlaySync offlineResolución de conflictos
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

470+
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)50h
Gestión de clubes, miembros e invitaciones59h
Catálogo de campos con hoyos y audit log42h
Circuitos, torneos y generador de grupos67h
Tarjeta interactiva pública + validación cruzada59h
Cálculo WHS, Stableford y simulador de hándicap59h
Billing Stripe (customers, subs, webhooks)50h
Panel superadmin (clubes, datos fantasmas, mantenimiento)42h
PWA, sync offline y reconciliación42h

470 horas de desarrollo, equivalentes a 2,8 mesesde una persona a jornada completa.

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