ml-connector
Sage 300SAP Concur

Sage 300 and SAP Concur integration

Sage 300 runs your accounts payable, accounts receivable, and general ledger. SAP Concur runs travel and expense reporting. Keeping them connected ensures that vendors and cost centers in Sage 300 match the accounts and dimensions in SAP Concur, and that approved expense and invoice transactions flow from SAP Concur back into your GL without re-entry. ml-connector handles the different authentication schemes and synchronizes the data on a schedule you control.

How Sage 300 works

Sage 300 is an on-premise Windows-based ERP that exposes its data via REST and OData APIs with HTTP Basic Authentication. Endpoints cover AP vendors, AR customers, GL accounts, GL segments, GL journal batches, purchase orders, order entry records, and inventory items. Sage 300 has no webhook system, so all data retrieval is pull-based through scheduled polling using OData filters and pagination. The API user must be created in Administrative Services with Web API security group permissions. Because Sage 300 is self-hosted, the customer must expose the API server over HTTPS from their own infrastructure.

How SAP Concur works

SAP Concur is a cloud platform for travel and expense management, offering REST APIs for expense reports, invoices, vendors, purchase orders, and purchase requests. It uses OAuth 2.0 with password grant flow for authentication and publishes data through the Event Subscription Service, which sends webhook notifications when expenses, invoices, and users change. SAP Concur's multi-datacenter deployment requires the client to detect the correct API base URL from the OAuth token response. Supported scopes and integrations must be registered at app setup time.

What moves between them

The main flow is bidirectional. Sage 300 AP vendors and GL accounts are polled on a daily schedule and synced to SAP Concur as vendor and GL mapping data. When expense reports and invoices are marked paid in SAP Concur, ml-connector reads the Financial Integration documents (which capture the GL impact of each approved transaction) and posts them into Sage 300 as GL journal batches, allocated to the correct GL accounts and segments. Sage 300 is pull-only, so ml-connector initiates all reads from Sage 300; SAP Concur can push events via webhooks, or ml-connector can poll if webhooks are unavailable.

How ml-connector handles it

ml-connector stores Sage 300 Basic Auth credentials encrypted and includes them with every request, using uppercase formatting for both username and password as Sage 300 requires. It handles SAP Concur's OAuth 2.0 token refresh cycle, refreshing the access token when calls return 401, and uses the geolocation hint from the OAuth response to route all subsequent API calls to the correct SAP Concur datacenter. Because Sage 300 is self-hosted with no webhooks, ml-connector polls on a schedule you configure, using OData date filters to retrieve only changed records. SAP Concur webhooks push changes as they occur, but ml-connector can fall back to polling if webhook delivery is unavailable. When syncing expense and invoice journals back into Sage 300, ml-connector maps SAP Concur GL accounts and cost centers to the matching Sage 300 GL accounts and segments, and submits them as GL journal batches that Sage 300 batch APIs accept. Both directions include automatic retries for transient failures and 429 rate-limit responses, and every record carries a full audit trail.

A real-world example

A mid-sized distributor runs Sage 300 on-premise for AP, AR, and GL operations, and uses SAP Concur for employee travel and expenses across three regional offices. Before integration, the finance team received approved expense reports from SAP Concur and manually entered each journal entry into Sage 300's GL at month-end, a process that took 2 to 3 days and introduced frequent data-entry errors. With Sage 300 and SAP Concur connected, vendor master data stays synchronized between systems, and each approved expense report's GL impact flows automatically into Sage 300 as a GL journal batch at the moment of approval, eliminating the manual month-end re-entry step and ensuring GL accounts are always accurate.

What you can do

  • Poll Sage 300 AP vendors and GL accounts on a schedule and sync them to SAP Concur for vendor validation and GL mapping.
  • Read approved expense reports and invoices from SAP Concur and post the associated GL journals into Sage 300 GL, mapped to the correct GL accounts and segments.
  • Authenticate Sage 300 with HTTP Basic Auth (credentials encrypted) and SAP Concur with OAuth 2.0, handling token refresh and datacenter routing.
  • Receive webhook notifications from SAP Concur when expenses and invoices change, or fall back to scheduled polling when webhooks are unavailable.
  • Track every vendor sync, expense journal post, and error in a full audit trail, with automatic retries on transient failures and rate limits.

Questions

Which direction does data move between Sage 300 and SAP Concur?
Sage 300 vendors and GL accounts are read from Sage 300 and synced to SAP Concur so that approved expenses post to valid GL accounts and cost centers. Approved expense reports and invoices flow from SAP Concur to Sage 300, where ml-connector posts them as GL journal batches. This bidirectional flow keeps both systems aligned and eliminates manual GL entry.
How does ml-connector handle Sage 300's self-hosted architecture and lack of webhooks?
Because Sage 300 is on-premise with no webhook system, ml-connector polls the Sage 300 API on a schedule you configure, using OData date filters to retrieve only changed records since the last poll. The customer must expose their Sage 300 IIS server over HTTPS. SAP Concur sends push notifications via webhooks where available, but ml-connector can also poll SAP Concur if webhook delivery is unavailable.
Does the Sage 300 Basic Auth credential require special handling?
Yes. Sage 300 requires HTTP Basic Authentication with both username and password in uppercase. ml-connector stores these credentials encrypted and formats them correctly on every request. The API user must be created in Sage 300 Administrative Services with Web API security group permissions before integration begins.

Related integrations

Connect Sage 300 and SAP Concur

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

Get started