Technical guide

Sage Intacct technical guide

Everything an engineer needs to connect Sage Intacct to Salesforce: architecture, the exact build steps with real code, field mapping, the data model, security, monitoring, and the pitfalls we design out.

Platform: Sage IntacctType: ERP / accountingDirection: Bi-directionalObjects: Invoice, Opportunity

Two-way Salesforce and Sage Intacct accounting sync via MuleSoft. We have shipped it across 2 client projects and 14 build tasks.

The value is one source of truth: both systems stay current, records reconcile automatically, and every error is logged for review.

We use Sage Intacct as governed middleware: Salesforce and your other systems connected once, mappings and transforms kept in one place, and scheduled flows with retries and monitoring.

Every Sage Intacct build is delivered by a senior Salesforce architect on a fixed price, tested end to end in a sandbox, deployed to your org, and backed by 30 days of hypercare. You own the result: documented, source-controlled, and free of black-box middleware lock-in.

the connection at a glancesync active
01Salesforce
02Sage Intacct flows
03Your other systems
Integration facts

How Sage Intacct connects to Salesforce

The real connection surface: how it authenticates, what it is built on, the endpoints and events in play, and where the reference docs live.

Connects via
MuleSoft (Anypoint / Composer) Sage Intacct Connector performing bi-directional sync with SalesforceSage Intacct XML Web Services via HTTP POST to the XML gatewayDataWeave transforms map Salesforce fields to Intacct dimensions and objects
Package
Custom build (no managed package)
Authentication
XML Web Services: senderId + senderPassword (partner credentials) plus company login; getAPISession returns a Session ID and a unique session endpoint used for all subsequent requests
API type
SOAP/XML
https://api.intacct.com/ia/xml/xmlgw.phtml (getAPISession returns a session-specific endpoint)

Key endpoints

getAPISessioncreate_sotransaction (AR invoice, ARINVOICE + lines)create_journalentry (GL journal)readByQueryreadByName
Free download

Build this with AI agents

Copy the full playbook as a prompt for any coding agent, or install it as a Claude Code skill. Either way your agent builds with our exact approach: the architecture, the Apex code, the field mapping, the rate limits, and the pitfalls to design out. Free, no signup.

Loading the Sage Intacct playbook...
Paste into Claude Code, Cursor, or any coding agent
From our builds

What we build for a Sage Intacct integration

A MuleSoft-based bi-directional Salesforce and Sage Intacct integration: session-based XML auth cached in Mule, DataWeave transforms both ways, a nightly billing sync onto Opportunities, and reconciliation of credit change orders and GL variances.

2client projects
14delivery tasks shipped

Session-based authentication

Authenticated Sage Intacct with an XML request (sender id and password, user id, company id) returning a Session ID, cached in a Mule variable for reuse.

Salesforce to Sage push

Transformed Salesforce records into Sage XML and JSON payloads with DataWeave, batched in chunks and posted on trigger.

Sage to Salesforce nightly sync

A scheduled midnight batch that syncs billing-contact details onto Opportunities and pulls negative change orders from the AR invoice-line endpoint into a Credit Change Order Amount.

Reconciliation and ARR

Reconciled GL and journal-entry-line variances, aligned line-of-business, and mapped Intacct contract lines to update Total Current ARR and renewal-opportunity fields on Account.

Real components we ship

MuleSoft bi-directional flowsXML session-id auth (cached in a Mule variable)DataWeave transformsNightly midnight-ET batchAR invoice-line endpointGL / journal-entry-line reconciliationTotal Current ARR mapping
Step 0

What you will need

What we confirm on both sides before writing a line of code.

A Salesforce edition with API access (Enterprise, Unlimited, or Developer)
A dedicated sandbox to build and test in
A Sage Intacct account on a plan with API access
System Administrator access on both systems
A dedicated integration user with a minimum-access permission set
Agreement on the objects, fields, and sync direction for the Sage Intacct data
How it works

From trigger to record, end to end

The production runtime flow, with what happens in each system.

runtime sequence4 steps
  1. 01

    Change in either system

    Either system

    A change in Salesforce or in Sage Intacct starts the sync.

    $Salesforce side via flow or Change Data Capture; vendor side via webhook or scheduled pull.
  2. 02

    Transform and route

    In transit

    The integration layer maps and transforms the payload between the two data models.

    $DataWeave or Apex converts between the Salesforce and vendor schemas.
  3. 03

    Push and scheduled pull

    In transit

    Records push on trigger and pull on a schedule so both sides stay current.

    $An updatedSince delta filter keeps each batch small and current.
  4. 04

    Reconciled both ways

    Both systems

    Records reconcile across systems, with every error logged for review.

    $Conflicts resolved by rule; failures land in an Error Log object for replay.
