RoundTrip Next Phase Implementation Plan
Status: Living document. Built from a full backlog audit completed 2026-08-02; updated 2026-08-04 to incorporate TRA-370's scoping session (ticket scheduling), its real dependency relationship with TRA-242, and three newly captured ideas not yet placed into a phase. Sequencing reflects real dependencies and current business priorities, not just ticket age or original priority label — several stale priorities were corrected as part of the original audit (see Appendix).
This plan sequences what's left in the backlog into a real order of operations, not just a priority-sorted list. Phases are meant to be worked roughly in order, though items within a phase can move independently of each other.
Guiding principles for this sequencing
- Trust and liability issues come before feature work. Anything that risks a real prospect being misled or exposed to unbacked promises jumps the queue, regardless of technical size.
- Friction reduction for new signups outranks net-new features right now. With outreach (postcards, SEO) actively in motion, anything that makes a first-time tenant's onboarding smoother has outsized value today specifically.
- Real dependencies get sequenced together, not scattered by ticket number. Several items only make sense to build as a unit (see each phase).
- Tech debt and AI-tooling work wait for their own dedicated sessions. Both are real and worth doing, but neither is blocking anything above it.
Phase 0 — Trust and liability (do first, small in size, large in consequence)
| Ticket | What | Why first |
|---|
| TRA-360 | Subscription plan bullets overstating capability | Already Urgent — a real prospect could sign up believing something false. Homepage/plan-card copy fix already drafted; confirm it's fully live. |
Phase 1 — Reduce friction for the signups already in motion
Postcards are out, SEO work is starting. These directly affect what a brand-new tenant experiences in their first hour.
| Ticket | What | Why now |
|---|
| TRA-263 | CSV import for Clients and Inventory | Highest-leverage onboarding fix in the whole backlog — a real business won't hand-enter 100+ existing clients or parts. Resolve the .xlsx scoping question (see Open Decisions) before starting. |
| TRA-241 | PWA photo capture | Backend already complete — frontend-only work, fast to ship, real technician-facing value. |
| TRA-271 | Edit/remove user & technician profiles | Basic account hygiene gap — no way to fix a typo'd name or remove someone who left. |
Phase 2 — Twilio cluster (build together, not separately)
These four only make sense as one unit — building any one without the others leaves dead code or an unfinished feature.
| Ticket | What |
|---|
| TRA-80 | Twilio SMS service itself — nothing exists yet |
| TRA-219 | A2P 10DLC carrier registration — required before any SMS reaches a real customer |
| TRA-236 | On-my-way SMS when a technician starts a ticket |
| TRA-210 | Invoice delivery via SMS |
Phase 3 — Billing completion (original PRD "Must Have" scope, still unbuilt)
| Ticket | What |
|---|
| TRA-144 + TRA-213 | Quotes — domain partially built, no frontend; 213 is the completion of 144, treat as one item |
| TRA-212 | Credit note issuance for finalized invoices |
| TRA-214 | Send Invoice modal — email/SMS toggle, recipient override (depends on Phase 2 for the SMS half) |
| TRA-151 + TRA-152 | Auto labour line items + tax rate pre-population — share a tenant-settings table, build together |
Phase 4 — Dispatch & data quality
Scoped in detail 2026-08-04 — TRA-370 and TRA-242 now have a confirmed real dependency, not just a loose thematic grouping, so order matters here more than in most other phases.
| Ticket | What | Why this order |
|---|
| TRA-285 | Google Maps Places Autocomplete — fixes real geocoding failures on abbreviated addresses today | No dependency on the rest of this phase, can move anytime |
| TRA-370 | Ticket scheduling — ScheduledDate, multi-day List view, two-rule rollover job for unfinished work (in-progress carries forward as-is; not-started rolls to an unscheduled queue) | Foundational — establishes the data model everything else in this phase's scheduling work builds on |
| TRA-165 | Choose service date on ticket creation | The create-time half of TRA-370's scheduling model — natural to build alongside it, not separately |
| TRA-242 | Dispatch board drag-and-drop, collapsible panels, Calendar/Schedule tab views (Gantt-style timeline dropped in favor of a cleaner modern view, decision made 2026-08-04) | Depends on TRA-370 — do not start the Calendar/Schedule view work before 370's data model lands |
| TRA-166 | Ticket filtering | No dependency, can move anytime |
| TRA-238 | PWA push notifications | No dependency, can move anytime |
Phase 5 — Tech debt (own session, not urgent, but real)
| Ticket | What |
|---|
| TRA-359 | Route Stripe writes through the Tenant aggregate instead of raw SQL |
| TRA-364 | Unit test coverage for Tenant's subscription-lifecycle methods |
| TRA-367 | Consolidate all modals onto a shared, per-file ModalShell |
| TRA-365 | Replace UI-driven Entra login in Playwright with ROPC |
| TRA-148 | Split useBilling.ts to match the established one-hook-per-file pattern |
| TRA-170 | Update vite-plugin-pwa for Vite 8 support |
| TRA-261 | Add Role to ITenantContext, remove the IncludeRevenue workaround |
| TRA-168 | Migrate the Azure DevOps build agent off the laptop |
Phase 6 — Monitoring (solo-founder safety net, currently nonexistent)
| Ticket | What |
|---|
| TRA-115 | Application Insights, error/cost alerting, solo-developer on-call setup |
| TRA-248 | Research a database monitoring/evaluation tool — sequence with TRA-115, don't duplicate research |
Phase 7 — AI cluster (blocked on its own dedicated planning session)
Nothing here starts until the tooling decision is made — building against the wrong stack is worse than waiting.
| Ticket | What |
|---|
| TRA-362 | Evaluate AI tooling path — n8n vs. MS Foundry Cloud vs. MS Foundry Local — do this first, blocks everything else in this phase |
| TRA-361 / TRA-120 (AI piece) | In-app chatbot/assistant — same idea filed twice, needs one owner before building |
| TRA-120 (remaining) | Contextual help panel + searchable knowledge base — doesn't depend on the AI tooling decision, could move independently of the rest of this phase |
| TRA-139 | AI-powered route optimization — Paid Module, no rush |
Marketing / non-engineering, tracked here for visibility
| Ticket | What |
|---|
| TRA-363 | Dedicated trade-specific landing pages (/hvac, /plumbing, /electrical) |
Captured, not yet placed — product ownership undecided
Surfaced during TRA-370's scoping session (2026-08-04), inspired by a look at ServiceTitan's feature set. None of these are scoped, and none are confirmed to actually belong in RoundTrip rather than Waypoint or Relay — deliberately not slotted into a phase above until both of those are settled.
| Ticket | What |
|---|
| TRA-371 | Proposal/bid builder for commercial work — distinct from Quotes, closer to a branded sales document |
| TRA-372 | Service agreements — recurring maintenance contracts, depends on TRA-370 existing first if it does end up in RoundTrip |
| TRA-373 | Customer self-service booking/intake — currently no path except manual dispatcher entry |
Open decisions needed before work starts
- TRA-361 vs. TRA-120 AI assistant ownership — same feature, filed twice. Pick one before Phase 7 starts.
Resolved since the plan was first drafted: TRA-263's file format scope (CSV + client-side .xlsx conversion + paste option, decided 2026-08-02) and Phase 0 (TRA-360 confirmed fully shipped and closed 2026-08-04).
Appendix — audit corrections made 2026-08-02
Several tickets had stale priorities or statuses that didn't reflect reality, corrected as part of building this plan:
- TRA-79, TRA-116, TRA-117, TRA-119, TRA-175, TRA-356, TRA-358 — marked Done (already complete, previously left open)
- TRA-137 — closed as duplicate of TRA-263
- TRA-80, TRA-120 — demoted from stale Urgent (deadline pressure that justified it no longer applies)
- TRA-225 — go-live checklist marked complete, demoted from Urgent to Medium
- TRA-152, TRA-263 — missing pricing-sort labels (
Free Upgrade) applied; TRA-263 reparented under TRA-136