The communications layer
your BDC actually works in.
AI-mediated inbound and outbound across email, SMS, voice, and your embedded website chat — grounded in your real inventory and offers, built for operators who run the queue eight hours a day.
- Channels
- 4
- email · sms · voice · web
- LLM safety guardrails
- 6
- enforced per channel
- Tenant isolation
- strict
- per-owner_id keying
- Status
- alpha
- design-partner pilots
Twelve seconds. Empty queue to closed deal.
A real loop of what an operator sees over the course of one lead. Every element here is the same primitive used in the production console.
The queue is clear. No callbacks waiting.
Marcus Chen · 2024 RAV4 XLE · test drive booked Tuesday 10:00.
live · loops every 12s · respects prefers-reduced-motion
One screen. The queue, the metrics, the calls.
Today's queue
Awaiting callback. Two flagged before noon.
Five surfaces, one console.
Inbound email pipeline
SendGrid Inbound Parse → multi-stage AI safety chain → reply. Idempotent against retries. Inventory-grounded responses pulled from your real stock.
Outbound campaigns with AI targeting
Describe the audience in English ("everyone who asked about a RAV4 in 30 days and never replied") — the assistant translates to a typed Supabase query. Operator confirms before any send. A/B variants built in.
Embedded chat widget
One <script> tag on your site. Shadow-DOM widget renders inline (not iframe) so host-page CSP can't block it. Per-widget Origin allow-list gates abuse.
Lead pipeline
One lead row per customer, captured from any channel. Keyed by email-or-phone (never both — shared landlines don't merge customers). Conversation history per channel; scoring + next-followup live on the row.
Voice (Twilio + personaplex)
Inbound voice via Twilio, STT + intent extraction in-app, voice cloning via a separate FastAPI service. Disclosure prompts wired in.
All 5, deeper.
Capabilities, file paths, and the safety machinery behind each surface.
What "production-grade" actually looks like.
Strict per-owner_id keying
Every query scopes by owner_id. The lead-lookup helper keys by one of email or phone — never both — so two customers sharing a phone line do not get merged. Supabase RLS plus explicit filters in the bypass paths.
No hallucinated cars
Smart-component blocks render only when the inventory match clears a confidence threshold. If the dealership doesn't stock the matching vehicle, the block is dropped — not filled with a placeholder.
Guardrails tied to evals
Each LLM safety directive in lib/prompts/*.ts cites the eval-baseline failure that motivated it (no APR quotes, no trade-in dollars, brand deflection, only-facts-provided). Audit reports live in the repo.
Built for the four people in a dealership BDC.
Functional alpha. Ready for design-partner pilots with a human in the loop.
The AI safety pipeline is rigorous; the multi-tenant boundary is clean; the messaging paths are wired to real services. Reporting is wired but not yet backed by real metrics, an operator inbox is the next major build, and we have not yet scale-tested past a single Vercel instance.
We say all of this in the open because dealerships have been burned by AI tools that promise more than they ship. For the engineering deep dive — including what we don't do yet — read product.md or open the security page.
Built by a dealer, for dealers. Operating from Frontier Toyota — the BDC team building Plenfi is the same one running it.
Run a real BDC week with us.
A pilot is one dealership, one channel turned on, two weeks of operator feedback. We learn what your reps actually need; you get a working inbound + outbound surface backed by a human-reviewed AI safety chain.