← Back to Home
DOCUMENTATION

QB ↔ SF Desktop Connector

Complete guide to setting up, configuring, and operating the VKM SyncBridge QuickBooks ↔ Salesforce integration platform.

01

Overview

The VKM QB ↔ SF Desktop Connector is a real-time bidirectional integration between Salesforce CRM and QuickBooks Desktop. It eliminates manual data entry by automatically syncing Accounts, Products, Opportunities, Invoices and more — in both directions.

📸
Full dashboard view — SF dashboard showing sync statistics, QB to SF timestamps, and Recent Activity. Caption: "VKM QB ↔ SF Dashboard in Salesforce"
⬆️

SF → QB (Outbound)

Changes in Salesforce automatically sync to QuickBooks Desktop — Accounts become Customers, Opportunities become Invoices.

⬇️

QB → SF (Inbound)

Changes in QuickBooks sync back to Salesforce — Customer updates, Invoice status, balances and payment terms.

🔧

No-Code Mapping

Upload a CSV to configure any field mapping. 13 transformation types available — no developer needed for field changes.

🛡️

No Duplicates

External ID upsert prevents duplicate records. Delta sync ensures only changed records are processed each cycle.


02

Prerequisites

System Requirements

RequirementDetails
Operating SystemWindows 10 or later (64-bit)
QuickBooks Desktop2019 or later — Pro, Premier, or Enterprise
Salesforce EditionProfessional, Enterprise, or Unlimited
InternetRequired for Salesforce OAuth. 7-day offline grace period.
.NET RuntimeNot required — connector is self-contained
RAMMinimum 4GB (8GB recommended)

Salesforce Requirements

  • ✅ Salesforce Connected App (provided by VKM)
  • ✅ VKM metadata package deployed
  • ✅ OAuth Username-Password Flows enabled
  • ✅ System Administrator or custom profile with API access
ℹ️

VKM will deploy all required Salesforce metadata (custom objects, fields, triggers, and components) as part of onboarding. You do not need to configure these manually.


03

Installation

The connector is a self-contained Windows application — no installation required. Simply copy the provided folder to your machine and run.

  1. 1

    Copy the connector folder

    Extract the provided ZIP file to a permanent location, e.g. C:\VKMConnector\. Do not move it after setup as settings are stored relative to this path.

  2. 2

    Open QuickBooks Desktop first

    Launch QuickBooks and open your company file before starting the connector. QuickBooks must be running whenever the connector is active.

  3. 3

    Run QBSFConnector.exe

    Double-click QBSFConnector.exe. The connector window will open.

  4. 4

    Accept the QuickBooks popup

    On first run, QuickBooks will show a security prompt asking permission for the connector app. Click Yes, Always Allow. This only appears once.

📸
QuickBooks Desktop security/permission popup dialog. Caption: "Click 'Yes, Always Allow' on first run"
⚠️

Important: Always open QuickBooks Desktop and your company file before starting the connector. If QuickBooks is not running, the connector will fail to connect after 3 attempts and stop.


04

First Sync Setup

  1. 1

    Click Settings

    Open the Settings panel and enter your Salesforce credentials. Click Connect to Salesforce — a browser window will open for OAuth login.

  2. 2

    Configure QuickBooks connection

    Enter the QB App Name (provided by VKM) and optionally the path to your company file. Leave company file blank to use the currently open file.

  3. 3

    Set QB Default Accounts

    Click QB Accounts and enter your QuickBooks Chart of Accounts defaults. These are required for creating Items in QB. Enter names exactly as they appear in QB.

  4. 4

    Enter License Key

    Enter the license key provided by VKM and click Verify.

  5. 5

    Click Start

    Click the ▶ Start button. Watch the Live Log — you should see Salesforce and QuickBooks both show as Connected within 30 seconds.

📸
Windows connector app — after clicking Start, showing "✓ Salesforce connected", "✓ QuickBooks connected" in the Live Log. Caption: "Connector running — both systems connected"

05

Salesforce Setup

Manage Mappings

All field mapping configuration is done from the Manage Mappings button in the Salesforce dashboard. You can view active mappings, upload new ones, and delete existing ones.

📸
Manage Mappings modal — showing list of active mappings (Account→Customer, Opportunity→Invoice etc.) with direction badges. Caption: "Active mappings in the Manage Mappings panel"

Uploading a Mapping CSV

  1. 1

    Download the mapping template

    Download QB_SF_Mapping_Template_v3.xlsx from VKM. Each sheet is a separate mapping. Export the sheet you need as CSV.

  2. 2

    Open Manage Mappings

    In the Salesforce dashboard, click Manage MappingsUpload Mapping CSV.

  3. 3

    Select your CSV file

    Choose the exported CSV. The filename must contain the entity name: Acct, Product, Oppty, or Invoice. For child mappings, include _CHILD_ in the filename.

  4. 4

    Upload and verify

    Click Upload. The mapping will appear in the Active Mappings list immediately.

