> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.omegatheme.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Sync quotes to Salesforce

The Salesforce integration lets QuoteSnap automatically create and update records in your Salesforce org every time a B2B quote is submitted — Opportunities, Contacts, Accounts, product line items, and the quote PDF — using a field mapping you fully control. This guide walks you through connecting your org and setting up what gets synced.
### 1. Before you start
You'll connect QuoteSnap to Salesforce using the **Client Credentials Flow**, so no user has to log in during syncing. You need:
* A Salesforce org where you can create an **External Client App** (System Administrator access).
* Permission to enable OAuth and the Client Credentials Flow on that app.
* A Salesforce user the integration will run as (its permissions decide which records and fields QuoteSnap can write).
### 2. Create an External Client App in Salesforce
In your Salesforce org:
1. Go to **Setup → App Manager → New External Client App** (or *External Client App Manager*).
2. Under **API (Enable OAuth Settings)**, turn on OAuth and add the scopes `api` and `refresh_token`.
3. Enable the **Client Credentials Flow** and choose the **Run As** user for it.
4. Save, then open **Consumer Key and Secret** to copy the **Consumer Key (Client ID)** and **Consumer Secret (Client Secret)**.
|| Note: The integration writes data as the Run As user you pick. Make sure that user can create Opportunities, Contacts, and Accounts, and has field-level access to any fields you plan to map.
### 3. Connect your org in QuoteSnap
1. In the QuoteSnap admin, open **Others → Sync Data → Salesforce**.
2. Paste your **Instance URL (My Domain)** — for example https://your-org.my.salesforce.com.
3. Paste the **Consumer Key** and **Consumer Secret**.
4. Click **Verify connection**. QuoteSnap tests the credentials and loads your org's fields, stages, and users.
![](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_znrihw.png)
### 4. Choose which records to sync
Turn on any combination of the three objects. Each one can be enabled independently and has its own field mapping:
| Object | **What QuoteSnap does** |
| ---- |
| Account | Creates or updates the account from the customer's company (name, account number, phone, billing/shipping address). |
| Contact | Finds a contact by email (or creates one) and links it to the account. |
| Opportunity | Creates the deal — name, stage, owner, amount, close date, plus a full quote summary. This is the main record. |

![](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_18ycna7.png)
### 5. Map quote data to Salesforce fields
Under each object, add mapping rows to send quote data into any writable Salesforce field — including your org's custom fields. Every row has three parts:
* **Salesforce field** — searchable list of writable fields; custom fields are marked `(custom)`.
* **Value type** — **From quote** (pull a value from the quote) or **Fixed value** (a constant you set).
* **Value** — the input adapts to the field's data type so you can't enter an invalid value.
| **Field type** | **What you'll see** |
| ---- |
| Picklist | A dropdown of your org's active values — or switch to *From quote* to map it dynamically. |
| Multi-select picklist | Pick several values; QuoteSnap joins them for you. |
| Checkbox | A `true` / `false` dropdown. |
| Number / Currency | A number input. |
| Date / Date-time | Fixed → choose “+N days after sync” (1, 3, 5, 7, 9, 15). From quote → a quote date such as the created or expiry date, or a date field from your form. |
| Email / Phone / URL | An input matching that format. |
| Lookup / ID | Enter a real record ID from your org (for example an Owner, Campaign, or Price Book ID). |
| Text | A plain text box. |

###### Available quote data
Depending on the object, you can map: quote number, admin link, created / expiry date, grand total, total quantity, products summary, customer name / email / phone, company name and ID, shipping & billing address, and **any custom field from your quote form** (shown as `Form: …`).

### 6. Sync products as Opportunity line items
Turn on **“Create Opportunity line items from quote products”** in the Opportunity section. Each product in the quote becomes a line item on the Opportunity, and the Amount is calculated by Salesforce from the line totals.
* **Discounts** — per-line discounts are sent as a discount percentage; a quote-level discount is added as a “Quote discount” line so the total matches the grand total.
* **Currency** — if your org uses Multiple Currencies, the Opportunity and its line items use the quote's currency.
* **Line notes** — a product's note and properties are written into the line item's description.
![](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_eccivg.png)](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image\_1pgebb8.png)![](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image\_9xgi4g.png)![](https://storage.crisp.chat/users/helpdesk/website/-/8/3/8/3/8383e5404a31c000/image_1l24sch.png)




### 7. Attach the quote PDF
Turn on **“Attach the quote PDF to the Opportunity”** and QuoteSnap renders the quote PDF (using your active template) and attaches it to the Opportunity's **Files**. Re-syncing replaces the previous file instead of adding a duplicate.
### 8. Disconnect the integration
To turn the integration off, click **Disconnect** in the top-right of the Salesforce page and confirm in the dialog. Disconnecting clears the saved credentials and mapping and stops syncing. Records already synced stay in Salesforce, and you can reconnect at any time.
### 9. Good to know
A few results depend on how your Salesforce org is configured:
|| Org settings that affect syncing 
|| 1. State & Country picklists: if enabled, address state/country must match a valid value — free-text values may be skipped (the rest of the record still saves).
2. Discount column: the per-line Discount field only appears if your org grants field-level access to it. Otherwise the price difference still shows via List Price vs Sales Price.
3. Multiple Currencies: enable it (and activate the currency) for the quote's currency to be used.
4. Lookup / ID fields: map these to a real, existing record ID in your org — an invalid ID is skipped.
5. Duplicate rules & required fields: QuoteSnap works around a rejected field by skipping just that field, and reuses an existing contact when a duplicate rule matches — so a single field or rule never blocks the whole quote.\*\*
