Back to all resources

Salesforce-to-ERP Revenue Workflow for B2B SaaS (2026)

Step-by-step guide to automating the path from closed-won Salesforce deals to invoices, payments, and ASC 606 revenue recognition in NetSuite and Sage Intacct. Covers source-of-truth rules, object mapping, Stripe payout reconciliation, and the failure modes that create the most manual cleanup.

·10 min read

Salesforce-to-ERP Revenue Workflow: How SaaS Companies Turn Closed-Won Deals into Recognized Revenue (2026)

Last updated: March 2026

A Salesforce-to-ERP revenue workflow converts a closed-won Salesforce deal into invoices, payments, and recognized revenue inside an ERP such as NetSuite or Sage Intacct. It synchronizes contract terms, billing schedules, payment activity, and revenue recognition so finance teams eliminate manual invoicing, reduce reconciliation errors, and maintain ASC 606 compliance.

To design one that works, assign source-of-truth rules per field (Salesforce owns commercial terms, billing owns invoice logic, the ERP owns accounting outcomes), maintain durable external ID linkages across all systems, and ensure contract fidelity is preserved through every handoff so revenue schedules reflect the economic substance of each deal.

Step What happens System
Deal closes Opportunity validated, approved for billing Salesforce
Contract terms normalized Billing cadence, pricing model, amendments extracted Integration layer
Billing records created Subscription or invoice schedule generated Stripe / billing platform
Invoice posted Sales order and invoice created NetSuite / Sage Intacct
Payments reconciled Charges matched to receivables, payouts matched to bank Stripe + ERP
Revenue recognized ASC 606 schedules generated from contract attributes ERP

Related: How to Create NetSuite Invoices from Closed-Won Salesforce Opportunities · How to Sync Salesforce Contracts to Sage Intacct Invoices · NetSuite + Stripe + Salesforce Integration Guide · Stripe NetSuite Reconciliation: Payouts, Fees, Refunds & Chargebacks · Contract-to-Cash Automation for SaaS: The Complete Playbook

What is a Salesforce-to-ERP workflow?

A Salesforce-to-ERP workflow is the automated pipeline that converts a closed-won CRM deal into accounting records inside an ERP. It synchronizes contract terms, billing schedules, invoices, payments, and revenue recognition across Salesforce, billing platforms (like Stripe), and ERP systems like NetSuite or Sage Intacct.

Without this workflow, finance teams must manually recreate invoices and revenue schedules from CRM data — a process that introduces billing errors, delays month-end close, and breaks the audit trail between what was sold and what was recognized.

When do companies need a Salesforce-to-ERP revenue workflow?

Companies typically build or adopt this workflow when they experience one or more of the following:

SymptomWhat it indicatesManual invoice creation after deals closeNo automated handoff from CRM to billingRevenue schedules built in spreadsheetsERP lacks contract context from SalesforceBilling errors from contract misinterpretationContract terms are not normalized before billingMonth-end close takes 5+ daysReconciliation requires manual cross-system checksSalesforce and ERP show different contract valuesNo source-of-truth rules or bidirectional ID mappingFinance team spends 8–15 hours/week on invoicingWorkflow is not automated end-to-end

These symptoms indicate the company's contract-to-cash workflow is not automated. The earlier a company addresses them, the less manual cleanup accumulates — but most teams do not prioritize the workflow until they are preparing for a fundraise, an audit, or a month-end close that takes too long.

How much time and revenue do broken Salesforce-to-ERP workflows cost?

Most B2B SaaS finance teams have a version of the same problem. A rep closes a deal in Salesforce, and then someone manually creates an invoice, posts a journal entry, or copies contract terms into the ERP. The workflow between closed-won and recognized revenue is stitched together with spreadsheets, Slack messages, and tribal knowledge about which system holds the correct number.

The cost of that fragility is not dramatic. It is slow, grinding, and cumulative. Industry data quantifies the damage:

