Skip to main content

SAP Concur Integration: Setup and Sync

Connect SAP Concur, a travel and expense management platform, to DualEntry to import approved expense reports as bills in your ledger. DualEntry pulls your Concur employees, expense types, payment types, location lists, and approved expense reports, then creates one bill per report per payment type with each expense entry as a line and the receipt image attached. Data flows one way: Concur to DualEntry. DualEntry does not write expense or payment data back to Concur.

Prerequisites

Confirm the following before connecting:
  • A SAP Concur account with an OAuth2 application registered for DualEntry. Concur provisions the application and issues the credentials and the one-time company request token you use to connect.
  • A Concur expense configuration admin user, whose email DualEntry uses to read your expense types and payment types.
  • Your chart of accounts set up, so you can map each Concur expense type to a GL account.
  • The DualEntry companies that incur and pay the expenses, plus a default bank account on the paying company if you record payments through the integration.
  • A DualEntry classification representing your locations, if you map Concur expense locations to companies and classification lines.
Connecting requires a SAP Concur OAuth2 application configured with the refresh_token grant and the expense, list, identity, and image read scopes. The company request token from Concur is single-use: DualEntry exchanges it once for an access token and refresh token, then refreshes access automatically.

How the Concur sync works

DualEntry authenticates with Concur over OAuth2, pulls reference data and approved expense reports, and turns each report into bills. The sync is one-directional and built around approved reports. DualEntry syncs entities in a fixed order so that mappings exist before bills are built: employees, expense types, payment types, location lists and their items, location-to-company mappings, and finally expense reports. For each report, DualEntry checks the approval status and skips anything that is not fully approved. It then reads the report’s expense entries, groups them by payment type, and creates one bill per payment type group. During bill creation, DualEntry downloads the receipt image for each entry that has one and attaches it to the bill. Receipt download failures are logged per entry and do not block the bill: the bill is created with whatever receipts succeeded.
Only fully approved Concur reports sync, and receipts are captured once at bill creation. The sync does not update bills that already exist, so reports edited in Concur after their first import, or receipts added later, are not reflected in DualEntry. Pulling those later changes into DualEntry is not automatic.

Connect the integration

Authorize DualEntry to call Concur using the OAuth2 application Concur registered for you. DualEntry stores the resulting tokens and keeps them fresh.
  1. In DualEntry, open Company -> Integrations -> All Integrations -> SAP Concur.
  2. Enter the OAuth2 client_id and client_secret from your Concur application, your Concur company_uuid, the one-time company_request_token Concur issued during setup, and the Admin Email Address of the user who requested the token.
  3. Choose Connect. DualEntry exchanges the request token for an access token and a refresh token, and reads the datacenter URL (geolocation) Concur returns so later calls hit the right region.
  4. Confirm the integration status is Connected. Setup is considered complete once the integration is connected; mapping happens next.
DualEntry refreshes the access token automatically using the stored refresh token, so you do not re-enter credentials on a schedule. If the refresh token is revoked in Concur, reconnect with a fresh company request token.

Configure integration settings

Set the integration settings that tell DualEntry which company pays, where to find the location on each expense, and how to treat each payment type. These settings drive bill creation and are available via the “Settings” button on the top right of the integration page.
SettingTypePurpose
Expense config admin emailstringThe Concur admin user whose policies DualEntry reads to pull expense types and payment types.
Paying companycompanyThe DualEntry company that pays all Concur bills. Used as the bill’s top-level paying company. Intercompany billing will be automatically posted in DualEntry where expensing company differs.
Location source custom fieldstringThe Concur expense field that carries the location, written as field_id:FieldName (for example, custom_1:Custom1Field).
Location classificationclassificationThe DualEntry classification whose lines are the location mapping options.
Payment type configJSONMaps each Concur payment type to a bill vendor and whether it is an employee reimbursement.
Paying bank accountbank accountThe bank account used when you record payments. Must belong to the paying company.
Initial Cut-off DatedatetimeThe date at which you would like to begin importing transactions to DualEntry from Concur.
The payment type config maps each Concur payment type ID to how DualEntry should bill it. Use is_employee_reimbursement for out-of-pocket spend (the bill vendor becomes the employee’s mapped vendor) and a vendor_id for corporate card spend (the bill vendor is that configured vendor).
{
  "CASH": { "is_employee_reimbursement": true },
  "CABF": { "is_employee_reimbursement": false, "vendor_id": 4012 }
}

Map Concur records to DualEntry

After the first sync, map the Concur records DualEntry imported to their DualEntry counterparts. Bills only post for reports whose every mapping resolves.
  • Employees to vendors. DualEntry auto-maps each Concur employee to an existing vendor whose name matches, then leaves the rest for you to map. The mapped vendor is used as the bill vendor for that employee’s reimbursements.
  • Expense types to accounts. Map each Concur expense type to a GL account. The account becomes the expense line’s account on the bill.
  • Locations to classification lines. Map each Concur location list item (shown as a “Site”) to a classification line so expense lines carry the right dimension.
  • Locations to companies. Map each classification line to the DualEntry company that incurs the expense. When that company differs from the paying company, the bill posts as a cross-company bill.
Payment types are not mapped on a screen; they are configured in the payment type config setting described above. Lists and list items themselves are reference data and do not need mapping beyond their location children.

How bills are created

DualEntry creates one bill per approved report per payment type, with each expense entry as a bill line. Knowing how each field resolves helps you map correctly.
Bill fieldSource
CompanyThe paying company from integration settings.
VendorFrom the payment type config: the employee’s vendor for reimbursements, or the configured vendor for corporate card.
DateThe report’s submit date.
Line accountThe expense type to account mapping.
Line companyThe location to company mapping; a different company than the bill’s triggers a cross-company line.
Line classificationsThe location to classification line mapping.
AttachmentsReceipt images for entries that have one, downloaded from Concur and stored in DualEntry as an attachment to the bill record.
If any entry in a payment group cannot resolve a required mapping, DualEntry records the error on that group and leaves it unmapped rather than posting a partial bill. Fix the mapping and run the sync again to create the bill.

