ml-connector
Sage 100Expensify

Sage 100 and Expensify integration

Sage 100 runs finance and operations for on-premises businesses. Expensify manages employee expenses in the cloud. Connecting them moves approved expenses into Sage 100's general ledger automatically, mapped to the right GL accounts and cost centers, so month-end closes do not require manual re-entry of expense totals. Employees submit expenses in Expensify, managers approve them, and the approved amounts flow into Sage 100's journals without re-keying.

How Sage 100 works

Expensify exposes expense reports, individual transactions, employees, policies (workspaces), and corporate card data through a REST API. All requests are POST to https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations with a JSON payload. Authentication is API key pair (partnerUserID and partnerUserSecret), generated in the Expensify integrations dashboard and passed inline with every request. Expensify has no webhooks or push events, so reports are read by polling, filtering by date range and approval status. Expense categories carry GL account codes, and tags function as dimensions like project, class, and cost center.

How Expensify works

Sage 100 is an on-premises ERP that exposes GL accounts, journal entries, vendors, and customers through SOAP web services (https://<customer-server>/ebusinesswebservices/masservice.svc) and a BOI COM layer. The BOI layer requires a local Windows agent on the customer's server, since Sage 100 has no cloud API. Authentication is username and password per call (no tokens or OAuth); the local agent adds its own credentials or API key. Sage 100 has no webhooks or event streams, so writes are discrete SOAP calls or BOI transactions. Company code (a 3-character identifier) is required for every call. GL accounts use a multi-segment format that varies by customer configuration.

What moves between them

Approved Expensify expense reports flow into Sage 100's general ledger. ml-connector polls Expensify for reports with status Approved on a schedule tied to your expense cycle (daily, weekly, or after each approval run). For each report, it reads the individual transactions, maps each transaction's Expensify category and tags to a Sage 100 GL account and cost center, and posts the report total as a single or multi-line journal entry into Sage 100's GL. Once posted, reports are marked as exported in Expensify so they do not re-sync.

How ml-connector handles it

ml-connector stores both API credential sets encrypted. On the Expensify side, it calls the REST endpoint with the API key pair and filters for approved reports within the date range. On the Sage 100 side, it connects to the customer's local SOAP endpoint or via the BOI agent, authenticates with the customer's username and password, and uses the customer's company code to post the journal entry. Expensify expense categories map to GL account codes via a configuration table; Expensify tags map to Sage 100 cost centers or other GL dimensions. Because Sage 100 is on-premises and accessed via a local agent, ml-connector retries SOAP timeouts and COM record-lock failures with exponential backoff. Every transaction is logged with the original expense ID, employee, and amount, so failed expense reports can be inspected and replayed.

A real-world example

A mid-sized services firm uses Sage 100 for on-premises accounting and operations, and Expensify for employee expense tracking across a multi-state field team. Before the integration, the finance team downloaded the approved expense report from Expensify each week, summed the totals by cost center, and manually entered journal entries into Sage 100's GL, a process prone to math errors and delays. With Sage 100 and Expensify connected, each approved report flows into Sage 100 automatically, posted to the right GL account and cost center based on the expense category and tags. The finance team no longer re-enters expense totals, and the GL is current by the time the weekly close begins.

What you can do

  • Poll approved expense reports from Expensify on a schedule and post them as journal entries into Sage 100's general ledger.
  • Map Expensify expense categories to Sage 100 GL accounts and Expensify tags to cost centers or other GL dimensions.
  • Bridge Expensify's cloud REST API with Sage 100's on-premises SOAP and BOI layers, managing credentials encrypted at rest.
  • Retry SOAP timeouts and COM record locks that Sage 100 may trigger, with exponential backoff and jitter.
  • Track every expense report with the original ID, employee, and amount in a full audit trail for inspection and replay on failure.

Questions

Does ml-connector need access to the Sage 100 server directly, or can it go through the agent?
ml-connector connects via the customer's local Sage 100 Windows agent, which wraps the BOI COM layer. The agent runs on or near the customer's server and is already authorized to write to Sage 100. If the agent exposes an HTTP or API endpoint, ml-connector calls that. Otherwise, ml-connector must reach the SOAP endpoint at https://<customer-server>/ebusinesswebservices/masservice.svc and present the customer's Sage 100 username and password for each write.
How do Expensify categories and tags map to Sage 100 GL accounts and cost centers?
Expensify categories are configured with GL account codes in your Expensify workspace settings. ml-connector reads those codes and posts the expense total to the matching GL account in Sage 100. Expensify tags (project, class, cost center, etc.) are mapped to Sage 100 GL cost center segments or other dimensions via a configuration table that you define and ml-connector applies during journal entry creation.
What happens if a report fails to post to Sage 100 due to a COM lock or timeout?
ml-connector retries the write with exponential backoff and jitter, respecting Sage 100's concurrent write limits. If the retry succeeds, the report is marked as exported in Expensify and the sync completes. If it fails after retries, the report is flagged in the audit log and can be replayed manually once the lock clears.

Related integrations

Connect Sage 100 and Expensify

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

Get started