{{ currentTitle }}
{{ currentSub }}
{{ briefing }}
| Stock # | Vehicle | Price | Mileage | Status | Days on lot | Updated | |
|---|---|---|---|---|---|---|---|
| {{ v.stock_no }} |
{{ v.year }} {{ v.make }} {{ v.model }}
{{ v.trim || v.body_style }} · {{ v.ext_color }} · {{ v.condition }}
|
${{ fmt(v.price) }} | {{ v.mileage.toLocaleString() }} | {{ v.status.replace('_',' ') }} | {{ daysOn(v) }} | {{ ago(v.updated_at) }} | |
| No vehicles match these filters. | |||||||
When in-stock count ≤ threshold: dashboard alert + email + SMS (if configured).
Leave blank to disable. Alerts fire the moment inventory changes.
{{ m.desc }}
{{ a.title }}
{{ a.summary }}
{{ kbArticle.title }}
Every endpoint lives at /api.php and returns JSON with an { ok: true } envelope. Identical contract ships in the Node.js/Express build (see Setup).
Front end: Vue 3 (CDN build on staging, Vite build for production) + Tailwind + Chart.js. State is a single reactive store; the realtime loop polls ?action=sync every 2s and patches only what changed.
Back end: one REST contract, two interchangeable implementations — PHP/SQLite for this staging host and Node.js/Express (server.js) for cloud deployment. Both expose identical endpoints and webhook events.
Integrations: every mutation emits a structured webhook event (vehicle.added / updated / sold, payment.captured, deal.closed). Provider adapters (CRM, POS gateway, Twilio, NHTSA vPIC) plug into the same emitter.
Data: SQLite on staging (zero-config, WAL mode); swap the driver for Postgres in production via a single connection config.