Caso de estudio · Plataforma
SetMatch
Plataforma de reservas para clubes de pádel.
- Rol
- Software Engineer · SEO Digital
- Mercado
- Argentina
- Plataformas
- App móvil · Panel web · API
- Roles
- Super admin · Club · Profesor · Jugador
- Pagos
- Mercado Pago, con retención y captura
- Entornos
- Producción y staging

01Contexto
El producto
SetMatch es una plataforma multi-club de gestión y reservas para clubes de pádel en Argentina.
La desarrollé en SEO Digital como Software Engineer, de extremo a extremo: arquitectura, backend, paneles web y app móvil.
02Reto
Lo que había que resolver
Un sistema donde reservar una cancha mueve el dinero de cuatro personas, con reglas de cancelación por ventana horaria y clubes que necesitan entender su negocio.
- Cuatro roles con necesidades distintas: super administrador, club, profesor y jugador.
- Partidos abiertos que solo se confirman cuando las cuatro plazas están pagadas.
- Pagos con retención y captura en Mercado Pago, reembolsos parciales y reglas por ventana horaria.
- Una agenda por cancha que combina reservas, partidos tentativos, bloques de profesores y torneos sin conflictos.
- Torneos, ligas y americanos con fixtures, cuadros y resultados que se resuelven solos.
- Métricas para que cada club entienda su ocupación y sus ingresos.
03Solución
Cinco piezas, un producto
01
App del jugador
Expo · React Native
Reservar, jugar, competir y comunidad, desde el teléfono.
- Búsqueda de clubes y horarios, con mapa
- Reservas privadas y partidos abiertos con pago por plaza
- Control de nivel por ELO para unirse a un partido
- Torneos en pareja, clases, billetera y chat por partido
- Comunidad: seguidores, publicaciones, comentarios y logros
02
Panel del club
Next.js
La operación diaria del club.
- Calendario por cancha y canchas con precio por franja y día
- Clientes con seguimiento de ausencias
- Profesores y bloques cedidos a cada uno
- Torneos, ligas, americanos y escuela
- Analítica de ocupación, ingresos y clientes
- Cobros conectando su cuenta de Mercado Pago
03
Panel del profesor
Next.js
El mismo panel, con permisos de profesor.
- Clases individuales y grupales dentro de sus bloques
- Escuela: alumnos y grupos recurrentes
- Sus propios torneos
- Perfil profesional global: puede trabajar en varios clubes o en ninguno
04
Panel de super administrador
Next.js
La configuración de la plataforma.
- Clubes, usuarios y profesores
- Configuración del ranking ELO
- Comisiones de la plataforma y ventana de cancelación
- Finanzas y operaciones de pago
05
API
Node.js · Express · MongoDB
El núcleo: 10 contextos acotados con arquitectura hexagonal y DDD.
- REST /api/v1 y tiempo real con Socket.IO
- Contexto de pagos con 13 módulos: pasarela, ledgers, cola, webhooks y cancelación
- Trabajos programados: capturas, renovación de tokens y cierre de inscripciones
- Notificaciones push y email
04Flujos
Cómo funciona
Partido abierto con pago por plaza
Cada jugador paga su parte; el partido solo se confirma cuando no queda ninguna plaza sin pagar.
- 01
01Abre el partido· Jugador
Elige club, cancha y horario; el partido nace como tentativo.
- 02
02Paga su plaza· Jugador
Un cuarto de la cancha, retenido en su tarjeta sin cobrar.
- 03
03Lo publica en tiempo real· SetMatch
En el lobby de partidos abiertos, por socket.
- 04
04Se unen· Otros jugadores
Fuera del rango de ELO piden acceso, y votan los que ya están.
- 05
05Pagan su plaza· Otros jugadores
Cada uno con su propia retención.
- 06
06Confirma el partido· SetMatch
Con las cuatro plazas pagadas; desde ahí la cancha queda bloqueada.
- 07
07Captura al empezar· SetMatch
El cobro se hace al inicio del partido; si nunca se llena, todo se devuelve.
- 08
08Recibe el pago· Club
Split de marketplace: el club cobra y SetMatch retiene su comisión.
- 09
09Cargan el resultado· Otros jugadores
La otra pareja lo confirma o lo rechaza, y se actualiza el ELO.
Liga: del fixture al resultado
Una liga se organiza sola: inscripción, fixture, pagos por partido y tabla.
- 01
01Crea la liga· Club
Formato, fechas e inscripción.
- 02
02Se inscriben en pareja· Jugadores
Con una retención de inscripción.
- 03
03Cierra la inscripción· SetMatch
Automáticamente, en la fecha fijada.
- 04
04Genera el fixture· SetMatch
Todos contra todos con el método de Berger; BYE si son impares.
- 05
05Agendan cada partido· Jugadores
Las parejas proponen la fecha.
- 06
06Pagan su plaza· Jugadores
Tienen 48 h para pagar después de agendar.
- 07
07Bloquea la cancha· SetMatch
Los partidos del torneo reservan su cancha.
- 08
08Cargan el resultado· Jugadores
Si la otra pareja no responde, se aprueba solo; un retiro da walkover 6-0.
- 09
09Corrige si hace falta· Club
El club puede corregir un resultado.
- 10
10Actualiza tabla y ELO· SetMatch
En torneos y ligas el factor K es fijo.
Clases con profesor
El club cede tiempo de cancha; el profesor organiza sus clases y cobra por ellas.
- 01
01Cede un bloque· Club
Bloques recurrentes de 90 minutos, entre las 08:00 y las 20:00.
- 02
02Bloquea la agenda· SetMatch
El bloque ocupa la cancha y deja de ofrecerse a los jugadores.
- 03
03Arma sus clases· Profesor
Individuales o grupales, dentro de sus bloques.
- 04
04Reserva y paga· Alumno
Con retención; se cobra al inicio de la clase.
- 05
05Recuerda el pago· SetMatch
En clases recurrentes avisa a las 48 h y cancela a las 24 h si no se pagó.
- 06
06Da la clase y cobra· Profesor
En las clases cobra el profesor, no el club.
05Pagos
Pagos y cancelaciones
Retener primero y cobrar después: el dinero se mueve según el estado real de la reserva y de la ventana de cancelación.
- Cinco verticales de pago: partido abierto, reserva privada, torneo, clase individual y clase grupal.
- Retención en tarjeta, captura total o parcial, liberación y reembolso, detrás de un puerto de pasarela.
- Split de marketplace: cada club o profesor conecta su cuenta y SetMatch retiene su comisión.
- Billetera en SetMatch Coins (1:1 con el peso) y deudas con libros contables propios.
- Las reservas se abren hasta 5 días antes, porque la retención de Mercado Pago dura 5 días.
| Cancela el jugador | Reembolso |
|---|---|
| 24 h o más antes | 100 % |
| Entre 12 y 24 h | 100 % menos comisiones |
| Entre 6 y 12 h | 50 % menos comisiones |
| Menos de 6 h | Sin reembolso |
| Si cancela el club | 100 % al jugador |
Torneos: reembolso total solo con más de 72 h y la inscripción abierta. Clases: regla de 24 h.
06Analítica
Analítica del club
Un panel de métricas para que cada club entienda su ocupación, sus ingresos y sus clientes.
- Ocupación: acumulada y del período, día y franja de mayor ocupación, y reservas por tipo.
- Ingresos: totales y netos de comisiones, promedio por turno y evolución frente al período anterior.
- Efectivo frente a app, y resumen mensual con la deuda con la plataforma.
- Clientes: activos, recurrentes, retención, conversión de partidos abiertos y ausencias.
- Salud del club: tasa de cancelación, tendencias y dependencia de clientes recurrentes.
07Rol
Mi rol
Desarrollé la plataforma de extremo a extremo: arquitectura, backend, paneles web y app móvil.
- Arquitectura
- Backend
- Frontend
- Mobile
- Pagos
- Tiempo real
- Testing
- Infraestructura
08Arquitectura
Cómo está construido
Una app móvil y un panel web con tres roles, sobre una API central multi-club.
Clientes
Servicios
API SetMatch
Node.js · Express · Mongoose
10 contextos acotados · hexagonal + DDD
- admin
- auth
- chat
- cliente
- club
- cuenta
- dev
- payments
- producto
- profesor
Datos y proveedores
- Multi-club: una sola base de datos con cada entidad acotada por club; credenciales de pago por club o profesor.
- La tarjeta se tokeniza directamente con Mercado Pago desde una WebView: los datos no pasan por el servidor.
- Cada módulo separa dominio, aplicación, infraestructura e interfaces.
09Decisiones
Decisiones técnicas
01
Hexagonal + DDD en 10 contextos
Cada módulo separa dominio, aplicación, infraestructura e interfaces, con inyección de dependencias.
02
Una sola regla de conflicto
Qué bloquea una cancha se decide en un único lugar, porque dos caminos de código estaban desincronizados.
03
Retener y capturar
Nada se cobra de entrada: retención en tarjeta y captura total o parcial según cómo termine la reserva.
04
La pasarela detrás de un puerto
Una pasarela simulada permitió desarrollar con TDD las cinco verticales de pago antes de conectar Mercado Pago.
05
Reloj inyectable
Reloj simulado en los tests y de sistema en producción: las reglas por ventana horaria se prueban sin esperar.
06
Libros contables propios
Billetera y deudas con sus propios ledgers, porque Mercado Pago no los ofrece.
07
Dinero en centavos enteros
Todos los importes son enteros en centavos, nunca decimales flotantes.
08
Cola idempotente y webhooks firmados
Las operaciones de pago se serializan por alcance y los webhooks se verifican con HMAC-SHA256.
09
Activación gradual de pagos
Todo el camino de pago quedó detrás de un guard, para activarlo sin romper los flujos existentes.
10Complejidad
Lo difícil, y cómo se sostiene
Complejidad
- Agenda por cancha que combina reservas, partidos tentativos, bloques de profesores y torneos con una sola regla de conflicto.
- Si el club reserva encima de un partido tentativo, ese partido se cancela con reembolso total.
- ELO con factor K por nivel (de 80 a 24) y fijo en torneos, mostrado como puntuación de 1 a 10 y nueve categorías.
- Torneos: liga todos contra todos con el método de Berger y americano con grupos y cuadro eliminatorio, con walkover y aprobación automática.
- Un único validador de marcador, idéntico en la API, el panel y la app.
Calidad
- 156 archivos de tests con Jest en la API, 34 de ellos dedicados a pagos.
- 58 especificaciones end-to-end con Playwright que recorren los flujos completos, y flujos Maestro en la app.
- Tests guardianes: el build falla si alguien calcula el orden de los jugadores o el estado de un pago fuera de su módulo.
- Endpoint de salud con memoria, latencia del event loop, trabajos en curso y estado de la base de datos.
11Estado
Dónde está hoy
En producción
- API y panel web con entornos de producción y staging en Railway.
- App con builds de producción y staging en EAS.
- Pagos con Mercado Pago integrados en los flujos de partido, torneo y clase.
- Desarrollo activo durante 2026.
12Galería
Capturas de SetMatch
public/images/setmatch/app-inicio.png
public/images/setmatch/app-reservar.png
public/images/setmatch/app-partido.png
public/images/setmatch/app-torneo.png
public/images/setmatch/panel-calendario.png
public/images/setmatch/panel-analitica.png
13Stack
Con qué está hecho
- Mobile
- Expo
- React Native
- TypeScript
- Firebase
- React Native Maps
- Panel web
- Next.js
- React
- TypeScript
- Tailwind CSS
- Recharts
- Leaflet
- Backend
- Node.js
- Express
- TypeScript
- MongoDB
- Mongoose
- InversifyJS
- Socket.IO
- JWT
- Pagos y servicios
- Mercado Pago
- Railway
- Resend
- Expo Push
- Almacenamiento S3
- Calidad
- Jest
- Playwright
- Maestro
- Supertest
Siguiente proyecto
Sonir
Leonardo Tapia