Metric Typical impact Source
Revenue leakage from billing errors 1–5% of EBITA annually EY
Companies experiencing some form of revenue leakage 42% MGI Research
Finance team time spent on manual invoicing and reconciliation 8–15 hours per week Industry benchmarks
DSO reduction achievable with contract-to-cash automation 7–15 days within one quarter JPMorgan working capital research
Payment failures causing subscriber churn 20–40% of involuntary churn Chargebee
Revenue leakage at $10M ARR company (at 3% rate) $300,000 per year

For a $10M ARR company, even a 3% leakage rate means $300,000 per year — two full-time hires, a marketing budget, or the difference between profitability and burning cash. A JPMorgan working capital study found that reducing DSO by just 7 days unlocks cash equivalent to 2% of annual revenue.

A well-designed Salesforce-to-ERP revenue workflow fixes these problems at the architecture level, not by adding more people to check more spreadsheets. For deeper analysis of revenue leakage mechanics, see Revenue Leakage in SaaS: Why You're Losing 3–5% of ARR. For DSO benchmarks by company stage, see DSO Benchmarks for B2B SaaS 2026.

What a Salesforce to ERP revenue workflow actually covers

The full path runs from opportunity through invoice, payment, bank settlement, and revenue recognition. Calling it "Salesforce to ERP" undersells the scope. A complete workflow covers six stages:

Stage What happens Primary system
1. Opportunity validation Required fields checked, deal approved for billing Salesforce
2. Contract term normalization Billing cadence, pricing model, amendment logic extracted Salesforce → Integration layer
3. Billing record creation Subscription, order, or invoice schedule created Stripe / billing platform
4. ERP posting Sales order, invoice, receivable created NetSuite / Sage Intacct
5. Payment & payout reconciliation Charges matched to receivables, payouts matched to bank deposits Stripe + ERP
6. Revenue recognition ASC 606 schedules generated from contract attributes ERP

Each step depends on data produced by the step before it. Revenue recognition is where incomplete workflows cause the most expensive cleanup.

Salesforce to ERP revenue workflow architecture

A typical B2B SaaS finance stack includes four layers. Each layer has a distinct role, and the integration layer is what keeps data consistent across systems.

Layer Example tools Role in the workflow
CRM Salesforce Deal terms, pricing, products, approvals
Billing Stripe, Chargebee, Orb Invoice generation, payment collection, subscription lifecycle
ERP NetSuite, Sage Intacct Accounting, AR, cash application, revenue recognition
Integration / orchestration LedgerUp, Workato, Boomi Contract-to-cash data mapping, transformation, retry logic, monitoring

The integration layer is critical because it maintains state across systems. Without it, each system operates on its own version of the truth. LedgerUp acts as the stateful orchestration layer, ensuring contract data extracted from Salesforce stays consistent as it flows into Stripe for billing and NetSuite or Sage Intacct for accounting — including handling amendments, refunds, and edge cases that break simpler point-to-point integrations.

Why this workflow breaks so often

The handoff from CRM to ERP spans at least three systems (Salesforce, billing, ERP) and often four or five when you include payment processing and revenue recognition modules. Each system has its own data model, its own object relationships, and its own assumptions about what a "deal" looks like.

Breakdowns rarely happen because of a single integration failure. They accumulate when teams treat the workflow as a series of one-time data exports rather than a managed, stateful process. A rep changes a price in Salesforce after the deal is marked closed-won, and the billing system never sees the update. A credit memo is issued in the ERP, but Salesforce still shows the original contract value.

The root issue is that no one has explicitly decided which system owns which piece of data. When commercial terms live in Salesforce, invoice logic lives in a billing platform, and accounting outcomes live in the ERP, any ambiguity about ownership produces conflicting values across systems.

Source-of-truth rules: which system should own what

Source of truth should be assigned per object and per field, not per department. The system where data is created and most reliably maintained should own it.

Salesforce owns commercial intent

Salesforce should own the opportunity, account, contact relationships, contract terms (pricing, dates, products, billing frequency), and approval status. Sales reps and RevOps teams maintain these records, and downstream systems should consume them rather than duplicate or override them.

Custom fields like Billing_Cadence__c, Contract_Start_Date__c, and Renewal_Type__c belong in Salesforce because they reflect the deal as negotiated. Any change to commercial terms should originate here and propagate forward.

