On this page

Logging In

Go to the dashboard URL — it opens straight to the login screen. Enter the shared dashboard password and tap Unlock Dashboard.

Your login stays active for the browser tab's session. If you're bounced back to the login screen unexpectedly, just log in again — nothing is lost, all data lives on the server, not in the browser.

Staff without the password can still use the Staff Intake Form to log a callback or a new inquiry — it doesn't require logging in.

Pipeline

The Pipeline tab is the home screen — every active event across every client, as a card you can scan at a glance.

Reading a card

Stage strip

The row of tiles above the cards (Inquiry → Menu → Quote → Deposit → Contract → Confirmed → Complete) shows a live count per stage. Tap a tile to filter the board down to just that stage; tap it again to clear the filter.

Search & filters

The search box matches client name or event name/occasion. The two dropdowns filter by concept (Magnolia Room / Catering / Cotillion Cafe / Sweetery) and by stage.

Quick actions on a card

Without opening the full event, you can ✉ Email (opens a template ready to send to Gmail Drafts), 📅 Calendar (creates a Google Calendar event), or 📋 Copy Note (copies a formatted summary block — handy for pasting into Apple Notes or a text).

Clients & Events

A client is just contact info — name, phone, email, referral source, general notes. Every booking they make is a separate event nested under that client, each with its own occasion, dining style, date, worksheet fields, stage, and activity log. This keeps repeat customers from blurring together: someone who books three parties a year shows up as one client card with three event cards underneath, not three unrelated entries.

This is the same client database the Reservations tab uses — a client doesn't need any events to exist, and a client with reservations but no catering event yet still shows up here with an empty event list. There's one contact database for the whole business, not a separate one per tab.

Adding a brand-new client

  1. Pipeline tab → + New Client.
  2. Fill in the contact fields and the first event's details.
  3. Save — the client and their first event both appear immediately on the pipeline.

Adding another event for an existing client

  1. Tap any of that client's event cards, then ← [Client Name] at the bottom to open their contact profile (or tap the client name directly if you're already viewing their profile).
  2. + Add Event — this is the fuller form, with add-on bars, dietary needs, staffing/equipment notes, and the free-text notes field the AI drafting tool reads.

Event detail screen

Opening any card shows the full picture: the ball-in-court banner (tap Flip to Client / Flip to Me any time the plan changes), the info grid, notes, AI triage summary (if the event came in through the intake form or inbox scan), the stage picker, the activity log, email templates, calendar shortcuts, and deposit toggle.

Activity log is the running history for that event — type a note and hit Enter or tap + Log. Every email, calendar event, and AI approval also drops its own automatic log line, so the log ends up being a fairly complete record of everything that happened on that booking.

📋 Apple Notes copies a clean, formatted text block of the whole event to your clipboard — paste it straight into a new Apple Note if you want an offline copy.

🧾 Billing — Create Square Invoice New

On the event detail screen, Create Square Invoice opens a box where you type or paste the items to bill for, one per line, ending in a dollar amount — e.g. Plated dinner x40 — $3200. Dashes, colons, or just a trailing $amount all work as the separator. Tap Preview Line Items to see exactly what will be itemized before anything is created.

Any line that doesn't end in a recognizable amount is left alone rather than guessed at — it shows up as a warning in the preview instead of silently vanishing. The Custom / Catch-all Amount field is where that gets resolved: fill it in and any lines that didn't parse get folded into one extra line item using that amount, so nothing typed is ever lost. If nothing on the page parses as an item at all, that field becomes the entire invoice — a single line for the full amount, described by whatever you typed.

Pick which Square location the invoice bills from, an optional due date (defaults to 14 days out if left blank), then Create Invoice (Draft). It requires a client email on file — Square needs one to know who the invoice belongs to. The invoice is created in Square as a draft — nothing is emailed to the client automatically; open it in Square yourself when you're ready to review and send.

📎 Files New

Every event has its own Files section on the event detail screen — attach a menu, quote, contract, or anything else specific to that booking and it lives right there alongside the rest of the event, not buried in email or a shared drive. Choose a file, pick a category (Menu, Quote, Contract, Invoice, Photo, Other), and tap Upload. Each file shows its category, size, and upload date; tap ⬇ to download or ✕ to remove it. Files are capped at 6MB each — plenty for PDFs and photos, but scanned images or long contracts sometimes need compressing first.

Tasks

A general to-do list, independent of any specific client — grouped by priority. + Add Task lets you optionally link a task to a client name (free text, not a hard link) and tag it with a category (Menu, Finance, Operations, POS, HR, Follow-Up, Other). Check the box to mark done; the ✕ removes it entirely.

