You asked for a full night on what gets an app accepted, and for the changes to be applied. Here is what happened, shortest thing first.
The academy's 2026–27 prices start on 2026-09-01, and an instrument only becomes bookable once a live price exists. So today the booking screen greys out 9 of 12 instruments as “Not open yet”. That is honest, but to a reviewer it is what an unfinished app looks like — and on 1 September all nine open by themselves, with no deploy.
Waiting one day costs you nothing and deletes an argument before it starts.
Yes. One app with a parent side and a staff side is normal and Apple accepts it. There is one hard condition and failing it is an instant rejection:
So the notes are written and the accounts are ready. What I did not do is hide the staff side — a reviewer who finds it later reads that as concealment, which is far worse.
POST /api/payments/stub/confirm was reachable with no login at all. Give it a payment id and it granted the lesson. Its only guard checked for “production”, and the live API is configured as “staging”, so the guard never fired.
Fixed and deployed. It now needs a signed-in caller who owns that payment. Proved live: no token → refused, someone else's payment → refused, your own → works, so the website's booking still functions.
I signed in as the reviewer and looked. It was a QA sandbox.
⭐ The teacher demo account is Omar Fathy — the same lessons from the other side. A reviewer can sign in as the parent, then as the teacher, and watch one booking from both ends. Neither account touches a real teacher or a real family.
16 of the 17 events were test data, five of them published and two taps from the home screen: BM 4.4 rehearsal test, Dual Test Concert, Dual Test 2, Spring Concert QA, Spring Concert QA3. Past concerts held one too — dated in the future. It is a proper season now.
“Demo Teacher B” sat between Ali Hossam and George Ramzy. And the same sentence — “Legacy teachers are available to advanced students.” — printed on twenty rows in a row. Once per tier now.
It said saving a card was coming, and described a card checkout the app does not have — contradicting what we tell Apple about payments. Now: “Paid at the academy.”
Privacy policy and Delete account shared a glyph — a square with a line through it, which at that size is the universal “image failed to load”. The one document Apple checks for looked like a missing asset. Both redrawn.
Two of them sit under the Create account button, so tapping them ejected you from a half-filled form. They open inside the app now.
A setting still read “RAISED FOR STAGING TESTING — set back to 8 before real users.” It allowed 500 sign-ups per hour from one address. Back to 8.
Six images at 1320 × 2868 — exactly the size App Store Connect requires. Real screens, status bar set to 9:41, on the brand ground.
The listing text is written too — name, subtitle, keywords, description, age rating and the privacy labels. All of it is in _DOCS/APP_STORE_METADATA.md.
It opens the whole academy — 50 real teachers by name, real children's dates of birth, the financial reports. My recommendation is to give them the parent and teacher accounts only, and say plainly in the notes that an administrator tier exists and is available on request. Nothing is hidden, which is what the rule actually cares about.
The signed-out screen has the name at the top, then about a third of the screen empty, then the headline and buttons. It may be exactly the poster you intended — but it is also the shape of an image that failed to load, and it is the first thing a reviewer sees. I left it alone rather than redesign it at 1am. Thirty seconds of your eye.
eas login → eas init) — this also unblocks push notifications, which are otherwise finished_APPS/bandmakers_mobile/SESSION_STATE_2026-08-30.md, then
_DOCS/APP_STORE_SUBMISSION.md and _DOCS/APP_STORE_METADATA.md.