# 04 · Screens

Every screen the owner app needs. For each: purpose, route in the prototype, layout, content, actions, states and the API route that feeds it (base `https://goremly.com/api/v1`; client routes sit under `/clients/{clientId}`).

**Universal state rules.** These apply to every screen unless a screen says otherwise.

| State | What the owner sees |
|---|---|
| **Loading** | Skeleton shaped like the content. No spinner except inside a busy button |
| **Empty** | The empty state with that screen's copy (below) |
| **Error** | Cached content if any, then "Couldn't load …" + reason + **Try again**. Network: "No answer from Remly. Check your signal and try again." Server: "Something went wrong at our end." Rate limit: "Too many requests. Try again in a moment." |
| **Offline** | Cached content + the "You're offline" pill. Send and save buttons are disabled and say "You're offline". Nothing is queued to send later, so never promise "it will send when you're back" |
| **Feature off** | A 404 because a feature flag is off (`INBOX_ENABLED`, `VOICEMAIL_ENABLED`). Hide the surface. Never show an error for a switched-off feature |
| **Session expired** | Any 401 after a failed refresh signs out once and shows sign-in with "You were signed out. Please sign in again." |

**Navigation map:** tabs **Today · Inbox · Leads · Jobs · More**, plus the Remy orb. Pushed screens hide the tab bar.

```
Today ──► thread, lead, job, voicemail, Inbox, Jobs
Inbox ─┬─ Messages ──► thread ──► customer file, lead, job
       └─ Calls ─────► thread (voicemail) / keypad
Leads ──► lead ──► thread, customer file, book-a-job sheet
Jobs ─┬─ Calendar ──► job / ghost-slot sheet
      └─ Pipeline ──► lead / move-to sheet
More ──► Customers ──► customer file;  settings pages;  sign out
Remy orb ──► Remy sheet ──► Teach Remy, How much Remy answers, Your assistant
```

---

## 1. Sign in · `#/signin`
- **Purpose:** get a staff member into their business.
- **Layout:** calm wallpaper. A centred solid card: the Remy mark, "Sign in to Remly", fields, the primary button, links.
- **Content:**
  - Fields: **Business code** (hint "It's in your welcome message"), **Email**, **Password** (show/hide eye).
  - **Sign in** (primary, lg).
  - **Forgot password?** (plain). It opens the website reset page for that business code. With no code: "Type your business code first, then tap Forgot password."
  - Sign in with Apple / Google rows, only when `GET /auth/methods` says so. If the person belongs to several businesses (409), a business picker sheet lists them by name.
- **States:**
  - Idle; busy (spinner in the button).
  - Errors, shown verbatim: "That business code, email or password is not right." · "Too many attempts. Wait a minute and try again." · "No answer from Remly. Check your signal and try again." · "Remly is having trouble. Try again in a moment."
  - Session expired: a notice above the form.
  - Offline: the button is disabled with "You're offline".
- **API:** `POST /auth/login` (client_id, email, password, device_name, platform, app_version) → `LoginResponse`. Also `GET /auth/methods`, `POST /auth/apple`, `POST /auth/google`.

## 2. Alerts primer · `#/primer`
- **Purpose:** explain alerts before the OS asks.
- **When:** after the first sign-in, if `NATIVE_PUSH_ENABLED` is on and the OS hasn't asked yet. Not again for 3 days after "Not now".
- **Content:** the frosted bell tile, "Turn on alerts", "Get a buzz the moment a customer calls, texts or chats, so nobody waits on you." Three sample glass notifications (missed call, new lead, WhatsApp). **Turn on alerts** (primary, shows the OS prompt) and **Not now**. Swiping down counts as Not now.
- **After:** Today. If denied, the "Alerts are off" banner appears on Today and More: "You won't hear about new customers until you turn them on." with **Turn on in Settings**.
- **API:** `POST /devices` on every launch, whatever the answer.

