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
A contractor company's portal on demo data: what was delivered this week, spend against its cap, credits pending, the next statement, what needs attention and the newest deliveries with their credit windows.The same company's portal overview on a phone, on demo data.
A company's view of the portal, on demo data.

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.

566
by AI call scoring, my own calls included
36
weekly, written by AI
6,124
The offers page on demo data: an offer waiting for an answer, with the project type, area, appointment time, price and the time left to answer.The offers page on a phone, on demo data.

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.

about 589,000
retracted rows and other kinds left out
705,046
everything ever loaded
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