The billing system owns invoice logic

The billing system (Stripe Billing, a standalone subscription platform, or a billing module) should own invoice generation schedules, proration calculations, usage metering, tax computation, and payment collection events. Billing owns the "how and when" of charging the customer. It should not own the "what was agreed," which stays in Salesforce.

The ERP owns accounting outcomes

The ERP (NetSuite, Sage Intacct, or equivalent) should own the general ledger, accounts receivable, cash application, credit memos, and revenue recognition schedules. NetSuite's order-to-revenue workflow includes sales orders, invoices, cash sales, return authorizations, credit memos, and cash refunds. The ERP is where the financial facts are recorded, reported, and audited. It should receive structured inputs from upstream systems, not raw deal data that requires manual interpretation.

Data type Source of truth Direction of sync
Deal terms, pricing, products, dates Salesforce Salesforce → Billing → ERP
Invoice schedules, proration, tax Billing system Billing → ERP, status → Salesforce
GL entries, receivables, cash application ERP ERP → Salesforce (write-back)
Revenue recognition schedules ERP Contract data flows in; schedules stay in ERP
Payment collection, refunds, disputes Stripe / payment processor Stripe → ERP, status → Salesforce

The core objects that need to sync across systems

A durable cross-system workflow depends on consistent records and shared identifiers. Missing or mismatched IDs are the most common cause of broken traceability.

Customer and entity records

The customer in Salesforce (Account) must map to a customer record in the billing system and a customer or entity record in the ERP. For multi-entity SaaS companies, subsidiary mapping matters: a single Salesforce Account might correspond to different legal entities depending on the billing country or contracting subsidiary.

Key fields to sync include legal entity name, billing address, tax ID, billing contact email, subsidiary or entity code, and payment terms.

Deal and contract records

The Salesforce Opportunity (with its line items) is the starting point for downstream financial records. Each Opportunity should carry a unique external ID that persists across systems. Salesforce Trailhead documents a pattern where the NetSuite internal ID for the resulting sales order is written back to a custom field on the Salesforce Opportunity. That bidirectional ID linkage is the minimum requirement for traceability.

Invoice and payment records

Invoices, payments, refunds, disputes, credit memos, and payouts each exist as separate objects in their respective systems. The relationships between them are not always one-to-one. A single invoice can have partial payments, a partial refund, and a dispute, each generating its own record in Stripe and its own accounting entry in the ERP.

Every funds movement in Stripe creates a BalanceTransaction, and payouts can aggregate multiple transactions into a single bank deposit. The sync design must preserve these relationships, not flatten them.

The six-step workflow from closed-won to recognized revenue

Step 1: Validate the closed-won opportunity

Before any downstream record is created, the opportunity should pass a validation check. Required fields like Contract_Start_Date__c, Billing_Cadence__c, Product_Line__c, and Payment_Terms__c must be populated and internally consistent.

A deal marked closed-won with a missing billing start date or a $0 contract value should not trigger an invoice. Validation gates prevent bad data from propagating into billing and ERP systems where cleanup is more expensive.

Step 2: Normalize contract terms for billing

The raw opportunity data needs to be normalized into a structure the billing system can consume: billing cadence (monthly, quarterly, annual), start and end dates, pricing model (flat rate, per-seat, usage-based), and any non-standard terms like implementation fees or ramp schedules.

Amendment logic matters here too. If the deal is a renewal or expansion, the workflow should reference the prior contract and produce the correct delta, not create a duplicate subscription. Platforms with contract intelligence capabilities, like LedgerUp, can automate extraction and normalization of these terms from Salesforce records, reducing the manual interpretation step that typically causes delays and errors.

Step 3: Create billing records

The normalized contract terms drive creation of a subscription, order, or invoice schedule in the billing system. For Stripe-based billing, the typical output is a Stripe Subscription or a set of Stripe Invoice objects tied to a Stripe Customer.

The billing system should write the billing record ID (e.g., Stripe Subscription ID) back to Salesforce for traceability. If the billing system supports it, the invoice schedule should be deterministic from the contract terms, not manually configured.