## 3. Today · `#/today` (tab root, vivid wallpaper) · **built**
- **Purpose:** in one glance, what needs the owner now.
- **Layout, top to bottom:**
  1. Header: a glass logo tile, the business name (small), "Morning, Mike"; a trailing glass bell button that opens Alerts settings.
  2. **Headline sentence** (display 40/800): "Remy caught 3 new leads overnight." or "2 people are waiting on you." or "All caught up."
  3. Alerts-off banner (conditional).
  4. **Hero** (frosted): the new-lead count, an urgent chip, "Top: Dana Whitfield · Panel upgrade", and chips per channel. Tap opens the top lead.
  5. **Four stat tiles:** Need a reply → Inbox · Voicemails to hear → the newest unplayed voicemail · Jobs today → Jobs · Quoted, waiting → Pipeline.
  6. **Remy pencilled-in banner:** "Remy pencilled in 2 jobs. Tap a dashed slot to confirm it." → Jobs.
  7. **Up next:** the next job (time, service · customer, notes) with a **Go** button (Maps).
  8. **Waiting on you:** up to 4 unread conversation rows, plus "See all".
  9. **While you were out** (Remy digest, proposed): "Answered 4 messages, took down 3 leads, texted back 2 missed calls and booked 1 job."
  10. Optional chart card "Billed this week" (proposed; omit without data).
- **Empty:** "All quiet for now" / "Nobody is waiting on a reply and nothing is booked. New calls, texts and chats show up here as they come in."
- **API:** `GET /me`, `GET /conversations`, `GET /leads`, `GET /voicemails`, `GET /appointments?from=today&to=today`.

## 4. Inbox · Messages · `#/inbox` (tab root) · **built**
- **Purpose:** every conversation, newest first, so the owner can choose who to answer.
- **Layout:**
  - Large title "Inbox", with the subtitle "4 waiting on you" or "Nothing waiting".
  - Segmented **Messages | Calls**.
  - Glass search "Search messages".
  - Filter chips with counts (hidden at zero): All · Needs reply · Held by team · SMS · WhatsApp · Voicemail · Web chat.
  - A solid list of conversation rows (`03-components.md`).
- **Actions:** tap → thread. Long-press / "…" → Open customer file · Mark as read/unread · Mute/Unmute · Pause Remy here/Let Remy answer · Call {number}. A failed action shows "That didn't save. {why}".
- **Empty:** "No messages yet" / "When a customer texts, calls or chats, it shows up here." · filter: "Nothing in {filter}" / "Every conversation is in All." · search: "No match for “{q}”" / "Search looks at names and at the text inside messages."
- **API:**
  - `GET /conversations?channel&status&cursor&limit` → `{ conversations, next_cursor }`. Pages as you scroll.
  - `POST`/`DELETE …/{channel}/{identifier}/read`, `…/mute`, `…/unmute`, `…/pause`, `…/unpause`.
  - A 404 means the inbox is switched off: hide the tab content and show "Your inbox isn't switched on yet."

## 5. Thread · `#/thread/{grouping_key}` (pushed) · **built**
- **Purpose:** read and answer one customer on one channel. See what Remy did.
- **Layout:**
  - **Glass nav bar:** back · centre (avatar, name, subtitle = the channel or "Jess is replying"; tap opens the customer file) · trailing Call and "…" buttons.
  - Body, top to bottom: the status banner (paused / opted out) · the voicemail card (voicemail threads) · the lead card · messages with day separators · the booking card · the Remy suggestion card.
  - The composer, in one of its six states.
