How to Sync Opportunities from one CRM to another

A few years ago we called it the “Dual CRM use case” - when customers are looking to pair a “front office” CRM with a “back office” CRM.

Usually customers are wanting a sales team in a more “salesperson friendly” CRM such as Salesforce or HubSpot or Microsoft Dynamics, paired with a CRM where the rest of the business is operated, such as NetSuite or ConnectWise.

Opportunities become an important handoff point to feed data from one system to the other; sometimes this is required when opportunities are first created or at an early stage; other times when they reach a certain stage such as quoting; and other times when they become new customers / are closed won.

So this may sound like these types of use cases:

“We want to sync opportunities from HubSpot to NetSuite, when each opportunity is closed won - to feed that data to our finance and operations team.”

“We want to sync all opportunities that reach a certain stage from Salesforce to ConnectWise, where quoting will be performed.”

“We want to sync opportunities that reach a certain stage from Microsoft Dynamics to ConnectWise, to initiate a project our services team.”

What’s a little "tricky" about this use case, is that when creating an Opportunity in a system like NetSuite or ConnectWise - it can't just be “floating around” - it needs to be tied to a specific account, and its related contacts. And in fact, this is required by their APIs in order to create the Opportunity, otherwise the creation of the Opportunity will fail.

So setting up the sync process needs to take this “dependency” into account - that before you can create an opportunity in a system like NetSuite or ConnectWise, you need to ensure that the account is synced first, and that the syncing of the opportunity follows - so that, in layman’s terms - it has a place to land in the back office CRM.

These are the steps we recommend for customers when setting up these CRM-to-CRM opportunity syncs.

Step 1: Identify fields to be mapped on Companies, Contacts & Opportunities across the two CRMs

Even though you may be thinking about it as an “Opportunity Sync”, you are going to need to ensure all three objects are syncing across both systems. And you’ll want to identify which fields need to be mapped across the two systems, and ensure these fields are setup in the respective systems (setting up new custom fields as needed).

If you are syncing an opportunity into a system like ConnectWise and NetSuite, you’ll want to ensure that you are setting the stage based on the picklist values that system is expecting. If you don’t, then this could be another cause of errors down the road.

So to avoid errors, you’ll want to ensure that for any picklists - using opportunity stage as an example - have matching values across both of your CRMs.

Note: we recommend creating a custom field in “CRM 1” which is the ID field synced back from “CRM 2” for all three of these objects. This will become useful later on when setting up your workflows to ensure the syncing occurs in the correct sequence, as we’ll explain later.

Step 3: Create a field to be used for a ‘sync trigger’ field for all three objects

Bedrock uses a ‘trigger field’ as part of its sync workflows, to push a record from CRM 1 to CRM 2. You’ll want to set up these as custom fields on each object: the Contact, the Account and Opportunity.

So if you are syncing from Salesforce to ConnectWise, you might simply label these “sync to ConnectWise” as a checkbox on Salesforce contacts, accounts and opportunities.

Step 4A: Use CRM workflows to ensure at the stage, the sync trigger field is flagged (for each object)

This step requires the use of CRM workflows (e.g. the Workflow Builder in Salesforce, or Workflows in HubSpot) to coordinate the updating of your data and ensure records will be triggered in the correct sequence.

So let’s say the way you are thinking about this is when an Opportunity reaches a certain stage (say 50%), you want to sync it from Salesforce to ConnectWise.

You want to sync in this order: Accounts & Contacts (OK to sync these together), then Opportunities.

You’ll have a Salesforce workflow that says when an Opportunity on the Account reaches a certain stage, update the flag. You don’t need to ever change this flag once it’s set once - as it doesn’t ever need to be synced over again (from that point forward, Bedrock’s rules for managed the bi-directional sync will apply).

For the second object, contact, you’ll want to ensure that the account exists in the second CRM before you sync - so part of the workflow for triggering the contact sync should be that the Account ID field from ConnectWise has been successfully synced back from Salesforce.

And then a similar thing for the Opportunity itself, part of flagging the Opportunity record to sync should check that the Account ID exists.

At the end of our steps below, we’ll spell out the “order of operations” of a typical sync to make sure it’s clear what the expected behavior will be once this is setup.

Step 4B: Setup field mappings in Bedrock

This could be done prior to Step 4A - this is going to be the setup of your field mappings in the Bedrock Sync interface, to define which fields will be mapped for each of the three objects - with full support for custom fields.

As part of your field mappings, you have the option to set a ‘system of record’ to determine once this object is created in CRM 2, what are the rules to govern the bi-directional updates of the object. One of the two systems could be set as a system of record to be authoritative over the other (not be overwritten), and that setting applies at a per field basis.

Step 4C: Setup sync workflows in Bedrock

Setup your Bedrock sync workflows, which will simply use the trigger field you’ve set up on each of the three objects - one for Account, one for Contact, one for Opportunity.

Step 5: Test it!

Test away.

Here’s the expected behavior based on what we outlined above:

Opportunity in Salesforce reaches Stage of 50%

The Salesforce workflow is looking for this at updates the related Account to “sync to ConnectWise” = True

Bedrock uses this as the trigger, and creates the account in ConnectWise

This process results in a ConnectWise company ID appearing on the record, which syncs back to the Account record in Salesforce

A second Salesforce workflow is looking for this field (and other values) to update the “sync to ConnectWise” field on the contact record

Bedrock uses this as the trigger, and creates the contacts in ConnectWise - added to the correct account

A third Salesforce workflow is looking for the ConnectWise company ID field (and other values) to update the “sync to ConnectWise” field on the opportunity record

Bedrock uses this as the trigger, and creates the opportunity in ConnectWise - added to the correct account, with the correct related contacts