Step 4: Post ERP records

The billing event (invoice finalized, payment collected, or subscription activated) triggers creation of corresponding records in the ERP.

ERP Typical record sequence Configuration note
NetSuite Sales order → Invoice → Cash application Revenue schedules via Advanced Revenue Management (ARM)
Sage Intacct Order entry transaction → AR invoice → Payment Configurable by transaction type; supports one-to-many from Opportunity

ERP record creation should be idempotent. If the sync job runs twice for the same invoice, the ERP should not create duplicate records. External ID fields (Stripe Invoice ID, Salesforce Opportunity ID) serve as deduplication keys.

Step 5: Reconcile payments and payouts

Payment collection in Stripe does not immediately mean cash in the bank. Automatic payouts can include funds from multiple transactions, and settlement timing depends on the payout schedule, country, and payment method.

Reconciliation requires matching individual Stripe Charges or PaymentIntents to ERP receivable records, then matching aggregated payouts to bank deposits. Stripe's payout reconciliation reports group transactions by reporting category, which helps finance teams identify which charges, refunds, and fees compose a given bank deposit.

Refunds in Stripe can be partial or full and may remain pending if the available balance is insufficient. Disputes debit the disputed amount plus a fee from the Stripe balance. Both events create accounting entries that must flow into the ERP as credit memos or expense records.

For a deeper breakdown of the Stripe-to-NetSuite reconciliation process, see Stripe NetSuite Reconciliation: Payouts, Fees, Refunds & Chargebacks.

Step 6: Update revenue recognition

Revenue recognition depends on contract fidelity, not just invoice creation. The ERP needs contract start and end dates, performance obligation detail, pricing allocation, and amendment history to build accurate revenue schedules.

Under ASC 606, the five-step model requires data that originates in Salesforce and passes through billing before reaching the ERP:

ASC 606 step Required data Typical source
1. Identify the contract Contract ID, parties, approval status Salesforce Opportunity or Contract
2. Identify performance obligations Products, deliverables, distinct bundles Salesforce line items / CPQ
3. Determine transaction price Total deal value, variable consideration, discounts Salesforce + billing system
4. Allocate transaction price Standalone selling prices, allocation method ERP revenue module
5. Recognize as obligations are satisfied Delivery dates, milestones, time periods ERP with contract date inputs

If any of those attributes are flattened or lost during the handoff, the revenue schedule will not reflect the economic substance of the deal. A $120K annual contract with a $20K implementation fee and monthly SaaS delivery has different recognition timing than a flat $120K subscription, and the workflow must preserve that distinction.

For more on how revenue recognition software handles these requirements, see 7 Best Revenue Recognition Software for SaaS (2026).

Example: closed-won deal to recognized revenue

To make the workflow concrete, here is how a typical B2B SaaS deal flows through the full system.

Scenario

A SaaS company closes a $120K annual deal in Salesforce with the following terms:

  • $20K implementation fee (one-time, recognized on delivery)
  • $100K platform subscription ($10K/month for 10 months, recognized ratably)
  • Net 30 payment terms
  • Annual billing, paid via ACH

Automated workflow

Step What happens System Output
1 Rep marks Opportunity as Closed Won. Validation gate confirms all required fields are populated. Salesforce Validated Opportunity triggers downstream sync
2 Contract terms are normalized: $20K implementation fee identified as a separate performance obligation, $100K subscription extracted with monthly recognition schedule. LedgerUp / integration layer Structured billing input with two line items
3 Stripe Subscription created for $10K/month. Separate one-time Stripe Invoice created for $20K implementation fee. Stripe Customer ID and Subscription ID written back to Salesforce. Stripe sub_abc123 and in_xyz789 stored on Salesforce Opportunity
4 NetSuite sales order created with two line items. Invoice posted for first billing period. NetSuite internal ID written back to Salesforce. NetSuite Sales Order #4521, Invoice #INV-8834
5 ACH payment collected by Stripe. BalanceTransaction recorded. Payout deposited to bank 2 business days later. Cash applied against NetSuite invoice. Stripe + NetSuite AR balance reduced, payment matched to deposit
6 NetSuite ARM generates two revenue schedules: $20K recognized on implementation delivery date, $100K recognized ratably at $10K/month over 10 months. NetSuite ARM Revenue schedules aligned to ASC 606 obligations