📸
Upload Mapping CSV dialog — showing file picker and the mapping preview after upload. Caption: "Uploading a field mapping CSV"
📸
Field mapping viewer — showing SF Field → QB Field → Transformation columns for a mapping. Caption: "Field mapping detail view"

06

Connector Settings

📸
Settings panel — showing all fields: Instance URL, Client ID, Client Secret, Username, App Name, Company File, Polling Interval, License Key. Caption: "Connector Settings panel"
SettingDescriptionExample
Instance URLYour Salesforce org URLhttps://myorg.salesforce.com
Client IDConnected App Consumer Key (provided by VKM)
Client SecretConnected App Consumer Secret (provided by VKM)
QB App NameMust match the registered QB app name exactlyQBSalesforceSync
Company FileFull path to .QBW file. Leave blank to use currently open file.C:\Data\Company.QBW
Polling IntervalSync cycle in seconds. Default: 3030
License KeyProvided by VKM on purchaseVKMQB-XXXXX-XXXXX
💡

After changing any setting, click Stop then Start to apply. Settings take effect on next connector startup.


07

QB Default Accounts

Click QB Accounts in the connector to set default Chart of Accounts. These are used when creating Items in QuickBooks. Enter names exactly as they appear in QB (Lists → Chart of Accounts).

📸
QB Accounts settings form — showing Income Account, COGS Account, Asset Account fields filled in. Caption: "QB Default Accounts configuration"
FieldPurposeRequired
Income / Sales AccountUsed for all item types. Revenue account.Required
COGS AccountCost of Goods Sold. Inventory items only.Inventory
Inventory Asset AccountAsset account. Inventory items only.Inventory
Expense AccountDefault purchase-side account.Optional
AR AccountAccounts Receivable.Optional
⚠️

If account names don't match exactly, Item creation in QB will fail with an "account not found" error. Copy the exact name from QB's Chart of Accounts list.


08

Field Mapping

Field mappings define which Salesforce fields sync to which QuickBooks fields. All mappings are configured via CSV upload — no code changes needed.

CSV Format

SF_Field_API_Name,QB_Field_Name,Required (Y/N),Transformation,Default_Value,Notes
Name,Name,Y,Simple,,Customer name
BillingStreet,BillAddr1,N,AddressSplit:1,,First 41 chars of address
BillingStreet,BillAddr2,N,AddressSplit:2,,Address overflow
CustomerRef.ListID,Linked_Account__c,N,Link:Account:QB_Customer_ID__c,,Links to SF Account

Supported Entities

SF ObjectQB EntityDirectionTemplate Sheet
AccountCustomerSF → QBAcct_to_Customer
AccountCustomerQB → SFCustomer_to_Acct
Product2ItemSF → QBProduct_to_Item
Product2ItemQB → SFItem_to_Product
OpportunityInvoiceSF → QBOppty_to_Invoice
QB_Invoice__cInvoiceQB → SFInvoice_to_SF
OpportunityLineItemInvoiceLineSF → QBOpptyLines_CHILD_Oppty
ContactCustomer (Sub)SF → QBContact_to_SubCustomer

09

Transformations

Transformations modify field values during sync. Set in the Transformation column of your mapping CSV.

Simple
Transformation: Simple

Copy value as-is. Default if blank.

Trim
Transformation: Trim

Remove leading and trailing spaces.

Concatenate
Concatenate:Invoice {value}

Wraps value in a template. {value} is replaced with the field value. Result: "Invoice 8"

Left / Right
Left:50 Right:10

First N or last N characters of the value.

Mid
Mid:2:8

8 characters starting from position 2.

DateFormat
DateFormat:yyyy-MM-dd

Reformat a date. Uses standard .NET format strings.

AddressSplit
AddressSplit:1 AddressSplit:2

Splits long addresses into 41-char QB chunks. Use :1 and :2 on the same SF field for two QB address lines.

Link
Link:Account:QB_Customer_ID__c

Finds a Salesforce record by matching a field value. Returns the SF record Id for lookup field population.

Upper / Lower
Upper Lower

Convert value to UPPERCASE or lowercase.

Replace
Replace:USD:$

Replace text. Replace:old:new — replaces all occurrences.

NumberFormat
NumberFormat

Rounds numeric values to 2 decimal places.

Static
Static

Always returns the Default_Value column. Ignores the QB/SF field value entirely.

