Skip to content

From Closed-Won to Posted Invoice: Wiring Salesforce Into Campfire

A practical guide to connecting Salesforce and Campfire, the AI-native accounting and ERP system. It walks through which Salesforce objects map to which Campfire records, how to key them so the same customer is never created twice, how change detection works on both sides, and what to send back to the rep once an invoice posts and a payment clears. Includes the field mapping most teams start with and the mistakes that cause duplicate customers.

Author
Ruben Burdin · Founder & CEO
Published
July 21, 2026
Read time
9 min read
From Closed-Won to Posted Invoice: Wiring Salesforce Into Campfire
ARTICLE

Salesforce knows who agreed to buy. Campfire knows what they were actually billed, what they paid, and what the revenue schedule looks like. Between those two facts sits the handoff that most finance teams still do by hand: someone reads a closed-won opportunity, retypes the customer and the line items into the ledger, and then answers the rep in Slack a week later when they ask whether the invoice went out.

That handoff is a sync problem, not a process problem. This guide walks through wiring Salesforce into Campfire so the deal becomes an invoice on its own, and so the invoice, the balance, and the payment status come back to the rep without anyone opening the ledger. It covers the object mapping, the keys that stop duplicate customers, and how changes are detected on each side.

Wire Salesforce into Campfire in three moves: connect both sides, map the objects, then sync both ways in seconds

Three moves: connect, map, sync. The detail that decides whether it works long term is in the second one, so most of this guide sits there. If you are choosing a platform to run it on, start with our guide to what a Campfire integration platform has to get right.

Step 1: connect both sides

Salesforce connects over OAuth, so the sync acts as an integration user with the permissions you grant it and nothing more. Campfire connects with an API key you mint yourself: create a dedicated API user under Settings, give it a role, and copy the key once. The key is sent as an Authorization: Token header on every request.

Use a separate API user for the integration rather than a person's credentials. It means the audit log shows clearly which writes came from the sync, and it means you can rotate or revoke that one key without locking a controller out of their own ledger. If you only need a read-only feed into a warehouse, the view only role is enough; a quote-to-cash sync that creates invoices needs write access.

Step 2: map the objects, and pick a key

This is where the sync is won or lost. Salesforce and Campfire model the same customer differently, so decide up front which system owns which field, then match records on a stable id rather than a name.

SalesforceCampfireDirection
AccountCustomerTwo-way, Salesforce owns the name and address
ContactBilling contact on the customerTwo-way
Opportunity, closed-wonInvoice with line itemsSalesforce to Campfire
Order and order productsInvoice linesSalesforce to Campfire
Invoice number, balance, statusInvoice and paymentsCampfire to Salesforce, read-only for reps

The mapping most teams start with. Ownership per field matters more than the object list.

For the key, write the Campfire customer id onto the Salesforce account and the Salesforce account id onto the Campfire customer. Every later change then updates the existing pair. Teams that skip this and match on company name end up with two customers for the same buyer within a month, usually because someone typed a trailing Inc. Campfire also supports custom fields and custom dimensions on its objects, which is the natural place to park that external id.

Quote to cash pipeline: closed-won in Salesforce, captured, mapped, posted as a Campfire invoice, then reflected back to the account
The quote-to-cash path, from a closed-won opportunity to a posted invoice and back.

Step 3: sync both ways, and watch the round-trip

With the mapping in place, the engine watches both sides. On the Salesforce side it picks up the change as soon as the record is saved. On the Campfire side it subscribes to webhooks, with last_modified_at filtering on the list endpoints as the backfill path and the safety net. Nothing here runs on a nightly timer.

Sequence diagram of one quote-to-cash round-trip between Salesforce, the Stacksync engine, and Campfire
One round-trip: closed-won to invoice, then invoice and payment status back to the account.

The step people forget is the return leg. Once Campfire posts the invoice and generates its journal entry, the invoice number, balance, due date, and payment status belong back on the Salesforce account. That is what stops the Slack question. It is also what lets customer success see that an account is 60 days past due before they renew it, without giving every rep a seat in the ledger.