Why the contract context matters

Without the contract normalization step (Step 2), the ERP would see a single $120K invoice with no distinction between the implementation fee and the subscription. The resulting revenue schedule would recognize $10K/month for 12 months — which misstates revenue timing under ASC 606 because the implementation fee should be recognized on delivery, not ratably.

This is the difference between a workflow that syncs invoices and a workflow that preserves contract fidelity.

What data must sync between Salesforce, billing, and the ERP

Commercial fields (source: Salesforce)

Field Why it matters
Product name and SKU Maps to billing items and ERP line items
Quantity and unit price Drives invoice line amounts
Discount percentage or amount Affects transaction price for rev rec allocation
Contract start date and end date Determines billing schedule and revenue recognition period
Billing frequency Monthly, quarterly, or annual invoice cadence
Payment terms (Net 30, Net 60, due on receipt) Sets ERP invoice due date; affects DSO
Currency Required for multi-currency ERP posting

Financial fields (source: billing system and ERP)

Field Why it matters
Invoice number and status (draft, sent, paid, void) Tracks billing lifecycle; write-back to Salesforce for visibility
Payment amount and date Cash application in ERP; DSO calculation
Payment method and Stripe Charge ID Payout reconciliation against bank deposits
Credit memo amount and reason Adjusts receivables and revenue schedules
Tax amount and jurisdiction Compliance; varies by billing vs. ERP calculation
Outstanding balance AR aging and collections prioritization

Control fields (cross-system)

Field Why it matters
Salesforce Opportunity ID External key in ERP and billing for traceability
ERP Sales Order or Invoice internal ID Write-back to Salesforce; enables bidirectional lookup
Stripe Customer ID and Subscription ID Links billing records to CRM and ERP
Sync status (pending, synced, failed, requires review) Monitoring; exception routing
Last sync timestamp Debugging; freshness validation
Error message Actionable detail for failed records

Why Salesforce to ERP integrations fail

Four failure modes cause the most manual cleanup for finance teams.

Failure mode What happens Result
No source-of-truth rules Both Salesforce and the ERP allow edits to the same field (e.g., contract value) Conflicting values across systems; silent divergence
Missing external IDs Records cannot be traced across systems; retries create duplicates Duplicate invoices, broken audit trail
Invoice-only integrations Invoice data syncs but contract context (performance obligations, amendment history) does not Revenue schedules require manual correction every period
No exception handling Failed syncs, partial refunds, and disputes are not handled by retry logic or alerting Unbilled deals, AR balances that don't match bank

Missing source-of-truth rules

When both Salesforce and the ERP allow edits to the same field (e.g., contract value or billing address), conflicting values are inevitable. A sales rep updates the contract amount in Salesforce while a billing analyst adjusts it in NetSuite, and the two systems diverge silently.

The fix is explicit ownership rules: commercial fields are mastered in Salesforce, financial fields are mastered in the ERP, and the billing system owns invoice-level calculations. Any field that exists in multiple systems should have a declared source and a direction of sync.

Weak ID mapping

Without durable external IDs linking records across systems, there is no reliable way to trace an ERP invoice back to its Salesforce Opportunity or a bank deposit back to its component Stripe payments. Write-backs (storing the NetSuite sales order ID on the Salesforce Opportunity, or the Stripe Invoice ID on the ERP invoice record) are the foundation of cross-system traceability.

If a sync job fails and retries without checking for an existing record, duplicate transactions result. Idempotency depends on consistent external ID usage.

Invoice-only integrations that skip contract context

Many teams start by syncing invoices from billing to ERP and consider the integration complete. Invoice-only sync misses contract context, amendment history, and the metadata that revenue recognition requires.

An invoice record tells the ERP "charge this customer $10K on this date." It does not tell the ERP "this is month 3 of a 12-month contract with two performance obligations and a ramp pricing schedule." Revenue schedules built without that context require manual correction every period.

