All case studies

Sports Management SaaS

Tournated

One platform for federations to run tournaments end to end

Role: Full-stack engineer — NestJS/GraphQL API, Next.js product surface, real-time scoring pathsTimeline: Multi-release production SaaS
  • Scope

    Multi-tenant SaaS

  • Stack

    Next.js + NestJS

  • Realtime

    Live scoring

  • Status

    In production

Tournated product screenshot

For a founder hiring: I can own multi-tenant SaaS complexity — domain logic, realtime, and white-label — without treating it like a marketing site.

Executive summary

Tournated is a white-label sports management platform. Federations and clubs run registration, scheduling, live scoring, and rankings in one product instead of stitching spreadsheets and chat threads. I worked across the GraphQL API and Next.js surfaces that make that lifecycle usable under real event load.

Why this product existed

Sports organizations needed a single branded system for tournament operations. Fragmented tools meant slow events, broken handoffs between registration and scoring, and no clean way to present rankings under a federation brand.

Business problem

Ops glue was eating organizer time. Registration, brackets, scoring, and rankings lived in separate places — so events were hard to run, hard to brand, and hard to trust when scores moved fast.

Why the existing approach failed

Spreadsheets, messaging apps, and disconnected tools don’t share a data model. Live updates were manual. White-label branding meant rebuilding or forking per federation. Nothing was designed for concurrent scoring traffic.

Users

Federation admins, club organizers, referees/scorers during live events, and players checking schedules and rankings.

Constraints

  • Multi-tenant white-label without forking the codebase per federation
  • Live scoring had to stay reliable when many matches update at once
  • Complex bracket and scheduling domain logic that non-engineers still need to operate
  • GraphQL payloads had to stay predictable as features grew

My responsibility

Full-stack engineer — NestJS/GraphQL API, Next.js product surface, real-time scoring paths

Architecture

NestJS + GraphQL on PostgreSQL with Redis for hot paths; Next.js for organizer and player experiences. GraphQL subscriptions for live scoring updates. Tenancy and branding modeled so federations share one product surface with config-driven white-label, not separate apps.

Engineering decisions

  • GraphQL API with subscriptions for live scoring

    Why: Clients need targeted updates during matches without polling every scoreboard.

    Rejected: Pure REST + short polling — simpler initially, but noisy and laggy under concurrent event traffic.

  • Shared multi-tenant codebase with white-label config

    Why: Federations need brand identity without multiplying maintenance cost.

    Rejected: Per-federation forks — ships the first brand fast, then becomes unmaintainable.

  • Postgres as system of record + Redis for hot realtime paths

    Why: Tournament state must be durable; live score reads need low latency.

    Rejected: Redis-only or document-only stores for core tournament state — weaker relational guarantees for brackets and rankings.

Hardest technical problems

  • Reliable live scoring under concurrent event traffic
  • Multi-tenant white-label without forking the codebase
  • Complex bracket / scheduling domain logic
  • Keeping GraphQL performant as query surfaces grew

Trade-offs

  • GraphQL flexibility vs. disciplined query design — without care, N+1 and over-fetching show up under load.
  • White-label config depth vs. product complexity — every federation-specific knob is a support cost.
  • Realtime freshness vs. infrastructure cost — subscriptions are worth it for scoring, not for every screen.

Implementation

Shipped and iterated on the tournament lifecycle in production: registration through scheduling, live scoring, and rankings, with NestJS/GraphQL backends and Next.js UIs organizers and players actually use during events.

How the product evolved

The product moved from core tournament ops toward a fuller federation platform — more of the lifecycle in one place, and white-label expectations rising as more brands came on.

What I’d do differently today

I’d front-load clearer tenancy boundaries and GraphQL performance budgets earlier, and document scoring edge cases as product rules — not tribal knowledge — so the next engineer doesn’t rediscover them under a live event.

Business impact

Organizers run events in one place. Federations get a branded product. Clubs stop losing hours to ops glue between tools that never shared state.

  • Live product at play.tournated.com
  • Registration → scoring → rankings in one flow
  • White-label ready for federation brands
  • API designed for concurrent live events

Lessons

  • Sports ops is a domain problem first — the stack only matters after the lifecycle is honest.
  • Realtime is a product promise; if scores lag, trust collapses faster than any chart can fix.
  • White-label is an architecture decision, not a CSS theme.

Technology choices

  • Next.js
  • TypeScript
  • NestJS
  • GraphQL
  • PostgreSQL
  • Redis
  • Apollo