Skip to content
AMTEXConsulting

Case study · Technology

SportzOS: a league platform for seven sports, from registration to live scoring

An iOS and Android app, two websites and one Postgres backend that let community organisers run leagues, collect fees, schedule matches, appoint officials, score games ball by ball and publish standings, with players keeping a record across every league they play in.

Client
SportzOS (NASportz)
Industry
Technology
Solutions
Application DevelopmentMobile Development
Technology
React NativeExpoNext.jsTypeScriptSupabasePostgreSQLStripeVercel

Challenge

Community sports leagues run on spreadsheets, group chats and goodwill. Registration lives in a form, fees in a payment app, fixtures in a message thread, and the score of last night's cricket match in someone's head. Organisers spend their evenings reconciling all of it, and players have no record of what they played or how they did once the season ends.

The brief was a platform that one person could run a league from a phone with, that handled the awkward parts of real sport (a cricket run-out off a bye, a tennis set decided by advantage rather than tiebreak, a duty team supplying the umpire), and that worked for two brands at once: NASportz, a nonprofit community programme, and SportzOS, the commercial product built on the same engine.

Context

AMTEX designed and built the product end to end: the mobile app, the organiser and player websites, the database and security model, payments, email, push notifications and the App Store and Play Store release pipelines. The app is live on the App Store and is delivered to Android through the same codebase.

Architecture

Platform architecture
  1. Experience

    • iOS app
    • Android app
    • Player & organiser webNext.js
    • Live scorersCricket · Tennis · Team sports
  2. Backend

    Postgres

    Row-level security · SQL standings engine

    Realtime

    Live scores · Chat

    Edge Functions

    Reminders · Mailers

    Auth

    Account deletion · Rate limits

  3. Services

    • StripePer-brand accounts
    • Transactional emailPer-brand senders
    • Push notifications
  4. Delivery

    • Store builds + OTA updates
    • Vercel
    • Git + staged SQL migrations

Solution

One Postgres database serves the Expo app and both Next.js websites. Permissions are not an application-layer afterthought: row-level security policies are the product's permission model, so an organiser sees registrant details for their league only, a captain sees their squad, and personal data is masked for everyone else. Standings are computed in SQL from recorded results, so the table is the same on every surface and recalculates when a result is corrected.

Each sport has a scorer that respects its rules. Cricket is scored ball by ball with toss, extras, run-outs, retirements, over caps and a full scorecard with strike rates, economy, fall of wickets and partnerships. Tennis supports both tiebreak and advantage set deciders chosen by the organiser. Soccer, basketball, volleyball and baseball have squads, playing-eleven sheets and box scores. Live scores stream to spectators over Realtime.

  • Registration for individuals, doubles pairs with partner invites, and captain-led team entries with approval flows and one-team-per-league enforcement.
  • Pay-as-you-go competition credits for organisers, priced by purchasing-power band and locked to the organiser's country in the database.
  • Entry fees paid directly to the organiser's own payment handle, so the platform is never the merchant of record for league money.
  • Match officials drawn from a duty team at scheduling time; cricket matches cannot be scheduled without one.
  • Opt-in contact reveal and match chat with block, report and an acceptable-use agreement, which is what App Store review requires of user-generated content.
  • Public player profiles keyed by a generated Player ID rather than a name, so two players with the same name never merge.
  • Weekly challenge reminders, league-versus-league battles, private code-gated leagues and hidden test leagues for staff.

Native releases go through the store review process, but JavaScript changes ship over the air to installed apps, so fixes reach players in hours rather than days. Every schema change is a reviewed SQL migration, applied in a recorded order, with a single query that reports which migrations are actually live before anyone diagnoses a problem.

Business impact

SportzOS went live on the App Store in July 2026 with real leagues, real payments and real match data. Organisers now run registration, fees, fixtures, officials and scoring from one place, and players keep a verified record that follows them from league to league.

The engineering that mattered most was not a feature. It was the security model (a personal-data lockdown that still let captains read their squads), the identity model (a player is an account, never a name) and the release model (store builds for native change, over-the-air for everything else).

7

Sports supported

July 2026

App Store launch

iOS · Android · 2 websites

Surfaces on one backend

Key takeaways

  1. 01Make row-level security the permission model, then test it with the least-privileged user you have.
  2. 02Identity is an account id. Matching people by name will eventually make a stranger into you.
  3. 03A SQL standings engine beats a client-side recalculation the first time a result is corrected.
  4. 04Separate what needs a store build from what can ship over the air, and ship the latter often.

Facing something similar?

We will walk you through how we approached this one and what would be different for you.