Competitive Dashboard¶
Repo: savvydealer-adam/competitive-dashboard · Path: C:/Users/adam/competitive-dashboard · Owner: Adam
Status: Live · % Done: 95 · Last commit: 2026-04-15
Deployed: https://comp.savvydealer.com
What it is¶
Viato-style competitor pricing and inventory intelligence for dealers. Each customer sees how their inventory stacks up against their real local competitors on price, days-on-lot, and sales velocity — with weekly PDF reports emailed automatically.
Why it exists¶
Dealers pay Viato, vAuto, and similar tools four and five figures a month for this intelligence. Competitive Dashboard delivers a focused slice of it as a SavvyDealer product — priced and scoped for dealer-group reality.
How it works¶
Stack: Python 3.12 + FastAPI + asyncpg, React + Vite client, Playwright + playwright-stealth 2.x scrapers, Supabase Postgres (jnfzzgycrmwfqzdxpzot), APScheduler, ReportLab + Resend, optional Gemini analysis, Cloud Run.
- Per-platform scrapers in server/services/scrapers/ covering savvy_api, dealer_inspire (CarsCommerce + Algolia fallback), dealer_com, dealeron, jazel, team_velocity (Apollo/Akamai-protected), dealer_car_search, autofunds, nabthat
- Scoring pipeline with cross-scraper model normalization; shared SQL helpers in services/comparison.py
- Two stealth patterns: Stealth().use_async(async_playwright()) (the only one that defeats Akamai) and the legacy apply_stealth_async (Cloudflare-only)
- Reads/writes via Supabase REST API (direct Postgres is broken on Windows); server-side uses asyncpg
- APScheduler handles daily pipelines + weekly report email
What's done¶
- 9 platform scrapers live, including Akamai bypass for
team_velocity(Gator Ford, etc.) - Executive summary + weekly PDF report email via Resend
- Bob Weaver + Elmer Hare competitor setup (session 2026-04-13)
- Scrape-alert banner with expandable failing-dealer list (2026-04-15)
- Strict platform detection (no dealer.com fallback — confirmed anti-pattern)
What's next¶
- Onboard remaining 23 clients that don't yet have competitors mapped
- Migrate the legacy scrapers to the Akamai-safe stealth pattern as platforms tighten
- Expand cross-scraper normalization edge cases (trim/model fuzziness)
Where the code lives¶
- FastAPI entry:
server/main.py(or equivalent underserver/) - Scrapers:
server/services/scrapers/ - Comparison SQL:
services/comparison.py - Scheduler: APScheduler bootstrap in
server/ - Deploy:
cloudbuild.yaml,Dockerfile
Integrations¶
- Savvy API — canonical customer inventory + sellingPrice (never Google Sheets)
- Supabase — scraped inventory store
- Resend — weekly PDF delivery
- Gemini — optional AI commentary
Don't rebuild this — extend it¶
All competitor-pricing and dealer-vs-dealer comparison features live here. New scraper? Add a platform_type in server/services/scrapers/ — do not spin up a side scraper repo.