Overview
- Context
- A fictional home renovation company, Harbor & Pine Renovations, receiving inquiries from a website form. All records are synthetic.
- Industry
- Home services (fictional)
- Engagement
- Technical demonstration built for this portfolio
- Status
- Interactive technical demonstration
My role
- Designed the qualification logic and the routing rules
- Built the interactive simulation and its tests
- Wrote the reply templates and the review step
Technical stack
- TypeScript
- React
- Rule-based scoring
- GoHighLevel (target CRM)
- OpenAI or Claude (optional extraction step)
The problem
Inquiries arrive with missing details, duplicates and very different budgets and urgency. Staff spend time sorting them, the best leads wait as long as the worst, and replies are inconsistent.
Requirements
- Reject incomplete or invalid submissions with a clear reason
- Detect existing contacts instead of creating duplicates
- Classify fit and urgency with rules that a business owner can read
- Draft a reply, but require human approval before anything is sent
- Route qualified leads to booking and others to nurture, and record each step
Solution architecture
Each lane is one workflow, in the order it runs.
Intake
- Form submitted
- Validate fields
- Duplicate check on email and phone
- Create or update CRM record
Qualification
- Score service fit
- Score budget and urgency
- Classify: hot, warm or nurture
- Pick next action
Response
- Draft reply from template
- Human review queue
- Approved reply sent
- Booking link or nurture sequence
Tracking
- Pipeline stage updated
- Owner notified
- Reporting event recorded
Implementation details
Validation first
The intake step checks required fields, email format and phone length before anything else runs, and returns the exact reason when it rejects a submission.
Duplicate detection
Email is normalised (case and whitespace) and phone numbers are reduced to digits before matching against existing records, so “Ann@Example.com ” and “ann@example.com” are the same contact.
Transparent scoring
Qualification is a set of weighted, readable rules (service fit, budget band, timeline, automation needs) that produce a score and a band. In production, an AI step can extract these fields from free text; the decision rules stay readable.
Human in the loop
The system drafts a reply but never sends it on its own. A reviewer approves or edits it, which is where most AI lead systems should start.
Try the system
AI Lead Qualification
Score a sample inquiry and see why. No AI API is called.
Qualification
The score, the reason behind every point, the recommended next action and a draft reply appear here.
Testing and quality assurance
- Unit tests cover validation, duplicate matching and every scoring band
- The demo has a reset button and runs entirely in the browser
What it demonstrates
This is a demonstration, so there are no client results to report. It shows the logic, safeguards and failure handling I build into production systems: reject incomplete or invalid submissions with a clear reason; detect existing contacts instead of creating duplicates; classify fit and urgency with rules that a business owner can read.
Evidence
Working demo
Try it below. No data leaves your browser.
Source logic
Scoring and validation rules are unit tested in the site’s repository.
Lessons learned
- Keep the decision rules readable even when AI does the extraction, so owners can see why a lead was routed.
- Start with drafting plus approval; widen automation only once results are proven.
Related services
Want a lead system like this inside your CRM?
Discuss your lead flow