Callbacks

A queue of people to call back — separate from the pipeline because not every callback turns into a booking. + Log Callback captures name, phone, reason, a scheduled time (free text, e.g. "June 5, 2pm"), and priority. If it came in through the intake form's AI triage, you'll see a short 🤖 summary line on the card too. ✓ Done marks it handled (and can be reopened); Remove deletes it.

Deadlines

A read-only, auto-generated view — every quote deadline, menu deadline, and event date across all events, plus any task with a due date, sorted soonest-first and bucketed into Overdue / Next 3 Days / This Week / Next 2 Weeks / Upcoming. Nothing is entered here directly; it's assembled from what's already on the events and tasks. Use the 📅 and ✉ shortcuts on each row to jump straight to a calendar entry or follow-up email.

Reservations New

A day-of-service table reservation system — separate from the catering/event pipeline above. Built directly against Square's Orders API rather than Square's own native reservations feature, which turned out to require a paid Square for Restaurants Plus plan connected to a third-party partner (OpenTable or ResDiaryLite) with no public API of its own to build against.

Set up your tables (one-time)

  1. Reservations tab → 🍽 Manage Tables.
  2. For each table: name/number, minimum and maximum guests (min is a soft guideline used for sorting and warnings, not a hard block), a priority number (lower = offered first when auto-assigning — put your best/most-used tables at priority 1), an optional section (e.g. "Patio"), whether it's bookable online (the only tables ever offered to guests through the public booking page when Auto-Confirm mode is on), and — importantly — its Square location, required before that table can be checked in.

Table combinations New

For parties too big for any one table, create a named combo from Manage Tables (e.g. "Table 3+4"): pick two or more existing tables, and it shows up as its own bookable option with the member tables' capacities summed. Booking a combo blocks every table it's made of for that time window, and booking any one of those tables individually blocks the combo right back — there's no way to accidentally double-book the same physical table through two different bookable "tables." Removing a table that's part of a combo warns you first; if it would drop the combo below two tables, the combo itself is removed too (any reservations still pointing at it are flagged in the warning).

Locking table edits

Delete buttons for tables and combos are hidden by default — tap 🔓 Enable Table Editing at the top of Manage Tables to reveal them, then 🔒 Lock Editing when you're done. This is a same-password speed bump against one-tap accidents, not a separate login; a real per-staff admin/manager/staff permission system is planned as a later step once the dashboard supports individual staff logins.

Booking a reservation

  1. + New Reservation → every field is labeled: guest name, phone/email, party size, date, time, duration (defaults to 90 minutes, adjustable per booking), and a table (or a combo).
  2. Link to Existing Client is a type-to-search box, not a long dropdown — start typing a name, phone, or email and matching client profiles appear below to pick from.
  3. You don't have to search first: typing a phone number or email that already belongs to a client auto-fills the rest of their info and links the reservation to them, with a toast confirming the match. Type a brand-new phone/email instead and a client profile is created for them automatically behind the scenes — there's no such thing as a reservation contact that only lives on that one booking.
  4. Time is a dropdown of fixed slots rather than free-typed — set the slot interval and each day's hours from Settings → Public Booking Page → Reservation Hours & Time Slots; both the dashboard and the public booking page use the same slots, and the dropdown regenerates when you change the reservation's date since hours can differ day to day.
  5. Not sure which table to use? Fill in party size, date, and time, then tap 🎯 Auto-Assign — it picks the best available table: right-sized for the party first, then by priority, then the smallest table that still fits, skipping anything already booked (or whose combo/member tables are booked) at an overlapping time.
  6. If the table's already booked for an overlapping window that day, you'll get a clear conflict message naming the other reservation instead of double-booking it.
  7. If the party size is outside the selected table's min/max range, a warning appears (non-blocking — you can still save).

Floor Plan New

Toggle 🗺 Floor Plan (top of the Reservations tab) for a visual, always-live-for-today view instead of the day list. Each table is a tile colored by its current real-time status — open, reserved later today, or occupied (someone checked in and seated). Tap a tile to see that table's reservations for today with a quick Check-In action, or jump straight to a new reservation pre-set to that table. To actually reposition tables into your real floor layout, tap 🔓 Edit Layout (the same lock as table deletion) and drag tiles where you want them — position saves automatically when you let go.

Day view & search

The date field at the top of the tab filters the list to one day at a time, sorted by time. Each row shows the guest, party size, assigned table, and status. Typing in the search box next to it looks up a guest by name or phone across every date — handy for "do you have my reservation?" calls when you don't know which day it was made for; it disables the date filter while a search is active.

