ml-connector
Epicor KineticExpensify

Epicor Kinetic and Expensify integration

Epicor Kinetic is your ERP for finance and operations. Expensify is where your employees submit and get approval for expenses and corporate card transactions. Connecting them keeps your general ledger in sync with your expense cycle without manual journal entry. Approved expense reports flow from Expensify into Epicor's GL, allocated to the cost centers and projects your team charged them to. Every entry is audited and can be replayed if a downstream step fails.

How Epicor Kinetic works

Epicor Kinetic is a cloud and on-premises ERP platform with REST OData v4 APIs. It authenticates via Basic Auth, API Key, OAuth2 client credentials (cloud), or Token Resource Service (on-premises), and exposes vendors, AP invoices, purchase orders, GL accounts, customers, and parts. Epicor cloud instances use tenant-specific URLs (https://<tenant>.epicorsaas.com/<instance>/api/v2/odata/<Company>/), while on-premises deployments use a server hostname. The API supports OData filtering on date fields to retrieve changed records since last sync, and writes follow a two-step pattern: GetNewXxx to create a skeleton, then UpdateMaster to finalize. Epicor has no native outbound webhooks, so integrations must poll.

How Expensify works

Expensify is a cloud-based expense management platform that exposes expense reports, expenses, employees, policies, corporate cards, and approval status through a REST API. All requests POST to https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations with a JSON payload. Authentication uses an API key pair (partnerUserID and partnerUserSecret) generated in the Expensify web interface and passed with every request. Expensify is polling-only; onReceive and onFinish are server-side actions, not push endpoints. There is no sandbox environment, so all integrations run against production. Expense categories are GL account code containers, and tags function as accounting dimensions like project, class, and cost center.

What moves between them

Approved expense reports flow from Expensify into Epicor. ml-connector polls Expensify for reports in Approved status, sums expenses by category within each report, maps Expensify categories to Epicor GL accounts, and posts a summary GL entry for each report into Epicor's general ledger. Each line item references a cost center or project tag from Expensify if configured. The sync runs on a schedule tied to your approval workflow, typically daily or weekly. GL entries in Epicor are read by finance for reconciliation and close; Expensify is the single system of truth for expense data and cannot be overwritten by the integration.

How ml-connector handles it

ml-connector stores both API credentials encrypted. On the Epicor side, it uses the tenant-specific URL or on-premises hostname provided per customer, and holds the API Key in addition to the bearer token, refreshing the bearer token when it expires (typically after 1 hour). On the Expensify side, it polls for expense reports via scheduled requests with date range and status filters, then transforms each approved report by summing expenses per category. Before posting to Epicor, ml-connector validates that each category maps to a valid GL account in Epicor's chart of accounts and reserves a cost center or project dimension if tags are configured. It then calls GetNewAPInvtDtl to create a GL entry skeleton and UpdateMaster to finalize the journal lines. Because both systems are polling-only, the integration cannot rely on webhooks and instead maintains a high-water mark timestamp to avoid duplicate syncs. Expensify runs only against production, so ml-connector includes a full audit trail and supports manual replay if a downstream GL posting fails.

A real-world example

A mid-sized services firm uses Epicor Kinetic to manage finance and operations, with offices in two cities, and uses Expensify for all employee expense reporting and corporate card reconciliation. Before the integration, the accounting team exported approved expense reports from Expensify weekly, manually assigned cost centers and GL accounts based on project codes and submission notes, and hand-keyed the totals into Epicor's GL. With the integration, each expense report that an approver marks as Approved in Expensify flows directly into Epicor's GL, tagged with the project and cost center from Expensify tags, and the manual re-keying step is eliminated. Month-end close starts with expense accruals already booked.

What you can do

  • Post approved Expensify expense reports to Epicor's general ledger, summarized by expense category and cost center.
  • Map Expensify expense categories to Epicor GL accounts automatically, with validation before posting.
  • Preserve expense data lineage: every GL entry includes a reference to the source Expensify report and carries a full audit trail.
  • Handle Epicor bearer token refresh (1-hour expiry) and Expensify's production-only API transparently.
  • Poll both systems on a schedule without relying on webhooks, with retries and manual replay support for failed GL postings.

Questions

Which direction does data move between Epicor and Expensify?
The main flow is from Expensify into Epicor. Approved expense reports are pulled from Expensify and posted as GL entries into Epicor's general ledger. Employees and cost centers may be synced in the opposite direction so Expensify policies reference valid Epicor dimensions, but GL posting is the primary flow.
How does ml-connector handle the two-step GL write pattern in Epicor?
Epicor requires a GetNewAPInvtDtl call to create a GL entry skeleton, then UpdateMaster to finalize the journal lines and GL account assignments. ml-connector calls both steps in sequence for each approved expense report summary, ensuring GL accounts and cost centers are valid before posting.
Why does the integration poll instead of using webhooks?
Epicor Kinetic has no native outbound webhook mechanism for cloud or on-premises, so polling with OData date filters is the only option. Expensify also offers polling only. ml-connector maintains a high-water mark timestamp to avoid duplicate syncs and includes a full audit trail on every record for reconciliation and replay.

Related integrations

Connect Epicor Kinetic and Expensify

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

Get started