💡

Link transformation tip: To populate the Linked Account field on a QB Invoice record, map CustomerRef.ListID (not CustomerRef) with Link:Account:QB_Customer_ID__c. CustomerRef returns the name; CustomerRef.ListID returns the QB ID needed for matching.


10

SF → QB Sync

Salesforce changes are automatically detected and synced to QuickBooks on the next connector cycle (default: every 30 seconds).

How it works

  1. 1

    Record saved in Salesforce

    When an Account, Product, Opportunity, or Contact is created or updated in SF, an Apex trigger fires automatically.

  2. 2

    Job queued

    The trigger creates a record in the sync queue (QBSync_Queue__c) with the record data as payload.

  3. 3

    Connector picks up job

    On the next cycle, the connector fetches pending jobs from Salesforce and processes each one through the field mapping engine.

  4. 4

    QB record created or updated

    The connector creates or modifies the QB record. If it's a new record, the QB ID is written back to the Salesforce record automatically.

Dependency Order

ℹ️

For Opportunity → Invoice sync, the parent Account must already be synced to QB first. The Account's QB_Customer_ID__c field must be populated. Sync Accounts before Opportunities.

Triggering a Manual SF → QB Sync

Click ↑ SF → QB button in the Salesforce dashboard to immediately queue all eligible records for sync.

📸
SF → QB button confirmation modal — showing the list of entities that will be queued. Caption: "Triggering a manual SF → QB sync"

11

QB → SF Sync

QB → SF sync runs automatically every 10 connector cycles (~5 minutes). You can also trigger it manually from the Salesforce dashboard.

Delta Sync — Only Changed Records

The connector tracks a per-entity timestamp for each QB entity. On each run, only records modified after the last sync timestamp are queried — making subsequent syncs fast regardless of total record count.

Manual QB → SF Trigger

  1. 1

    Click ↓ QB → SF in the dashboard

    This queues a manual sync request. The connector picks it up on the next cycle (within 30 seconds).

  2. 2

    Confirm the trigger modal

    Click Confirm to proceed. The connector will query QB for all entities that have QB→SF mappings configured.

  3. 3

    Watch the Live Log

    In the connector app, you'll see log lines like ✓ Queried 13 QB Customers and ✓ 13 synced, ✗ 0 failed.

📸
Windows connector Live Log showing QB→SF sync messages: "Queried 13 QB Customers", "Syncing 13 QB Customer → SF Account", "✓ 13 synced". Caption: "QB → SF sync in progress"

Invoice Status

When QB Invoices sync to Salesforce, the Status field is automatically derived:

QB ConditionSF Status Value
Balance Remaining = 0Paid
Due Date passed, balance > 0OverDue
Due Date not passed, balance > 0Open

12

Salesforce Dashboard

📸
Full qbSyncHome dashboard — showing System Status cards (SF Connected, QB Connected, Connector Online), Sync Statistics (Successful/Pending/Failed/Total), and action buttons. Caption: "QuickBooks Sync Dashboard"

System Status

IndicatorMeaning
🟢 Salesforce — ConnectedSF API is accessible. Always green when viewing the dashboard.
🟢 QuickBooks — ConnectedQB Desktop is open and connector has an active session.
🟢 Desktop Connector — OnlineConnector pinged SF within the last 2 minutes.
🔴 Connector — OfflineConnector hasn't pinged in 2+ minutes. Check if it's running.

Action Buttons

ButtonAction
↑ SF → QBQueue all eligible SF records for sync to QuickBooks
↓ QB → SFTrigger immediate QB → SF sync for all mapped entities
Manage MappingsView, upload, and delete field mapping configurations
RefreshReload dashboard statistics and recent activity

13

QB → SF Sync Timestamps

The timestamp panel shows when each QB entity was last synced to Salesforce. Timestamps control delta sync — only records modified after the timestamp are synced.

📸
QB to SF Sync Timestamps panel — showing Customer and Invoice rows with last sync times and Reset buttons. Caption: "Per-entity sync timestamps"

Reset Timestamp

Clicking Reset on an entity clears its timestamp. The next QB → SF sync will re-sync all records for that entity from scratch. Use this when:

  • • You want to re-sync all QB records after a mapping change
  • • SF records were accidentally deleted and need to be recreated
  • • Initial migration after going live
⚠️

Reset All Timestamps will re-sync ALL QB entities. For large datasets this may take several minutes. Contact VKM support before resetting all timestamps in a production environment.


14

Supported Entities

