CRM and ERP Integration

One Stop Software connects CRM, ERP, accounting, and operations systems so data entered once flows everywhere it is needed. We are the SoftwareMile specialist practice for business systems integration.

CRM Integration

HubSpot, Zoho, Salesforce, and Pipedrive connected to the rest of your business: quotes that become orders, orders that become invoices, and customer history that follows the customer – into support, fulfillment, and finance.

ERP and Accounting Integration

NetSuite, QuickBooks, Sage, and Microsoft Dynamics wired to your CRM and operations software: real-time inventory in the sales pipeline, automatic invoice creation, and reconciliation that does not depend on spreadsheets.

The Automation Chain

Our standard: a closed deal triggers fulfillment, invoicing, inventory adjustment, technician dispatch where relevant, and management reporting – with zero rekeying. Every integration is built with error handling, retry logic, and an audit trail, because business data deserves engineering discipline.

Integration Methods

Native APIs first, middleware where it genuinely saves cost, custom connectors where your systems are proprietary. We document every integration so you are never locked to us.

Tell us which systems need to talk – include your CRM, accounting platform, and the workflow that hurts most. We scope integrations in days, not months.

Related services

What Does CRM and ERP Integration Actually Involve?

At its simplest, making two systems agree about the same facts — customers, products, prices, orders, invoices — without anyone retyping them. In practice the work divides into three parts, and the first two are where projects succeed or fail.

  • Agreeing the data model. What is a “customer” in each system, and are they the same thing? One may key on account number, the other on email. One may hold parent companies, the other only sites. This is a business decision before it is a technical one.
  • Deciding the source of truth. For every shared field, one system owns it and the others follow. Fields with two owners produce conflicts that surface as inexplicable data changes months later.
  • Moving the data. The genuinely technical part, and usually the smallest.

What Is the Source of Truth for Each Field?

This single question resolves most integration arguments. Pricing might be owned by the ERP, contact details by the CRM, and delivery addresses by whichever system the customer last updated. Write it down field by field.

Where two systems must both accept edits to the same field, you need an explicit conflict rule — last write wins, or one side always defers — and someone must own the exceptions. Projects that skip this step do not avoid the problem; they discover it in production with no rule to apply.

Real-Time or Batch?

Real-time synchronisation is not automatically better. It is more complex, harder to debug, and creates tighter coupling between systems that then have to be available at the same time.

  • Real-time suits anything a person is waiting on: credit checks at order entry, stock availability during a quote, a portal showing live order status.
  • Batch suits everything else: nightly financial postings, product catalogue updates, reporting extracts. It is cheaper, easier to reprocess when something goes wrong, and gentler on systems with API rate limits.

Most estates need both. Choosing per data flow rather than picking one pattern for the whole project is what keeps the cost sensible.

Why Do Integration Projects Fail?

  • Underestimating data quality. Duplicates, records that violate the new rules, and free-text fields carrying meaning nobody documented. Cleansing is a project in itself and is almost never in the original estimate.
  • No error handling. Integrations fail — systems go down, records get locked, a field arrives longer than expected. What happens then must be designed: retry, queue, alert a human. Silent failure is the worst outcome because nobody notices until reconciliation.
  • No monitoring. An integration that stopped three weeks ago and nobody noticed is a common and expensive discovery.
  • Point-to-point sprawl. Six systems wired directly to each other is fifteen connections to maintain. Past a certain size, a middle layer is cheaper than the alternative.
  • Vendor upgrade risk. A SaaS API version change can break an integration with limited notice. Someone must own watching for that.

Build, Buy, or Use an iPaaS?

Off-the-shelf connectors between two mainstream products are usually the right first choice — someone else maintains them when the vendor changes an API. An integration platform earns its licence cost once you have several systems and want central monitoring, retry and logging rather than bespoke handling per connection.

Custom development is warranted where the systems are niche or internal, where the transformation logic is genuinely specific to your business, or where a connector exists but does not carry the fields you need. We will tell you when a connector you can buy does the job — that is a cheaper answer and it usually holds up better.

What a Good Integration Looks Like Afterwards

Documented field mappings and ownership. Errors that reach a person rather than a log nobody reads. A monitoring view that shows whether data actually flowed today. The ability to reprocess a failed batch without a developer. And enough documentation that someone other than the original engineer can maintain it.

Related: ERP and CRM selection consulting · business process automation · reporting and analytics.

How an Integration Project Actually Runs

The first pass is an inventory rather than a design. Every object that will move gets listed with a direction: customer records from CRM to ERP, invoices back the other way, products one way only. Against each one, record what the API actually exposes, because the field list in the user interface and the field list in the API are not the same thing. Calculated totals, tax figures and system audit fields are commonly read-only through the API, and custom fields usually carry an internal name that bears no relation to the label on screen.

