I've been doing freelance web dev for a while now. And the hardest part was never the actual work, it was finding the clients.
Cold email felt random. LinkedIn outreach was slow. Bought lead lists were garbage. And every "lead gen tool" I tried was either too expensive, too bloated, or built for sales teams of 20+.
So I did what engineers do. I built my own.
That's how Prospkt was born.
The Problem (For Real This Time)
Here's what the process actually looked like before Prospkt:
- Manually search Google for local businesses in a niche
- Open each website one by one
- Try to figure out if they even need a new site
- Find contact info somewhere buried on the page
- Write a cold email from scratch
- Repeat 50 times
It wasn't unworkable. It was just slow. And inconsistent. And exhausting.
What I really wanted was: give me a list of businesses that are likely to need help, with enough context to reach out intelligently.
That's the gap Prospkt fills.
What Prospkt Actually Does
At its core, Prospkt is a lead prospecting tool built for freelancers and small agencies.
You tell it what kind of businesses you're targeting and where. It finds them, scores them, and gives you actionable outreach starting points, call scripts, DM templates, email copy, all generated based on that specific business's signals.
The lead scoring isn't arbitrary. It's weighted across real signals:
- Website quality: Is it outdated? Mobile-broken? Slow?
- Google PageSpeed score: Pulled from the free PageSpeed Insights API
- Online presence gaps: Missing socials, no Google Maps listing, etc.
- Business category: Some niches have higher conversion rates for web services
A business with a broken mobile site, a 34 PageSpeed score, and no Instagram? That's a Hot lead. A business with a clean Webflow site and active socials? Probably Cold, they're already handled.
The output isn't just a list. It's a pipeline, organized by temperature, with context attached.
The Stack (For the Devs)
Frontend: TanStack Start + Tailwind v4 + Shadcn UI
TanStack Start is still relatively new but it's genuinely good for full-stack apps. Server functions feel clean, and the routing is solid. Tailwind v4 took some adjustment, the config approach changed, but once it clicked, it's fast to work with.
Database: MySQL via TiDB + Drizzle ORM
TiDB gives you MySQL-compatible distributed SQL with serverless scaling. Drizzle was the right call here, it stays close to SQL without the overhead of Prisma, and TypeScript inference is great.
Auth: Better Auth
Straightforward to set up. Handles sessions well. No complaints.
AI: Gemini Flash via @tanstack/ai
Used for generating the outreach scripts. Gemini Flash is fast and cheap at this scale. The @tanstack/ai integration kept it clean, no separate API layer needed.
Lead Data: Google Places API with aggressive field masking
This is where cost control matters. Google Places can get expensive fast if you're not careful. Field masking, only requesting the specific fields you need, keeps the cost around $16 per 1,000 requests instead of the default rate.
Website Analysis: Server-side fetch + PageSpeed Insights API
No headless browser. Just a plain server-side fetch to crawl the business site and pull signals. PageSpeed Insights is free and gives you a reliable performance score without any scraping complexity.
Deployment: Netlify (Functions + Background Functions)
The standard API routes run as regular Netlify Functions. The heavier stuff, crawling, scoring, AI script generation, runs as Netlify Background Functions, which give you up to 15 minutes of execution time. That's the key reason Netlify worked here: the lead pipeline isn't fast enough for a standard serverless timeout.
What I'd Do Differently
I over-engineered the scoring model early.
I spent time building a weighted scoring system before I had real data to validate the weights. It works, but the weights are still educated guesses. I should've shipped with simpler bucketing (good site / bad site) and iterated from there.
The outreach scripts needed more context.
The AI-generated scripts are good, but "good" isn't the same as "personal." A cold call script that mentions a specific broken button on their contact page converts better than one that just says "your website needs improvement." I knew this going in but underestimated how much it mattered.
I should've validated demand before building the full pipeline.
I built the whole thing and then launched. Classic mistake. A simple landing page with a waitlist would've told me a lot before I wrote a single line of code.
What's Next
Prospkt is live. It's early. No big user numbers to report, that's just the reality of launching something new.
The next focus is distribution. Cold outreach (using the tool itself, which feels right), content, and getting it in front of freelancers and small agencies who are actively hunting for clients.
If that's you: check it out at prospkt.app.
And if you've built something similar or have thoughts on the lead scoring approach, I'm genuinely interested. Find me on LinkedIn or X.
I write about building products, freelancing, and shipping things as a solo dev. Follow if that's your thing.
