SAP ECC and Expensify integration
SAP ECC runs your general ledger and cost structure. Expensify tracks employee expenses and corporate card spend. Connecting the two closes the gap between expense approval and GL posting. Approved reports from Expensify flow into SAP ECC as GL documents, allocated to the cost centers and GL accounts you define. Expense data arrives with full audit lineage, so month-end close starts with GL reconciled and the manual re-entry step is gone.
What moves between them
The main flow is Expensify to SAP ECC. ml-connector polls Expensify for approved reports on a scheduled interval (daily or after payroll cycles), extracts each expense with its GL account and cost center tags, and posts batches into SAP ECC's general ledger as GL documents via BAPI_ACC_DOCUMENT_POST. Each posted document references the Expensify report ID as the external document number to prevent re-posting on retry. Reference data (cost centers, GL accounts, employee lists) is read from SAP ECC on startup and cached for mapping validation. Expense reversals in Expensify trigger reversal documents in SAP ECC.
How ml-connector handles it
ml-connector stores SAP ECC credentials encrypted and uses the on-premises SAP .NET Connector or Java Connector library to make RFC calls to the customer instance; OData calls go via HTTP Basic Auth to the SAP Gateway URL. On the Expensify side, it stores the API key pair encrypted and polls for approved reports with date-range filters in the request body. Because SAP ECC write operations require an explicit BAPI_TRANSACTION_COMMIT call, ml-connector issues that call after posting each GL document batch. Cost centers and GL accounts are validated against SAP ECC master data before posting, so every expense lands on a valid dimension. Expensify report IDs are stored in the SAP ECC external document number field (REF_DOC_NO) to detect re-posts; a retry with the same report ID does not create a duplicate GL document. ml-connector tracks the Expensify API call rate and applies exponential backoff if a request is rate-limited, and it stores every posted report in the audit log with its GL line items.
A real-world example
A multinational manufacturing company runs SAP ECC for finance and GL operations across five plants, and uses Expensify for employee travel, meals, and corporate card expenses across a thousand employees. Before the integration, expense reports were printed or exported from Expensify weekly, and the finance team manually entered the totals into SAP ECC by cost center and GL account, a process that took two full days per week and introduced re-entry errors. Month-end close was delayed waiting for the manual entry to complete and for the GL to reconcile. With SAP ECC and Expensify connected, approved reports post to the GL automatically the next business day, allocated to the cost centers and GL accounts tagged in Expensify. The finance team no longer re-enters data, and month-end close starts with the expense accounts already reconciled.
What you can do
- Post approved Expensify reports into SAP ECC's general ledger allocated to cost centers and GL accounts tagged in each expense.
- Validate cost centers and GL accounts against SAP ECC master data before posting so every transaction lands on a valid dimension.
- Detect and prevent re-posting of the same Expensify report by using the report ID as the external document number in SAP ECC.
- Handle on-premises SAP ECC access via RFC with the .NET or Java Connector and apply explicit BAPI_TRANSACTION_COMMIT after posting.
- Poll Expensify on a schedule and track each posted report in a full audit trail for month-end reconciliation.
Questions
- Does the integration handle on-premises SAP ECC and cloud Expensify together?
- Yes. ml-connector connects to SAP ECC via the on-premises SAP .NET Connector or Java Connector library (which must be installed on the customer network), and connects to Expensify via HTTPS REST API calls. The integration runs in a network location that can reach both the on-premises SAP Gateway/RFC interface and the public Expensify API endpoint.
- Which GL documents get posted and in what order?
- Approved Expensify reports are polled daily (or on a schedule you set). Each report is a batch posting: all expenses are grouped by cost center and GL account, summed, and posted as a single GL document with multiple line items via BAPI_ACC_DOCUMENT_POST. Report IDs are stored as the external document number to prevent duplicates on retry.
- How are cost centers and GL accounts mapped from Expensify to SAP ECC?
- In Expensify, each expense category is assigned a GL account code, and each expense is tagged with dimensions (cost center, project, class) configured per policy. ml-connector reads these GL codes and tags from each approved report, validates them against the SAP ECC master data (BAPI_GL_ACC_GETLIST, BAPI_COSTCENTER_GETLIST), and posts the GL document only if all dimensions exist. If a cost center or GL account is invalid, the report is marked for review.
Related integrations
More SAP ECC integrations
Other systems that connect to Expensify
Connect SAP ECC and Expensify
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started