Mapping is field to field and also value to value. An order status picklist in one system has to resolve to a picklist in the other, and the value with no counterpart is the interesting one. Types matter more than they look: length limits truncate silently on some platforms and reject the whole record on others, dates arrive with or without a time zone, and currency rounding applied at different points produces invoices that differ by a cent and reconcile to nothing. Required fields on the receiving side are the usual reason a mapping that looked complete fails on its first write.

Build order is one flow, end to end, in a test environment, before the second one is started. That means the first flow carries its own error handling and its own monitoring before anything else is added, so that when something is wrong there is one change to look at. What that sequence needs from your side, before the first flow is built:

  • A test or sandbox instance of each system, or a clear statement that none exists.
  • API credentials for each system, and the administrator access needed to issue them.
  • One person per system who can decide field ownership without convening a committee.
  • An export of real records, including the awkward ones nobody wants to show.
  • Agreement on which system is written to first where a flow runs in both directions.
  • A decision on history: backfill everything, backfill from a date, or start clean.

Matching Records Across Two Systems

Every sync answers the same question on every record: is this the same customer we already hold? That needs a key both systems can carry. Email addresses look like keys and are not, since one person uses two of them and two people share one at a small company. Company names are worse, because punctuation, legal suffixes and trading names differ by system. The durable pattern is to write the far system's record ID into a dedicated field on each side the first time a record crosses, then match on that field afterwards.

Unmatched records need a rule before go-live rather than during it. When a record arrives with no counterpart, the options are to create one on the far side, or to hold it in a review queue for a human. Creating is right where the far system is only a destination and a wrong creation is cheap to undo; a queue is right where it is not. Fuzzy matching on name and address is a third option, and it belongs feeding that queue as a suggestion rather than acting as an automatic decision.

Deletions and merges are the cases most projects find late. Many APIs report a delete weakly or not at all, so a record removed in one system can persist indefinitely in the other. Soft deletes, where the record is flagged inactive instead of removed, propagate cleanly and are worth preferring on the source side for that reason. Merging two duplicates in a CRM behaves as a delete plus an update: the losing record's ID stops resolving, and any cross-reference stored against it becomes a dead pointer that the next run will try to follow. The deletion rule has to be designed rather than inherited.

How the Two Systems Exchange Records

Three transports cover almost everything. A push, where the source system calls a URL of yours when something changes. A pull, where the integration asks on a schedule for records modified since a given timestamp. And a file drop, still common with older ERP and accounting products, where a delimited or fixed-width file lands on SFTP and is collected. Which one you get is usually decided by what the source system supports rather than by preference.

Webhooks deliver at least once, not exactly once, and they arrive out of order often enough to matter. A retry after a network blip means the same event can arrive twice, which is harmless only if the write path matches on the stored cross-reference instead of creating blindly. Most webhook payloads carry an ID and a change type rather than the full record, so the handler calls back for current state, which is also why two edits in quick succession can both read the later version. And there is usually no replay for the window during which your endpoint was down, so a push-based flow still needs a scheduled pull behind it to collect what was missed.

Polling turns on a timestamp, and whose clock that timestamp comes from decides whether records go missing. Use the modified date returned by the source system, not the time your job started, and overlap each window by a few minutes so records written while the previous query was executing are not skipped. The overlap re-reads a handful of records every cycle, which costs nothing once writes match on the cross-reference.

API rate limits shape the design more than anything else in this list. Platforms return HTTP 429 when a limit is hit, usually with a Retry-After header stating how long to wait, and a client that ignores it and retries immediately extends its own lockout. The quota is normally counted per organization over a rolling window and shared with everything else connected to that org, so the budget available to your integration is whatever the reporting tool, the mobile clients and the other vendor's app have left. Bulk and batch endpoints, where the platform offers them, move hundreds of records for the cost of a few calls and are the right home for anything nobody is waiting on. A one-time backfill is the usual way a quota gets exhausted, which is the argument for running it in chunks rather than as a single job.

Credentials, Permissions and the Service Account

An integration authenticates as somebody, and the choice of somebody has consequences. A token issued against a named employee's account inherits that person's permissions and stops working when their account is disabled, which is how an integration that ran quietly for a year fails on the Monday after someone leaves. A dedicated service account, owned by a role rather than a person, avoids that. On platforms that charge per user, the license for it belongs in the budget from the start rather than arriving as a surprise at go-live.

