# Public Flow Audit

Date: 2026-04-02

## Canonical route contract

- `/rent`
  Public rental search and availability flow.
- `/rent/extras/:id`
  Vehicle configuration step between search and checkout.
- `/rent/checkout/:id`
  Reservation request checkout step.
- `/request/:token`
  Public custom request tracker.
- `/track/:token`
  Public booking tracker and payment entry.

## What was wrong

- Search, extras, and checkout were split across root-level routes, which leaked template-style URLs into production.
- The search-to-booking flow was not grouped under a single namespace.
- Some internal CTAs still pointed to old template-style paths (`/search`, `/extras/:id`, `/checkout/:id`).
- Vehicle detail still jumped into checkout-style booking flow without full trip context.
- Snapshot CTA fields could still reintroduce old route paths through content exports.

## What is fixed

- Search page moved to canonical `/rent`.
- Extras page moved to canonical `/rent/extras/:id`.
- Checkout page moved to canonical `/rent/checkout/:id`.
- Root-level `/search` and `/checkout` pages were removed.
- Root-level `/extras/:id` page was removed and replaced by the canonical namespaced page.
- Internal route generation is centralized in `frontend/app/utils/public-routes.js`.
- Header, footer, hero, search, extras, checkout, track, FAQ, locations, and content-layer CTA mapping now use canonical rental routes.
- Snapshot CTA URLs for known internal rental links are normalized through the content layer instead of leaking raw export paths into UI.

## Remaining product-level issue

- Vehicle detail does not yet own a full booking context (pickup/dropoff location + times), so it cannot safely jump straight into extras or checkout.
- Current safe behavior:
  Vehicle detail CTA enters `/rent` with a preferred vehicle hint (`vehicleGroupId`), and the search page prioritizes that vehicle in the results.
- Proper long-term solution:
  Either collect full trip context on the detail page, or clearly define detail page as a discovery page that feeds into `/rent`.
