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.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.- In DualEntry, open Company -> Integrations -> All Integrations -> SAP Concur.
- Enter the OAuth2
client_idandclient_secretfrom your Concur application, your Concurcompany_uuid, the one-timecompany_request_tokenConcur issued during setup, and the Admin Email Address of the user who requested the token. - 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.
- Confirm the integration status is Connected. Setup is considered complete once the integration is connected; mapping happens next.
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.
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).
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.
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.
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.
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.
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 inIntegration.credentials:client_id,client_secret,company_uuid,company_request_token(consumed once),access_token,refresh_token, andgeolocation(datacenter base URL). Grantsrefresh_tokenandpassword; scopes includeexpense.report.read,expense.config.*.restricted.read,spend.list.read,spend.listitem.read,identity.user.*.read,IMAGE, andreceipts.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), andconcur_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 asconcur_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 returnsvendor_payment_ids,vendor_prepayment_id, andintegration_record_ids. - Concur API versions in use: Identity v4, Expense Config v4, Expense v3, List v4, Expense Form v1.1, Image v1.
