Projects / Case Study · Laravel + React Native

My own SaaS product · Sole architect & developer

RollCall

A multi tenant membership and class attendance SaaS for Brazilian jiu jitsu and martial arts gyms, built solo: a Laravel JSON API with Sanctum, a React 19 TypeScript web app, and a standalone React Native (Expo) Android app, all sharing one typed contract. QR check in that keeps working with no signal, belt progression, dues and billing, member chat, and family accounts.

Laravel PHP 8 Sanctum MariaDB React 19 TypeScript React Native Expo Zod contract pnpm monorepo
01

The brief

Most gyms still run on a clipboard and a spreadsheet: attendance is scribbled on paper, belt eligibility lives in the head coach's memory, and dues are chased by hand. RollCall replaces all of that with one platform a gym owner can actually run, and that I can stand up for any number of gyms from the same codebase.

It is multi tenant from the ground up. Each gym is an isolated tenant with its own members, classes, plans, and staff, so one deployment serves many gyms without their data ever touching.

02

Architecture

One API, two clients, one shared source of truth for every type that crosses the wire.

The API is the only thing that touches the database. Both clients are consumers of it, authenticated with Sanctum tokens. The web app and the mobile app never re invent a payload shape, because every request and response type comes from one shared, Zod typed contract in a pnpm monorepo. Change a field once and both clients fail to compile until they agree with the server.

03

Check in that survives no signal

The hardest part of a gym app is the least glamorous one: members scan a QR code to check in, and the mat is often exactly where the wifi is not.

Check ins are queued on the device and sync the moment connectivity returns, and the whole thing is built around one invariant: a member can be marked present for a given class on a given day at most once, no matter how many times a flaky connection retries the request. The dedupe key is the member, the class, and the day, enforced end to end, and the offline queue and the sync classifier are covered by pure logic assertions that run against the real transpiled code, so the invariant is proven, not hoped for.

04

What it does

QR check in + attendance

Scan to check in, with an idempotent offline queue and a twelve week attendance heatmap per member.

Belt progression

Stripes and belts with eligibility rules and a promotion history, so the coach sees who is due at a glance.

Dues & billing

Membership plans, dues tracking, and reconciliation for local rails with dunning for missed payments.

Coach mode

Class rosters and manual check in through the same idempotent path, for members without a phone on them.

Member chat + board

In app messaging and a community board per gym, plus push notifications.

Family accounts

One guardian managing several members, for the kids classes that fill a BJJ schedule.

05

The mobile app

A standalone Expo React Native client for members and coaches, Android first, sharing the same typed contract as the web app.

Strict TypeScript throughout, secure token storage, session restore, and a clean logout on an expired token. Dues are real world services paid at the gym, so the app carries no store payment SDK and stays out of in app purchase rules. It ships through Play closed testing now, with iOS to follow from the same codebase.

Expo (SDK 57) Strict TypeScript NativeWind Offline queue Expo push Light / dark theme EAS build
06

Engineering & quality

Type safe from the database to the phone, tested where it counts, and built to add a second gym without touching the code.

Shared Zod typed contract Multi tenant isolation Sanctum token auth API feature tests Offline logic assertions Strict TypeScript both clients pnpm monorepo Idempotent writes

Phases one through three are shipped and tested, with the public launch on rollcallhq.xyz next.

Building a product like this?

I take multi tenant SaaS from an idea to a shipped API, web app, and mobile app, solo and end to end. If that is the build you are scoping, let us talk.