Skip to content

Case Study / Built in-house

We automated our own
lead follow-up.

Every agency says it is different. We were following up leads by hand, same as everyone. So we became the first tenant of our own operating system and pointed Joseph at our funnel. This is what we built, what it does, and where we held back on purpose.

The problem

Joseph started as a dashboard. A nice one, but a dashboard. It showed the pipeline. It did not move it. Leads came in through a scan, a brief, or a chat, and then a human had to remember to look, score in their head, and follow up before the interest cooled.

When I grew ILAC enrollment eight times over, I was in the room. I was the system. I caught the signal, I made the call, I closed the loop. That works right up until it does not, because a founder in the room does not scale, and the leads that arrive at 11pm on a Friday do not wait for Monday.

The honest version of the problem: we had real intake and no real follow-up discipline. The fix could not be another tool we forget to open. It had to run on capture, on its own, and tell us only when a human was actually needed.

The room does not scale. The system has to be the room.

How Joseph was wired in

Step 1

Catch the lead wherever it lands

Most agencies have one form. We had three doors: a public site scan, a Nadia brief, and a start-chat. The trap is three doors with three inboxes. So all three call one function and write one record keyed by the email. Scan someone, then have them chat, and it is still one lead, not three.

Step 2

Score it the moment it arrives

The record is scored on capture, not on a Monday review. Domain quality, source intent, how weak their current site scored, how severe the gap is, and any prior engagement. That produces a number and a temperature. Hot, warm, or cold is decided by code, not by mood.

Step 3

Make hot mean something

A hot lead is not a row that waits. It fires a realtime alert to the operator within seconds and kicks off an enrichment pass. The alert is deduplicated for thirty minutes, so one excited prospect refreshing the page does not turn into ten pings.

Step 4

Put it where the money is counted

Every captured lead is mirrored into the revenue view the same instant it is created. Before this, a chat lead that never escalated to a brief was invisible on the money board. Now the board is the truth, and Joseph reads from it.

How a lead gets scored

The number is not a guess. It is the sum of five bands, capped at 100. Seventy and up is hot, forty and up is warm. These are the real weights the code uses.

Domain quality

0 to 25 pts

Real company domain, business email over a free inbox.

Source intent

0 to 20 pts

A booking beats a scan beats a chat beats a newsletter subscribe.

Scan signals

0 to 30 pts

The weaker their current site scores, the higher the opportunity.

Gap severity

0 to 15 pts

Positioning, conversion, and lead-generation gaps weigh the most.

Engagement

0 to 10 pts

Opens and clicks on prior outreach add late signal.

Results

One honest caveat first. Beonbrand runs this as a solo-founder tenant, so the headline is not a sales-team ARR chart. It is follow-up discipline: how fast a lead is caught, scored, and contacted, and how little of that needed a human.

Apr to Jun 2026 · illustrative sample · live Firestore figures replace these at launch

63

Leads captured

Across all three intake paths. Split: 28 scan / 21 brief / 14 chat.

37%

Scored hot on arrival

Decided by the intake score, the moment the lead landed.

100%

Hot leads contacted under 24h

Without manual triage. The alert and enrichment pass ran on capture.

Under 9s

Capture to operator alert

From lead written to operator pinged. Deduped for 30 minutes.

24

Dropped-intent clicks caught

Clicked the diagnostic CTA and did not book. Previously invisible.

Show your work

None of this is a slide. Every claim above maps to a file you could open. Here is the mechanism and where it lives.

Three intake paths, one record

scan-site.ts · nadia-brief-lead.ts · _leads/priyaPipeline.ts

A site scan, a Nadia brief, and a start-chat all call the same upsertLead() and converge on one deterministic lead record. No duplicate leads under load.

Deterministic scoring

_leads.ts · calculateIntakeScore()

Each lead gets a 0 to 100 score from domain quality, source intent, scan signals, gap severity, and engagement. 70 and up is hot, 40 and up is warm.

Realtime hot-lead alert

_runtime/hotLeadAlert.ts · alertHotLead()

When a lead crosses into hot, the operator is pinged in seconds. The same alert is deduplicated for 30 minutes so one lead never spams the channel.

Pipeline visibility

_workflowLeads/capture.ts · writeCapturedWorkflowLead()

Every captured lead is mirrored into the money pipeline view, so a chat lead is never invisible on the revenue board.

Dropped-intent capture

cta-lead-trail.ts

Clicked the diagnostic CTA but never booked? That intent is written to a trail, so the gap between click and booking stops being a blind spot.

Joseph surfaces it

useFounderHomeSnapshot.ts · JosephMoneyPanel.tsx

Asking Joseph who is in the pipeline pulls live data from the same store, not a fabricated number. When data is absent, it says so.

Live walkthrough

A short recording: a real scan, the lead getting captured and scored, the hot alert firing, the revenue board updating, and Joseph answering who is in the pipeline. No edits, no narration tricks.

Walkthrough pending

The recorded walkthrough is being captured. It will appear here as a Loom embed: scan to capture to hot alert to revenue board to Joseph.

What is on, what we held back

The most honest thing a system can do is tell you what it is not doing yet. Here is the line, drawn on purpose.

On

Capture, scoring, alerting, money-pipeline visibility

The full intake-to-visibility path runs in production. Leads are captured, scored, alerted, and mirrored to the revenue board today.

On

Joseph conversational replies

Joseph answers in natural language about the live pipeline. This is on, reading from the same store the board reads.

Held

Autonomous tool execution and live drip sends

The runtime tool-loop and live drip email sends are built and instrumented but held behind a founder switch. The infrastructure is ready. We have not opened the live-send tap. That restraint is deliberate, not a gap.

What we would do differently

Calibrate scoring to the real deal pattern

The score is a strong first cut, but the weights are a hypothesis until enough deals close to confirm them. The fix is to tune the bands against which leads actually became revenue, not against what felt important on day one.

The dropped-intent trail was the surprise

The most useful thing we added was not the alert. It was capturing the click that never became a booking. That gap was completely invisible before, and it is where the easiest follow-ups live.

Keep the human on proposals, not intake

Automating intake was the right call. Automating the proposal would not be. The system should clear the noise so a person spends their judgment on the moment that needs it, which is the offer, not the inbox.

We can build this for your team.

Start with the diagnostic, or run a scan on your own site and watch the first step happen to you.