SF ObjectQB EntityDirectionOperations
Account Customer SF→QB QB→SF Create, Modify
Contact Customer (Sub) SF→QB Create, Modify as sub-customer
Product2 Item SF→QB QB→SF Create, Modify
Opportunity Invoice SF→QB Create, Modify + line item replace
OpportunityLineItem InvoiceLine SF→QB Create, Modify (child of Opportunity)
QB_Invoice__c Invoice QB→SF Upsert with derived Status field
ℹ️

Additional entities (Order, Payment, Estimate, Bill) are available as paid add-ons. Contact VKM for a quote.


15

Troubleshooting

Common Issues

QB Connection Failed

⚠️

Log shows: Could not connect to QuickBooks after 3 attempts

  1. 1

    Open QB Desktop first

    QuickBooks must be open and a company file loaded before starting the connector.

  2. 2

    Check for QB popup

    On first run, QB shows a permission popup. Accept it with "Yes, Always Allow".

  3. 3

    Restart both apps

    Close the connector, then close and reopen QB. Start the connector again.

Salesforce Auth Failed

⚠️

Log shows: Salesforce authentication failed

Click Settings → Connect to Salesforce to re-authenticate. If the browser doesn't open, check that ports 8080–8084 are not blocked by your firewall.

Records Not Syncing

Check in order:

  • 1. Is the connector running? Check the Live Log for cycle messages.
  • 2. Is there an active mapping for that entity? Check Manage Mappings.
  • 3. Is the parent record synced first? (Account before Opportunity)
  • 4. Check the Recent Activity in the SF dashboard for Failed records.

QB Won't Close

The connector holds a QB session while running. Always click ■ Stop in the connector before closing QuickBooks. Wait for "Sync engine stopped" in the log before closing QB.

Duplicate Records in QB

Should not occur normally — the connector uses external ID upsert. If duplicates appear, verify the QB_Customer_ID__c field on the Account is marked as External ID in Salesforce Setup.

Log MessageCauseFix
✗ INVALID_FIELD on upsertExternal ID included in request bodyContact VKM — connector update required
⚠ Link: No Account foundAccount not yet synced to QBSync Account first, then retry Invoice
✗ asset account requiredMissing QB Asset Account defaultSet Inventory Asset Account in QB Accounts settings
✗ QB Invoice errorProduct not in QB (no QB_Item_ID__c)Sync Product2 to QB before syncing Opportunity

16

Frequently Asked Questions

Does the connector work with QuickBooks Online?

No. This connector is specifically built for QuickBooks Desktop (Pro, Premier, Enterprise). QuickBooks Online has a different API and is not supported by this connector.

What happens if the connector is offline?

SF changes are queued in QBSync_Queue__c and processed when the connector comes back online. QB→SF sync will catch up from the last timestamp — no records are lost.

Can multiple users trigger syncs simultaneously?

Yes — the queue handles multiple requests. However, only one connector instance should run per QB company file to avoid session conflicts.

How long does a full sync take?

Initial sync depends on record count. Typically: 100 records ≈ 30–60 seconds. Subsequent (delta) syncs are near-instant as only changed records are processed.

Can I add custom fields to the sync?

Yes — add a row to the mapping CSV with the SF API field name and QB field name, then re-upload via Manage Mappings. No developer required.

Is my Salesforce data secure?

Yes. The connector uses OAuth 2.0 — no passwords are stored. All communication is over HTTPS. Data is processed locally on your Windows machine and is never stored by VKM servers.


17

Support

📧

Email Support

support@vkmtechnosolutions.com
Response within 1 business day.

🔧

Custom Development

Need a new entity synced? Contact VKM for a quote. 1–2 days per entity.

📋

License Issues

Include your Machine ID (shown in connector log on startup) when contacting support.

🚨

Emergency

For production-down issues, contact VKM directly via WhatsApp or phone.

💡

When reporting an issue, always include: (1) the exact error message from the Live Log, (2) which entity was syncing, (3) whether it's SF→QB or QB→SF direction. This helps VKM resolve issues faster.

// Mobile menu toggle const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const sidebar = document.getElementById('sidebar'); const sidebarOverlay = document.getElementById('sidebarOverlay'); if (mobileMenuBtn && sidebar && sidebarOverlay) { function toggleMobileMenu() { sidebar.classList.toggle('open'); sidebarOverlay.classList.toggle('show'); } function closeMobileMenu() { sidebar.classList.remove('open'); sidebarOverlay.classList.remove('show'); } mobileMenuBtn.addEventListener('click', toggleMobileMenu); sidebarOverlay.addEventListener('click', closeMobileMenu); // Close menu when clicking nav links on mobile document.querySelectorAll('.nav-link').forEach(link => { link.addEventListener('click', function() { if (window.innerWidth <= 768) { closeMobileMenu(); } }); }); }