- **"…" sheet:** Open customer file · Pause Remy here / Let Remy answer · Mute alerts for 8 hours / Unmute · Mark as unread.
- **Message long-press:** Copy · Forward… (customer messages only). This opens the Forward sheet: the message, a phone field, "By: Text message / WhatsApp", Cancel / Send.
- **Opens at:** the newest message (a voicemail thread opens on the voicemail card).
- **States:**
  - Loading: a skeleton.
  - Empty conversation: "No messages yet. Say hello."
  - Missing: "This conversation is not here" / "It may have been merged with another, or you may no longer have access to it."
  - Errors: "Take over didn't work. {why}" · a failed send line "Not sent. Tap to send again" · "Couldn't load the photo. Tap to try again."
- **Rules:**
  - Replying yourself pauses Remy on this conversation (server takeover, 30 days). Say so in a toast.
  - Pause from the menu = 1 hour (server default 3600s).
  - Unknown message roles render as event lines.
  - Show server refusal text verbatim.
- **Sheets:**
  - **Consent:** "This customer hasn't opted in to texts." / "Did they verbally agree to receive text messages (e.g. told you "text me")?" with a checkbox "Only choose OK if they actually agreed — this is a compliance record." and OK (disabled until checked) / Not now. Offered only for reason `no_consent`, never for `opted_out`.
  - **Template picker** (WhatsApp window closed): "Send a template" / "WhatsApp only allows an approved message here. Pick one and fill in the blanks." Pick a template, fill the slots with a live preview, then Send.
  - **Continue by text** (web chat): "Continue with {name}", a phone field, "By: Text message / WhatsApp", "The whole chat moves with it, so they see what was already said.", Cancel / Continue.
- **API:**
  - `GET /conversations/{channel}/{identifier}?before&limit` → `{ meta, messages, next_before }`, plus `GET …/message-statuses` while it is open.
  - `GET /leads/{leadId}/reply-channels`, `GET /whatsapp/window-state?channel&identifier`.
  - `POST /leads/{leadId}/reply`, `POST /media`, `POST …/takeover`, `POST …/pause`, `POST …/unpause`, `POST /leads/{id}/consent`, `POST /conversations/migrate-channel`, `GET /whatsapp/templates`, `POST /whatsapp/send-template`, `POST /messages/forward`, `POST …/{channel}/{identifier}/call`.

## 6. Leads · `#/leads` (tab root) · stub
- **Purpose:** every enquiry Remy captured, by status.
- **Layout:**
  - Large title "Leads", with "{n} open · {total} on the board".
  - Glass search "Search name, number or job".
  - Status chips: **Open** (default: urgent + new + contacted + quoted) · All · one per status.
  - Grouped solid lists with sticky status headers and counts.
  - Trailing nav button "Board" → `#/jobs/pipeline`.
- **Row:** avatar, the name or "Lead #142", service_type, channel dots, stage chip, "Unconfirmed" when `is_partial`, the created time, and a chat glyph when a conversation exists. Urgent is a red flag chip on the row, never its own group.
- **Empty:** "No leads yet" / "Every enquiry the assistant captures lands here." · search: "No match for “…”" / "Search looks at names, numbers, the job and the address."
- **API:** `GET /leads` (voicemail leads are hidden by default; `include_voicemail=true` shows them).

## 7. Lead detail · `#/lead/{id}` (pushed) · stub
- **Purpose:** everything about one enquiry, and the next step.
- **Layout:**
  - Header: 58pt avatar, name, "service · #ticket", phone, stage chip, Unconfirmed chip.
  - Action tiles: **Message** (→ thread via `conversation_id`; disabled when null) · **Call** · **Directions**.
  - **Remy's summary** panel (✦), from `qualifying_data` with keys humanised. A `quick_form` lead shows "Customer's request" and hides the Q&A.
  - **Primary CTA**, by status:
    - new/urgent/contacted: **Book a job**
    - quoted: **Book a job**, plus Send quote again
    - scheduled: **View booking**
    - closed: **Create invoice**
    - collections: **Text a payment reminder** (proposed)
  - Secondary: Send quote · Create invoice.
  - **STATUS** row: tap for a menu of the statuses, with a check on the current one. Saving shows a spinner; failure shows "That change was not saved."
  - **DETAILS:** Job, Address, Email, Came in by ("The assistant", "The quick form", "A missed call", "A voicemail"), Ticket.
  - **NOTES:** the text or "Add a note".
  - **HOW IT MOVED:** "New → Quoted · Tue 13 Oct, 6:02 PM".
  - Footer "Came in Thu 22 Oct".
