HubSpot + Sage X3 integration
Sage X3 keeps its data in folders served by the Syracuse web server. What its Web API can hand HubSpot, where SOAP still decides, and the build hours.
Connects by APIScope this integration Book a scoping call Estimate the cost
- Into HubSpot
Is there an official Sage X3 + HubSpot integration?
Not from HubSpot or Sage. As of September 2026 the HubSpot App Marketplace lists one app named for X3, Sage X3 SYNC, Data Lake, AI, MCP by Commercient, which is third-party. We recommend a custom API integration that reads the X3 Web API folder by folder on a schedule, at 70 to 150 build hours; writing back to a function X3 has not yet moved to its newer class model means a SOAP web service, which adds work.
- Recommended route
- Custom API integration
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- Yes, Sage X3 SYNC, Data Lake, AI, MCP by Commercient
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect Sage X3 to HubSpot
Sage X3 is organized around folders. Each folder is a complete set of parameters, rules and data, stored on SQL Server or Oracle and served through the Syracuse web server, and one installation can hold several. It runs on a company’s own servers or as Sage X3 Online. Either way, the people who sell for an X3 business rarely have an X3 login.
What they want is ordinary: the open orders, the last invoice and the credit position on the HubSpot company before a call. Today they ask the office, which answers from an X3 inquiry screen or an exported report, and the answer arrives after the conversation it was needed for.
Two facts about X3 shape this project more than the object list. The first is where it runs, because X3 Online accepts only OAuth2 tokens, while an on-premises server also allows basic or certificate authentication. The second is how far each module has moved from X3’s classic screens to its newer classes and representations. Sage is upgrading the modules progressively, and whether a module has made that move decides whether the Web API or SOAP carries a write. Sage also ships Version 12 update releases twice a year, and the integration has to keep working through each one.
What syncs
Five objects carry it. Customers, read from the BPCUSTOMER representation, become HubSpot companies and their contacts HubSpot contacts. Sales orders arrive as deals, sales invoices as custom object records, and X3 products as HubSpot products.
Reads can all come through the Web API, because Sage X3 provides read-only representations on every resource, so a first build moves everything one way into HubSpot. A write back, usually a won deal creating a customer or an order, is a second phase, and it uses the Web API only where that module has been upgraded.
Keys are X3’s codes, not names: the customer code (BPCNUM), the order and invoice numbers and the product reference, each held in a custom HubSpot property together with the folder it came from. The folder matters because a test folder copied from production holds the same codes, and a key without it lets a test run overwrite live records.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Customer (BPCUSTOMER) | Company | Into HubSpot | Customer code (BPCNUM), held with the folder it came from | A test folder copied from production holds the same codes, so the folder is part of the key. |
| Contact | Contact | Into HubSpot | Email, with the X3 contact code as the tie breaker | |
| Sales order | Deal | Into HubSpot | Sales order number, held with the folder | Orders are read only in HubSpot. X3 prices, ships and invoices them. |
| Sales invoice | Custom object | Into HubSpot | Invoice number, associated to the customer and the order | |
| Product | Product | Into HubSpot | Product reference |
Architecture
Sage documents no webhook subscription for X3, so the service polls, one representation at a time. It holds an OAuth2 bearer token for a user mapped to an X3 user with its own security profile, and every hour it queries each representation with the Web API’s query syntax: a GET on the class and representation, a where predicate to narrow it, and an orderBy on the key.
Paging follows the links X3 returns. Each page carries a $next link keyed on the last code read, and the service follows it rather than computing offsets.
Writes into HubSpot are batch upserts on the X3 code in a custom property, and orders and invoices are linked to their company in a second pass. The service tracks each representation with a watermark where it exposes an update date and a row hash where it does not, so a failed run picks up where it stopped. A replay re-reads one representation over a range of codes, and the same code range drives a reconciliation against an X3 inquiry.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- Unknown
- Changed-since filter
- Unknown
- Sandbox
- Yes
- Rate limit
- Not documented
Developer documentation online-help.sagex3.com
Three ways to connect
On X3 the choice turns on where the system runs and which modules you need to write to. For reading, a custom API integration on the Web API works on premises and on X3 Online alike, and it keeps the mapping, the keys and the run history in one service that can replay.
Commercient’s Sage X3 app is the packaged alternative, a third-party sync that suits a standard customer and order feed with nobody of yours on call.
We steer away from any general automation platform that reaches X3 through SOAP. X3 licenses SOAP traffic by data volume per period, and a platform that polls full records spends that allowance on rows that did not change. Sage 100, despite the shared brand, connects in a completely different way, which the Sage 100 page covers.
-
Custom API integration
RecommendedA custom API integration reads the Web API's representations folder by folder with an OAuth2 bearer token, follows the paging links X3 returns, and keys every record on X3's codes, keeping SOAP for the classic functions that need it.
-
Marketplace app
PossibleCommercient's X3 listing is a third-party sync, and the mapping, support and roadmap sit with that developer. Worth a look when the need is a fixed customer and order mapping with no service of your own to run.
-
iPaaS
AvoidA general automation platform that reaches X3 through SOAP spends the licensed SOAP data allowance on every poll, and past the grace band the service slows down and then stops answering.
What breaks and how we prevent it
Pages the server shortens
The Web API returns 20 records a page unless asked for more, and the server may cap a larger count to limit memory. Code that assumes it received what it asked for skips records. We follow the $next link until it is absent and never compute an offset.
Zero web service child processes
On an on-premises X3, SOAP needs at least one web service child process on the host, and the setting defaults to zero. Every SOAP call then fails with an HTTP 500 saying no web services are accepted. We check the setting in discovery and make a trivial call the first health check after any server change.
The licensed SOAP data allowance
SOAP calls count against a data volume the licence sets per day, month or year. Past the limit a grace band slows the service down, and past the grace band it stops answering. We keep SOAP for writes to classic functions only and log the volume each run uses.
Where clauses naming a missing property
On an X3 endpoint, a query whose where clause names an unknown property fails with an HTTP 500. With two update releases a year, we validate each representation’s properties when the service starts and rerun the reads in a test folder before every update.
Our approach
- Scope. We confirm where X3 runs, which folders are live, and which modules have moved to classes and representations, since that decides the write path.
- Architect. We fix the representations, the keys with their folder, the watermark per representation and the page size, and name any SOAP web service to publish.
- Build. We develop against a test folder copied from production and a HubSpot sandbox, and the service refuses any folder or portal outside its allowlist.
- Validate. Customer counts and open order totals per folder are checked against an X3 inquiry, and finance walks the differences with us.
- Operate. We watch each representation’s run history, keep replay available, and rerun the reads in the test folder before each update release.
Common questions
Is there a Sage X3 app in the HubSpot App Marketplace?
Only a third-party one. As of September 2026 Commercient lists Sage X3 SYNC, Data Lake, AI, MCP by Commercient, which the marketplace shows with five installs. The Sage app that HubSpot builds itself, in the same search, is for Sage Business Cloud Accounting rather than X3, so an X3 connection is either Commercient's sync or a build.
Should a Sage X3 integration use the Web API, SOAP or GraphQL?
For reading, the Web API, because Sage provides read-only representations on every resource. For writing, the Web API works only on modules already moved to classes and representations, and SOAP covers the classic functions. Sage's developer portal now recommends its GraphQL API for most new integrations and keeps adding nodes, so we check which ones your release carries.
How does a HubSpot integration authenticate to Sage X3 Online?
With OAuth2, the only method X3 Online accepts. The server allows the oauth2 and bearer modes, and calls run as a user configured for OAuth2 and mapped to an X3 user with a suitable security profile. An on-premises X3 can also use basic or certificate authentication, and Sage calls certificates the usual choice there.
Can Sage X3 return only the customers that changed since the last sync?
Sometimes. A Web API query accepts a where predicate on the representation's properties, and each result can carry creation and update metadata, but Sage does not document an update-date filter that works on every representation. We confirm it representation by representation in discovery, and where it is missing we read by key on a schedule and compare row hashes.
Why would Sage X3 SOAP web services stop answering?
Two reasons come up. On premises, the host needs at least one web service child process, the setting defaults to zero, and every call then fails with an HTTP 500. And SOAP traffic is licensed by data volume per day, month or year: past the limit, a grace band slows the service, and past the grace band it stops answering.
How do you test a Sage X3 integration without touching live data?
In a test folder. X3 creates every folder from a reference folder, and any folder can serve as the reference, so a copy of production gives the build real structure and codes. The service reaches it through its own endpoint, and a folder allowlist refuses any write that did not come from the folder it expects.
What does a Sage X3 and HubSpot integration take to build?
Allow 10 to 20 hours of discovery and 70 to 150 hours of build for five objects with watermarks, replay and reconciliation endpoints. Discovery settles where X3 runs, which folders are live, how authentication works there, and whether a write back needs a SOAP web service published, because that last point is where the estimate moves.
Also in ERP and accounting
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Trust and compliance
We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.
-
SOC 2
We build to support SOC 2 security controls, on platforms that hold SOC 2 reports of their own.
-
ISO/IEC 27001:2022
We build to support your information security program under ISO/IEC 27001:2022.
-
HIPAA
We scope BAA needs in discovery, then design builds around them for covered entities and their business associates.
-
GDPR
We scope data-processing needs in discovery and design builds to support your GDPR duties.
About the GDPR at the European Commission (opens in a new tab)
-
PIPEDA
We design builds to support your accountability for personal information as it moves between systems.
-
CASL
We can build consent capture and sync that support your CASL consent records.
Our builds run on
How we build
- Sandbox first. We build and test in a sandbox before anything reaches production.
- Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
- Least-privilege access. Each integration gets only the API scopes it needs.
- Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
- Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
- A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.
Scope a Sage X3 integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Sources
- Web services integration online-help.sagex3.com
- SData web service for Query online-help.sagex3.com
- Api get query online-help.sagex3.com
- Oauth2 authentication for Web services online-help.sagex3.com
- SOAP Web services implementation online-help.sagex3.com
- Folders online-help.sagex3.com
- GraphQL API · Docs (latest) · X3 · Developer Portal developer.sage.com
- 2026 R1 (12.0.39) | Sage X3 online-help.sagex3.com
- Sage X3 Lifecycle Policy docs.sage.com