Poll, don't webhook
Inbound payment confirmation is polled because the bank will never call us; outbound messaging is pushed. Choosing the right direction per integration beats forcing one pattern on both.
Hosts post drop-ins, leagues and tournaments. Players reserve spots. The money moves player-to-host by Interac e-Transfer — no platform cut, no merchant account, no payment processor. Which means nothing ever tells the platform who paid. So I built the thing that works it out.
Every other booking product I could copy starts from the same assumption: a processor takes the money, then tells you it happened. Take the processor away and the hardest problem in the system is no longer scheduling nine teams across three tiers. It is knowing, with confidence, that a specific stranger paid a specific host for a specific Monday night.
The honest trade-off: inbound reconciliation is polled, not pushed, and it always will be. There is no webhook for a bank transfer between two strangers. Everything in the design follows from accepting that instead of wishing it away.



Inbound payment confirmation is polled because the bank will never call us; outbound messaging is pushed. Choosing the right direction per integration beats forcing one pattern on both.
No sockets. Liveness is server-rendered revalidation and an explicit refresh. A volleyball roster changes a few times an hour, not a few times a second — a persistent connection per viewer would have been infrastructure bought to solve a problem nobody had.
The app installs to a phone home screen, and its service worker says in a comment that it caches nothing on purpose. An app whose entire content is who else is playing tonight has nothing honest to show you offline.
Player, host, cohost and admin are separate passwordless sessions that can be held at the same time, so testing a host flow doesn't cost you your player session. Host access is approval-gated rather than self-serve — publishing a game takes on other people's money and evenings.
Live scoring opens over the league page as an intercepting parallel route: a real URL you can send to the person holding the clipboard, that still renders as a modal over the standings when you click into it from there.