Integration guide
Procore and Sage Intacct Construction integration
Sage Intacct is cloud accounting with a REST API, so there's no on-premises gateway to stand up. The constraints sit elsewhere: every Intacct company must authorize your sender ID, Intacct limits concurrency rather than requests per minute, and Procore throttles per hour and per 10 seconds.
System facts last verified October 2026 against the vendors' documentation (sources below). Confirm details with Procore Technologies and Sage before you build.
Procore and Sage Intacct side by side
- API style
- ProcoreREST/JSON. Procore states that direct database access and RDBMS, XML or SOAP integrations aren't supported.
- Sage IntacctREST (recommended; Sage says new objects and features ship in REST) plus the legacy XML Web Services gateway, which accepts POST only.
- Authentication
- ProcoreOAuth 2.0, registered as an app in the Procore Developer Portal: authorization code (acts as a specific user) or client credentials through a Developer Managed Service Account (DMSA) with company and project permissions. Traditional service accounts were sunset on March 18, 2025.
- Sage IntacctREST: OAuth 2.0. XML: a Web Services sender ID and password plus company credentials or a session ID. Either way, each customer company must authorize the sender ID under Company > Security > Web Services authorizations.
- Webhooks / events
- ProcoreYes. Company- or project-level create, update and delete triggers; Procore recommends payload v4.0 for new integrations. Delivery is best-effort with retries, and events are discarded after 12 hours of continuous failure, so pair webhooks with a periodic reconciliation sync.
- Sage IntacctPartial: Smart Events and platform triggers can send outbound HTTP requests. Sage describes Smart Events as fire-and-forget, with no error feedback or retry.
- Rate limits
- ProcoreAn hourly (60-minute) limit and a 10-second spike limit, reported in X-Rate-Limit-Limit, -Remaining and -Reset headers; exceeding either returns 429, and 503 with Retry-After signals platform load. Procore publishes no fixed default: its rate-limiting page uses sample headers (600 per hour, 25 per spike window), warns not to assume a fixed window such as 3,600/hour, says values can change, and lets apps request an increase. Every request counts, including failed ones.
- Sage IntacctConcurrency by level of service. Under Standard, each company may run one API transaction job and one offline report job at a time; a further request waits 30 seconds and then errors. Higher performance tiers allow more concurrency.
- Sandbox
- ProcoreYes. A developer sandbox with seed data is created when you register an app (you can have many). Customers can also enable on-demand and monthly sandboxes; the monthly one is refreshed from production each month. Not available to Federal Zone customers.
- Sage IntacctSage says the Web Services license is available to Sage Intacct customers and partners; a customer sandbox is an additional module on the subscription. Confirm partner sandbox terms with Sage.
- Exports and files
- ProcoreNo bulk export API confirmed; reporting integrations page through list endpoints. Procore Analytics is a separate product.
- Sage IntacctCSV imports and exports in the application. Not researched further.
- Marketplace / partners
- ProcoreProcore App Marketplace and the Procore Technology Partner Program (application, technical review, certification, agreement, listing).
- Sage IntacctSage Intacct Marketplace Partner Program.
Who owns what
- Accounting usually owns jobs, vendors and cost codes; they flow into project management.
- Commitments and change orders are typically created in project management and pushed to accounting on approval.
- Actual costs flow from accounting back to project management or into a reporting model.
What syncs between Procore and Sage Intacct
The typical shape for this pair. Every row is typical: confirm it against your configuration in discovery.
| Object | Direction | System of record | |
|---|---|---|---|
| Projects / jobs | Sage Intacct to Procore | Sage Intacct (project ID) | Hourly |
| Typical frequency: Hourly. Notes: Create the project in Intacct, then the Procore project stamped with the Intacct project ID, so both share a key from day one.(Typical: confirm against your configuration.) | |||
| Vendors | Sage Intacct to Procore | Sage Intacct | Hourly |
| Typical frequency: Hourly. Notes: Reference the Intacct vendor ID from the Procore directory. Matching on name alone creates duplicate vendors.(Typical: confirm against your configuration.) | |||
| Cost codes and cost types | Sage Intacct to Procore | Sage Intacct | On change |
| Typical frequency: On change. Notes: Intacct's construction API exposes cost types and standard tasks and cost types. Map them to Procore cost codes and cost types in a table accounting reviews, and reject unknown codes instead of defaulting them.(Typical: confirm against your configuration.) | |||
| Budgets | Sage Intacct to Procore | Intacct project estimate at award; Procore after | Once at setup |
| Typical frequency: Once at setup. Notes: Seed Procore budget lines from the Intacct project estimate. Changes after award go through Procore budget changes.(Typical: confirm against your configuration.) | |||
| Commitments / subcontracts and POs | Procore to Sage Intacct | Pick one: usually Procore | Every 15 minutes, queued |
| Typical frequency: Every 15 minutes, queued. Notes: Send approved commitments only, landing as Intacct purchasing documents. Queue the writes: under the Standard level of service each company runs one API transaction job at a time.(Typical: confirm against your configuration.) | |||
| Change orders | Procore to Sage Intacct | Procore for approval; Intacct for posted cost | Every 15 minutes, queued |
| Typical frequency: Every 15 minutes, queued. Notes: Intacct exposes change requests and project change orders. Send approved ones only, and hold a change order whose commitment hasn't synced yet, then retry.(Typical: confirm against your configuration.) | |||
| Subcontractor invoices → AP bills | Procore to Sage Intacct | Sage Intacct after posting | Hourly |
| Typical frequency: Hourly. Notes: Approved Procore subcontractor invoices land as Intacct AP bills so AP review stays intact. Carry the Procore invoice ID to prevent duplicates.(Typical: confirm against your configuration.) | |||
| Payments and actual cost | Sage Intacct to Procore | Sage Intacct | Daily |
| Typical frequency: Daily. Notes: Paid status and posted cost read back, so project teams see what was paid without asking accounting.(Typical: confirm against your configuration.) | |||
Directions, owners and frequencies are the typical pattern from our integration guides and mapping workbook. Confirm each one against your configuration in discovery.
Is a native connector enough?
We haven't confirmed a documented native connector for this pair. Check the Procore App Marketplace and the Sage Intacct Marketplace for a partner connector first: if one moves the records you need with your cost structure and approvals, configure it. Build when the mapping needs governing, when failures need routing to a person, or when you also need cross-system reporting.
Compare native connectors with a custom buildCommon gotchas
- Authorize your sender ID in every Intacct company you connect (Company > Security > Web Services authorizations). A missing authorization fails with “Invalid Web Services Authorization” and is a common go-live blocker.
- Intacct concurrency is per company and shared with the customer's other integrations, and Procore counts every request, failed ones included. Queue writes and back off on both sides rather than fanning out parallel calls.
- Setting origin_id on a Procore direct cost locks it, and subcontractor invoices, payment applications and payments lock once it's set. Only one integration can own that field, so decide whether this sync or an existing connector holds it.
- Build on Intacct's REST API; XML gets no new enhancements. Intacct Smart Events are fire-and-forget and Procore discards webhook events after 12 hours of failures, so keep a scheduled reconciliation on both sides.
Sources
- Procore developer documentation
- Procore: choosing an OAuth grant type
- Procore: rate limiting
- Procore: webhooks
- Procore: development environments
- Procore: financial tools tutorial
- Procore: partner program overview
- Sage Intacct XML Web Services overview
- Sage Intacct developer FAQ (concurrency, sender authorization)
- Sage Intacct construction API: cost types
- Sage Intacct REST API developer portal
- Sage Intacct Marketplace Partner Program
Frequently asked questions
Can Procore integrate with Sage Intacct?
Yes. Both publish APIs: Procore's REST API with OAuth 2.0 and Sage Intacct's REST API, which Sage recommends for new work. Check both marketplaces for a connector first; when none fits your cost types and approvals, a custom flow maps projects, vendors, cost types, commitments and AP bills.
What usually limits a Procore and Sage Intacct sync?
Intacct concurrency. Under the Standard level of service each company runs one API transaction job at a time, shared with every other integration, so writes need a queue. Procore adds an hourly and a 10-second spike limit reported in its rate-limit headers.
Which system should own commitments?
Pick one. Usually commitments are drafted and approved in Procore and pushed to Intacct on approval. A two-way commitment sync without a single owner causes overwrites.
Next step
Connecting Procore and Sage Intacct?
Bring one real job and the records you want to move. We'll walk through what syncs, who owns each record, and what to check first.