~1,000
leads processed per day
2
inbound sources — website and affiliate API
YoY
live dashboard, by day and by week
PWA
mobile management access
Situation
Success on the front end became a bottleneck at the back
This is the second engagement with the same UK home improvement company. The first — the Sitecore frontend retainer — took the website from tens of leads a day to approximately a thousand.
Which is a very good problem, right up until the moment you have it. A thousand records a day arriving from the main website and from affiliate partners is more than any spreadsheet, inbox or general-purpose contact database is going to survive. The client needed a robust admin and CRM system built for that volume.
Problem
Volume, sources, and the question nobody could answer
- Two very different inbound sources. The company's own website submits clean, controlled data. Affiliate partners submit whatever their own systems produce — different field names, different formats, duplicates, and the occasional record that is simply junk.
- No single view of the lead lifecycle. A lead is not an event, it is a story: contacted, quoted, sold, lost. Without follow-up status and an assigned sales value on the record, nobody can say what a lead was worth — only that it arrived.
- Performance had no reference point. "We had 950 leads today" means nothing on its own. It only becomes information when set against the same day last year, and the same week last year.
- The people who needed the numbers were rarely at a desk. Management wanted the picture on a phone, without a separate mobile product to build and maintain.
A thousand leads a day you cannot measure is a thousand chances a day to guess.
Implication
What an unmanaged lead pipeline quietly costs
Leads are perishable. A record that sits unassigned for two days is not the same asset it was when it arrived, and at a thousand a day even a small percentage slipping through unworked is a substantial number of paid-for opportunities going cold every week.
The second cost is subtler and larger. Without campaign tracking and assigned sales values on the lead record, marketing spend gets allocated by lead volume — and the channel producing the most leads is very often not the channel producing the most revenue. Every month that goes unmeasured is a month of budget pointed at the wrong place.
What we built
A backend built around the lifecycle, not around the record
- Real-time dashboard comparing performance year on year, by day and by week
- Full lead lifecycle handling — follow-up status, sales value assignment, campaign tracking on every record
- Affiliate API with powerful data validation and sanitisation, so partner submissions are cleaned at the boundary rather than inside the database
- Progressive Web App (PWA) giving management installable, app-like access from a phone
- Management reporting with drill-down, so a number on the dashboard can be opened down to the records behind it
Validation at the boundary is the whole affiliate integration
An affiliate API that accepts whatever it is sent will fill your CRM with records your sales team learns to distrust — and once a team distrusts the data, the system stops being used regardless of how good the rest of it is. Sanitising and validating on the way in is not a defensive detail; it is what keeps the system credible.
Result
One system, still growing
The CRM handles the full daily volume from both sources, gives management a live year-on-year picture from any device, and lets the business trace a lead from the campaign that produced it through to the value it was assigned. The engagement is ongoing and the system continues to be upgraded.
What we would tell you before starting something similar
Build the lead lifecycle and the reporting question first, and the screens second. Almost every CRM that gets abandoned was built as a place to put records, by a team that had not yet agreed what question the records were supposed to answer.
Tech stack: PHP · MySQL · PWA · Sitecore (main site)