πŸ›ž

AWS Motor Club β€” Living Breakdown

TireGuard & GlassGuard command center Β· aws-motor-club.pages.dev
← Appolis Β· the city of apps

AWS Motor Club App β€” Breakdown (LIVING DOC)

THIS FILE is the portable breakdown β€” the one that travels. It is what docs.appolis.app renders (the hub renders markdown at build time, so a published page can no longer lag the doc), what git diffs, and what anyone without an app login can read. Keep it current: it is the only version of this document the outside world ever sees.
/breakdown in the running app is a LIVE TWIN, not a mirror β€” it cannot be published. It fetches /api/config, /api/stats, /api/products and /api/dealers at runtime and its theme + term-rule editors write back (config/app-config.json / the term_rules table), so it is always true inside the app and worthless outside it: hosted anywhere else those relative fetches hit the wrong origin and the page renders as an empty shell whose write-back buttons POST into the void. That is exactly what happened when it was copied to docs.appolis.app; the published copy has been pulled and docs-hub/build.js now carries a β›” DELIBERATELY NOT COPIED note next to it. Two ways back onto the hub, both fine: (a) this markdown in the hub's renders list β€” the chosen route, and the prerequisite is met; or (b) a static snapshot export that bakes the API values in at build time (not built; see Β§9). Do not add web/breakdown.html to the hub's copies list.
Same rule as Flip CMS: this document is updated on every app change.

What it is: customer-service command center for AWS Motor Club (AWS = Addendum & Warranty Solutions) vehicle protection products: TireGuard β€” tire repair/replacement program; GlassGuard β€” windshield protection; more products to come. ⚠️ GlassGuard naming exception: GlassGuard is windshield protection everywhere, now and going forward. The only exception is the existing Mercedes-Benz of South Orlando book, where an employee incorrectly applied the GlassGuard name to a touchscreen radio screen protector and AWS had to honour it. So the 1,846 imported GlassGuard registrations are that touchscreen product; every GlassGuard sold from here on is a windshield. Do not "correct" the historical rows, and do not let this exception leak into product copy, decks or new dealer setups. Replaces the Google AppSheet + spreadsheet-pipeline setup: instead of dealership sheets being copy-pasted through staging spreadsheets into a master sheet, dealership data goes straight into a real database and every derived number (term, expiry, dealer profit) is computed by code.

Status: v0.7.1 β€” LIVE ON CLOUDFLARE at aws-motor-club.pages.dev (deployed 2026-08-17, migration first, then code). Real data: 8,136 customers, 10,733 registrations β€” 10,717 live plus 16 recorded as cancelled β€” after the Dec-2025 β†’ Jul-2026 statement backfill (1,141 added, 144 repaired) and the 2026-08-18 AppSheet enrichment: 1,331 VIN-less legacy rows matched back to their AppSheet source (999 by contract number), every recovered VIN decoded to year/make/model, December-2025 cleared of its 123 double-counted placeholders, and 570 duplicate customer records merged so each person holds ALL their products on one profile. Remaining known specks: 8 rows whose AppSheet match was ambiguous, 4 VINs NHTSA cannot decode, 44 vehicles whose two products carry different surnames (family members or resales β€” left for human review). The live app is behind per-person login (Β§1.5): approved people only, each with their own password. Default theme is the ✨ New look (gloss-black shield, v0.5.0); ↩ Classic is one click away in the sidebar foot. Every registration carries a decoded year/make/model (v0.5.3). 30 claims ($9,831.10 paid β€” the AppSheet claims history landed 2026-08-18: 11 new claims imported, 12 legacy claims corrected for a doubling bug in the old master workbooks where the same amount sat in two columns, and 12 claims now correctly showing in progress per the dealer), 1 dealership (Mercedes-Benz of South Orlando), 14 F&I managers, 19 note activities carried over from AppSheet.

Version is single-sourced here. APP_VERSION in web/index.html (the badge + refresh prompt), package.json, this Status line, the top of Β§10, and the deck (web/features.html) must all read the same number. They drifted five ways once (badge v0.5.2 / Status v0.5.0 / changelog v0.5.3 / package.json 0.4.0 / deck v0.4.1) β€” if you bump one, bump all five. Two things only land after a command: the badge reaches users after npm run deploy, and the hub copy of the doc + deck only refreshes after node build.js && npx wrangler deploy in F:\Claude Code\docs-hub.

