Saltar al contenido
Leonardo Tapia
Lo que he construido

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
Logo de Setmatch: El partido empieza acá

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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.

  1. 01Abre el partido· Jugador

    Elige club, cancha y horario; el partido nace como tentativo.

  2. 02Paga su plaza· Jugador

    Un cuarto de la cancha, retenido en su tarjeta sin cobrar.

  3. 03Lo publica en tiempo real· SetMatch

    En el lobby de partidos abiertos, por socket.

  4. 04Se unen· Otros jugadores

    Fuera del rango de ELO piden acceso, y votan los que ya están.

  5. 05Pagan su plaza· Otros jugadores

    Cada uno con su propia retención.

  6. 06Confirma el partido· SetMatch

    Con las cuatro plazas pagadas; desde ahí la cancha queda bloqueada.

  7. 07Captura al empezar· SetMatch

    El cobro se hace al inicio del partido; si nunca se llena, todo se devuelve.

  8. 08Recibe el pago· Club

    Split de marketplace: el club cobra y SetMatch retiene su comisión.

  9. 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.

  1. 01Crea la liga· Club

    Formato, fechas e inscripción.

  2. 02Se inscriben en pareja· Jugadores

    Con una retención de inscripción.

  3. 03Cierra la inscripción· SetMatch

    Automáticamente, en la fecha fijada.

  4. 04Genera el fixture· SetMatch

    Todos contra todos con el método de Berger; BYE si son impares.

  5. 05Agendan cada partido· Jugadores

    Las parejas proponen la fecha.

  6. 06Pagan su plaza· Jugadores

    Tienen 48 h para pagar después de agendar.

  7. 07Bloquea la cancha· SetMatch

    Los partidos del torneo reservan su cancha.

  8. 08Cargan el resultado· Jugadores

    Si la otra pareja no responde, se aprueba solo; un retiro da walkover 6-0.

  9. 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.

  1. 01Cede un bloque· Club

    Bloques recurrentes de 90 minutos, entre las 08:00 y las 20:00.

  2. 02Bloquea la agenda· SetMatch

    El bloque ocupa la cancha y deja de ofrecerse a los jugadores.

  3. 03Arma sus clases· Profesor

    Individuales o grupales, dentro de sus bloques.

  4. 04Reserva y paga· Alumno

    Con retención; se cobra al inicio de la clase.

  5. 05Recuerda el pago· SetMatch

    En clases recurrentes avisa a las 48 h y cancela a las 24 h si no se pagó.

  6. 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.
Reglas de cancelación de un partido
Cancela el jugadorReembolso
24 h o más antes100 %
Entre 12 y 24 h100 % menos comisiones
Entre 6 y 12 h50 % menos comisiones
Menos de 6 hSin reembolso
Si cancela el club100 % 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

App del jugadorExpo · React Native
Panel webNext.js · club, profesor y super admin

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

MongoDB
Mercado PagoOrders API · retención y captura
Firebaseacceso social y FCM
Expo Pushnotificaciones
Resendemail
Almacenamiento S3imágenes
Railwayproducción y staging
  • 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

  1. 01

    Hexagonal + DDD en 10 contextos

    Cada módulo separa dominio, aplicación, infraestructura e interfaces, con inyección de dependencias.

  2. 02

    Una sola regla de conflicto

    Qué bloquea una cancha se decide en un único lugar, porque dos caminos de código estaban desincronizados.

  3. 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.

  4. 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.

  5. 05

    Reloj inyectable

    Reloj simulado en los tests y de sistema en producción: las reglas por ventana horaria se prueban sin esperar.

  6. 06

    Libros contables propios

    Billetera y deudas con sus propios ledgers, porque Mercado Pago no los ofrece.

  7. 07

    Dinero en centavos enteros

    Todos los importes son enteros en centavos, nunca decimales flotantes.

  8. 08

    Cola idempotente y webhooks firmados

    Las operaciones de pago se serializan por alcance y los webhooks se verifican con HMAC-SHA256.

  9. 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

[POR COMPLETAR]

public/images/setmatch/app-inicio.png

App del jugador · inicio
[POR COMPLETAR]

public/images/setmatch/app-reservar.png

App del jugador · reservar
[POR COMPLETAR]

public/images/setmatch/app-partido.png

App del jugador · partido abierto
[POR COMPLETAR]

public/images/setmatch/app-torneo.png

App del jugador · torneo
[POR COMPLETAR]

public/images/setmatch/panel-calendario.png

Panel del club · calendario
[POR COMPLETAR]

public/images/setmatch/panel-analitica.png

Panel del club · analítica

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