Documentation
IntroductionArchitectureMonorepo & ToolingRunning Locally
Screen Flow MapUser JourneysPersonas & RolesWeb ScreensClient Portal
Convex OverviewData ModelFunctions ReferenceAuth & SessionsRoles & PermissionsJobs & Providers
Web Design SystemAdmin Console DesignPatterns & Conventions
Web AppiOS AppMarketing Website
Testing & HarnessCI Pipeline

Web Screens

Web Screens Reference

Every route in apps/web, what it shows, and who can reach it. For how they connect, use the interactive Screen Flow Map.

Roles: owner > manager > supervisor > employee > volunteer > customer. "Min role" is the nav/UX gate; the backend re-enforces every action independently.

Public & auth

RoutePurposeAccess
/Redirector — /accounts if a session token exists, else /loginpublic
/loginEmail/password sign-in; the shared door for staff and pet parentspublic
/accountsAccount picker — the user's orgs with role badges; choosing one enters the staff appauthed
/applyPublic 3-step tenant application wizard (business → contact & scale → review)public
/our-customersPublic directory of active orgs (name, logo, accent color) linking to each portalpublic
/platformLandlord surface: review/approve/reject tenant applications; approval provisions an orgplatform owners

There is no marketing homepage in the product app — that's apps/website. Error handling is uniform: error boundaries map typed ConvexError codes to screens (UNAUTHENTICATED → login redirect, FORBIDDEN → 403 screen, ORG_NOT_FOUND/null results → 404 screen).

Sign in — the shared door for staff and pet parents
Sign in — the shared door for staff and pet parents
The public directory at /our-customers — each card links to that org's portal
The public directory at /our-customers — each card links to that org's portal
The tenant application wizard at /apply feeds the platform-admin review queue
The tenant application wizard at /apply feeds the platform-admin review queue
Platform admin — review, approve, or reject applications; approval provisions an org
Platform admin — review, approve, or reject applications; approval provisions an org

