Overview
I built the backend API and the staff CRM dashboard for Wisco Home Buyer, a cash home-buying business in Wisconsin, and worked on the public website with a teammate. Sellers fill in an eight-step form, the system scores each lead and enriches it from county records, and the team manages leads, cash buyers and wholesale listings from one dashboard.
Problem
A cash home buyer lives on speed. Sellers who fill in a form are only valuable if someone calls them quickly, and the best sellers are often not even asking: they are absentee owners nobody has contacted. Without a system, leads sit in inboxes, nobody knows which one is hot, and property facts are looked up by hand.
Approach
I built one platform in three parts. The public site collects a seller's details in an eight-step form. The NestJS API scores and prioritises every lead, adds property and owner facts from public county records, and alerts the team in real time. The dashboard gives staff a pipeline, buyer list, listings and analytics, and a nightly job finds new leads on its own.
Outcome
- API endpoints
- 89
- Database models
- 17
- Migrations
- 15
- Dashboard pages
- 21
- User roles
- 4
- Lines of TypeScript, API and dashboard
- ~33k
What I built
- Seller intake: an eight-step form (address with map, contact, details, condition, occupancy, timeline, photos, review)
- Automatic lead score from 0 to 100 and a high, medium or low priority
- Enrichment from county public records, with property value and comparable sales shown to the seller
- Nightly job that finds absentee-owner properties in three counties and creates new leads
- Lead pipeline from new to closed with assignment, notes, offers and a full activity history
- Cash buyers list with consent, service areas and CSV export
- Wholesale listings with photos, price and video, set as public or private
- Notify buyers by email and an I am interested form that alerts the team
- Overview dashboard with revenue, conversion, pipeline and priority charts
- Real-time notifications over Socket.IO, including a repair-issue alert
- Team invites by email, four roles and refresh-token sign-in
- Database backup and restore for the super admin, rate limiting, Helmet and Swagger docs
Architecture
System architecture
Seller lead intake and scoring
Nightly lead finder
Access control
Wholesale listings
Engineering decisions
01Score the lead on arrival
A simple, explainable rule (50 plus condition, timeline and occupancy) gives every lead a number at once. Staff open the hottest ones first, and the rule can be tuned without changing the form.
02Public records as the source of truth
The client chose county records for owner and tax facts. The API reads them directly and treats the paid property-data service as optional, so the business does not depend on it.
03Absentee owners are the signal
An owner whose mailing address differs from the property is a likely motivated seller. The nightly job prioritises them and skips properties already in the system.
04Deny by default
Every route needs a valid token unless it is marked public, and there are only a few public routes. A forgotten guard fails closed instead of open.
05Rotating refresh tokens, hashed
Refresh tokens are stored hashed and replaced on use, so a leaked database does not hand out working sessions.
06Buyers are emailed only with consent
A buyer receives deal alerts only if they agreed when they signed up. The data model records consent next to the contact.
Need something similar?
Tell me what you are building and I will reply within one working day.