Poor exception handling

Failed syncs, partial refunds, disputed charges, and mid-term amendments all produce edge cases that a straightforward integration will not handle. A sync job that fails silently and never retries leaves an unbilled deal in limbo. A dispute in Stripe that is not reflected in NetSuite produces an accounts receivable balance that does not match the bank.

Exception handling requires retry logic with exponential backoff, dead-letter queues for permanently failed records, and alerting that surfaces problems before month-end close. Platforms like LedgerUp's Ari that offer Slack-native exception workflows reduce the latency between failure detection and resolution, because the alert and the action happen in the same channel where finance teams already work.

Approaches to Salesforce-to-ERP automation compared

Approach Implementation time Ongoing maintenance Finance logic depth Limitations
Manual finance ops Immediate High (8–15 hrs/week) Full (human judgment) Error-prone at scale; revenue leakage risk
Custom integration (in-house) 3–6 months High (engineering dependency) Configurable Expensive to build and maintain; breaks on edge cases
iPaaS middleware (Workato, Boomi, Tray) 1–3 months Medium Limited finance-specific logic Requires custom mapping for rev rec, amendments, disputes
Contract-to-cash platform (LedgerUp) 1–2 weeks Low (managed) Deep (pre-built for B2B SaaS billing) Best for standard SaaS billing models; custom rev rec rules may need configuration

The key differentiator is finance logic depth. General-purpose integration tools can move data between systems, but they do not understand contract amendments, multi-element revenue arrangements, or the relationship between a Stripe payout and its component charges. A contract-to-cash platform like LedgerUp embeds that finance logic natively, which is why deployment takes 1–2 weeks instead of months.

Who uses each approach

Method Typical user Primary risk
Manual finance workflow Early-stage startups (<$2M ARR) High error rate; revenue leakage as deal volume grows
Custom integration (in-house) Companies with large engineering teams Expensive maintenance; breaks on edge cases like amendments and refunds
iPaaS middleware (Workato, Boomi, Tray) Mid-stage SaaS with RevOps resources Limited finance-specific logic; requires custom mapping for rev rec
Contract-to-cash platform (LedgerUp) Finance-driven teams at $1M–$100M ARR Fastest deployment; best for standard SaaS billing models

Designing the workflow for auditability

Write-backs to Salesforce

Finance and sales teams both need visibility into downstream status. Writing invoice status, payment status, and ERP record IDs back to Salesforce means sales reps can see whether a deal has been billed and paid without logging into the ERP.

Write-backs should include at minimum: invoice number, invoice status, payment date, outstanding balance, and ERP transaction ID.

Monitoring and alerts

Every sync job should log its outcome, and failures should trigger alerts to a shared channel. Good monitoring answers three questions at any time: how many records synced successfully in the last 24 hours, how many failed, and which specific records need attention.

A retry policy should handle transient errors (API timeouts, rate limits) automatically, while persistent failures should route to an exception queue for manual review.

Approval controls for non-standard billing events

Non-standard billing events (manual discounts, off-cycle credits, amendments that change contract value by more than a threshold) should require explicit approval before they propagate downstream. The approval record should capture who approved, when, what the original and modified values were, and which downstream records were affected.

For teams building Slack-based approval flows, see Slack Invoice Approval Workflow Template for Finance Teams.

NetSuite and Sage Intacct implementation notes

NetSuite

NetSuite's order-to-revenue workflow begins with a sales order or invoice and extends through return authorizations, credit memos, and cash refunds. For teams using Advanced Revenue Management (ARM), revenue recognition schedules are generated from the sales order or invoice and can be configured to respect multi-element arrangements and allocation rules.

The canonical integration pattern writes a closed-won Opportunity to a NetSuite sales order using product, price, and quantity data, then writes the NetSuite internal ID back to Salesforce. Revenue workflow behavior depends on whether ARM is enabled, so finance teams should confirm their NetSuite configuration before designing the sync. For a step-by-step field mapping guide, see How to Create NetSuite Invoices from Closed-Won Salesforce Opportunities.

Sage Intacct