- **Sheets:**
  - **Book a job** (large): date picker, FREE TIMES grid, "What is the job?", Book.
    - Errors: "Nothing free that day. Pick another day." · "Couldn't load the free times. Try again." · "That job was not booked. Try again."
  - **Send quote / Create invoice:** Amount, plus "Message to the customer (optional)" or "What it's for (optional)".
    - Footers: quote "QuickBooks emails the quote if the customer has an email, and the lead moves to Quoted."; invoice "A draft invoice in QuickBooks, kept on this lead so you can see when it's paid."
    - QuickBooks refusals: not connected / reconnect on the website / already invoiced / still being created / QuickBooks unavailable.
  - **Notes:** "Only you and your team see these. The customer never does." Save. Error: "Those notes were not saved."
- **API:**
  - `GET /leads` (by id), `GET /leads/{id}/history` → `{ history: [{ old_status, new_status, at }] }`.
  - `POST /leads/{id}/status`, `/notes` (merge on `base`), `/edit`, `/quote`, `/invoice`.
  - `GET /appointments/available-slots`, `POST /appointments`.

## 8. Calls · `#/inbox/calls` (Inbox segment) · **built**
- **Purpose:** the call log: missed, answered, outgoing, voicemail.
- **Layout:**
  - Subtitle "{n} texted back for you" or "Nothing missed".
  - Sections **Today** and **Earlier**, with counts.
  - A keypad button in the nav (only when `OUTBOUND_CALLING_ENABLED`).
- **Row:**
  - Avatar with a kind glyph, the caller name or the formatted number.
  - Kind label ("Missed · texted them back" in danger) · duration (only when known).
  - The number, when a name is shown.
  - For a voicemail, the first line of the transcript.
  - Time, and a small round **Call** button.
- **Tap:** opens the conversation (`conversation_id`), or the customer file, or (with neither) offers to call.
- **Call placement:**
  - Remly rings the owner's phone first, then connects. Banner: "Your phone is about to ring. Answer it and we'll connect {name}."
  - Failure: "The call could not be placed", with **Dial from this phone** / **Not now**, and a warning that the customer will see the owner's own number.
- **Keypad sheet:**
  - A large number display and 12 keys (hold 0 for +).
  - A green call button, disabled under 10 digits ("Type at least ten digits first").
  - "We ring you first, then connect the customer. They see your business number."
- **Empty:** "No calls yet" / "Calls to your Remly number show up here." **Error:** "Couldn't load your calls" + Try again.
- **Note:** the history starts on the day the server began recording. Don't imply older calls are missing. `duration_seconds` is often null; show nothing then.
- **API:** `GET /calls?from&to&limit` → `{ calls: [Call] }`, `POST /calls`.