Record payments for Concur bills

DualEntry records payments against the bills it imported from Concur. You select outstanding bills, enter one lump-sum amount, and DualEntry posts the vendor payments. No payment status is pushed back to Concur in this version. Select the Concur bills to pay from the bill list, filtered to the Concur source and to unpaid or partially paid status. All selected bills must share the same currency. DualEntry draws the payment from the paying company’s configured bank account, which is pre-filled and not editable. The payment amount must be at least the total amount due across the selected bills:
  • Exact payment. When the amount equals the total due, DualEntry creates one vendor payment per bill.
  • Overpayment. When the amount exceeds the total due, DualEntry creates a vendor payment per bill and posts the remainder as a vendor prepayment against a vendor you choose. Apply that prepayment to future bills through the normal prepayment flow.
  • Underpayment. An amount below the total due is rejected.

What syncs

DualEntry imports the following Concur records and maps them to DualEntry targets. The sync runs in this order so that mappings exist before bills are built.
Concur recordDualEntry targetNotes
EmployeesVendor mappingAuto-mapped by name; you map the rest.
Expense typesAccount mappingMap each to a GL account.
Payment typesConfigured in settingsSet vendor and reimbursement flag in the payment type config.
Lists and list itemsReference dataLocation definitions pulled from Concur.
Location list items (“Site”)Classification line mappingMap each to a classification line.
Location to companyCompany mappingMap each classification line to the company that incurs the expense.
Approved expense reportsBill (per payment type)One bill per report per payment type, with entries as lines.
Only reports with a fully approved status are imported, and only reports submitted on or after the integration’s cutoff date.

Current limitations

A few constraints are worth knowing before you rely on the integration:
  • Approved reports only. DualEntry imports a report only when it is fully approved in Concur. Where a payment has been made on a credit card account but the expense report has not been fully approved, a vendor prepayment can be recorded during the payment record process defined above.
  • One-way sync. DualEntry pulls from Concur and does not push expense or payment data back. Recorded payments stay in DualEntry.
  • Receipts captured once. Receipt images are fetched at bill creation. Receipts added or removed in Concur afterward are not synced, because existing bills are not updated.
  • Payment types via settings. Payment type handling is configured in the payment type config JSON, not on a mapping screen.
  • Uniform currency for payments. Every bill in a single recorded payment must share one currency.

Troubleshoot bill creation errors

When a report’s payment group does not become a bill, DualEntry records an error on the integration record and leaves it unmapped. The common causes are below.
ErrorCauseResolution
MISSING_PAYING_COMPANYThe paying company setting is not configured.Set the paying company in integration settings.
MISSING_EMPLOYEE_MAPPINGThe report owner is not mapped to a vendor.Map the employee to a DualEntry vendor.
MISSING_PAYMENT_TYPE_VENDORThe payment type is absent from the payment type config.Add the payment type to the config with a vendor or the reimbursement flag.
MISSING_GL_MAPPINGAn expense type is not mapped to an account.Map the expense type to a GL account.
MISSING_SITE_CLASSIFICATIONA location list item is not mapped to a classification line.Map the location to a classification line.
MISSING_SITE_COMPANYA classification line is not mapped to a company.Map the location to a company.
MISSING_LOCATION_SOURCE_CUSTOM_FIELDThe location source custom field setting is missing, or the field is absent on the entry.Set the location source custom field, and confirm the field is populated on the Concur expense.
After correcting the mapping or setting, run the sync again to create the bill. You may also resync individual transactions by selecting the retry action at the far right side of the row in the data sync tab.

For maintainers

The details below describe connector configuration and internal endpoints, not user-facing features.
  • Authentication: OAuth2 against /oauth2/v0/token. Credentials in Integration.credentials: client_id, client_secret, company_uuid, company_request_token (consumed once), access_token, refresh_token, and geolocation (datacenter base URL). Grants refresh_token and password; scopes include expense.report.read, expense.config.*.restricted.read, spend.list.read, spend.listitem.read, identity.user.*.read, IMAGE, and receipts.read.
  • Settings (category concur): concur_expense_config_admin_user_email, concur_paying_company_id, concur_location_source_custom_field, concur_location_classification_id, concur_payment_type_config (JSON), and concur_paying_bank_account_id.
  • Approval filter: only reports with approval_status_code = "A_APPR" sync. Sync methods are all PULL; there are no PUSH methods.
  • Receipts: Image v1 API (/api/image/v1.0/expenseentry/{id}) returns a 15-minute URL; the image is downloaded and uploaded to S3 as concur_receipt_{entry_id}.{ext}.
  • API endpoints (router Integrations - Concur): GET /{integration_id}/custom-fields/ returns expense entry form custom fields for location mapping; POST /{integration_id}/bill-payments/ records payments and returns vendor_payment_ids, vendor_prepayment_id, and integration_record_ids.
  • Concur API versions in use: Identity v4, Expense Config v4, Expense v3, List v4, Expense Form v1.1, Image v1.

Result

After completing these steps, DualEntry imports your approved Concur expense reports as bills grouped by payment type, with employees mapped to vendors, expense types to accounts, and locations to companies and classifications, and receipts attached. You can then record vendor payments against those bills in DualEntry. Concur remains the system of record for expense capture and approval; DualEntry holds the accounting view. To compare other AP integrations, see Bill.com and Ramp. To connect additional systems, return to Integrations.
Last modified on June 10, 2026