Architecture

How the data actually flows

Left to right: sources, the integration layer, Salesforce, and the outcomes it drives.

system architecture
Sources
Salesforce records
Sage Intacct
Integration layer
Mapping and transforms
Push on trigger
Scheduled pull
Salesforce
Invoice
Related records
Reports
Outcomes
Both systems current
Auto-reconciled
Errors logged

// sources feed the integration layer, Salesforce persists, outcomes ship

Data model

The objects behind the integration

The Salesforce objects we read and write, what each one is for, and the fields that carry the load.

ObjectPurposeKey fields
InvoiceThe primary Salesforce record Sage Intacct data maps onto.External_Id__c, Name, Status
AccountMatched or created for the customer or company behind the record.Name, External_Id__c
Error_Log__c (custom)Captures every request, response, and failure so anything can be replayed.Payload__c, Status__c, Related_Id__c
Sync_Log__c (custom)Tracks the last-synced timestamp per record for delta pulls.Last_Synced__c, Direction__c

Salesforce objects typically in play for Sage Intacct

AccountOpportunityOrdercustom AR invoice line objectcustom GL journal entry object
Step by step

Build the Sage Intacct integration

Every step we follow to ship a production-grade build, with the code that matters.

1

Plan the integration and prerequisites

We line up both systems and the platform first.

  • API access on Salesforce and your other systems, plus the Sage Intacct environment and connectors
  • The objects, direction, sync pattern, and success criteria agreed up front
2

Connect Salesforce to Sage Intacct

We wire up the Salesforce connector securely.

  • Configure the Salesforce connector with a Connected App and OAuth, or JWT for a headless flow
  • Give the connector a dedicated least-privilege integration user
3

Connect the target systems

We bring the other endpoints into the platform.

  • Configure each target connector with its own secure credentials
4

Design a canonical data model

We map everything to one shared shape, not point to point.

  • Define a canonical model so each system maps to and from one schema, which scales as systems are added
5

Build the transforms

We keep all the mapping logic in one governed place.

  • Build the Sage Intacct flows or recipes that move each record
  • Map and transform payloads (for example, DataWeave on MuleSoft) to and from the canonical model
transform.dwldataweave
%dw 2.0
output application/json
---
payload map (row) -> {
  External_Id__c: row.id,
  AccountId: row.customerId,
  Amount__c: row.total,
  Status__c: upper(row.state)
}
6

Choose the sync pattern

We pick real-time or batch per use case.

  • Real-time via Platform Events or Change Data Capture, or scheduled batch with an updatedSince filter
OrderEventTrigger.triggerapex
// Real-time: Salesforce publishes a Platform Event, the iPaaS subscribes
trigger OrderEventTrigger on Order_Event__e (after insert) {
  List<Sync_Task__c> tasks = new List<Sync_Task__c>();
  for (Order_Event__e ev : Trigger.new) {
    tasks.add(new Sync_Task__c(Order_Id__c = ev.Order_Id__c, Status__c = 'Queued'));
  }
  insert tasks;
}
7

Add error handling and retries

We make it reliable at volume.

  • Batch records in chunks, add retries with backoff, and route failures to a dead-letter queue
DeltaPullScheduler.clsapex
// Scheduled delta pull: only records changed since the last successful run
global class DeltaPullScheduler implements Schedulable {
  global void execute(SchedulableContext ctx) {
    Datetime since = IntegrationConfig.lastSync();
    ExternalService.pullUpdatedSince(since);     // the iPaaS flow filters by updatedSince
    IntegrationConfig.setLastSync(System.now());  // watermark for the next run
  }
}

Pro tip: build for retries

At volume, transient failures are normal. Batch in chunks and add retries with a dead-letter queue, so a blip never means lost data.

8

Test in a sandbox environment

We validate before production.

  • Run representative loads end to end and confirm both sides reconcile
9

Deploy with CI and monitor

We ship it and keep it observable.

  • Promote Sage Intacct artifacts through environments with CI, and monitor the flows with alerting plus 30 days of support
Field mapping

Example field mapping

How Sage Intacct data lands on your Salesforce records. We tailor the full mapping to your org.

