Case study: Salesforce to NetSuite, reconciled — a distributor cuts sync errors 92%
by Green Dolphin Software, Integration practice
Anonymized at the client's request — no company, people, or project names. The shape of the problem and the results are real and typical of this engagement type.
The client
A mid-market B2B distributor: sales ran in Salesforce, finance ran in NetSuite. A closed-won Opportunity was supposed to become a Sales Order in NetSuite so finance could invoice and recognize revenue. They'd bought the native connector — and hit a wall the moment they went past basic objects.
The problem
The connector synced simple fields fine, but the data models did not line up, and the gaps showed up as lost orders and manual cleanup:
- Customer matching: the same account existed in both systems under different names; pushing blindly created duplicate NetSuite customers.
- Product / SKU mapping: Salesforce sold "seats" and "plans"; NetSuite invoiced against item records with their own internal IDs. Nothing was one-to-one.
- Multi-currency & tax: deals closed in EUR; NetSuite booked in USD with subsidiary-specific tax.
- Revenue timing: a closed-won Opportunity is not the same event as a recognizable sale — triggering on the wrong field drifted the numbers.
- Silent failures: when a sync failed at 2am, nobody found out, and the order vanished.
Finance was spending most of two days a week reconciling, and roughly one order in nine failed to land cleanly.
What we built

A fixed-bid engagement — one price, scope locked. The connector was the easy 20%; we built the hard 80%:
- Deterministic customer matching with a dedupe step, so an existing NetSuite customer is found instead of recreated.
- A SKU crosswalk mapping Salesforce products to NetSuite item records, with a fallback for unmapped items.
- Currency and tax handling per subsidiary, with the FX rate and timing rules agreed up front.
- Revenue-timing rules so a Sales Order is created on the right event, not just "closed-won."
- Error handling and retries with alerting, plus a versioned, auditable mapping so every change can be rolled back.
The results

| Metric | Before | After |
|---|---|---|
| Sync error rate | ~11% of orders | under 1% |
| Manual reconciliation | ~12 hrs / week | ~2 hrs / week |
| Time to invoice | ~4 days | under 1 day |
| Duplicate customers created | ~40 / month | ~4 / month |
Finance trusts the numbers again, sales-to-order is hands-off, and there's an audit trail when anyone asks "why did this sync that way?"
The takeaway
The native connector is rarely the hard part — reconciling two different data models is. Scope the matching, the crosswalks, the currency, and the timing up front, build real error handling, and the integration stops being a source of 2am surprises. We do that on a fixed bid: one price, scope locked, built and run for you. Start your intake or see how it works.
