Invite-Only ON: every new account sees “Join HOOP”
Asked for by Leong Sen Fong, 2026-09-28 15:54: “it should show the Hoop invite gate page even carry the invite code” · 15:55 “design the flow for me first” · 16:08 “okay, proceed to implement”. Built the same day: server live 16:12, app in v2.766 (web version live; iPhone after the next TestFlight build). The 3 questions were answered with the suggestions. Today a code carried in from an invite link skips this page. That rule dates from 15 Sep (v2.215), but it only started happening today: v2.762 (build 244) fixed the app so a link's code arrives for people who aren't logged in yet. That's why Leong's 15:23 test on build 244 went straight to profile setup even though the gate was on. Drawn by Tora Master.

The flow

appnew in this changeworks todayrefused (existing screens)decision / note
Sign in: email + 6-digit code, Apple or Googlemay be carrying a code from an invite link(the app keeps it up to 7 days)Existing account?YesLogs innever blockedNo, new accountInvite-Only ON?OFFAccount created · no pagea carried code still counts(inviter credited) · UNCHANGEDONNEW: “Join HOOP” page ALWAYS appearseven when a code was carried inCarried a codefield already filled · green“From your invite link · Leong invited you”can change or clear itNo codeempty field (as today)Paste button · or the Waitlist tabTap ContinueServer checks, in this order:place left today? → then the codeall good✓ Joinedcode used · one place usedcode badStays on the page, says whyused / invalid / expired (existing lines)no new 6-digit code neededday full“HOOP is full for today”code NOT used · works tomorrow(existing sheet)Old app builds (TestFlight before this change) keep today’s behaviour and skip the pageuntil they update. The server can’t tell an old app’s carried code from one typed on the page.

The page, in each case

‹Join HOOP
HOOP is invite-only
We're opening up gradually. Enter an invite code from a friend to join.
I have a codeWaitlist
✦HOOP-WW4P-RA65✕
✓ From your invite link · Leong Sen Fong invited you
Continue
Your sign-in code is still valid, so you won't need a new one.
A · Came by a friend's link (Leong's test). The code is already in the field and the line says where it came from and who invited them. One tap on Continue.
‹Join HOOP
HOOP is invite-only
We're opening up gradually. Enter an invite code from a friend to join.
I have a codeWaitlist
✦HOOP-7KQ2-M3XD✕
✓ From your invite link
Continue
Your sign-in code is still valid, so you won't need a new one.
B · Came by an official or waiting-list link. Same, without a name: HOOP is letting them in, not a person.
‹Join HOOP
HOOP is invite-only
We're opening up gradually. Enter an invite code from a friend to join.
I have a codeWaitlist
✦HOOP-XXXX-XXXX📋 Paste
Continue
Your sign-in code is still valid, so you won't need a new one.
C · No code. Exactly as today: an empty field with Paste, or the Waitlist tab.
‹Join HOOP
HOOP is invite-only
We're opening up gradually. Enter an invite code from a friend to join.
I have a codeWaitlist
✦HOOP-WW4P-RA65✕
That code has already been used. Each code works once — ask your friend for a fresh one.
Continue
Your sign-in code is still valid, so you won't need a new one.
D · The carried code turns out to be used (after Continue). They stay on the page with the reason, and can type another code or join the waitlist. The 6-digit code stays valid.
The ✕ in the field clears a carried code. After that it behaves like C. Nothing is used until Continue is tapped, so nothing happens without the person seeing it.

What changes

SituationTodayAfter
Gate ON · new account · carried a codeCode used automatically, no pagePage A/B, prefilled → Continue
Gate ON · new account · no codePage CPage C (same)
Gate OFF · new account · carried a codeNo page, code still credits the inviterSame
Existing account (any gate state)Logs inSame: logins are never blocked, and never see this page
Day full (Daily Sign-up Limit)“HOOP is full for today”, code keptSame, shown after Continue
Apple / Google sign-inSame as emailSame as email

How it would be built (short)

  1. App: a code carried in from a link is no longer sent as “the invite”. It is sent as “a code this person may want to use”.
  2. Server: gate ON + new account → answers “ask for a code” and hands back the carried code, so the page opens prefilled. Gate OFF → uses the carried code exactly as today, so inviters keep their credit.
  3. The page only needs to fill the field and add the “From your invite link” line. Paste, the Waitlist tab, the refusal lines and the “full for today” sheet already exist.
  4. Both parts ship together: the server part goes live straight away, and the app part needs the next TestFlight build and the web version.
Until someone updates their app, an old build still carries the code the old way and skips the page. The server can't tell an old app's carried code apart from one typed on the page, so this can't be forced from the server alone without breaking those old builds.

Questions for you

  1. Gate OFF: keep it as today, with no page and the carried code quietly crediting the inviter? My suggestion: yes. With the gate off there's nothing to confirm.
  2. Existing accounts never see this page, even when carrying a code. OK?
  3. The line under the field: “From your invite link · Leong Sen Fong invited you”. Wording OK?

Say “go” (with any changes) and I'll build the server and app parts together.