Org staff app — /o/[slug]/*

All wrapped by OrgLayout: fixed sidebar (role-filtered nav with live badge counts), charcoal header with global search (⌘K), location switcher (hidden with <2 locations), clock-in widget, and user menu. The portal route bypasses this shell entirely.

Operations

RoutePurpose
/dashboardToday at a glance (live): in-facility / checked-in / checked-out / issue KPIs, arrivals & departures, recent notes & messages, clocked-in staff, today's shifts, HR row (approvals, missed punches, OT watch), upcoming birthdays
/boardLive facility board / kiosk: rooms, in-house pets with care chips (issues, meds, feeding, allergies), arrivals with agreement + deposit prompts, recent checkouts, one-tap care logging, check-in/out
/visitsVisit list with status tabs via ?status= (All, In house, Planned, Due in, Checked-in/out today, Completed, Cancelled); bulk cancel
/visits/newBook a visit; accepts ?client= / ?pet= prefill; service selection applies default room + schedule style
/visits/[id]Visit detail: check-in (agreement gate + manager override), check-out, cancel, no-show, care log, linked order & deposit state
/calendarMonth / Week / Day (hour grid) / Rooms (14-day occupancy) views of visits
/scheduleWeekly staff shift grid; managers upsert/remove shifts; overnight shifts roll over
Dashboard — live KPIs, arrivals & departures, HR row, and shortcuts, all one reactive query
Dashboard — live KPIs, arrivals & departures, HR row, and shortcuts, all one reactive query
The facility board in kiosk-ready form: in-house pets with care chips, arrivals with agreement and deposit prompts
The facility board in kiosk-ready form: in-house pets with care chips, arrivals with agreement and deposit prompts
Visits — status tabs driven by the ?status= query param, bulk cancel via row selection
Visits — status tabs driven by the ?status= query param, bulk cancel via row selection
Calendar — month, week, day, and rooms-occupancy views of the same visit data
Calendar — month, week, day, and rooms-occupancy views of the same visit data
Visit detail — check-in with the agreement gate, care log, and the linked order's deposit state
Visit detail — check-in with the agreement gate, care log, and the linked order's deposit state

CRM

RoutePurpose
/clientsPaginated, searchable client list (cursor pagination, 50/page)
/clients/newCreate client → redirects to detail
/clients/[id]Client profile: contact, VIP badge (policy-masked), pets, visits, orders, signed agreements, payment methods, edit dialog, view-portal-as-client impersonation
/petsPaginated pet list with status filter (active / inactive / passed away / all)
/pets/newCreate pet (accepts ?client=) → redirects to detail
/pets/[id]Pet profile: vaccines with expiry status, structured feeding spec, medication needs with last-dose, issues, documents, visit history, care timeline, photo gallery
/messagesThread inbox with unread counts; start new thread
/messages/[id]Conversation: send by email/SMS/in-app channel, attachments via storage upload, Enter-to-send, mark read
/notesInternal team board: pinned notes, requires-acknowledgment receipts (x/y ack counter)
Clients — cursor-paginated and searchable; rows drill into the profile
Clients — cursor-paginated and searchable; rows drill into the profile
Client detail — pets, visits, orders, agreements, wallet, and the view-portal-as-client impersonation
Client detail — pets, visits, orders, agreements, wallet, and the view-portal-as-client impersonation
Pet detail — vaccines with expiry status, structured feeding spec, medications, issues, and the care timeline
Pet detail — vaccines with expiry status, structured feeding spec, medications, issues, and the care timeline
A message thread — email/SMS/in-app channel select, attachments, Enter to send
A message thread — email/SMS/in-app channel select, attachments, Enter to send
Notes — the internal team board with pinning and acknowledgment receipts
Notes — the internal team board with pinning and acknowledgment receipts

Commerce

RoutePurpose
/ordersOrder list with fulfillment tabs (?status=); bulk archive
/orders/newPOS builder: line items (product optgroups by type, pet, qty), live subtotal, per-location tax, total
/orders/[id]Order detail: fulfillment status, record payment (cash/card/bank/wallet), charge saved card, collect deposit, refund, pickup complete, per-item notes, payment + event history
/orders/[id]/receiptPrintable receipt (print-to-PDF)
/catalogServices / products / boarding catalog with pricing, deposits, retail inventory counts, colors, variants
The POS order builder — line items by product and pet, live subtotal and per-location tax
The POS order builder — line items by product and pet, live subtotal and per-location tax
Order detail — payments, refunds, fulfillment status, per-item notes, and the event history
Order detail — payments, refunds, fulfillment status, per-item notes, and the event history
Catalog — services, products, and boarding with pricing, deposits, and retail inventory
Catalog — services, products, and boarding with pricing, deposits, and retail inventory

Staff & reports

RoutePurposeMin role
/staffRoster with pay data and on-the-clock indicators; invite staffowner
/staff/[id]Membership editor: role, title, pay type/rate, 4-digit PIN, active; approve time. Accepts literal id meowner (self via me)
/staff/[id]/hoursTimecard: date range, total/pending/open tiles, approve, edit entriesself, or staff.manage
/reportsIndex of the seven reportsemployee
/reports/salesSales by day / type / top products, CSV exportemployee
/reports/transactionsPayment ledger: charged / refunded / net, by methodemployee
/reports/pets-clientsCRM health: top spenders, species mix, vaccines expiring in 60 daysemployee
/reports/time-clockPer-staff worked/approved minutesemployee
/reports/overtimeWeekly OT watch (>40h and approaching)employee
/reports/missed-punchesOpen time entries older than 16 hoursemployee
/reports/readinessPre-arrival flags: balance due, no items, unsigned agreementsemployee

All range-based reports share RangePresets (7d/14d/31d/MTD/3mo/6mo/YTD/1yr) and client-side CSV export.

Staff roster — pay data, on-the-clock indicators, owner-only invites
Staff roster — pay data, on-the-clock indicators, owner-only invites
The schedule grid — weekly shifts per staff member, manager-editable
The schedule grid — weekly shifts per staff member, manager-editable
Sales report — by day, by type, top products, with range presets and CSV export
Sales report — by day, by type, top products, with range presets and CSV export

Settings — /settings (manager+)

Six tabs, each backed by settings.manage-gated functions:

  1. General — org name, timezone, accent color, check-in/out windows, brand logo upload, ICS/JSON calendar feed links (per-user feed tokens).
  2. Locations — locations with hours and per-location tax rate (basis points); rooms (run / suite / room / grooming station) with capacity.
  3. Roles — the policy board: per-action minimum role with reset-to-default.
  4. Agreements — versioned by seriesKey, append-only publishing, require-for-booking flag.
  5. Food brands — curated dry/wet lists by species with priority ordering.
  6. Reminders — upcoming-visit / vaccine-expiry / agreement-missing rules: offset hours, channel, template.
Settings — six tabs; every tab's mutations are independently gated by settings.manage on the backend
Settings — six tabs; every tab's mutations are independently gated by settings.manage on the backend

Customer portal — /portal

Renders without the staff shell. Pet parent overview: pets, upcoming stays, orders and balances, wallet, book & pay self-serve, sign agreements, upload vet records, message the desk. Staff open it in impersonation mode via ?as={clientId} (audit-logged, exit banner). Full detail: Client Portal.

The customer portal — the same org, seen as the pet parent
The customer portal — the same org, seen as the pet parent