Project № VIII · Case study

Red Activa — the coach's clipboard, rebuilt as a SaaS

A multi-tenant platform for swimming academies and clubs. Coaches log attendance from a phone deck-side, evaluations get written as the athlete touches the wall, and the owner sees the team's health in one dashboard on Sunday night. Built on Laravel with a Filament-powered team panel and three tiers priced by athlete count.

I.Problem

Small sports academies run on WhatsApp groups and paper.

The academies we kept meeting had the same shape. A head coach with a notebook. An owner with a spreadsheet. A WhatsApp group that was half attendance, half parents asking whether class was on today. Evaluations lived in the coach's head, or on a clipboard that the pool eventually warped. None of it aggregated. None of it survived a coach leaving.

The off-the-shelf options were either generic gym CRMs that treated athletes like gym members — monthly dues, check-in kiosks — or enterprise federation software that assumed a back office the academy did not have. There was nothing sized for a club with three coaches and two hundred kids, written in the language they actually used.

The athlete is the unit. Attendance, evaluations, and communication all hang off the same person. Build the profile once; let the rest of the product be thin views over it.

II.Approach

A canonical athlete, two panels, a pricing gate on headcount.

The model settled on a handful of first-class entities — athlete, class, attendance, evaluation — and everything else is a view over them. A coach opens a class on the phone, ticks names, and the same rows become the owner's chart on the dashboard. An evaluation is a form the coach fills in deck-side; the same rows become the parent's notification and the athlete's history.

The app itself is two surfaces on one codebase:

  • A Filament team panel that each academy lives inside, scoped by tenancy. Coaches, owners, and assistants share the same panel with role-gated access; invitations let an owner onboard a coach in a minute without standing up a separate admin.
  • A Filament admin panel for us — the operator — to handle sign-ups, tiers, and the long tail of support tickets that a small SaaS inevitably generates.

Pricing is the gate that keeps the model honest. Three tiers — Entrenador up to 50 athletes, Academia up to 200, Centro Deportivo up to 1000 — all on a 30-day trial, all in USD. The cap is enforced at the domain, not at the marketing page, so the tier is a real constraint and not a feature list.

The product is swimming-specific today. The entities — athlete, class, attendance, evaluation — were designed without baking the stroke into the schema, so other disciplines are a possible future. But we have not chased that future. The academies we serve are swim clubs, the evaluation vocabulary is a swim coach's vocabulary, and pretending otherwise in the copy would be selling an abstraction we have not earned yet.

III.Outcome

A product that compounds with every season.

3
Tiers, capped by athlete count, 30-day trial on each
1000
Athletes on the top plan — a centro deportivo's worth
Active
In production, in Spanish, in LatAm swim clubs

Red Activa has taught me more than any other project about the gap between shipping a feature and shipping it in a way users will actually adopt. The hard parts were not the forms; they were the shape of the forms. A coach with wet hands on a phone at the edge of a pool is not a gentle target. Every extra tap compounded into a feature that went unused.

The boring pieces earn their keep quietly. Attendance charts on the dashboard let an owner notice a drop-off two weeks earlier than the WhatsApp group would have. Evaluation notifications close the parent loop without a coach typing the same message forty times. The admin panel — Filament, self-theming, free — shortened support turnarounds from days to an afternoon.

IV.Retrospective

The athlete is the product.

Three things aged well. First, one athlete table, one attendance table, one evaluation table — kept narrow, kept boring. Every time I was tempted to add a specialised table for a new evaluation type, the thing I actually wanted was a field. Restraint in the schema has paid back every season.

Second, Filament for both panels. We got a team surface and an admin surface out of the same primitives, which for a two-person team was the difference between shipping and not. The seams that show are worth showing; we did not try to hide that the app is a Filament panel with a good landing page, and the users did not care.

Third, tier caps at the domain. Putting the 50/200/1000 ceilings in the model — not on the pricing page — meant that upgrades were a real event and downgrades forced a real choice. The pricing stayed legible because the product enforced it.

What I would do differently is the onboarding surface. The Filament panel is excellent for power users and exhausting for a coach whose first login is on a phone in a locker room. A lighter mobile-first shell over the same data — even just a /today view with the day's classes, a tap for attendance, a tap for a quick evaluation — would do more for adoption than any feature we have shipped in a year. It is the next thing on the list, and it has been for a while, which is itself a lesson about how easy it is to keep polishing the panel you already have instead of building the surface your users actually need.