Lead Tracker CRM and voice stack
The system behind BuildSource, a California home-improvement lead business.
- Built for
- BuildSource LLC
- Role
- Founder
- Status
- In production
- Stack
- Next.js, React, TypeScript, Postgres on Supabase, Telnyx WebRTC, Stripe, Twilio, the Claude API, Fly.io


Remote callers worked their leads in this CRM, the office seats dial from a browser softphone, an AI receptionist answers the public line first, and the contractor companies on the other end get a portal, booking and billing. I shipped it, and I run it.
The size of the build
- lines of TypeScript
- over 600,000
- tests included
- commits
- 1,230
- migrations
- 162
- tables
- 173
- in the database behind it
The phone system
The office seats dial from a browser softphone: Telnyx WebRTC on a SIP credential connection, role-gated, with inbound ring lists, voicemail and per-line greetings.
An AI receptionist answers the public line first, around the clock, live since Sep 2026. Across the softphone and the AI line there have been 316 voice sessions, 51 of them answered by the AI.
Keeping the numbers clean
An outbound number is only as good as the label carriers put on it, so the system manages caller ID like a reputation: daily carrier-label sweeps, warm-up ramps for new numbers, and a dial ceiling on every seat.
I registered the numbers with the free caller registry the carriers' spam filters read, and filed the remediation myself when a number was flagged.
Graded calls, written coaching
AI call scoring grades calls against a written rubric, and the grades turn into weekly coaching reports.
Claude does that work, along with translation, summaries and extraction. The model for each task is chosen in settings, and the calls are logged.
- calls graded
- 566
- by AI call scoring, my own calls included
- coaching reports
- 36
- weekly, written by AI
- logged LLM calls
- 6,124


Portal, booking and billing
Contractor portal, appointment booking and billing in production. It serves a network of about 20 contractor companies, and each company on the portal has its own login.
A company sees an offer first, with enough to decide, then accepts the full lead or passes. Invoices freeze their lines when they are issued, and payments run through Stripe.
Links in emails and requests between the apps are signed with HMAC, and the portals reach the database only through functions: the read-only portal's role is granted only 3 functions and no table.
Offers: enough to decide, then accept the full lead or pass.
The data underneath
Leads start as public records, pulled into the same database the CRM runs on.
Numbers below the top data score get a live-line check before they reach a calling list, and the check's vendor won a bake-off: 13.5% dead numbers caught, 0.0% false positives.
A lead radar sweeps active leads for project-stage changes and owner-portfolio signals, then ranks a call sheet.
- records
- about 589,000
- retracted rows and other kinds left out
- rows ingested
- 705,046
- everything ever loaded
- public sources
- about 230
- that have fed a row
The calling floor
I hired over 12 remote callers (independent contractors, not employees) and managed 5 callers at once. They worked their leads in this CRM, and I built the tracking and payroll views that ran the floor.
Contact
For a role, a project or a question about anything here, email me.
An AI phone line that answers questions about my work.
- Call my AI
- (213) 635-1440
- Download
- Résumé (PDF)