Heads up — where the data comes from: this dashboard is a downstream consumer. In production, the values it shows are fed in from two places on the Tripshepherd platform.
From the platform (admin / records):
- Tours — pulled from the product catalog.
- Guides — pulled from the guide roster on the platform. Certifications are granted by lead guides through BOAT.
- Configure blocks — pulled from operating-hours / block templates.
From the guide app (per-week, per-guide):
- Availability — the days and blocks each guide has confirmed they can work.
- Unavailability — explicit blocks marked as not-available, even within an otherwise available day.
- Time-off requests — full-day or multi-day requests; treated as hard unavailability when approved.
- Preferred time blocks — soft preference signal the suggester uses to bias assignments toward the blocks a guide actually wants.
When the week banner reads "Availability submitted", that means the guide app has collected and synced this data for every guide on the roster. The Configure / Tours / Guides screens here are illustrative — the source of truth lives elsewhere on the platform.
Overview
This dashboard turns a roster of guides, a catalog of tours, and a week of guide-availability into a published schedule. It works in three loops:
- Configure — define your blocks (AM/PM/EVE), tours, guides, and certifications. Done once per city, then maintained.
- Build — for each upcoming week, request availability, auto-populate or copy from a previous week, then resolve any flagged issues.
- Publish — release the schedule to guides. Edit later if needed; the dashboard tracks unpublished changes for you.
A "section" is the smallest unit of work — one tour type (Walking or Driving) on one day in one block. Every KPI in the dashboard counts sections.
Setup (one-time per city)
The four buttons in the subheader each open a configuration modal. Set them up in this order for a new city:
0 · Add a city (and optionally import its catalog)
Open the city picker (top-right) and click Add city at the bottom. The modal walks through up to three steps:
- Name. Type the city. If the typed name matches a city already registered on the platform's product catalog (currently Toronto, others as the catalog grows), a Pull from product list CTA appears.
- Source. Clicking the CTA shows every city the platform has products for. Pick one.
- Products. All of that city's tours show with checkboxes — all selected by default. Each row shows tour type (Walk / Drive), start time, duration, and the block it'll fall into. Deselect anything you don't want scheduled, then click Add city with N tours.
What import does for you:
- Pre-fills the Tours catalog with the selected products.
- Auto-generates three time blocks (Morning / Afternoon / Evening) and computes each block's window from the imported tours — earliest start to latest end across that bucket. Buckets without any imported tours fall back to default windows (08:30–13:30 / 13:30–18:00 / 18:00–22:00).
- Bucketing rule — tours starting before 12:00 land in AM, 12:00–17:00 in PM, 17:00 onward in EVE.
If the typed name doesn't match a catalog (or you skip the CTA), the city is created blank and you go straight to step 1 below.
The product catalog is platform-wide data — these tours come from the same source you'd see in Tripshepherd's product/tour records. The Add City flow is a shortcut so you don't have to retype them here.
1 · Configure blocks
Defines your AM / PM / EVE windows. Each block has a name ("Morning"), time ("08:30 – 13:30"), and short key ("AM") used in pills.
2 · Tours
Your product catalog. Each tour belongs to a tour type (Walking or Driving), a start time and duration, and one or more blocks it can run in. The dashboard infers offered tour types for the city from this list — if you have only Walking products, Driving sections never appear in the calendar.
3 · Guides & certs
Your roster, plus a checkbox matrix of which guide is certified for which tour. Only certified guides count as primary coverage for that tour's products. Editing certs is the single biggest lever — it changes Product Gaps and Primary Uncertified KPIs immediately.
4 · Priorities
Color and label each priority rank. Three ranks ship by default (P1 blue, P2 green, P3 orange). Add more ranks if you run a deeper backup bench; remove ranks you don't use. Colors propagate to every pill, badge, and modal.
Changing Priorities mid-cycle re-colors live cells. Pick your palette before you publish a schedule.
P1, P2, P3 explained
Every cell in the schedule holds a stack of guides ordered by priority. The rank means how the section is run if the schedule is challenged on the day:
Rank pills (one stacked section)
P1 Lena P.
P2 Marco B.
P3 Sarah C.
- P1 — Primary lead. Runs the tour. Must be certified for the product. If a P1 is missing the cell is Unfilled.
- P2 — Backup. Steps in if P1 calls out. Missing P2 is a soft warning ("Missing P2 backup") — the tour still runs, but you have no fallback.
- P3+ — Bench. Further fallbacks. If the only certified guide in the stack is P3+, the cell triggers the Primary uncertified KPI: the schedule technically has a guide, but your front-line P1 isn't certified.
How to change a rank
- Click the cell section (Walking or Driving) to open the side panel.
- On a guide row, use Replace to swap a different guide into that rank, or Remove to delete and re-index the stack.
- Use + Add backup (Pn) to push a new guide onto the next available rank.
Removing P1 promotes P2 to P1 automatically. Ranks are always contiguous (no P1 + P3 with no P2).
Auto-suggester logic
When you click Auto-populate schedule on an availability-ready week, the suggester fills every section using the configured roster, certifications, and the per-guide signals below.
Inputs the suggester looks at
| Signal | What it does |
| Certification | Hard requirement for P1. Uncertified guides can only land on P3+. |
| Score (70–95) | Hidden quality score. Higher score → more certifications and a stronger P1 candidate. |
| Hours balance | Targets even distribution. Guides with negative hours (under-booked) get prioritized first. |
| Preferred ⭐ | Guides marked preferred are nudged toward higher-visibility blocks (e.g. Saturday morning). |
| Tour-type variety | Tries to keep each guide on a healthy mix of Walking + Driving where they're certified for both. |
| Cross-tour conflict | The suggester never puts one guide on Walking and Driving in the same block. Same-guide assignments across tours are flagged in the Cross-tour conflicts KPI. |
How ranks get assigned
- P1: the most-qualified, most-available certified guide for the section.
- P2: the next certified guide available, ideally distinct from P1's day-pattern (so a sick-day doesn't take both out).
- P3+: remaining bench, regardless of certification — the suggester will surface a flag if there's no certified P1 or P2.
What "Primary uncertified" means
A section where the highest-ranked certified guide is P3 or lower. The tour can technically run, but you'd be promoting a bench guide to P1 on the day. Resolve by adding a certified guide at P1, or by adding the certification to an existing P1.
Re-run suggester vs Auto-populate
- Auto-populate schedule — fills an empty week from scratch (only available when the week is in avail_ready).
- Re-run suggester — soft refresh of the current week's stacks, keeping any manual locks in place. Use after editing certifications or roster mid-cycle.
How to override the suggester
Any cell change (Replace, Remove, Add backup, drag-reorder) overrides the suggester for that section. Re-running the suggester later will respect those manual edits.
Weekly forecast
The forecast is a per-week, ops-only briefing that tells the suggester how deep to stack each section. It replaces the old busyness slider and is optional — if you don't set one, scheduling falls back to the default 1–3 stack from guide availability alone.
Forecast pill (subheader)
Add forecast
Peak · Canada Day weekend — major influx…
Demand levels
| Level | Default stack target | Use when |
| Low | P1 only | Quiet shoulder weeks; historical low patterns. |
| Normal | P1 + P2 | Standard week; this is the baseline if no forecast is set. |
| High | P1 + P2 + P3 | Long weekends, conferences, school breaks. |
| Peak | P1 + P2 + P3 + P4 + P5 | Canada Day, July 4, Memorial Day — auto-extends ranks to P5. |
Stack depths are configurable per city from the bottom of the forecast modal (Niagara might be P5 at peak; another city might cap at P4). The selected level's depth shows in the dropdown next to the label.
Suggestions
The modal opens with a row of one-tap chips (e.g. Canada Day weekend, FIFA Toronto event, Quiet shoulder week). Tapping a chip pre-fills the level, scope, note, and the days the spike applies to — the rest of the week is set to Normal automatically. You can edit any field afterward.
Tour scope
A forecast can target Walking only, Driving only, or Both. Out-of-scope tours fall back to the Normal baseline. Example: a FIFA event in Toronto skews driving-only — Walking sections stay at default depth.
Per-day overrides
The lower half of the modal lists each day Mon–Sun. Each day defaults to Inherit week but you can override to a different level (or back to Normal). Use this when a holiday only affects part of the week.
What changes downstream
- Auto-populate schedule applies the forecast as it builds — extending stacks past the seed where Peak/High demand it, or trimming where Low applies.
- Re-run suggester reads the current forecast and tops up under-stacked sections without overwriting your manual edits.
- KPIs retarget — the "P2 backup filled" card becomes Forecast depth met, counting sections that hit their forecast-driven target depth.
- Ranks auto-extend — saving a Peak forecast adds P4 / P5 to the global priority palette using fallback colors. Customize them later from the Priorities modal.
Lifecycle
- The forecast lives on the (city, week) pair. Switching weeks shows that week's forecast, or "Add forecast" if none.
- Editing a forecast is non-destructive — you must click Re-run suggester to apply changes to an already-populated week.
- Copy from previous does not carry the forecast forward. The destination week starts blank and you choose whether to set one.
- Forecasts are ops-only. They never publish to guides.
A forecast doesn't fix coverage by itself — it changes what counts as enough. You still need certified guides on the bench to fill the deeper ranks Peak demands.
KPI cards
The strip above the calendar is your at-a-glance health check for the week. Cards turn yellow when they need attention and red when they block publishing.
| KPI | What it counts | Goal |
| P1 filled | Sections with at least one guide assigned at P1. | 100% before publishing. |
| P2 backup filled | Sections with a P2 assigned. When a forecast is set this card relabels to Forecast depth met and counts sections that hit their forecast-driven target depth (P3 / P5 etc.). | ≥ 80% normally; 100% under High / Peak. |
| Unfilled sections | Sections with zero guides — tour cannot run. | 0. |
| Cross-tour conflicts | Same guide assigned to Walking and Driving in the same block. One person can't run both — always flagged. | 0. |
| Product gaps | Sections where no guide in the stack is certified for any product the section runs. Hard fail. | 0 — must clear before publish. |
| Primary uncertified | Sections where only P3+ are certified — see "Auto-suggester logic". | 0; soft warning otherwise. |
| Imbalance flags | Guides whose week-over-week hours fall outside ±6h of the city target. | 0; soft warning otherwise. |
Issues panel
The right rail (when no cell is selected) lists every flagged issue from the KPIs, grouped by severity, with a one-click action on each.
- Unfilled sections → Assign P1
- Missing P2 backup → Add P2
- Cross-tour conflicts → Resolve (opens the section so you can swap one of the two guides)
- Product coverage gaps → Find certified guide
- Primary uncertified → Open (opens the section's side panel)
- Imbalance flags → Open (opens the guide in Signals tab)
Each group caps at 6 visible items with a "+N more…" overflow. Resolving an issue removes it live — no save step.
Week states
Every week your dashboard shows is in exactly one of four states. Use the week navigator (‹ ›) and Today to move between them.
Availability not yet available
Guides haven't submitted availability — send a reminder.
Availability requested · waiting on team
Reminder sent. The schedule will unlock once guides respond.
Availability submitted
All guides shared availability. Auto-populate or copy from a previous week.
| State | What it means | Available actions |
avail_pending | Future week, no availability requested yet. | Ask team to submit |
avail_requested | Reminder sent; guides have not all responded. | Wait. Button is disabled. |
avail_ready | All guides have submitted; cells are still empty. | Copy from previous · Auto-populate schedule |
populated | Cells are filled (manually, copied, or auto). KPIs activate, Issues panel populates. | Edit, save draft, publish. |
Publish lifecycle
The badge on the publish bar tells you exactly where the current week is. Each state corresponds to a specific button label and disabled-state.
Cycle 11 · Phase 1 review
Published · 2025-05-01 16:20
Unpublished changes
| Badge | Button | Behaviour |
| Cycle · Phase 1 review | Publish → | Schedule built but never released. Click to publish. |
| Published · timestamp | Disabled | Live for guides. Nothing to do until you edit. |
| Unpublished changes | Publish changes → | You edited a published schedule. Re-publish to push the diff. |
Any cell edit on a published week (Replace, Remove, Add backup, reorder) automatically flips the badge to Unpublished changes. There is no separate "save" step before publishing.
Drafts & copy from previous
Save draft
Save draft snapshots the current week without releasing it. Use it before risky edits or to keep a "Plan B" version. Reopen any saved draft from the Drafts button.
Copy from previous
On an avail_ready week, Copy from previous opens a list of populated past schedules (released or in-review). Pick one to clone all of its cells into the current week. Useful for repeating weeks (off-season) or cycling a known-good template forward.
Copy is a one-shot clone — there's no live link between source and destination. Edit the new week freely; the source isn't touched.
Blocks vs Guides view
Blocks view (default)
Rows are blocks (AM/PM/EVE). Cells show every guide stacked on that block per day. Best for spotting holes — empty sections, missing P2, conflicts. KPIs and Issues panel are calibrated to this view.
Guides view
Rows are guides. Cells show what that guide is running each day. Best for guide-level checks — fairness of hours, who's overworked, who's idle. The hours-balance ("+5h", "−3h") next to the name is your week-over-week target delta.
Both views read the same underlying data; switching is purely visual.
Happy path — building next week's schedule
1
Open the upcoming week
Click › until the subheader shows the week you're scheduling. Confirm the city in the city picker.
2
Request availability if needed
If the banner reads Availability not yet available, click Ask team to submit. Wait for the state to flip to Availability submitted.
3
Generate the cells
Click Auto-populate schedule for a fresh build, or Copy from previous if last week's pattern still fits. The toast tells you how many issues were flagged.
4
(Optional) Set a forecast
Click Add forecast if there's anything unusual about the week — a holiday, a known event, an expected slump. Pick a suggestion chip or set the level by hand. Skip this if it's a normal week — the suggester does the right thing without it.
5
Resolve issues
Work top-down through the Issues panel. Aim for: 0 Unfilled, 0 Product gaps, 0 Cross-tour conflicts. P2 below 80% and Primary uncertified above 0 are acceptable but should be intentional.
6
Save a draft (optional)
Click Save draft if you want a safe-point before more edits. Drafts are city- and week-scoped.
7
Publish
Click Publish →. Badge flips to Published · timestamp; the button disables until your next edit.
Edge cases & how the dashboard handles them
Brand-new city with no guides
Both views show an empty-state with a direct shortcut to Guides & certs. KPIs all read 0 / 0 until guides are added.
City offering only one tour type
If the Tours catalog has only Walking products, Driving sections never render. The opposite is also true. Add a product of the missing type to unlock those rows.
Week never had availability collected
The week stays in avail_pending indefinitely. KPIs and Issues panel are inert until you populate. There's no implicit auto-collection.
No certified guide exists for a product
Section shows in Product gaps (red, hard fail). Resolution: certify a guide for that product (Guides & certs), or add a tour to a guide who is already certified.
Only P3+ certified for a section
Section shows in Primary uncertified. Either elevate a certified guide to P1 (Replace) or add the certification to your existing P1.
Imbalance > ±6h
Guide shows up in Imbalance flags. Either move sections off them or onto them; or set the city target to a different baseline if the whole roster is drifting.
Editing a published week
Badge flips to Unpublished changes; the publish button reactivates as Publish changes →. There is no rollback in-app — re-publishing pushes the new state.
Copying from a draft into a populated week
The destination cells are overwritten. Save a draft of the destination first if you may want to revert.
Adding a priority rank mid-cycle
Existing pills keep their old colors. New rank colors apply only to newly-assigned guides at that rank.
Buttons & cheatsheet
Top header
- City picker — switch between cities. Add city at the bottom of the menu opens the new-city flow; if the typed name matches a city already in the platform's product catalog (e.g. Toronto), a Pull from product list button appears to import its tours and auto-generate time blocks.
Subheader
- ‹ / › — previous / next week.
- Today — jump to current week.
- Blocks / Guides — view toggle.
- Add forecast / forecast pill — opens the weekly forecast modal (suggestions, demand level, tour scope, per-day overrides, depth config).
- Configure blocks — edit AM/PM/EVE definitions.
- Tours — product catalog.
- Guides & certs — roster + certification matrix.
- Priorities — rank colors and labels.
- Re-run suggester — soft refresh of the current week's stacks.
Publish bar (above calendar)
- Cycle / Published / Unpublished changes badge — current state.
- Drafts — open saved drafts for this city.
- Save draft — snapshot current week.
- Publish → / Publish changes → — release the schedule. Disabled when there's nothing to publish.
Week-state banner (when not yet populated)
- Ask team to submit — request availability.
- Copy from previous — clone a past schedule.
- Auto-populate schedule — run the suggester from scratch.
Cell side panel
- Priorities tab — rank stack, replace, remove, add backup, approve, re-suggest.
- Signals tab — per-guide preferred / hours / variety.
Floating button
- Schedule Guide — re-opens this guide. Available on every screen.