InventoryLocations
Docs
    Dealer Brand App

    Decentralized Self-building Future

    Sign In
    Inventory
    Locations
    Service
    My Garage
    How I shop
    Privacy|Contact
    v1.106.1|Sonoratek LLC

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Dealer desk docs
    Getting started
    First day on the desk
    Features
    Vehicle inventory
    Vehicle stock
    Listing a vehicle by hand
    Rooftops and the dealer group
    Dealer leads
    Rooftop messages
    Garage and how you shop
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Dealer desk docs
    Getting started
    First day on the desk
    Features
    Vehicle inventory
    Vehicle stock
    Listing a vehicle by hand
    Rooftops and the dealer group
    Dealer leads
    Rooftop messages
    Garage and how you shop
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Dealer desk docs
    Getting started
    First day on the desk
    Features
    Vehicle inventory
    Vehicle stock
    Listing a vehicle by hand
    Rooftops and the dealer group
    Dealer leads
    Rooftop messages
    Garage and how you shop
    Push Notifications with FCM (Ring-Powered)
    Tunnel Protocol
    Dealer Brand App Logo

    Loading documentation...

    Preparing Dealer Brand App content

    Dealer Brand App Logo

    Loading documentation...

    Preparing Dealer Brand App content

    Dealer Brand App Logo

    Loading documentation...

    Preparing Dealer Brand App content

    Vehicle stock

    A vehicle on the website is a store product with a VIN, an asking price, and a rooftop. If it has no VIN, or no price, it does not publish. Shoppers never add it to a cart.

    This is the dealer-pack page for the features/inventory sidebar slot. It is stock for a rooftop, not a warehouse ERP screen.

    Status you can put on a unit

    StatusMeaning on the site
    availableCan be shown
    pendingStill a dealer vehicle; your desk copy should say it is spoken for
    in_transitNot on the lot yet
    soldRemoved from the public advertisement after delivery, or after a full import that no longer lists that VIN

    Putting cars on the site

    Staff who are admins of a rooftop open /dealer/inventory/import. Paste a JSON array of vehicles, type that rooftop's entity id, and use Dry run first. Dry run counts what would be created or updated and does not write. Apply writes. The screen always sends an incremental import: it adds and updates the VINs in the file and leaves other units alone.

    Each row needs a 17-character VIN and an asking price. Rows that are only a title are filled from NHTSA vPIC when the title does not contradict the VIN. A row that disagrees with the VIN decode is skipped, and the report says why.

    The same screen lists three names as planned and not connected: Carfax history reports, vAuto pricing, and CDK DMS sync. Do not promise those to a customer.

    When the car is sold

    Delivery is a staff action, not a button on the public page. A rooftop member calls POST /api/dealer/vehicles/<product id>/deliver with the buyer's user id. That sets the unit to sold, zeroes the public stock, and can place the car in the buyer's garage. If you also pass an opportunity id, that lead moves to sold.

    A full import (mode: full on the API, not on the current screen) marks VINs that are no longer in the file as sold. Use that only when the file is the whole rooftop, not a partial list.

    PiecePath
    Import screenapp/[locale]/(protected)/dealer/inventory/import/page.tsx
    APIPOST /api/dealer/inventory/import
    Rulesfeatures/dealer/services/inventory-import.ts
    Feed shapefeatures/dealer/lib/feed-map.ts
    VIN decodefeatures/dealer/services/vpic.ts
    DeliverPOST /api/dealer/vehicles/[id]/deliver

    The API requires a session. A non-admin must pass assertEntityRole at ADMIN for that rooftop. Platform admins skip that check. Omitted dryRun is treated as true. Omitted mode is incremental. Product id is stable per VIN and rooftop (productIdFor).

    features/dealer/addons.ts is the list of unpaid feeds. Do not add client keys for them in the pack.

    Frequently asked questions

    Impact

    Will a dry run change the website?

    No. Apply is the button that writes.

    Can a salesperson import?

    Not unless they are an admin of that rooftop, or a platform admin. A member can deliver a sold unit. Import is the stricter role.

    Ops

    Why was a row skipped?

    The report lists the VIN. Usual causes: the VIN is not 17 characters, there is no asking price, or the title does not match the decode.

    Related documentation

    Vehicle inventory

    Next-step: how a published unit looks to a shopper.

    Listing a vehicle by hand

    Same workflow: typing a vehicle in by hand.

    First day on the desk

    Prerequisite: the screens an owner opens first.

    1. /
    2. /Vehicle stock

    Updated Oct 28, 20263 min listen

    Vehicle stock

    A vehicle on the website is a store product with a VIN, an asking price, and a rooftop. If it has no VIN, or no price, it does not publish. Shoppers never add it to a cart.

    This is the dealer-pack page for the features/inventory sidebar slot. It is stock for a rooftop, not a warehouse ERP screen.

    Status you can put on a unit

    StatusMeaning on the site
    availableCan be shown
    pendingStill a dealer vehicle; your desk copy should say it is spoken for
    in_transitNot on the lot yet
    soldRemoved from the public advertisement after delivery, or after a full import that no longer lists that VIN

    Putting cars on the site

    Staff who are admins of a rooftop open /dealer/inventory/import. Paste a JSON array of vehicles, type that rooftop's entity id, and use Dry run first. Dry run counts what would be created or updated and does not write. Apply writes. The screen always sends an incremental import: it adds and updates the VINs in the file and leaves other units alone.

    Each row needs a 17-character VIN and an asking price. Rows that are only a title are filled from NHTSA vPIC when the title does not contradict the VIN. A row that disagrees with the VIN decode is skipped, and the report says why.

    The same screen lists three names as planned and not connected: Carfax history reports, vAuto pricing, and CDK DMS sync. Do not promise those to a customer.

    When the car is sold

    Delivery is a staff action, not a button on the public page. A rooftop member calls POST /api/dealer/vehicles/<product id>/deliver with the buyer's user id. That sets the unit to sold, zeroes the public stock, and can place the car in the buyer's garage. If you also pass an opportunity id, that lead moves to sold.

    A full import (mode: full on the API, not on the current screen) marks VINs that are no longer in the file as sold. Use that only when the file is the whole rooftop, not a partial list.

    PiecePath
    Import screenapp/[locale]/(protected)/dealer/inventory/import/page.tsx
    APIPOST /api/dealer/inventory/import
    Rulesfeatures/dealer/services/inventory-import.ts
    Feed shapefeatures/dealer/lib/feed-map.ts
    VIN decodefeatures/dealer/services/vpic.ts
    DeliverPOST /api/dealer/vehicles/[id]/deliver

    The API requires a session. A non-admin must pass assertEntityRole at ADMIN for that rooftop. Platform admins skip that check. Omitted dryRun is treated as true. Omitted mode is incremental. Product id is stable per VIN and rooftop (productIdFor).

    features/dealer/addons.ts is the list of unpaid feeds. Do not add client keys for them in the pack.

    Frequently asked questions

    Impact

    Will a dry run change the website?

    No. Apply is the button that writes.

    Can a salesperson import?

    Not unless they are an admin of that rooftop, or a platform admin. A member can deliver a sold unit. Import is the stricter role.

    Ops

    Why was a row skipped?

    The report lists the VIN. Usual causes: the VIN is not 17 characters, there is no asking price, or the title does not match the decode.

    Related documentation

    Vehicle inventory

    Next-step: how a published unit looks to a shopper.

    Listing a vehicle by hand

    Same workflow: typing a vehicle in by hand.

    First day on the desk

    Prerequisite: the screens an owner opens first.

    1. /
    2. /Vehicle stock

    Updated Oct 28, 20263 min listen

    Vehicle stock

    A vehicle on the website is a store product with a VIN, an asking price, and a rooftop. If it has no VIN, or no price, it does not publish. Shoppers never add it to a cart.

    This is the dealer-pack page for the features/inventory sidebar slot. It is stock for a rooftop, not a warehouse ERP screen.

    Status you can put on a unit

    StatusMeaning on the site
    availableCan be shown
    pendingStill a dealer vehicle; your desk copy should say it is spoken for
    in_transitNot on the lot yet
    soldRemoved from the public advertisement after delivery, or after a full import that no longer lists that VIN

    Putting cars on the site

    Staff who are admins of a rooftop open /dealer/inventory/import. Paste a JSON array of vehicles, type that rooftop's entity id, and use Dry run first. Dry run counts what would be created or updated and does not write. Apply writes. The screen always sends an incremental import: it adds and updates the VINs in the file and leaves other units alone.

    Each row needs a 17-character VIN and an asking price. Rows that are only a title are filled from NHTSA vPIC when the title does not contradict the VIN. A row that disagrees with the VIN decode is skipped, and the report says why.

    The same screen lists three names as planned and not connected: Carfax history reports, vAuto pricing, and CDK DMS sync. Do not promise those to a customer.

    When the car is sold

    Delivery is a staff action, not a button on the public page. A rooftop member calls POST /api/dealer/vehicles/<product id>/deliver with the buyer's user id. That sets the unit to sold, zeroes the public stock, and can place the car in the buyer's garage. If you also pass an opportunity id, that lead moves to sold.

    A full import (mode: full on the API, not on the current screen) marks VINs that are no longer in the file as sold. Use that only when the file is the whole rooftop, not a partial list.

    PiecePath
    Import screenapp/[locale]/(protected)/dealer/inventory/import/page.tsx
    APIPOST /api/dealer/inventory/import
    Rulesfeatures/dealer/services/inventory-import.ts
    Feed shapefeatures/dealer/lib/feed-map.ts
    VIN decodefeatures/dealer/services/vpic.ts
    DeliverPOST /api/dealer/vehicles/[id]/deliver

    The API requires a session. A non-admin must pass assertEntityRole at ADMIN for that rooftop. Platform admins skip that check. Omitted dryRun is treated as true. Omitted mode is incremental. Product id is stable per VIN and rooftop (productIdFor).

    features/dealer/addons.ts is the list of unpaid feeds. Do not add client keys for them in the pack.

    Frequently asked questions

    Impact

    Will a dry run change the website?

    No. Apply is the button that writes.

    Can a salesperson import?

    Not unless they are an admin of that rooftop, or a platform admin. A member can deliver a sold unit. Import is the stricter role.

    Ops

    Why was a row skipped?

    The report lists the VIN. Usual causes: the VIN is not 17 characters, there is no asking price, or the title does not match the decode.

    Related documentation

    Vehicle inventory

    Next-step: how a published unit looks to a shopper.

    Listing a vehicle by hand

    Same workflow: typing a vehicle in by hand.

    First day on the desk

    Prerequisite: the screens an owner opens first.

    1. /
    2. /Vehicle stock

    Updated Oct 28, 20263 min listen

    Docs
    Features
    Docs
    Features
    Docs
    Features