Origin tracking is what keeps the round-trip from becoming a loop. When the engine writes the invoice number into Salesforce, it tags that write as its own, so the resulting Salesforce update is not read back as a fresh change and pushed into Campfire again. Without it, two systems that both watch for changes will happily ping the same record back and forth forever.

Book a Stacksync demo: push closed-won Salesforce deals into Campfire and send invoice status back

The cases that break a naive sync

A demo sync handles the happy path. These are the ones worth testing before you trust it with a close.

  • The deal changes after it is invoiced. Decide whether an amended opportunity updates the invoice, issues a credit memo, or does nothing and raises a flag. Campfire supports credit memos and partial updates, so all three are possible; pick one deliberately.
  • Both sides edit the same field. A rep fixes the billing address while finance fixes it differently. A field-level conflict policy decides the winner per field, rather than the last write clobbering the whole record.
  • The customer already exists. Match on the external id, and when there is no id, fall back to a deterministic rule and log it, rather than silently creating a second customer.
  • A write fails. A required field missing in Campfire should retry and surface, not disappear. This is the difference between a sync you can leave alone and one someone has to babysit.

None of these are exotic. They all show up in the first quarter, and how a platform handles them is the real product difference. For the wider argument on why a scheduled export cannot cover them, see real-time sync versus batch ETL.

One handoff, wired once

Salesforce and Campfire do not need a person in the middle. Connect both sides, map the objects on a stable key, sync in both directions, and the deal becomes an invoice on its own while the invoice becomes something the rep can see. The work is in the mapping, and it is a one-time job.

Stacksync runs that sync in real time and in both directions, with field-level conflict resolution and an audit log per record, alongside the rest of your stack on the same engine. To see it map your Salesforce objects to Campfire, book a demo, or read how the same engine handles Campfire and NetSuite.

Keep Salesforce and Campfire in step with two-way sync

FAQ

Frequently asked questions

How do I sync Campfire with Salesforce?
You connect Salesforce over OAuth and Campfire with an API key minted for a dedicated API user, then map the objects: Salesforce accounts to Campfire customers, and closed-won opportunities or orders to Campfire invoices. A sync engine watches both sides for changes, applies each one to the other in seconds, and settles conflicts field by field so neither system overwrites good data.
Which Salesforce objects map to which Campfire records?
The common starting point is account to customer, contact to the billing contact on that customer, and closed-won opportunity or order to invoice with its line items. Products and price book entries map to the items on the invoice line, and the Campfire invoice number, balance, and status come back onto the Salesforce account or opportunity as read-only fields for the rep.
How do I stop duplicate customers being created in Campfire?
Pick a stable external key and store it on both sides, then match on that instead of on name. Most teams write the Campfire customer id onto the Salesforce account and the Salesforce account id onto the Campfire customer record, so every later change updates the existing pair rather than creating a second one. Matching on company name is the single most common cause of duplicate customers.
Does the sync work in both directions?
Yes, and for quote to cash it needs to. Sales edits the account and closes the deal, finance issues and adjusts the invoice, and both facts have to reach the other side. A two-way sync applies each change where it belongs and uses origin tracking so a write it just made is not read back as a new change and looped forever.
How fast does a closed-won opportunity become an invoice in Campfire?
With a real-time sync it is seconds, not a nightly batch. The change is picked up as soon as the opportunity is saved in Salesforce, the account is matched to a Campfire customer, and the invoice with its line items is created through the Campfire API, which generates the journal entry with it.
Can reps see payment status without a Campfire login?
Yes. Once the invoice posts, the invoice number, balance, due date, and payment status can be written back onto the Salesforce account or opportunity as fields, so reps and CS see collection reality in the CRM they already live in, and only finance needs a Campfire seat.

About the author

Ruben Burdin
Ruben Burdin
Founder & CEO

Ruben Burdin is the Founder and CEO of Stacksync, the first real-time and two-way sync for enterprise data at scale. Ruben is a Y Combinator alumni with a strong background in software engineering and business.

All posts by Ruben Burdin

About Stacksync

Stacksync powers real-time, two-way sync between CRMs, ERPs, and databases. Engineers sync data at scale and automate workflows, not dirty API plumbing.

Coworkers laughing in front of a laptop in a casual office setting

Your last integration took months.
Your next one takes a prompt.