Check-in

Checking a reservation in is deliberately a separate step from booking it — Check In only appears once a reservation is Confirmed, and tapping it opens a real, empty ticket in Square at that table's location (tagged with the reservation so it's traceable back from Square's own dashboard). Staff then ring up the order at the POS as normal. This means a no-show never leaves a stray open ticket sitting in Square — nothing is created in Square until the guest is actually seated.

No-show, Edit, Cancel

No-show sits next to Check In on a Confirmed reservation — use it when the guest never arrives, rather than Cancel, so the two stay distinguishable in the record. Edit is available on any Confirmed or Seated reservation to fix a detail (phone number, party size, table, time) without deleting and recreating it — changing the table or time re-runs the same conflict check as a new booking. Cancel is available any time before check-in and immediately frees that table/time slot for a new booking.

Removing a table

If a table still has upcoming reservations attached to it, removing it from Manage Tables now warns you first (naming one of the affected reservations) rather than silently leaving those bookings pointing at a table that no longer exists.

Clients

Reservations and the catering Pipeline share one client database — there's no separate "guest" record anymore. Someone can have five dinner reservations over the years all tied to one client profile, and that same profile is what shows up if you ever start a catering event for them. Reservations tab → 👤 Manage Clients to search, add, or remove profiles, and to see how many reservations and Pipeline events are linked to each one; a View Profile button on any client opens their full Pipeline contact profile.

Nothing about a reservation contact ever lives only on that one booking. When booking or editing a reservation, the optional Link to Existing Client search box at the top of the form fills in name/phone/email from that profile and ties the reservation to it. Leave it unlinked and type a phone or email instead, and a client profile is matched or created for you automatically the moment the reservation saves — matching is by email first, then phone.

Importing from another system (one-time)

Two separate CSV imports, both under 👤 Manage Clients and the Reservations tab respectively — bring in the customers file first if you want bookings linked to a profile on import:

Both are one-time only — there's no ongoing sync with the other system afterward.

Merging duplicate clients

🔀 Find & Merge Duplicates (Manage Clients) scans for profiles that share the exact same email or phone number and groups them for review — nothing merges automatically. Pick which profile in each group to keep; the others are removed, every reservation and Pipeline event that was linked to them gets re-pointed to (or combined into) the profile you kept, so booking and event history doesn't get lost in the merge.

Not built yet: guest-facing confirmation/reminder texts (email is covered — see Guest Confirmations & Reminders), fuzzy name-based duplicate matching (only exact email/phone matches are detected), and individual staff logins with per-person admin/manager/staff permission levels (table editing is currently gated by a same-password toggle, not separate accounts).

Settings navigation

The Settings tab is split into categories with its own sub-menu on the left — House Rules & Style Guide, Public Booking Page, and Reservation Hours & Time Slots — rather than one long scrolling page. Switching categories keeps any unsaved edits in the other categories; only a full navigation away from the Settings tab (or a page reload) discards them, same as everywhere else in the app.

🌐 Public Booking Page

A no-login, embeddable page (book.html) guests can use to request or book a table themselves — turn it on and configure it from Settings → Public Booking Page:

⏰ Reservation Hours & Time Slots

Its own category under Settings — set opening and closing times per day of the week (or mark a day fully closed), and add breaks to block out a window in the middle of a day (e.g. between breakfast and lunch service). A single slot interval (5 to 60 minutes) applies across all days. Generates the time choices offered in the dashboard's own New/Edit Reservation forms and on the public booking page, so both stay in sync automatically, and both re-generate the options whenever the reservation's date changes.

A hidden honeypot field on the public booking form quietly discards obvious bot submissions without any visible captcha.

Calendar View

A separate page (calendar.html, linked from the 📅 Calendar header button) showing every Pipeline event on a month grid, one event per day it's scheduled. Use ‹ › to change months and Today to jump back to the current month.

Events are color-coded by stage, using the same palette as the rest of the dashboard rather than plain red/green: gold for Confirmed/Complete, brass for Deposit/Contract, and crimson for the earlier Inquiry/Menu/Quote stages — so you can tell a locked-in date from one still up in the air at a glance. Click any event to see its details (or "+N more" on a busy day to see the full list); nothing on this page is editable, it's a read-only view for scanning the schedule.

This is separate from Reservations and from Google Calendar sync — it only reflects the Pipeline's own event dates, not dinner reservations or anything created directly in Google Calendar.

📡 Capacity Radar

The Capacity tab is the one place that overlays both halves of the business on top of each other — Pipeline event guest counts and Reservations covers, day by day — so a big Magnolia Room wedding and a packed dining room the same night show up together before it's a surprise, instead of living in two tabs no one cross-references.