Sage IntacctSalesforceNotes
Sage Intacct record idInvoice.External_Id__cUnique external id, upsert key
Sage Intacct numberInvoice.Name
Sage Intacct customerAccountMatched or created
Sage Intacct amount / totalInvoice.Total__c
Sage Intacct statusInvoice.StatusPicklist value mapping
Created / updated atLastModifiedDateEnables delta sync and audit
Owner or repInvoice.OwnerIdAssignment rules or a default owner
API & limits

Rate limits and governor limits

The platform constraints we design around, so the integration stays fast and never falls over at scale.

Specific to Sage Intacct

Session IDs are idle-timeout limited and must be refreshed
Per-company concurrency throttling; Intacct recommends single-threaded use of a session
Large loads should use offline/async processing to avoid gateway timeouts

Salesforce platform limits

Sage Intacct manages throttling and backpressure between systems, so neither side is overwhelmed.
Salesforce Bulk API handles large loads, conserving the standard REST API allocation.
Change Data Capture and Platform Events stream changes in real time instead of polling.
Security

Secure by design

How we keep the integration safe, least-privilege, and compliant.

Secrets stored in Named Credentials and permission sets, never in code or metadata
A least-privilege integration user, with field-level security and sharing scoped tight
All traffic over TLS, with signature verification on inbound events
Shield Platform Encryption available for sensitive fields
A full audit trail: every request and response logged for traceability
Every automation runs as a dedicated integration user, so actions are attributable and revocable
Sandbox-first delivery and change-set deployment keep production changes reviewed and controlled
Monitoring

Monitoring, retries, and reliability

What keeps the integration trustworthy in production, and how you know the moment something needs attention.

Every request and response is logged to a custom Error Log object, tagged with the related record id.
Failed calls retry with exponential backoff; anything still failing lands in a dead-letter queue for review.
Idempotency keys guarantee a retried or duplicate event never double-posts a record.
A dashboard surfaces failures, latency, and volume so problems are caught before users notice.
Optional email or Slack alerts fire on repeated failures or a stalled sync.
Testing & deployment

How we test, deploy, and hand it over

The quality gates every build clears before it touches your production org.

Apex unit tests with HttpCalloutMock cover the success path, failure handling, and a 200-record bulk case, at 75 percent or higher coverage.
The full flow is validated in a sandbox against real sample data and the edge cases that matter.
A parallel run reconciles the integration against your live system before cutover.
Everything deploys through change sets or an SFDX and CI pipeline, under version control.
Permission sets, sharing, and Named Credentials are configured in production, then we run 30 days of monitored hypercare.
Pitfalls

Common pitfalls we design out

The mistakes that quietly break integrations, and how we avoid each one.

Point-to-point sprawl

Map every system through one canonical model instead of pairwise connections.

Silent failures at volume

Add retries with backoff and a dead-letter queue with alerting.

Schema drift breaks the flow

Version the transforms and validate payloads against a contract.

No visibility when it breaks

We log every call and surface failures on a dashboard with alerts, so an issue never goes unnoticed.

Reporting drifts from reality

External-id keys and a delta timestamp keep Salesforce and the source reconciled, so reports stay trustworthy.

Gotchas specific to Sage Intacct

A function-level controlid is required for idempotency; without it, retries can post duplicate invoices or journal entries
Returned session endpoints must be validated to intacct.com domains
The Web Services subscription and a dedicated sender id must be enabled in Intacct before any call succeeds
FAQ

Sage Intacct integration: technical FAQs

How do you authenticate Sage Intacct with Salesforce?

We connect Sage Intacct using MuleSoft with secure credentials and store every secret in Salesforce Named Credentials with a permission set, so nothing is hard-coded or shipped in metadata.

Does the Sage Intacct integration handle bulk volume?

Yes. All Apex is bulkified, volume moves to Queueable or Batch Apex, and we respect the Salesforce governor limits (SOQL, DML, and callout caps per transaction).

How do you prevent duplicate records?

We upsert on a unique external-id field, so a retried or duplicate payload is idempotent and never creates a second Invoice.

How is the integration tested and deployed?

Apex tests with HttpCalloutMock cover the success, failure, and a 200-record bulk case (75 percent plus coverage). We deploy via change sets or an SFDX and CI pipeline.

What happens if Sage Intacct or Salesforce is briefly down?

Failed calls retry with backoff and land in an Error Log object with alerting, so nothing is lost and any event can be replayed.

Real-time or batch sync?

Either. We use Platform Events or Change Data Capture for real-time, or a scheduled batch with an updatedSince delta filter for high volume.

Want us to build your Sage Intacct integration?

Skip the build. In a free 30-minute call we will map your Sage Intacct flow and hand you a clear, fixed-price plan.

Ask me anything