ml-connector
Sage X3SAP Concur

Sage X3 and SAP Concur integration

Sage X3 runs finance and procurement for mid-market manufacturers and distributors. SAP Concur runs travel and expense management. Connecting the two keeps your expense and invoice records in sync without manual re-entry. Expense reports and invoice payment requests from SAP Concur flow into Sage X3 as supplier invoices and general ledger entries, allocated to the correct cost centers and GL accounts, with a full audit trail of every transaction.

How Sage X3 works

Sage X3 is an on-premise and cloud ERP that covers finance, procurement, inventory, manufacturing, and project management. It exposes financial and procurement data through REST api1 with HTTP Basic Authentication (legacy path), GraphQL (Xtrem) with OAuth2 Bearer tokens (V12 and later), or SOAP services. Key entities include suppliers, customers, purchase orders, sales invoices, products, and GL accounts. Sage X3 does not support outbound webhooks or native push notifications, so data must be read by polling, using updatedDate or modifiedDateTime fields to detect changes since the last poll. Access tokens expire in 5 minutes; the server URL and folder name are customer-specific. REST api1 has no formal OpenAPI spec, and GL dimension structure varies per customer configuration.

How SAP Concur works

SAP Concur is a cloud expense and travel management platform that exposes expense reports, invoice payment requests, purchase orders, vendor records, and financial integration documents via REST JSON APIs. It uses OAuth2 password grant with an auth token, and the base URL is determined by geolocation in the token response (US, EMEA, or China). Access tokens last 1 hour; refresh tokens last 6 months. SAP Concur supports webhooks through the Event Subscription Service with at-least-once delivery and automatic retry on failures. Mutual TLS is required for webhook receivers. Each app is limited to 5 active webhook subscriptions, and expense reports are capped at 64 characters in the business purpose field.

What moves between them

Expense reports and invoice payment requests flow from SAP Concur into Sage X3 as supplier invoices and general ledger entries. The integration polls SAP Concur for new or updated expense and invoice records on a configurable schedule, maps each expense category to a Sage X3 GL account and cost center, and posts the resulting entries into X3's general ledger. Expense approvals and invoice status changes in SAP Concur are reflected in X3 through periodic polls. Vendor and cost center reference data is synced bidirectionally to ensure expense allocations land on valid X3 dimensions.

How ml-connector handles it

ml-connector stores both credential sets encrypted and handles the multi-region OAuth2 flow for SAP Concur, extracting the geolocation from the token response and using it for all subsequent API calls. For Sage X3, it accepts either OAuth2 Bearer token auth or HTTP Basic Authentication via the REST api1 path, and it polls both systems on a schedule independent of webhook delivery. Because SAP Concur sends expense and invoice events via webhooks while Sage X3 is pull-only, ml-connector can optionally receive SAP Concur webhook notifications and correlate them with subsequent polls to avoid duplicate processing. Expense categories are mapped statically to X3 GL accounts; if a new category appears, the mapping is flagged and requires manual adjustment. X3 GL dimensions (cost centers, departments) are validated before posting to ensure no invalid entries land in the ledger. SAP Concur tokens expire in 1 hour, so ml-connector refreshes them on a regular cadence and detects token expiry errors to prevent mid-flow failures. Every record carries a full audit trail, and failed GL posts can be replayed once the underlying mapping issue is resolved.

A real-world example

A mid-market professional services firm runs Sage X3 for finance and project accounting, and uses SAP Concur for employee travel and expense management. Before the integration, the accounting team downloaded expense reports from SAP Concur each month, manually created supplier invoices in Sage X3, and allocated each expense to the correct project code and GL account. This re-keying step introduced errors, delays month-end close, and created reconciliation gaps when expense approvals changed after initial entry. With Sage X3 and SAP Concur connected, each approved expense report flows into X3 automatically as a supplier invoice, with the correct cost allocation pre-applied. Month-end close is faster, reconciliation is automatic, and the manual expense-entry step is eliminated.

What you can do

  • Sync SAP Concur expense reports into Sage X3 as supplier invoices, with expenses allocated to the correct GL accounts and cost centers.
  • Post invoice payment requests from SAP Concur into Sage X3 general ledger entries for accounts payable reconciliation.
  • Map expense categories to Sage X3 GL accounts, so each expense lands on the correct account without manual adjustment.
  • Authenticate SAP Concur across multiple geolocation regions and refresh OAuth2 tokens hourly, and handle Sage X3 Bearer or Basic auth on a customer-specific server URL.
  • Poll both systems on a configurable schedule, with full audit trails and error replay when GL posts fail.

Questions

Which direction does data move between Sage X3 and SAP Concur?
The main flow is SAP Concur into Sage X3. Expense reports and invoice payment requests move from SAP Concur into X3 as supplier invoices and GL entries, while cost centers and GL accounts are synced in both directions to ensure expense allocations reference valid X3 dimensions. Sage X3 GL entries are read-only in this direction, so ml-connector does not write financial adjustments back to SAP Concur.
How does ml-connector handle SAP Concur's multi-region API endpoints?
SAP Concur returns the customer's geolocation (US, EMEA, or China) in the OAuth2 token response. ml-connector extracts this geolocation and uses it as the base URL for all subsequent API calls, ensuring the integration routes to the correct regional datacenter. The geolocation is re-verified on each token refresh so migrations do not break the integration.
What happens when an expense category in SAP Concur does not have a mapped GL account in Sage X3?
Unmapped expense categories are flagged in the audit log and the GL post is held until the missing mapping is added. The integration includes a configuration surface to define or update category-to-account mappings without code changes, and once added, the held post can be replayed automatically.

Related integrations

Connect Sage X3 and SAP Concur

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started