Skip to content
Notes

The hidden cost of CRM/ERP integrations that 'just need a button'

By Philipp Kant 6 min read

There is a sentence that appears in roughly nine out of ten initial conversations about a CRM/ERP integration. It contains the word “just,” and it goes something like:

“We just need a button in the CRM that pushes the order into the ERP. That’s basically it, right?”

It is never basically it. The button is the visible 5% of the integration, and the people doing the asking are not being unreasonable. The visible work is the button. The other 95% lives in places that don’t show up until you start building, and that’s where these projects quietly cost three times what anyone budgeted.

This is a working tour of what the other 95% is.

What the button is hiding

When someone asks for a button that “pushes an order into the ERP,” they are describing the trigger, not the integration. The integration is everything that happens between the click and the order actually existing correctly, durably, and recoverably in the target system.

The categories of hidden cost are predictable. They show up on every project of this shape; the only question is whether they’re handled deliberately or discovered the hard way.

Hidden cost 1: data model mismatches

The CRM and the ERP do not agree on what a customer is. Or a product. Or an address. Or a unit of measure. The CRM has free-text address fields; the ERP has a strict schema with country codes from a specific list. The CRM tracks “company” with one ID; the ERP tracks “legal entity,” “billing entity,” and “shipping entity” as three.

Every field in the source has to be reconciled to a field in the target. The fields that map cleanly are the cheap ones; the fields that don’t are where the integration design lives.

This work is invisible until you start it. Two hours into building the button, you find out the CRM has nine address lines and the ERP has four, and the question “what goes where” turns into a 30-minute meeting with the operations lead.

Hidden cost 2: sync direction and authority

Which system is the source of truth for what? When a customer record exists in both, which one wins on conflict? When a product is updated in the ERP but the CRM has been edited since the last sync, which edit survives?

These are not technical questions; they are governance questions with technical consequences. They have to be answered before you write the integration, because the wrong answer is silent and permanent. The system will quietly overwrite the wrong field with the wrong value forever.

In practice, most “just a button” integrations end up being one-way push systems precisely because two-way sync requires answering these questions properly. That’s often the right call, but it’s a design decision, not a default.

Hidden cost 3: edge cases and idempotency

The button works for the happy-path order. Then somebody clicks it twice because the first click didn’t visibly do anything. Now there are two orders in the ERP.

Idempotency is the property that the same operation applied twice produces the same result as once. It sounds academic until you’re explaining to the operations lead why there are duplicate invoices. Building for it from the start is straightforward. Retrofitting it is not.

The list of edge cases for a CRM/ERP push is longer than the happy path:

  • Partial orders (some line items succeed, some fail)
  • Orders for customers that don’t exist yet in the target
  • Orders for products that have been renamed in the target since the last sync
  • Orders submitted during a target-system maintenance window
  • Orders submitted while another sync is in flight for the same customer
  • Orders that violate target-system business rules invisible to the source

Each of these is a decision: skip, retry, fail loudly, fail silently and queue, requeue with notification. Every “just a button” project is, in part, a series of unglamorous decisions about these.

Hidden cost 4: error handling and visibility

When the button fails, and it will, what happens? The user sees a “Something went wrong” message? An email goes somewhere? Nothing visible, and the order is lost?

A production integration needs:

  • A retry policy that handles transient failures without amplifying bad data
  • A dead-letter pattern for genuinely-failed items, so they don’t block the queue
  • A monitoring surface where operations can see what’s actually happening: not “the system is up” but “47 orders synced today, 3 in dead-letter, here’s why”
  • Alerting that fires when failure rates spike, not after the operations team finds out by accident

This is the part that most “we’ll just build the button quickly” projects skip. It’s also the part that determines whether the integration is trusted in production after the first incident, or whether it becomes the system everyone copies orders out of by hand.

Hidden cost 5: historical data

The button handles new orders. What about the existing ones?

Almost every integration project has a backfill question. Sometimes the answer is “we don’t need to migrate anything, just sync from now.” More often the answer is “actually we need the last two years of orders in the new system, and they’re a mess.”

Historical data migration is its own engineering problem, on top of the integration. It’s worth scoping separately and honestly. Combining “build the integration” and “migrate the history” into one budget is how projects discover six weeks of cleanup work nobody priced.

Hidden cost 6: maintenance over time

The integration ships. Six months later, the CRM vendor updates their API. A year later, the ERP gets new required fields. Two years later, somebody renames the “customer status” field, and the sync silently starts failing for a subset of records that nobody notices until quarterly reporting.

Every integration is a long-term liability, not a one-time build. Whether the maintenance lives with the original builder, with the in-house team, or with whoever happens to be available, it has to live with someone. Projects that don’t decide explicitly usually discover it lives with nobody.

When it actually is just a button

Rarely, but it does happen. The conditions are:

  • Both systems are well-documented APIs that you control or that are stable
  • The data model maps cleanly with no edge cases (genuinely no edge cases, not “we’ll deal with them later”)
  • One-way push from a single source of truth
  • The volume is low enough that manual recovery is acceptable when things break
  • The integration’s failure has limited blast radius

If all of these are true, you can build it in an afternoon and nobody will be the worse for it. They are rarely all true.

Estimating these projects honestly

A practical rule we use: when scoping a CRM/ERP integration, estimate the button at 1× and budget 4–6× for everything else. That ratio varies by complexity, but the directional truth is what matters: the visible work is a fraction of the actual work.

The conversation we’d rather have at scoping is not “how long will the button take” but “which of the six hidden-cost categories above apply, and how much honest engineering effort do they need?” That conversation is the actual project plan.


If you’re staring at one of these and “just a button” is the framing you’re working with, that’s the conversation we’d usually have first.