Skip to content

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 under server/)
  • 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.