How to Sync Opportunities From One CRM to Another

Written by Formstack on April 25, 2018

Posted in Workflow Automation

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, 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, when they reach a certain stage such as quoting, or when they become new customers and considered closed won.

This type of use case fits the following scenarios:

“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. 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. Before you can create an opportunity in a system like NetSuite or ConnectWise, you need to ensure that the account is synced first. The syncing of the opportunity needs to come second so 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, and 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. You’ll also want to identify which fields need to be mapped across the two systems. Once identified, it’s important to check that these these fields are setup in the respective systems, setting up new custom fields as needed.

Step 2: Ensure common picklist values for any picklists.

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.

To avoid errors, you need to make sure that the 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.

Formstack Sync 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 these up 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 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 and contacts, 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 – as it doesn’t ever need to be synced over again. From that point forward, Formstack Sync’s rules managing 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. Similar 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 Formstack Sync.

This step defines your field mappings in the Formstack Sync interface. You’ll need to decide 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 overwritten), and that setting applies at a per field basis.

Once your field mappings are set, you’ll setup your Formstack Sync workflows. This will simply use the trigger field you’ve set up on each of the three objects – one for account, one for contact, and one for opportunity.

Step 5: Test it!

Now is the time to 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
  • Formstack Sync 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
  • Formstack Sync 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
  • Formstack Sync uses this as the trigger, and creates the opportunity in ConnectWise – added to the correct account, with the correct related contacts

There you have it, two CRMs working together. You can rest assured that your data is going where it needs to, when it needs to. Cheers to efficient data workflows!


Do you have a specific question around what’s possible for your CRM to CRM data integration? Please contact our team to learn more.