Sage Intacct's Advanced CRM Integration synchronizes sales transactions with Intacct-provided custom objects in Salesforce. The sync direction is configurable by transaction type: Salesforce users might create quotes and sales orders, while Intacct posts invoices back as read-only records in Salesforce.

Sage Intacct supports one-to-many relationships between an Opportunity and downstream transactions by default. A single opportunity can produce a sales order, one or more invoices, a credit memo, and a payment record. For a full walkthrough of the Salesforce-to-Intacct mapping, see How to Sync Salesforce Contracts to Sage Intacct Invoices.

A practical architecture for B2B SaaS finance teams

The target architecture has three layers. The commercial layer (Salesforce) captures deal intent, contract terms, and approval status. The billing layer (Stripe or equivalent) handles invoice generation, payment collection, and subscription lifecycle. The accounting layer (NetSuite or Sage Intacct) handles financial posting, receivables, cash application, and revenue recognition.

Data flows forward from Salesforce to billing to ERP, with write-backs carrying status and IDs in the reverse direction. An integration layer (middleware, iPaaS, or a contract-to-cash platform) manages the mapping, transformation, retry logic, and monitoring between systems.

The key design decisions are: which system owns each field, how IDs are linked across systems, what triggers each sync (event-driven vs. scheduled), and how exceptions are surfaced. LedgerUp connects natively to Salesforce, Stripe, NetSuite, and Sage Intacct with pre-built object mapping and can deploy in 1–2 weeks, which compresses the time between architecture decision and operational workflow. Its AI agent Ari handles invoicing, collections, AR tracking, and ERP sync from Slack, and routes the 5–10% of edge cases that require human review through the same channel where finance teams already operate.

The 90–95% automation target reflects the practical ceiling: some edge cases always require human review, and a good system routes those exceptions efficiently rather than pretending they do not exist.

What a well-designed workflow looks like

A well-designed Salesforce-to-ERP revenue workflow has four characteristics:

Characteristic What it means in practice
Automated Closed-won deals produce billing and ERP records without manual data entry
Traceable Every ERP transaction links back to a Salesforce Opportunity; every bank deposit decomposes into component payments
Resilient Amendments, refunds, disputes, and failed syncs are handled by defined processes, not ad hoc cleanup
Contract-fidelity preserving Commercial terms (pricing, dates, obligations, amendment history) arrive intact in the ERP for revenue schedules and reporting

When that chain of custody is unbroken, month-end close is faster, audit preparation is simpler, and finance teams spend their time on analysis instead of reconciliation.

Key takeaways

  • Salesforce should own commercial terms — deal pricing, products, contract dates, and approval status.
  • Billing platforms should own invoice logic — invoice generation, proration, tax calculation, and payment collection.
  • ERPs should own accounting outcomes — general ledger, receivables, cash application, and revenue recognition schedules.
  • Durable external IDs must link records across all systems — Salesforce Opportunity ID, Stripe Subscription ID, and NetSuite internal ID should be written back bidirectionally.
  • Invoice-only integrations fail because they do not carry the contract context (performance obligations, amendment history, pricing allocation) that ASC 606 revenue recognition requires.
  • Contract-to-cash orchestration platforms automate 90–95% of finance workflows — the remaining 5–10% of edge cases should be routed to human review through defined exception workflows, not ad hoc cleanup.

Frequently asked questions

What is a Salesforce to ERP revenue workflow?

A Salesforce to ERP revenue workflow is the automated process that moves deal data from a closed-won Salesforce Opportunity through billing (Stripe or equivalent) and into an ERP (NetSuite, Sage Intacct) for invoicing, payment collection, cash application, and ASC 606 revenue recognition. A complete workflow covers opportunity validation, contract term extraction, billing record creation, ERP posting, payment reconciliation, and revenue schedule generation.

Should Salesforce or the ERP be the source of truth?

Neither system should own everything. Salesforce should own commercial data: deal terms, pricing, products, and contract dates. The ERP should own accounting outcomes: posted invoices, receivables, cash application, and revenue schedules. The billing system should own invoice generation logic, proration, and payment collection. Assign source of truth per object and per field, not per system or per department.