Brand palette (from the AWS logo): gloss black #101214/#17191c, silver #9ba1a6, bright green #63b32e (accents/active states), white cards.


1. Run / develop

1.5 πŸ” Who can get in (v0.6.0, todo_1095)

The app used to sit behind ONE shared device key: anyone holding it was in, and the app could never tell who did what. That is gone. Access is now per person, and the account list is a closed allowlist β€” there is no self-registration anywhere in the app, so a stranger with a valid-looking email cannot create anything.

2. Business rules (the important numbers)

Term length comes from what the product cost the DEALER (term_rules table):

ProductDealer costTerm
TireGuard$2993 years
TireGuard$1991 year
GlassGuardany1 year (product default, no price rules)

3. Data model (SQLite, server/db.js)

4. API (all JSON, server/api.js)

5. UI tour (web/index.html, vanilla JS, hash-routed)

6. Integration seams (not built yet)

7. Spreadsheet import (DONE 2026-07-03)

Both master lists (intake/*.xlsx, sheet "MASTER For APP") imported by deploy/import-masters.js using deploy/lib/xlsx-lite.js (zero-dep xlsx reader; needs the file expanded as a zip first). Columns are located by header title, not position. Actual layout (identical in both files): Dealership Β· Deal Date Β· Deal Number Β· VIN Β· F&I Manager Β· Customer Name (one full-name column, ALL CAPS, sometimes company or bare last name) Β· Dealer Cost Β· Sale Price Β· Dealer Profit Β· Term Β· "TG Customer #" (β†’ contract_no) Β· Status Β· Date of Last Claim or Service Β· Customer Email/Phone/Address Β· Notes Β· 1st–5th Service or Claim Amount Β· Total Amount Paid Β· Claim In Progress (Β· Front/Rear Tires, TireGuard only, empty).

Import rules that matter:

Known source-data quirks (imported faithfully, worth cleaning over time): junk contact cells (e.g. an email of "51"), a handful of future deal dates (e.g. 2026-12-01), GlassGuard dealer costs vary ($185 dominant, $399/$599 strays β€” all 1-yr by product default, so harmless).

8. OPEN ITEMS FOR TYLER

  1. Pick the comms provider (Twilio or Telnyx β€” Grasshopper has no API, see Β§6) and open the account. The comms hub is built and logging; wiring real send/receive is the next big piece, and everything stays in-app with no tel:/sms: bouncing.
  2. The roadside contacts currently "saved to phones" β€” send them in any format.
  3. ~~AppSheet-only notes~~ DONE v0.5.3 β€” Tyler supplied the export and all 17 notes matched in (6 new). Still outstanding: photos. None are embedded in the AppSheet export, so any per-customer images still live only in AppSheet and need their own route out.
  4. Auth model before hosting: single shared access key (Flip CMS style) or per-user logins?
  5. The 586 sheet-vs-computed status mismatches + future-dated deals: the app shows computed truth; flag any specific contract that looks wrong.

9. TODO board

Done items are deleted, not left sitting here looking open. Shipped and gone: real-data import (v0.3), the Cloudflare Pages + D1 port (v0.4/v0.4.1), geocoding (v0.4/v0.4.3), VIN decode and the AppSheet notes import (v0.5.3), and the styled breakdown mirror β€” superseded by the live /breakdown twin.

10. Changelog

Newest first. Every entry is ONE source line on purpose β€” the hub's renderer is line-based and a wrapped bullet shreds the list (see the note at the top of this file).

Renumbering note (reconciled 2026-07-26, todo_1086): two releases had been given numbers that were already taken. v0.5 (2026-07-04, mobile build-out) collided with v0.5.0 (2026-07-17, the New Look), and v0.5.1 was held by both the 2026-07-05 Google Places release and the 2026-07-17 bug-button sweep. The 2026-07-17 numbers are baked into shipped code (web/index.html comments read "NEW LOOK (v0.5.0, todo_682)") and into board todos 682/727/731, so they kept their numbers; the two earlier releases moved down into the v0.4.x line, where they also sit correctly by date. v0.5 β†’ v0.4.4 and Google Places v0.5.1 β†’ v0.4.5. No release was deleted and none changed content.
Rendered from AWS Motor Club/APP_BREAKDOWN.md Β· this page is generated β€” edit the markdown, not the HTML
print this page for a PDF