Shipping an estimator is the easy part. Keeping every request safe, traceable, and easy to follow up on is the real work.
What changed after the MVP
Once the estimator was live, I focused on three upgrades:
- Persistence so every conversation is saved
- Notifications so new requests are actioned quickly
- Visibility so I can track status and outcomes
Data capture and storage
I moved messages into a lightweight database and created a single lead record that ties together contact details, estimates, and any screenshots.
The stack:
- Vercel Blob for persistent message storage
- Vercel Postgres for lead records and request metadata
- Each screenshot is stored as a blob with a unique ID, referenced from the lead record
Admin tooling
The admin dashboard keeps follow ups simple. It supports:
- status updates (New → In Review → Contacted → Qualified → Closed)
- transcript review with the full chat history
- quick contact actions (email client integration, copy lead data)

Notifications
New requests trigger an email via Resend with:
- Lead name and project summary
- Link to the full conversation
- Quick-action buttons to update status
This ensures nothing falls through the cracks, even if I'm away from the dashboard.
What I'd do differently
The MVP was intentionally lightweight, but in hindsight I would add:
- Request tagging from the start (e.g., "e-commerce", "SaaS", "marketing site")
- A quick-notes field for context that doesn't fit in chat
- Automated status updates based on user actions
These improvements turned a useful MVP into a reliable lead pipeline.