ml-connector
Microsoft Dynamics NAVExpensify

Microsoft Dynamics NAV and Expensify integration

Microsoft Dynamics NAV runs your general ledger and vendor master. Expensify manages employee expenses and corporate cards. Connecting the two keeps your GL accounts reconciled with approved expenses without manual journal entry. When employees submit expense reports in Expensify and approvers sign off, ml-connector transforms each report into a purchase invoice or journal entry in NAV, allocated to the correct GL account and cost center based on the expense category, and linked to the correct vendor or expense ledger account.

How Microsoft Dynamics NAV works

Microsoft Dynamics NAV exposes vendors, customers, purchase invoices, purchase orders, sales invoices, GL accounts, general ledger entries, dimensions, items, employees, and journals through OData v4 REST (primary) or legacy SOAP web services. Cloud deployments (Dynamics 365 Business Central online) authenticate with OAuth 2.0 client credentials via Microsoft Entra ID from a tenant-specific base URL. On-premises installations use the same OAuth 2.0 path or legacy Basic auth with a web service access key. NAV supports webhooks that expire after 3 days and must be renewed, or polling for a more stable pull cadence.

How Expensify works

Expensify exposes expense reports, individual expenses within those reports, employee records, policies, and corporate card transactions through REST POST requests to a single integration endpoint. Authentication is API key pair (partnerUserID and partnerUserSecret) sent inline with every request. Expensify is pure polling; there are no webhooks or push capabilities. Expense categories map to GL account codes within Expensify, and tags (project, cost center, class) function as accounting dimensions. Expensify does not have vendor master, invoice, or purchase order entities; it is expense-management only.

What moves between them

Expense reports flow from Expensify into Microsoft Dynamics NAV. ml-connector polls Expensify on a schedule (typically daily or after each approval cycle), retrieves approved expense reports with their detail lines, and posts each report as a NAV purchase invoice or general journal entry, depending on configuration. The expense category in Expensify maps to a GL account in NAV, and expense tags (cost center, project, department) map to NAV dimensions so entries land on the correct cost and responsibility center. Individual expense amounts become invoice lines or journal detail rows. The status of each NAV posting is tracked in ml-connector's audit log.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On every poll cycle it authenticates to Expensify via API key, retrieves reports matching your filters (status, date range, policy), transforms each expense line into a NAV invoice line item or journal detail, and posts the complete invoice or journal entry to NAV via OAuth bearer token. The mapping from Expensify categories to NAV GL accounts and from Expensify tags to NAV dimensions is configured once per customer; ml-connector validates that the GL account and dimension values exist in NAV before posting to prevent invalid entries. If a NAV POST fails (e.g. account does not exist, dimension value is inactive), ml-connector retries with exponential backoff and surfaces the error in the audit trail so you can fix the underlying data. Expensify has no vendor master, so expense reports are posted either to a designated expense ledger account or to a vendor record you map per report category. Polling is one-way; ml-connector does not write approval status or report status back to Expensify.

A real-world example

A mid-sized service firm runs Microsoft Dynamics NAV for general accounting and vendor management. Employees file expenses through Expensify (travel, meals, client reimbursables), and approvers sign off in Expensify's workflow. Before the integration, the accounting team exported approved reports from Expensify at month-end, manually created NAV purchase invoices or journal entries for each, and coded them to the right GL accounts and cost centers by reading the expense details. With NAV and Expensify connected, each approved report posts automatically to NAV with the correct GL account and cost center, and the month-end close process starts with expenses already in the ledger. The manual entry and coding step is eliminated, and the GL is accurate with zero re-work.

What you can do

  • Poll Expensify for approved expense reports on a schedule and post each as a NAV purchase invoice or general journal entry.
  • Map Expensify expense categories to NAV GL accounts and Expensify tags (cost center, project, department) to NAV dimensions so entries land on the correct accounts.
  • Authenticate Expensify via API key pair and Microsoft Dynamics NAV via OAuth 2.0 client credentials, with encrypted credential storage.
  • Validate that GL accounts and dimension values exist in NAV before posting, and surface mapping errors in the audit trail.
  • Retry failed posts with exponential backoff and track the status of each expense report in the audit log so you can verify completeness and troubleshoot mismatches.

Questions

What expense data flows from Expensify into Microsoft Dynamics NAV?
Approved expense reports flow from Expensify into NAV as purchase invoices or general journal entries. Each report becomes a single invoice or journal with detail lines for each expense, mapped to the appropriate GL account based on expense category and to the appropriate cost center based on expense tags (cost center, project, department). ml-connector does not write approval status or payment status back to Expensify.
How does ml-connector handle the fact that Expensify has no vendor master like NAV does?
Expensify expense reports are posted either to a designated expense ledger account in NAV or to a vendor record you configure per report category. The mapping is set up once during integration configuration and applied to every report matching that category. If you need employee names or cost centers tracked separately, use NAV dimension values assigned via the Expensify tags.
What happens if a NAV GL account or dimension value is inactive or does not exist when ml-connector tries to post?
ml-connector validates that the GL account and dimension values exist and are active before attempting to post. If validation fails, the post is blocked, the error is logged in the audit trail, and ml-connector retries on the next schedule cycle. You can then fix the NAV master data or adjust the expense category-to-account mapping and resubmit the report.

Related integrations

Connect Microsoft Dynamics NAV and Expensify

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

Get started