## 9. Voicemail · `#/voicemail/{grouping_key}` (= thread) · **built**
The thread screen for `channel: voicemail`. It opens on the **voicemail card** (player, transcript, Call back), then the lead card, then the messages (missed-call card, "Voicemail · 0:38" event line, Remy's text-back), then the booking card and the Remy suggestion card ("Hi Greg… I can come tomorrow 8–10 AM. Okay?").
- **States:** no audio (no play button) · transcript pending ("No transcript. Press play to listen.") · playing.
- **API:** `ConversationMeta.voicemail` in the thread response. `GET /voicemails` feeds the Today count (`played: false`).

## 10. Jobs · Calendar · `#/jobs` (tab root, default view) · stub
- **Purpose:** the day as a timeline, with Remy's suggested slots.
- **Layout:**
  - Large title "Jobs", with the date as subtitle.
  - Segmented **Calendar | Pipeline**.
  - A glass **Day | Week** switch in the nav.
  - A 7-day strip (weekday, date, an accent dot on days with a Remy suggestion).
  - A **Remy lead bar** ("Remy pencilled in 2 new leads. Tap a dashed slot.").
  - The **day timeline**: 7 AM–7 PM at 74pt per hour, an orange NOW line, and solid event chips. Pending appointments are dashed ghost slots with Accept.
- **Week:** a 7-column grid with compact chips; tap a day header to open that day.
- **Ghost slot sheet:**
  - "✦ Panel quote visit?", the source ("📞 Phone lead · Thu 12:30–1:30 PM").
  - Why Remy chose it.
  - Worth / Drive / Customer tiles (only when known).
  - **Other time** / **Accept & text Dana**, and "Not this one".
- **Event sheet:** title, date and time, Customer / Worth / Drive tiles, "Booked by Remy" note, **Running late** / **Directions**.
- **Nav "+"** → Book a job sheet.
- **Empty day:** "Nothing that day" / "Remy fills free time as leads come in." **Empty book:** "Nothing booked".
- **API:** `GET /appointments?from&to`, `POST /appointments/{id}/status` (confirmed / completed / cancelled), `GET /appointments/available-slots`, `POST /appointments`.

## 11. Jobs · Pipeline · `#/jobs/pipeline` · stub
- **Purpose:** see where every piece of work is, and what's stuck.
- **Layout:**
  - Glass columns in this order: New (with urgent flagged) · Contacted · Quoted · Booked · Done · To collect. A "Show lost" toggle adds Lost. Junk is never shown.
  - Each column has a header (count, and a sum only with estimates) and solid job cards.
  - Stage shortcut chips above the board.
  - A Remy nudge bar ("Nina's quote has waited 9 days. Remy can follow up.").
- **Actions:**
  - Tap a card → lead.
  - Hold and drag between columns → `POST /leads/{id}/status`, with a toast "Moved to Quoted".
  - **Move to…** sheet: every status as a button; the current one disabled.
  - Moving to Done can show a short celebration (confetti from c8; off under Reduce Motion).
- **Empty column:** "Drop a card here". **Empty board:** "No work on the board yet."
- **API:** `GET /leads`, `POST /leads/{id}/status`, `GET /leads/{id}/history` (days in stage).

## 12. Job detail · `#/job/{id}` (pushed) · stub
- **Purpose:** what you need on the way to, and at, the job.
- **Layout:**
  - Eyebrow "9:00 AM · in 40 min", large title = service_type.
  - A map card (styled placeholder) with "Elena Park · 12 Elm St" and **Go**.
  - A status chip, then a Notes panel (gate code, pets).
  - Action tiles Message / Call / Directions.
  - Bottom buttons: **Running late** (secondary) and **On my way** (primary). Both text the customer.
  - A "…" menu: Confirm (pending only) · Mark done · **Call off** (confirm: "Call this job off?" / "{name} · {slot}. The time becomes free to book again." · "Call it off" / "Keep it").
  - A link to the conversation when `lead_id` is set.
- **States:** missing → "This job is not here". Status change error: "Not changed".
- **API:** `GET /appointments`, `POST /appointments/{id}/status`.

## 13. Customers · `#/customers` (from More) · stub
- **Purpose:** the phonebook.
- **Layout:**
  - Large title "Customers", "{n} on the books", with a "+" in the nav.
  - Search "Search name or number".
  - A–Z sections, and an alphabet rail at the right edge (drag to scrub, selection haptic, empty letters dimmed).
- **Row:** avatar, name, phone, channel dots, stage chip, last contact time.
- **Add contact sheet:**
  - Fields: Name · Telephone ("The number the customer messages from") · Email (optional) · What they need (optional) · Reach them on SMS / WhatsApp.
  - A **required** checkbox: "This customer agreed to receive messages (e.g. they asked you to reach out). Required before you can message them."
  - **Add contact.** Errors: "Your session has ended. Sign in again." / "Couldn't add the contact right now. Try again later."
- **Empty:** "No customers yet" / "People Remy takes down, and contacts you add, show up here."
- **API:** derived from `GET /leads` (there is no customers list route). `POST /leads` adds a contact.

## 14. Customer file · `#/customer/{id}` (pushed) · stub
- **Purpose:** one person's whole history and what they owe.
- **Layout:**
  - Header: avatar, name, phone, channel dots, stage chip. Capsule buttons Message · Call · Directions · **Book a job**.
  - **THE JOB:** what, service, when, how long, where.
  - **ACCOUNT** (frosted tiles): "$3,200 outstanding" or "Nothing owed" · "$X lifetime paid" · "N jobs done". Cents → whole dollars.
  - **NOTES:** "Add a note" sheet ("What should you remember about them?"), plus a list.
  - **EVERYTHING, IN ORDER:** a timeline of messages, calls, voicemails, jobs, notes and invoices.
  - **HOW IT MOVED.**
  - Footer "On the books since 1 Oct".
- **States:** missing → "This customer isn't in your phonebook". Note save error: "That note was not saved. Try again."
- **API:** `GET /customers/{customerId}/account` → `Account`, `GET /customer-history?phone|email` → `{ leads (with transcript), notes }`, `POST /customer-notes`.

## 15. Remy sheet · the orb · stub
- **Purpose:** what the assistant is doing, and how to steer it. **Not a chat**: there is no API for asking Remy questions.
- **Content:**
  - Header: the Remy mark, "Remy", and the mode ("Suggests replies, you send").
  - **Today so far** panel (proposed digest).
  - Rows: "{n} questions Remy couldn't answer" → Teach Remy · How much Remy answers · Your assistant.
  - When Remy is switched off for the business (`ai_enabled` false): "Remy is off. Customers get your missed-call text only." plus a link to the website.
- **API:** `GET /unanswered` (count), `GET /settings` (`ai_enabled`), proposed mode.

## 16. More · `#/more` (tab root) · stub
- **Layout:** large title "More", with the business name.
  - **YOUR WORK:** Customers · Jobs.
  - **YOUR ASSISTANT:** Your assistant · Teach Remy · How much Remy answers.
  - **YOUR BUSINESS:** Business details · Opening hours · Your number (`client.phone`, tap to copy; **hidden when null**, never a fake number) · Your team (on the website ↗) · Billing (on the website ↗).
  - **THIS PHONE:** Alerts (summary: "Off in iPhone Settings" / "Muted" / "7:00 AM – 9:00 PM" / "Any time") · Your calls ring ("Your own phone" / "The business phone").
  - **ABOUT:** About Remly.
  - A signed-in card: avatar, name, "Signed in · Bright Spark Electric", **Sign out**.
- The alerts-off banner sits at the top when relevant.

## 17. Settings pages · `#/more/{page}` · stubs
| Page | Content | API |
|---|---|---|
| **Business details** (`business`) | Hours (one line), Service area, Payment methods, Warranty, Licensing, Anything else. Note: "Remy answers ‘when are you open?’ and ‘do you come to me?’ from these." Save / Saving… / Saved | `GET`/`POST /business-details` |
| **Opening hours** (`hours`) | 7 rows: day, "Today" tag, "7:00 AM – 6:00 PM" or "Closed". "Outside these hours: Remy still answers. It says you are closed, takes their details, and tells them you will call first thing." **The contract stores hours as one free-text line; the 7-row editor is a proposal** | `business-details.hours` |
| **Alerts** (`alerts`) | Toggle "Mute all alerts". WHEN (hidden while muted): toggle "Only alert me between set hours", From / Until (default 08:00–20:00), "Times are New York time". Saves itself; failure reverts with "That wasn't saved. Try again." Validation: "Use a time like 08:00." / "The start and end can't be the same time." | `GET`/`POST /me/notifications` → `NotificationPrefs` |
| **Your assistant** (`assistant`) | YOUR BUSINESS (hours, where you work) · HOW REMY SAYS HELLO (greeting) · EMERGENCIES (toggle + urgent words, e.g. "sparks, burning smell, no power") · WHEN YOU MISS A CALL (toggle "Text the caller back" + text). Staff see "Only the owner can change this." 404 → "These settings aren't ready on Remly yet. Use the website for now." | `GET`/`POST /bot-config`, `/settings`, `/business-details` |
| **Teach Remy** (`teach`) | "Questions Remy couldn't answer" cards: question, "Asked by text message / WhatsApp / website chat", **Answer** / **Dismiss**, "Clear all" (confirm). Answer sheet: question, "Your answer", the blanks warning "Fill in the parts in [square brackets] first. Remy never guesses prices or yes/no answers.", REMY WILL SAY preview, Preview → Teach Remy. "What Remy has learned": Q + A, Edit, Remove (confirm "Stop using this answer?"). Empty: "Nothing waiting. When a customer asks something Remy can't answer, it shows up here." | `GET`/`DELETE /unanswered[/{id}]`, `GET`/`POST /faqs`, `PATCH`/`DELETE /faqs/{index}` |
| **How much Remy answers** (`remy-mode`) | Radio rows: Off · **Suggest a reply** (default) · Answer the first few ("Remy stops after 4 replies and hands it to you.") · Send automatically ("You get five seconds and a Stop button on every one."). "Whatever you choose: Remy never answers a conversation you or your team has picked up. Replying to someone yourself holds Remy off that conversation for thirty days." **Proposed: no server route** | none yet |
| **Your calls ring** (`forwarding`) | Card "Your own phone" / "The business phone" saying what rings when you press Call. Field THE PHONE TO RING, Save / Clear. Explainer "Why we ring you first" | `POST /me/forwarding`, `GET /me` |
| **Your team** (`team`) | Web-only: a one-line explainer + **Open on the website** | — |
| **Billing** (`billing`) | Web-only: a one-line explainer + **Open on the website**. No prices in the app | — |
| **About** (`about`) | Version "1.0 (42)", **Privacy policy**, **Terms of service** (website links) | — |
| **Sign out** | Confirm: "Sign out of Remly?" / "The messages saved on this phone are removed. Nothing on the server changes." · **Sign out** (destructive) / **Stay signed in** | `POST /auth/logout`, `DELETE /devices` |

## 18. New business setup · `#/setup/{step}` · stub (proposed)
There are no API routes for this yet. Today the Remly team sets businesses up. Design it so the flow is ready, and label it as proposed. Steps, with a progress chip "Step 2 of 6":
1. **Your business:** name, trade, service area, opening hours.
2. **Your number:** pick a local Remly number, or keep yours and forward missed calls to it (with instructions per carrier).
3. **Texting approval (waiting state):** "Texting is being approved. Phone carriers check every business before it can text customers. This usually takes 3–7 days. Calls, voicemail and web chat work now." A status timeline: Submitted → In review → Approved, or Needs changes (with what to fix). "We'll send you an alert when it's done."
4. **Your assistant:** greeting, urgent words, missed-call text (prefilled for the trade).
5. **Alerts:** the primer.
6. **Done:** "Remy is answering." Buttons **Make a test call** and **Go to Today**.

## 19. Global overlays
- **Push banner (in-app):** a glass notification sliding from the top with the alert text. Tap opens the deep link (`05-flows.md` §7).
- **Call banner:** after **Call**, "Your phone is about to ring. Answer it and we'll connect Dana." It closes after 5s or on a tap.
- **Offline pill**, **toast**: `03-components.md`.
