Skip to content

Dealership Intel

Repo: savvydealer-adam/dealership-intel · Path: C:/Users/adam/dealership-intel · Owner: Adam Status: Active dev · % Done: 70 · Last commit: 2026-03-24 Deployed: local Streamlit (not a public-facing product)

What it is

Internal sales-intelligence tool. Crawls OEM dealer locators and dealer websites to extract staff contacts, platform, inventory counts, social links, and review scores — then pushes enriched records into the AI CRM.

Why it exists

Apollo and Rocket Reach don't know dealerships. We built a purpose-built crawler for automotive rooftops so SavvyDealer's sales team always has a fresh, accurate prospect list by OEM and region.

How it works

Stack: Python + Streamlit, Playwright + nodriver (stealth crawling), Apollo.io API (fallback), Gemini (enrichment fallback), AI CRM REST API, direct Supabase/Postgres for bulk inserts. - app.py — Streamlit entry; multi-page UI under pages/ - crawlers/ — browser pool, stealth layer, staff crawler, contact/platform/inventory extractors - audit_brand.py — primary OEM-vs-CRM diff tool; creates groups, adds missing dealers, marks stale as Inactive - OEM JSON files seeded per brand (Ford 3503, Honda 1069, Nissan 1052, Kia 794, Mitsubishi 299) - enrich_dealers.py — batch enrichment; batch JSON files batch10_contacts.jsonbatch31_contacts.json captured - CRM sync via X-API-Key header, key rotates — pulled from GCP Secret Manager (SERVICE_API_KEY in savvydealer-website)

What's done

  • 5 OEMs scraped (Ford, Honda, Nissan, Kia, Mitsubishi)
  • Staff contact extraction with role classification, email/phone validation, confidence scoring
  • Platform detection (DealerOn, Dealer.com, DealerInspire, DealerFire, etc. — strict signatures, no dealer.com default)
  • CRM sync + dedup scripts
  • 4-phase cleanup plan: Phases 1–2 done (audit + clean)

What's next

  • Phase 3: enrichment (fill contact gaps via Apollo + Gemini)
  • Phase 4: dedup across OEMs and regions
  • Add Toyota, Hyundai, Mazda to the OEM crawl roster
  • Background scheduler instead of manual Streamlit runs

Where the code lives

  • Entry: app.py, pages/1_Process.pypages/4_Settings.py
  • Crawlers: crawlers/
  • Audit: audit_brand.py
  • Config: config/settings.py, config/platforms.py
  • OEM data: ford_official_dealers.json et al.

Integrations

  • AI CRM — destination for enriched dealer/contact records (https://ai-crm-isbpcosoxa-uc.a.run.app/api)
  • Apollo.io — fallback contact enrichment
  • Gemini — AI fallback for hard-to-parse pages
  • Supabase — bulk enrichment inserts

Don't rebuild this — extend it

Any dealer/contact prospecting pipeline belongs here. Do not re-crawl OEMs in another repo — add a brand scraper under crawlers/ and an audit_brand.py path.