Each row is one upcoming day: covers and reservation count on the left, Pipeline guest count and event count in the middle, a combined total, and a status pill once that total crosses your Daily Threshold (editable right on the tab — Approaching past 75%, Over Capacity past 100%). Tap any day to see exactly what's booked — reservations and events both, with times where they apply.

Pipeline events count toward a day's total at every stage, not just Confirmed — an early Inquiry still represents real potential kitchen load worth seeing coming. Cancelled and No-show reservations are excluded. The threshold is a per-device display preference (not shared data), so each person viewing the dashboard can set their own sense of "busy."

Settings & House Rules

Paste your filled-in Menu House Rules / style guide worksheet here — dining-style-by-dining-style guidance on what a plated dinner, buffet, tea, etc. should include. This is the single source of truth the AI reads every time it drafts a menu (see AI Drafting below), so keeping it current is the highest-leverage thing you can do to improve the quality of AI-drafted menus. Tap Save House Rules after editing.

AI Drafting & Briefing

☀️ Today's Briefing

Header button, available from anywhere. Pulls overdue and upcoming quote/menu/event deadlines plus pending high-priority callbacks and writes a short prioritized summary — read-only, nothing is sent or changed automatically.

✨ Draft Menu & Email (the main AI flow)

On an event detail screen: reads that event's full worksheet, its notes, and your House Rules, and drafts both a proposed menu and a client-facing email introducing it, in one step. The draft is always shown for review first — edit anything you like, then either:

Nothing is ever sent automatically — every AI draft, everywhere in this dashboard, stops at your Gmail Drafts folder for a final human look before it goes out.

Draft Quote / Draft Menu (quick)

A lighter-weight version for when you just want a standalone quote or menu draft to copy elsewhere, without going through the full menu+email flow or touching Gmail. Prices are always left as a [PRICE] placeholder — the AI never invents a dollar figure.

✨ Personalize with AI (email templates)

Inside any email template modal — rewrites the selected template using that specific client's real notes and recent activity log, instead of the generic boilerplate.

🤖 AI Triage

Runs automatically (not something you trigger) on both the public intake form and the inbox scan — pulls out dietary needs, an estimated guest count, a budget note, and urgency from free-text notes, shown as a clearly-labeled, review-before-relying-on-it block. It never overwrites your own fields.

Gmail & Google Calendar

Connecting

Tap 🔄 Reconnect Google in the header and complete Google's consent screen. You only need to do this once — and again any time a new permission (like Calendar) gets added and needs to be picked up.

📥 Scan Inbox

Header button. Scans the last 2-5 days of inbox (pick the range from the dropdown) and flags likely new inquiries (filtering out newsletters, receipts, and ongoing threads about already-booked events) with a review-and-checkbox screen — nothing gets added as a client without you explicitly picking it.

Gmail Drafts

Every manual email flow in this dashboard — templates, personalized emails, and the AI menu+email draft — ends the same way: a real draft sitting in your Gmail Drafts folder, ready to review and send yourself. The one exception is automatic guest confirmations and reminders, described below — those really do send on their own.

Google Calendar

From an event's 📅 Add to Google Calendar section, pick Event Date / Quote Due / Menu Due — it pre-fills a title, date/time, and description from that event's info, and creates a real calendar event with a 1-hour popup and 24-hour email reminder.

Guest Confirmations & Reminders

This is the one place in Parlor that emails a guest or client automatically, with no draft step and no human click — it only fires for things that are genuinely confirmed, on two triggers:

Each only sends once — a reservation edited after it's already Confirmed doesn't trigger a second confirmation, and a reminder that already went out doesn't repeat the next time the daily check runs.

Every one of these arrives as a branded HTML email — the business name banner, gold accent rule, and a clean details table for the date/time/party size — with a plain-text version underneath for any mail client that can't render HTML.

Requires an email address on file and Gmail connected. Reservations only require phone at minimum, so a phone-only booking (no email) simply won't get an email — nothing breaks, it's just silent for that guest. If Gmail isn't connected, the reservation or event still saves normally; the notification is skipped rather than blocking anything.

Staff Intake Form

A separate, no-login page (intake-handler.html) meant to be bookmarked on a phone at the host stand or wherever calls come in. Two options:

Submissions appear on the dashboard as soon as anyone with it open refreshes or re-syncs — there's currently no push/SMS alert for a new high-priority submission, so if something's urgent it's still worth a phone call or a glance at the dashboard rather than relying on it to ping anyone.

Tips & Known Limits