Real-time sync uses Firestore's native onSnapshot listeners on every client surface — the React Native app, the React coach portal, and any admin tools the studio builds. The architectural choice is to use Firestore as the message bus rather than build one.
What that looks like in practice
When a member finishes a set on the watch and it writes to Firestore via the phone, the same record streams to the coach's open dashboard within roughly 100–300 milliseconds, depending on network. There's no separate WebSocket server, no Redis pub-sub, no Pusher channel — Firestore is the message bus.
Security rules carry the scope
Security rules ensure each listener only receives data scoped to that user's tenant. A coach's dashboard listener fires only on documents under their roster. A member's app listener fires only on their own programmes and workouts. The rule layer is the same code path that protects writes.
Where ordering matters
For features that need stronger ordering guarantees — programme edits with conflict resolution, sequential workout completion — the studio uses Firestore transactions. A transaction reads the current version, validates it hasn't changed, and writes the new one. If a transaction loses, the client retries or surfaces a conflict toast.
Why this model fits the team
What "no message bus" actually saves you
A traditional real-time stack is a list of things that can break at 3am: a WebSocket server to keep alive, a Redis instance to scale, reconnection logic, missed-message replay, presence tracking. Leaning on Firestore listeners deletes that entire list. There is no server to keep alive because there is no server — the database is the channel. For a small team, the features you do not have to operate are worth more than the ones you do.
The limits, stated plainly
This model is not infinite. A document has a write-rate ceiling, so a single hyper-contended counter (a live "people watching now" number for a million viewers) is a poor fit and needs sharding or a different tool. Most products never come close to that ceiling — but knowing where it is means we design around it before it bites, rather than discovering it in an incident.
