Four ERP Sync Bugs That Only Show Up in Production

Four ERP Sync Bugs That Only Show Up in Production
hubspot HubSpot Implementation

The quote lines arrived before the quote.

That's the first bug, and it came from a live client whose ERP-to-HubSpot integration had been working for months. The middleware created quote line items and tasks a fraction of a second before it created the quote header they belonged to, so the association workflow fired against a parent that didn't exist yet. Everything looked right in the field mapping. Every field synced. The order was wrong, and no test plan checks order.

Here are four ERP sync bugs from September, across three clients, that share one trait: none of them show up in UAT.

Bug one: the child record lands before its parent

Quote lines before quote headers. Companies created after the quotes that belong to them. Any integration that pushes related records as separate calls can deliver the child before the parent, and any workflow that runs on creation will miss the association. The fix is either sequencing on the sender's side or a delayed re-association on the receiver's, but you only know you need it by watching production timestamps.

Bug two: a valid key is the wrong key

The same client's ERP contacts were being attached to quotes and deals by customer ID, meaning every contact at the customer got associated with every quote. What sales needed was the contacts actually linked to that specific ERP quote. Both are valid keys. Only one is useful. Mapping documents usually say "contacts sync to deals" and never say by what, and UAT with three test records can't tell the difference.

Bug three: the default that made every prospect a customer

At a logistics software client, companies created in HubSpot without a lead status arrived in NetSuite defaulted to "Customer, Closed Won." No error fired, because that was the default value. Every new prospect looked like a paying customer to finance until a workflow was added to force "Unqualified" on anything created without a status. Ask what every required field defaults to on both sides when the source is blank. The answer is usually surprising.

Bug four: the sandbox is slower than production, in the wrong direction

The same integration stalled because the ERP sandbox API couldn't handle a full company pull including inactive records. The fix was scoping the sync to companies created after a recent date. That's the right call for go-live, but it means the historical load is a separate job, and nobody had planned it as one. Sandbox performance tells you nothing about production performance except that they differ.

The bug that's really a feature request

One more, from a manufacturer's discovery: "reps should not have to manually mark won quotes." When a quote number is entered in ERP order entry, that event should flip the CRM quote to Won on its own. It's a small integration, and it's the single biggest adoption lever in a quoting-heavy sales team, because it removes the one step reps skip. If your sync doesn't carry that event, your win rate in the CRM is fiction.

To be fair to UAT: it does catch mapping errors, and mapping errors are most errors. What it structurally can't catch is ordering, timing, default values on blank fields, and volume. So add a production-watch week to every ERP integration plan, with someone reading the sync logs daily, and treat the first ten real quotes as the real test.

Which of the four have you hit? I'd bet on bug three; it's the one nobody believes until they see it.

This came out of a client project. The story behind it, and what to check in your own portal, goes to subscribers on Thursdays. Get Thursday's note.

Perry Nalevka

by Perry Nalevka on October 25, 2026

CEO of Penguin Strategies