---
title: "Garage and how you shop"
description: "A customer's own vehicles, mileage and recall notes, and the optional audience choice that does not grant staff access"
locale: "en"
---
# Garage and how you shop

Two signed-in pages belong to the person, not to the rooftop desk: My Garage and How I shop.

> **Info**
> Neither page changes the platform role (`visitor`, `subscriber`, `member`, `admin`). Staff access is still an invite on the rooftop entity.

### For founders

## My Garage

`/profile/garage` lists vehicles the signed-in person owns. They can add one by VIN. Open a vehicle to log an odometer reading and a short note, or to check open NHTSA recalls for that VIN. The recall check reports a count. It is not a Carfax history and it is not a promise that the car is free of problems.

This garage is not your for-sale inventory. Cars you are advertising live on `/store`.

When your staff deliver a sold unit to a buyer, that API can also place the car in the buyer's garage. The lead desk does not have a Deliver button yet. Until it does, delivery is a staff call, not a screen the buyer clicks.

## How I shop

`/profile/audience` asks one optional question:

| Choice | What it does |
|---|---|
| Car buyer | Default. Browse and message a rooftop. |
| Independent dealer | Saves the choice and sends one application to the dealer group. |
| Parts supplier | Same kind of application, for someone who wants to supply parts. |
| Other | A private note only. |

An application does not let that person edit inventory or see other rooftops' leads. Your managers accept or ignore it on the lead desk like any other lead. Sending it again does not create a second application.

### For developers

| Piece | Path |
|---|---|
| Garage list | `GET` and `POST /api/dealer/garage` |
| Mileage and recalls | `GET` and `POST /api/dealer/garage/[id]/events` |
| Tables | `owned_vehicles`, `owned_vehicle_events` via `features/dealer/services/garage.ts` |
| Audience | `GET` and `PUT /api/dealer/audience` |
| Stored field | `users.data.dealerAudience` |
| Application kind | `partner_application` in `features/dealer/services/leads.ts` |

`POST /api/dealer/garage` with `{ kind: 'own', vin }` creates the row for the session user. A mileage event with `type: 'mileage'` and `odometer` updates `data.miles`. `type: 'recall_check'` reads NHTSA and returns `recalls`.

`PUT /api/dealer/audience` rejects an unknown value. `independent_dealer` and `parts_supplier` call `createDealerLead` against the first `dealer_group`, or the first `dealer_rooftop` if no group exists. The platform `role` column is not written.

  
- [features/entities](/docs/features/entities.md) — Prerequisite: why an application is not a staff invite.

  
- [features/inventory](/docs/features/inventory.md) — See also: delivery, which can copy a sold unit into this garage.

  
- [getting-started/first-success](/docs/getting-started/first-success.md) — Same workflow: the signed-in pages on the owner
