ml-connector
Epicor KineticBrex

Epicor Kinetic and Brex integration

Epicor Kinetic runs manufacturing, distribution, and finance. Brex runs corporate cards, expenses, and bill pay. Connecting the two brings coded card and cash spend into the Epicor general ledger and AP without re-keying. After Brex finishes coding a transaction, the expense lands in Epicor against the right account and cost segments, and the Brex vendor directory stays aligned with Epicor vendors. ml-connector handles the very different APIs on each side and moves the data on the cadence you set.

How Epicor Kinetic works

Epicor Kinetic exposes vendors, AP invoices, purchase orders, GL accounts, and a chart of accounts as OData v4 REST endpoints under a tenant-specific URL that includes the company segment. Authentication is HTTP Basic or, on cloud sites with Epicor IdP, OAuth2 client credentials, and in most configurations an API key header is required in addition to establish service-layer access. Complex writes such as AP invoices follow a two-step pattern, calling a GetNew method for defaults and then UpdateMaster to commit the record and its GL lines. Epicor Kinetic has no native outbound webhooks, so all reads are done by polling with an OData date filter.

How Brex works

Brex exposes card and cash transactions, expenses with receipts and coding, vendors, transfers, and accounting records through its REST Developer API. Most calls use a static bearer token created in the Brex dashboard, or OAuth 2.0 for multi-tenant partner apps, and list endpoints use cursor-based pagination capped at 100 records on the Expenses API. The accounting records surface carries GL account ids, custom dimension fields, and an export status flag, which is the two-way ERP sync surface. Brex also pushes webhooks signed with Svix, including a record-ready-for-export event that signals a coded transaction is ready to pull.

What moves between them

The main flow runs from Brex into Epicor Kinetic. Once Brex marks an accounting record ready for export, ml-connector reads the coded card or cash transaction and posts it into Epicor Kinetic as an AP invoice line or GL entry, mapped to the matching Epicor GL account and cost segments, then marks the Brex record exported so it is not posted twice. Vendor records are aligned so the Brex payables directory and Epicor vendors stay in step. Reference data such as GL accounts and dimension fields is matched first so every posted line references an account that already exists in Epicor. Epicor card spend is treated as the system of record for finance, so ml-connector does not write ledger balances back into Brex.

How ml-connector handles it

ml-connector stores both credential sets encrypted, sends the Brex bearer token on every request, and presents the Epicor Kinetic tenant URL, company segment, and API key together with the Basic or OAuth2 identity, since the API key alone does not authenticate. Brex sends a record-ready-for-export webhook signed with Svix, so each delivery is verified using the webhook id, timestamp, and signature before the record is fetched, and a scheduled poll backfills anything a webhook missed. Because Epicor Kinetic has no webhooks, it is always read by polling an OData date filter. Brex GL account ids and dimension fields are mapped to Epicor account segments and cost dimensions first, and merchant names are fuzzy-matched to Epicor vendors because Brex merchant names rarely match exactly. AP invoice writes use the GetNew then UpdateMaster pattern so required defaults and GL lines commit in one call. Brex rate limits return HTTP 429, so ml-connector backs off and retries, and it watches the Brex token, which expires after ninety days of inactivity, so a lapse does not become an outage. Every record carries a full audit trail and can be replayed if an Epicor post fails.

A real-world example

A mid-sized industrial distributor with about three hundred staff runs Epicor Kinetic for purchasing, inventory, and finance, and issues Brex corporate cards to its buyers and field technicians. Before the integration, the accounting team exported card statements from Brex each week and hand-entered the coded expenses into Epicor AP, then spent the first days of month-end close reconciling card spend against the GL accounts it was supposed to hit. With Epicor Kinetic and Brex connected, each transaction Brex finishes coding posts into Epicor automatically, allocated to the right account and cost segment, and the vendor list stays aligned across both systems. Month-end close starts with card spend already booked, and the weekly re-keying step is gone.

What you can do

  • Post coded Brex card and cash transactions into Epicor Kinetic AP invoices or GL entries after Brex marks each record ready for export.
  • Keep the Brex vendor directory aligned with Epicor Kinetic vendors, using fuzzy matching on merchant names.
  • Map Brex GL account ids and custom dimension fields to Epicor Kinetic account segments and cost dimensions.
  • Authenticate Brex with its bearer token and Epicor Kinetic with its tenant URL, company segment, and API key.
  • Verify Brex Svix-signed webhooks, then poll Epicor on a schedule with retries and a full audit trail on every record.

Questions

Which direction does data move between Epicor Kinetic and Brex?
The main flow is Brex into Epicor Kinetic. Coded card and cash transactions move from Brex into Epicor as AP invoice lines or GL entries, and vendor records are aligned so both directories match. Epicor stays the system of record for finance, so ml-connector does not write ledger balances back into Brex.
How does the integration know when a Brex transaction is ready to post?
Brex sends a record-ready-for-export webhook, signed with Svix, once it finishes coding a transaction. ml-connector verifies the signature, fetches the coded accounting record, posts it into Epicor, and marks the Brex record exported. A scheduled poll backfills any record a webhook missed.
How does the integration handle Epicor Kinetic auth and its lack of webhooks?
Epicor Kinetic needs the tenant URL with the company segment, a Basic or OAuth2 identity, and an API key header, all of which ml-connector presents together. Because Epicor has no native webhooks, it is read by polling an OData date filter on a schedule rather than waiting for a push.

Related integrations

Connect Epicor Kinetic and Brex

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

Get started