Can a single Salesforce Opportunity create multiple ERP transactions?

Yes. A single Salesforce Opportunity can generate a sales order, multiple invoices (for recurring billing), credit memos (for adjustments), and payment records. Sage Intacct explicitly supports one-to-many relationships between opportunities and downstream transactions. Your workflow should expect and model this multiplicity.

Why do invoice-only integrations leave finance teams with manual work?

Because invoice data alone does not carry the contract context that revenue recognition and reconciliation require. An invoice tells the ERP the amount and date, but not the performance obligations, allocation method, or amendment history needed for ASC 606 compliance. Payment reconciliation also requires matching payments to payouts to bank deposits, which goes beyond invoice status.

How do Stripe payouts fit into the Salesforce to ERP workflow?

Stripe payouts are batch-based. A single payout to your bank account can include charges, refunds, fees, and disputes from multiple invoices and customers. Finance teams reconcile by matching individual BalanceTransactions (filtered by payout ID) to ERP records, then matching the payout total to the bank deposit. Timing differences between payment date and settlement date are normal but must be tracked to avoid unexplained variances in accounts receivable. For a detailed guide, see Stripe NetSuite Reconciliation: Payouts, Fees, Refunds & Chargebacks.

What fields must sync between Salesforce, billing, and the ERP?

Three categories of fields must sync. Commercial fields from Salesforce: product name, SKU, quantity, unit price, discount, contract dates, billing frequency, payment terms, and currency. Financial fields from billing and ERP: invoice number and status, payment amount and date, payment method, credit memo details, tax amount, and outstanding balance. Control fields across all systems: Salesforce Opportunity ID as external key, ERP transaction ID written back to Salesforce, Stripe Customer and Subscription IDs, sync status, last sync timestamp, and error messages for failed records.

What are the most common failure modes in Salesforce to ERP workflows?

Four failure modes cause the most manual cleanup. Missing source-of-truth rules, where both Salesforce and the ERP allow edits to the same field, creating conflicting values. Weak ID mapping, where records cannot be traced across systems. Invoice-only integrations that skip contract context needed for revenue recognition. And poor exception handling, where failed syncs, partial refunds, and disputes are not handled by defined retry logic and alerting.

How long does it take to implement a Salesforce to ERP revenue workflow?

Implementation timelines vary significantly based on approach. Custom-built integrations using middleware or iPaaS platforms typically take 2–6 months including mapping, testing, and rollout. Pre-built contract-to-cash platforms like LedgerUp can deploy in 1–2 weeks with native connectors to Salesforce, Stripe, NetSuite, and Sage Intacct. The time savings comes from pre-built object mapping and established handling for common edge cases like amendments, refunds, and multi-entity billing.

How does ASC 606 affect the workflow design?

ASC 606 requires identifying the contract, identifying performance obligations, determining the transaction price, allocating it across obligations, and recognizing revenue as obligations are satisfied. Each of these steps requires data that originates in Salesforce (contract terms, products, pricing) and must arrive intact in the ERP. If the workflow loses contract context at any handoff point, finance teams rebuild that context manually every period to produce compliant revenue schedules.

What is the difference between a Salesforce to NetSuite integration and a Salesforce to Sage Intacct integration?

Both ERPs support Salesforce integration, but the mechanics differ. NetSuite's canonical pattern writes a closed-won Opportunity to a sales order, then generates invoices and revenue schedules (via ARM) from the sales order. Sage Intacct's Advanced CRM Integration synchronizes sales transactions using Intacct-provided custom objects in Salesforce, with configurable sync direction by transaction type and native support for one-to-many relationships between Opportunities and downstream transactions. The source-of-truth rules and ID mapping principles are the same for both; the field mapping and API patterns differ. See the dedicated guides for NetSuite and Sage Intacct.

Further reading from LedgerUp:

Book a LedgerUp Demo

Ready to take manual work out of billing and revenue workflows?

See how LedgerUp brings your billing and revenue systems into one place so you can remove busywork and focus on growth.

Book a demo
Salesforce-to-ERP Revenue Workflow for B2B SaaS (2026) — LedgerUp