Case study
A prospecting engine that tells a sales team who to call, and why today
Leads found in French public data, scored out of 100, briefed by an AI that is not allowed to invent, and followed in a built-in CRM.
My role
This one is my own product, built with a first customer: a dealer of copiers and business telecom in France. I designed it and I write all of it, alone.
The situation
In this trade there is one real reason a company changes its copier or its phone supplier: the current contract is coming to an end. The product, the price and the pitch matter far less than calling at the right moment. A sales advisor with a list of company names has no way to know which of them is three months from that moment. So the job was never to write better sales messages. It was to find the timing, in data anyone can read and nobody has time to read, and put it in front of an advisor as a short list for today.
The constraint
Everything shown had to be real. Before writing any code I tested each data source with a real request and kept the answers. Two public sources I had planned on turned out to be unusable, so the plan changed before the build started. The rule since then: a field I have not seen in a real answer is never used in the code.
The AI could not be allowed to make things up. A call brief that quotes a wrong figure costs the advisor the call. The model only gets a fixed list of facts, has to write "unknown" when something is missing, and a check on my server throws out any brief containing a number or a name that was not in those facts.
Every outside service that costs money is capped per day and written to a cost log, so a busy team cannot run up a surprise bill.
What I built
One web app, in French, used from a phone or a desktop:
- Lead sourcing from public data. For companies, the app compares two snapshots of the French company registry and keeps what changed (a move, a new site, a change in headcount), each with its real date. For public buyers, it reads published procurement contracts and estimates when each one ends.
- A score out of 100 with its breakdown shown; 70 is the line for "qualified". Old and low-score leads age out, so the list refills itself.
- Only leads that can be called: each qualified lead is checked for a French phone number before it reaches the list.
- A call brief on any lead: why to call now, what is known and where it comes from, and an opening line.
- A built-in CRM: a sortable grid with saved views, cards on a phone, statuses, follow-up dates the AI proposes and the advisor decides, a daily call list, a planning view and a dashboard.
- Calls: tap to call, record on speakerphone after a legal notice or paste a transcript; the app drafts the call report and grades the call. The advisor edits and validates everything.
- Limits per user: an admin sets how many new leads each person may take per day, and a costs page shows what was spent.
The numbers
- 70 / 100the score a lead needs to count as qualified
- 46server endpoints behind the screens
- 101self-check cases in one script
- 209commits, 24 September to 9 November 2026
Every number above is counted from the project's own files and history. There are no lead, call or revenue figures here: those belong to the customer, and I do not publish them.
What this is, and what it is not
It is a working product with one customer, not a platform with a market behind it. I have no sales results to show for that team, so I show none.
Part of what is listed above is built and still waiting for its rollout, and the link to the office phone system was written from the vendor's documentation: it has never received a real call.
There is no automated test framework and no automatic deployment: one self-check script, a build, a type check and a look in a browser at phone width, then a rollout by hand. The interface exists in French only.
What I would do differently: automate the rollout from the first week. Features finished in October were still waiting for a manual rollout in November.
Stack
- Next.js
- TypeScript
- Claude API
- Google Speech-to-Text
- Google Places API
- Firebase Auth
- Firestore
- Cloud Storage
- Firebase App Hosting
- Tailwind CSS
See it
Want something like this?
Tell me what you are building, or what you are still doing by hand, and I will tell you how I would approach it. No commitment.