A guided click-path through every admin and owner surface in v9. Login creds and what to look at are inline. Walk it on your own pace; nothing here writes anything you can't undo by re-seeding.
Live site: https://service-hours-tracker.pages.dev
| Role | Password | What it sees | |
|---|---|---|---|
| Teacher-Admin (Demo School) | admin@demo.school |
AdminDemo!2026 |
Demo School data only |
| Teacher-Admin (Riverside) | admin@riverside.school |
AdminDemo!2026 |
Riverside data only |
| Teacher-Admin (Hillcrest) | admin@hillcrest.school |
AdminDemo!2026 |
Hillcrest data only |
| Owner (gives you SUPERADMIN button) | n/a — passcode at /owner/login |
OwnerOnly2026Demo |
Cross-tenant; can switch between any school |
Owner cookie + admin login cookie can co-exist. With both, the SUPERADMIN button appears top-right; click → school picker → switch.
OwnerOnly2026Demo/owner — the owner dashboard.What to look at: the dashboard summary (across all tenants). This is your view of the entire ServePanda customer base — once we have real customers, this is where you'll see who's who.
From /owner, click around to:
/owner/access-requests — public signup-interest queue from /request-access. Currently empty (no traffic yet)./owner/usage — per-tenant counts: students, log entries, etc.What to look at: Riverside / Hillcrest / Demo all show up with their respective counts. This is the data partition working.
Owner cookie alone doesn't show you the SUPERADMIN button — you need an admin session too. Go to /login and log in as admin@demo.school with AdminDemo!2026.
You're now on /dashboard (Demo School's admin view).
Look at the top-right of the page. You should see a 🔧 SUPERADMIN button (this only renders when the owner cookie is valid).
admin@demo.school — but the data you see is now Riverside's.What to look at: the school name in the header switches. The roster table changes (different students). The "override-verify queue" (if any) changes. This is tenant impersonation working — useful for support, demos, and seeing what each tenant's view looks like without needing their password.
This is the answer to Luke's "show me 3 demo tenants and the picker."
These are the surfaces a real teacher-admin (the school's day-to-day user) interacts with. Best to walk these as admin@demo.school (most populated dataset).
URL: /dashboard
What to look at:
+ Add student and + Log entry buttons at the top — both trigger modals; both work.verified-by-staff when no site host exists./config)URL: /config
What to look at:
The slider UI is iter-10 work; iter-9 ships the table.
/import)URL: /import
What to look at: Two upload boxes — students roster and log entries. Both validate row-by-row and report back errors. Useful for the typical school onboarding flow.
/admin/sites)URL: /admin/sites
What to look at:
/admin/bumps)URL: /admin/bumps
What to look at:
bumps.sent_at (actual email send is iter-10 deferred — currently records the intent only)./settings/notifications)URL: /settings/notifications
What to look at:
URL: /pricing (works without login)
What to look at:
This will only work end-to-end once STRIPE_WEBHOOK_SECRET is set as a Pages secret (see the handoff path in #bergs-borty). Until then:
4242 4242 4242 4242 will succeed at Stripe's side/billing/success will worknull / "demo mode"active and the demo-mode banner clearsURL: /dashboard (as admin)
What to look at:
| Feature | Status |
|---|---|
| Multi-tenant data partition + SUPERADMIN switcher | ✅ Live |
| 3 populated demo tenants | ✅ Live |
| Tiered pricing on /pricing (4 tiers, monthly/annual toggle) | ✅ Live |
| Stripe Checkout session creation | ✅ Code live; activates with STRIPE_SECRET_KEY (set) |
| Stripe webhook signature verification | ⏳ Awaiting STRIPE_WEBHOOK_SECRET |
| Subscription DB state + banner | ✅ Live (banner shows demo mode without subscription) |
| Email send (notifications, bumps, site-host invites) | ⏳ iter-10 |
| Native phone app | ⏳ iter-10+ |
| Drag-handle slider for checkpoint editor | ⏳ iter-10 |
| Real Google OAuth for staff signup | ⏳ iter-10 |
If you find anything sticky in the walk-through, that's the iter-10 priority. Likely candidates already on radar: - Wire actual email sends for notifications + bumps + site-host invites (Resend or Postmark; ~3-4 hr) - Drag-handle slider checkpoint editor (~4-6 hr; UX polish vs the iter-9 table form) - Real Google OAuth flow for staff (~2-3 hr; client provisioning + redirect handler) - Stripe price-tier auto-detection by school size (~2 hr; soft-enforces tier pricing rather than relying on customer self-selection)
Ping me with whatever you find.