The ERP Knew Everything. HubSpot Knew Almost Nothing.

0
Customer Records Locked in the ERP
0
Contacts Bouncing on Send
0
Records Now Syncing Nightly

An education resources supplier had run HubSpot for over two years without ever connecting it to OrderWise, the ERP holding every order the business had taken. Around 73,000 customer records sat in the ERP, roughly 71,000 of them without a job role. Marketing was sending to a picture of the customer base that had been assembled by hand and going stale ever since.

The ERP Knew Everything. HubSpot Knew Almost Nothing. — Stack Logic case study
The Challenge: Two systems holding two different customers

The supplier sells curriculum resources and training to schools, trusts and local authorities. Orders run through OrderWise. Marketing runs through HubSpot. In more than two years the two had never been connected, so the CRM held a version of the customer base that had been assembled by hand and had been drifting ever since.

The numbers made the gap concrete. OrderWise held around 73,000 contacts, roughly 71,000 of them with no job role recorded, so segmenting by what someone actually did was not possible. More than half the sales history was missing from HubSpot entirely. A recent campaign went to 34,000 people and produced 125 clicks.

Deliverability was heading the same way. Around 4,600 contacts were bouncing, and a grey mail list of roughly 20,000 people who never opened anything had never been suppressed. Lead scoring was not removing inactive contacts either, so nothing pushed back against the list ageing. Meanwhile the sales team, curriculum specialists rather than salespeople, ran their pipeline in Excel.

One more thing shaped everything that followed. The OrderWise server had a habit of locking sessions or falling over under load, most visibly during large invoice uploads. An integration pushing tens of thousands of records was going to make that worse unless it was built not to.

Disconnected clusters of nodes, illustrating a fragmented manual process
What Was Built: A one-way sync, on purpose

The integration runs in one direction only, OrderWise to HubSpot. OrderWise is where orders and invoices live, so it is the source of truth, and a two-way sync would let a mistyped field in the CRM travel back into the system the business bills from. Contacts created in HubSpot are flagged for the finance team to check before they go anywhere near the ERP, which mirrors how the webshop already worked.

The server problem set the schedule. Rather than syncing on change, it runs nightly in small batches through the small hours, when nobody is uploading invoices. Authentication refreshes itself so the connection does not quietly expire, and scheduling, monitoring and an audit log were built alongside the sync rather than bolted on afterwards.

Matching was the hard part. HubSpot's automatic domain matching was not reliable enough to trust, so it was switched off and the OrderWise customer ID became the unique key instead. Getting there meant a reconciliation exercise first, matching on domain and then on name and postcode, which resolved the large majority automatically and left a manageable remainder to be worked through by hand.

Then there is drift. A one-way sync will overwrite anything a user edits in HubSpot, so instead of doing that silently, conflicts go out in a daily report, the field is left alone for seven days while someone corrects it at source, and OrderWise wins after that. Some fields were deliberately left out. Sales rep and account manager stayed unsynced because OrderWise usernames were inconsistent, Andy in one record and Andy Bird in the next, and mapping them properly needed an ownership decision the business had not made yet.

Nodes converging on a single hub, illustrating one automated pipeline

Around 50,000 records, 25,000 contacts and roughly as many companies, now flow into HubSpot nightly with customer type, account number and territory attached, so segmentation runs on what a school actually buys rather than on a guess from an email domain.

Rollout was staged rather than switched on. A 200 contact dry run first, then a linked cohort of a few hundred companies with all their contacts, then the full set. The grey mail list is being worked through in batches of around 2,000, with non-openers moved out of marketing contacts automatically after fourteen days.

Worth noting: the hardest decision in this build had nothing to do with moving data. It was working out what should happen when the two systems disagree. An integration that silently overwrites someone's correction teaches people to stop making corrections, and the data gets worse from there rather than better.

This project is still running. Order data, reporting and consultant training land across the autumn term, with full launch in January. The figures above describe the scale of the problem and the size of the sync rather than a measured return, and there is no point claiming one before it exists.

The client is anonymised. The technical detail is accurate.

See where your team's time is going.

It starts with a short audit of your stack. I'll show you where consultant and back-office hours are leaking, and what it would take to get them back.

Systems That Scale.

© 2026 Stack Logic. All rights reserved.
Here's our privacy policy.

See where your team's time is going.

It starts with a short audit of your stack. I'll show you where consultant and back-office hours are leaking, and what it would take to get them back.

Systems That Scale.

© 2026 Stack Logic. All rights reserved.
Here's our privacy policy.