Opportunity Creation and Quote Sync

How opportunity linkage works across Salesforce and quote workflows, what fields matter, when primary quote is required, and why certain sync actions get blocked.

📘

Overview

Opportunity sync in MonetizeNow is built around pairing one MN Opportunity with one Salesforce Opportunity and keeping that pairing stable as quotes move through the pipeline. Linkage, creation, and outbound updates each follow separate rules. This doc covers all three.

Layer 1: Identity

Which MN Opportunity maps to which Salesforce Opportunity, tracked through IDs and association records.

Layer 2: Primary Quote

Which quote is designated as primary for an opportunity. Changing it after finalization is blocked, and certain linking flows depend on it being set correctly in Salesforce.

Layer 3: Sync Direction

Whether an action originated in Salesforce or in MonetizeNow. Both paths exist and both have their own rules.

Two Directions. One Relationship.

Sync runs both ways, but each direction has its own logic and prerequisites.

Flow A: Salesforce → MonetizeNow

  1. SFDC Opportunity: starting point
  2. Check for link: monetize__Id__c?
  3. Check primary quote: MN Quote ref?
  4. Link or Create: MN Opportunity

Key rule: If monetize__Id__c is already populated on a SFDC Opportunity, MonetizeNow treats it as already linked and won't relink through this path. If no ID is found, it looks for a primary quote reference to resolve which opportunity to link.

Flow B: MonetizeNow → Salesforce

  1. MN Opportunity: already linked
  2. Locate SFDC record: association or customId
  3. Update SFDC Opp: link + primary quote

Key rule: If a Salesforce Opportunity can't be located (no stored association, no customId), sync is skipped. MonetizeNow requires a confirmed identifier before writing back to Salesforce.

Fields That Control Linkage Behavior

These are the fields on each side that determine how opportunities are linked and synced.

Salesforce Fields

FieldWhat it does
monetize__Id__cPopulated by MonetizeNow once an opportunity is linked. Its presence signals that a link already exists.
monetize__PrimaryQuote__cReference to the MN Quote used to resolve which opportunity to link when no link exists yet
Name / AccountCarried into MonetizeNow when a new opportunity is created from a Salesforce-initiated quote flow

MonetizeNow Fields

FieldWhat it does
MN Opportunity IDPrimary identifier for an opportunity in MonetizeNow
MN Quote IDQuote designated as primary for this opportunity
MN↔SFDC associationStored internally once a link is confirmed. MonetizeNow uses this to locate the right Salesforce record for all subsequent syncs.

How Outbound Resolution Works

When pushing updates to Salesforce, MonetizeNow checks in this order.

#CheckResult
1Stored association from an earlier sync found?✅ Use it. Update SFDC.
2No stored association, but a Salesforce Opportunity was referenced when this MN Opportunity was created?⚠️ Use that reference as fallback.
3No link of any kind found?❌ Sync skipped. No SFDC update.

Six Things Worth Knowing

Core behaviors before going live.

  1. One-to-one pairing. Each MN Opportunity maps to exactly one Salesforce Opportunity. If a link already exists and something tries to create a conflicting one, MonetizeNow returns an error.
  2. Link is established once, reused after. MonetizeNow stores the Salesforce association after initial linkage and uses it for all subsequent syncs. No manual configuration is required to maintain it.
  3. Primary quote is structural. In certain linking flows, a valid MN Quote reference in Salesforce is required to resolve which opportunity to link.
  4. Account context first. Opportunity creation depends on account linkage being in place. Without it, downstream behavior becomes unreliable.
  5. Unresolvable = skip. If MonetizeNow can't locate the linked Salesforce Opportunity, it skips the outbound update rather than write to an unverified record.
  6. Conflicts return errors. Attempting to link an already-associated opportunity to a different SFDC record throws a conflict error. The existing association has to be resolved first.

Did this page help you?