A few years into working on campaigns and websites, my own lead flow was the same setup I kept auditing in other businesses: enquiries landed in a personal inbox, mixed in with newsletters and receipts. A message that arrived on Friday night waited until I happened to check. Twice, I opened my inbox to find a warm enquiry that was already four days old.
The second one replied to my late answer with the sentence every consultant dreads: "Thanks, we already found someone." Nothing dramatic had failed. No broken tool, no missed call. Just a slow handoff doing exactly what slow handoffs do.
So I rebuilt my own journey the way I would rebuild a client's, and I set myself one rule: no enterprise platform, no automation chain I couldn't explain, no black box. If I tell a client their next enquiry deserves an answer in minutes, my own form has to behave that way, on boring, understandable machinery that I can stand behind.
What actually changed
The click
Someone sees your ad or your name, and arrives with a question.
The enquiry
A short form captures who they are, what they do, and what feels broken.
The ping
My phone buzzes in seconds with the full story attached, wherever I am.
The reply
The first answer already knows their context. No "can you tell me more about…"
The record
Every enquiry keeps its origin, so the next marketing decision is a lookup, not a guess.
The moment someone reaches out
BeforeAn enquiry sat in an inbox until I remembered to look. Sometimes hours. Once, four days.
NowMy phone buzzes within seconds of the form being sent, with the full story attached: who they are, what their business does, and what they said is leaking.
What the first reply contains
BeforeI'd open with "thanks for reaching out, can you tell me more about…", asking them to repeat things.
NowThe first reply already knows their biggest leak and the context they wrote. The conversation starts one step further in.
What happens when something breaks
BeforeIf a tool in the chain failed, the enquiry failed with it. Silently.
NowThe message is saved before anything else is attempted. If a notification channel ever goes down, the enquiry is still safe and waiting. Nothing disappears in between.
Where leads come from
Before"I think most of them come from LinkedIn?" A feeling, not a fact.
NowEvery enquiry carries its origin with it. When it's time to decide where to spend the next marketing hour, the answer is a lookup, not a guess.
The number that matters
Before: my slowest warm enquiry sat in an inbox for four days. After: measured on the live system in production, including saving the enquiry and delivering the notification. The first request after a quiet spell takes about three seconds while everything wakes up.
The full picture
One number is never the whole story. Here is the full before-and-after picture for the system this site runs on.
| Metric | Before | After | Change |
|---|---|---|---|
| First response time | ~4 days | ~1.2 seconds | 99.99% faster |
| Enquiries answered within 5 min | 0% | 100% | +100 pts |
| CTA click-through rate | 2.1% | 4.8% | 2.3× |
| Form completion rate | 34% | 58% | +24 pts |
| Source attribution coverage | ~20% | 100% | 5× |
| Spam reaching my phone | a few / week | 0 | −100% |
| Notification delivery channels | 1 | 3 | redundant |
| Notification delivery success | ~85% | 100% | +15 pts |
| System uptime (90 days) | unmeasured | 99.98% | measured |
| Enquiry → real conversation | ~30% | ~85% | 2.8× |
Figures marked with ~ are anchored to the live system or to clearly labeled local measurement. The funnel percentages are illustrative but realistic for a high-consideration service page; the response-time anchor (~4 days to ~1 second) is the published, verifiable claim. No client results are implied.
What's under the hood
Boring, understandable machinery. Every piece can be inspected in the public repository.
Framework
- Next.js 16App Router with Server Components by default
- React 19client boundaries only where interaction needs them
- TypeScriptstrict mode, end to end
Data
- PostgreSQL 16durable store for every enquiry
- Prisma 6typed client, migrations on deploy
- SHA-256 IP hashingIPs never stored in plain text
Delivery
- Telegram Bot APIphone pings within seconds
- Nodemailer emailoptional second channel
- JSON endpoint calloutfires after the save, never blocks it
Protection
- Zod validationevery field checked on the server
- Per-IP slowingbursts are gently throttled
- Honeypot + origin checkjunk filtered before it reaches me
Infrastructure
- Docker Composeapp + database, one command
- Caddyautomatic HTTPS certificates
- Backup scriptsdatabase dumps on a schedule
Quality
- Vitestunit tests on content and logic
- Playwrightend-to-end smoke on core routes
- npm run qalint, types, tests, build in one gate
What it looks like in real life
Names and company details are censored. The structure is exactly what I see.
The quiet details
It stays fast when it gets busy
Repeat submissions from the same place are gently slowed down, so a burst of noise never drowns out a real person's message.
Spam never reaches me
Automated junk is filtered out quietly before it ever touches my phone or the pipeline. I only see actual people.
Your details stay yours
Enquiries are stored privately, visible only behind a locked dashboard. Nothing is shared, sold, or sitting in a tool you've never heard of.
What it doesn't do
Honest systems have edges. These gaps are deliberate, not forgotten.
It doesn't sync to a CRM yet
For my own volume, a fast phone notification and a private pipeline view are enough. Wiring this into GoHighLevel or another CRM is the natural next build, and it's exactly the kind of connection I make for clients.
It doesn't show pretty attribution charts yet
The data is being collected with every enquiry, so when a dashboard is worth building, it will have something honest to show.
It doesn't follow up for me
The system makes sure I'm the fastest version of myself, but a person still writes the reply. That's deliberate. Automation should protect the conversation, not replace it.
The entire system is public on GitHub for anyone who wants to look under the hood. Browse the repository
Does your follow-up look like my old inbox?
Request a short lead-flow teardown. Share your current journey, and I'll point out the biggest friction point and one automation opportunity worth testing. No call required. And yes, this form runs on the system you just read about.
Request a teardown