Permissions on that account then decide what the mapping can actually do. Field-level security and role-based record access apply to API calls exactly as they apply to the screen, so a mapping built and tested by an administrator can drop fields or return empty result sets once it runs as a restricted service account. The symptom is characteristic: no error, a successful response, and a field that is simply absent. Granting only the objects and fields the flows use is still right; the point is to test as the service account rather than as yourself.

Token lifetime is the other recurring failure. OAuth access tokens are short-lived and refresh automatically, but the refresh token itself can expire after a period of inactivity, be invalidated by a password change on the underlying account, or be revoked when an administrator resets connected app access. Any of those stops the flow cleanly and quietly, which makes it a monitoring problem as much as an authentication one. Where the ERP sits on your own network, the same thinking applies to whatever certificate or VPN credential the connection depends on, since those expire on a fixed date whether or not anyone noted it.

When You Do Not Need an Integration

Volume and edit frequency decide this more than anything else. A flow carrying a handful of records a week, where nothing about the record changes after it lands, rarely repays the attention automation asks for across its life. An export and an import with a checklist can be the honest answer, and it carries no software to maintain. What turns that judgment around is not volume by itself but the second edit: once the same record is changed in both places after the first copy, keeping up manually becomes a reconciliation problem rather than a typing one, and reconciliation is where the errors hide.

There is also the case where nobody actually needs to edit in the second system. If the requirement is to see figures from the CRM and the ERP together, and neither system needs to accept writes from the other for that to be satisfied, then what is being asked for is a reporting question rather than a sync question. Naming which one it is at scoping matters, because the two are specified differently and the answers are not interchangeable.

Signals that the manual version has stopped working, and that a flow is worth building:

  • The same record is touched by more than one team, each keeping its own copy.
  • Discrepancies surface at month end rather than at the point they were created.
  • Someone maintains a spreadsheet whose only purpose is holding the two systems together.
  • Headcount is being added to keep pace with a volume that is still rising.

Frequently Asked Questions

Is this the same as a data migration?

No. A migration moves records once, out of a system being retired and into the one replacing it, and then it is finished. An integration keeps two systems that both remain in service agreeing with each other, so it runs for as long as both do and has to handle records that change after they first crossed. The two get confused at scoping because the first run of an integration looks like a migration. It is also not a warehouse copy, which reads from both systems for analysis without writing anything back into either.

What has to already exist on our side before integration work can start?

API access, which is not universal. Several CRM and accounting platforms restrict API use to higher editions, meter calls as a paid add-on, or expose only part of the object model below a given tier, so the edition each system is licensed at is worth confirming before anything is designed. Desktop accounting products are a separate case: many have no cloud API at all and depend on a connector service running on the machine that holds the company file, which changes what is possible if that machine is switched off overnight.

Where does the integration actually run?

On a host that can reach both systems, which means a cloud service, an integration platform tenant, or a server or container you own. Cloud to cloud is the simple case, since both endpoints are public HTTPS. An ERP on your own network is the case needing a decision: either an agent installed inside the network that makes outbound connections only, or an inbound path through the firewall with a fixed address allowlisted at your end. The outbound agent is usually the easier one to get approved internally, so it is worth asking which the ERP vendor supports before assuming either.

Do we have to clean up our data before we start?

Not entirely, but you do have to decide what happens to the records that fail. The receiving system's own validation rules, required fields, picklist restrictions and duplicate rules are what actually reject a record, and a flow that routes those to a queue can run while cleanup continues behind it. Cleanup belongs in the source system rather than in transformation logic; a mapping rule that patches a bad value in transit hides the problem from everyone still working in the system that produced it. Duplicates are the exception worth handling early, because a duplicate on either side turns record matching into a guess.

Will this put load on our production systems?

The visible cost is API consumption rather than server performance, since every record that moves is one or more calls against a metered allowance. Pulling the current API usage figures from each platform before design is worth doing, because the headline limit is not what a new flow will have available to it.

How is this tested without touching live data?

In a sandbox or test instance, with one caveat that catches people out. Sandboxes are frequently refreshed copies of production, which means they hold real customer email addresses, and the workflow rules, notifications and automated emails in the receiving system stay armed unless they are explicitly suppressed. That is how a first sandbox load can end up sending live notification emails to real customers. Turning off outbound mail and reviewing the automation rules on the receiving side is part of the setup rather than an afterthought.

What happens when we replace one of the systems later?

The field mappings and the ownership decisions survive the change; the connector does not. A replacement platform means new authentication, a different object model and a fresh round of testing even where the business logic is unchanged, which is why the mapping document is the asset worth maintaining rather than the code. If the replacement is still being chosen, that decision belongs before the integration work rather than running in parallel with it.