When a potential eZhire customer submits a form on the website, chats with our bot, and sends a WhatsApp message — they create three separate records in three separate systems.
The sales team sees a prospect in HubSpot. The live chat team sees a conversation in Crisp. The WhatsApp team sees a thread in BotSpace. Nobody knows these are the same person.
This is the CRM fragmentation problem. It's common, it's expensive, and it's surprisingly hard to fix.
The State Before
Our lead acquisition came from multiple channels:
- Website forms → HubSpot
- Live website chat → Crisp
- WhatsApp inquiries → BotSpace
- Direct calls → Ziwo (logged manually, if at all)
- Walk-ins and referrals → Nowhere
Each channel had its own tool. Each tool had its own contact database. There was no deduplication across tools, no unified pipeline view, and no way to measure end-to-end conversion from first touch to booking.
Sales managers couldn't answer basic questions: How many leads did we generate this week? What's our conversion rate? Which channel drives the most bookings? Which sales agent is performing best?
The answers were in three different systems, none of which agreed with each other.
What We Built
The CRM platform has three layers:
1. Lead Ingestion & Deduplication
Every lead from every channel flows into the eZhire ERP through a unified ingestion layer.
When a lead arrives, the system checks for duplicates using a matching algorithm:
- Exact match on phone number → same lead, update existing record
- Exact match on email → same lead, update existing record
- Fuzzy match on name + approximate phone → flagged for manual review
The matching algorithm handles the messy reality of lead data: phone numbers in different formats (+971 vs 00971 vs 971), emails with minor variations, names with different transliterations.
After deduplication, every lead has a single canonical record in our system with:
- All touch points (which channels, when, what was said)
- Linked HubSpot contact ID
- Linked Crisp conversation IDs
- Linked BotSpace thread IDs
- Rental history (if an existing customer)
2. Pipeline Management
We built a sales pipeline on top of the lead records:
New Lead → Contacted → Qualified → Proposal → Negotiation → Booked → Lost
Each stage has:
- Definition (what makes a lead "Qualified" vs just "Contacted")
- Required actions before progression (minimum contact attempts, qualification checklist)
- Automated follow-up tasks (day 1, day 3, day 7 reminders)
- Conversion tracking
The pipeline is visible to sales agents through the ERP interface and to management through dashboards.
3. HubSpot as System of Record
We chose HubSpot as the canonical CRM system because it has the best sales workflow tooling. Our ERP is the operational system; HubSpot is the sales system.
The integration works bidirectionally:
- ERP → HubSpot: lead created or updated in ERP automatically syncs to HubSpot
- HubSpot → ERP: deal stage changes in HubSpot sync back to ERP pipeline stage
- Booking event: when a lead converts to a booking in the ERP, HubSpot deal is marked Won automatically
This means sales agents work in HubSpot (which they prefer) and data stays in sync with the ERP without manual effort.
The Technical Integration
HubSpot API integration:
We use HubSpot's Contacts and Deals APIs. On lead creation, we create a HubSpot contact and deal and store the HubSpot IDs in our database. On deal stage changes (via HubSpot webhooks), we update our pipeline stage. On booking, we close the HubSpot deal.
Crisp integration:
Crisp's webhook fires on new conversation and new message events. We parse the conversation to extract contact information (phone, email, name from the lead form if available), match against existing leads, and create or update the lead record. The Crisp conversation ID is stored against the lead so agents can pull up the full chat history.
BotSpace (WhatsApp) integration:
BotSpace webhooks fire on new WhatsApp conversations. We extract the phone number (always available in WhatsApp), match it to an existing lead, and create or update. WhatsApp conversations are linked to the lead record.
Deduplication across channels:
The trickiest part. A lead might arrive in Crisp first (only email), then in BotSpace (only phone number). At the time of the BotSpace event, we don't have the email to match on. We use a time-windowed matching approach: if a new phone lead arrives within 48 hours of an email lead with a similar name, we flag it for review. Review resolves ~95% of cross-channel duplicates.
Lead Scoring
We built a simple scoring model for lead qualification:
| Signal | Points |
|---|---|
| Has valid UAE phone number | +20 |
| Responded to follow-up | +15 |
| Requested specific vehicle | +15 |
| Has previous rental history | +25 |
| Multiple channel contacts | +10 |
| High-intent keywords in chat | +15 |
Leads above 60 points are flagged as high-priority and assigned to senior sales agents. Below 30, they go into a nurture queue with automated follow-ups.
The scoring model isn't ML — it's a rules-based system built on what the sales team identified as qualification signals. Simple, transparent, and easy to adjust.
What Changed
After the platform launched:
- Sales managers had a single pipeline view for the first time
- Lead response time dropped because agents had unified context and automated task reminders
- Duplicate handling stopped consuming agent time
- Conversion rates became measurable by channel, by agent, and by lead source
- HubSpot and ERP data agreed with each other (previously they diverged constantly)
The sales team stopped managing their own spreadsheets. The data was finally in one place.
What I'd Do Differently
Don't try to replace HubSpot's UX. Early designs had us building a full CRM interface in the ERP. We scaled that back to pipeline tracking and let HubSpot handle the sales UX. Better outcome, faster delivery.
Deduplication is harder than you think. Budget at least 2x what you estimate for the matching logic. Edge cases are endless — especially with international phone number formats and names with multiple transliterations.
Agree on the pipeline stages before building them. We changed the stage definitions three times during development because sales, marketing, and operations had different mental models of what "Qualified" meant. A workshop upfront would have saved three refactors.
CRM fragmentation is a revenue problem disguised as a data problem. The fix isn't better tools — it's a unified data layer underneath the tools you already have.