Integrations and platforms
ERP and accounting integration testing
ERP and accounting integration testing verifies that entries, currencies, and tax lines from spend, expense, AP/AR, payroll, or billing software reach the ERP or accounting system once with correct values. Buyers receive a sync scenario suite per connected system, field mapping and currency conversion checks, a duplicate and missing record report, and error recovery and resync test results.
What ERP and accounting integration testing covers
A sync defect copies itself into the customer's general ledger. An accountant finds it at month-end close or an auditor finds it later, and the product vendor has to explain the difference. We test the connection between a finance product and the ledger it writes to. Ledger math inside accounting software is covered on the accounting software segment page, and payment runs on the AP/AR segment page.
Integration types in scope: cloud accounting REST APIs with OAuth 2.0 apps, ERP web services, flat file journal imports over SFTP, and integration platforms that sit between the product and the ERP.
Sync scenarios per connected system
Each connected system gets its own suite, because two ERPs reject the same bill for different reasons. The suite covers every record type the product writes or reads: vendors, customers, employees, chart of accounts, tax codes, bills, invoices, credit notes, journal entries, payments, and refunds. Each record type runs through create, update, void, and delete, and each run reads the record back from the ERP.
Failure patterns the suite targets:
- Void that never leaves the product. A card transaction is refunded or an expense report is rejected after export, and the ERP keeps the original entry. Expenses stay overstated, and a reimbursement bill left in the ERP can be paid in the next AP run.
- Posting into a closed period. The ERP rejects an entry dated in a locked month. The connector drops the entry, retries it forever, or reposts it with today's date without a record of the change.
- Multi-entity and dimension mapping. An entry posts to the wrong subsidiary or loses its department or cost centre, and the entity's trial balance stops matching the product.
Field mapping and currency conversion
Checks compare every synced field with the agreed mapping.
- Minor units. The ISO 4217 list one, published by SIX on 1 January 2026, gives JPY 0 decimal places and BHD, IQD, JOD, KWD, LYD, OMR, and TND 3 decimal places. A connector that multiplies every amount by 100 posts a 5,000 JPY expense as 500,000 JPY. A connector that keeps two decimals posts a 12.345 KWD card transaction as 12.35 KWD or 12.34 KWD.
- Exchange rate and date. The product can send the functional currency amount, or the ERP can convert at its own rate on the posting date. Checks cover both configurations and the exchange difference account. The FX rate application guide shows the rate and date cases.
- Tax line rounding. Five invoice lines of 0.35 EUR net at 21% VAT give 0.35 EUR of VAT when rounded half up per line, and 0.37 EUR when rounded half up on the 1.75 EUR document total. An ERP that recomputes tax from the tax code rejects the bill or posts the 0.02 EUR difference to a rounding account. The rounding guide lists the rounding modes to test.
- Archived targets. An account, tax code, or vendor archived in the ERP after the mapping was set makes every later entry fail.
Duplicate and missing records
- Duplicate after a timeout. The ERP commits a bill, the response is lost, and the connector creates the bill again. When the ERP pays suppliers, the supplier is paid twice. Tests cut the connection after commit and check that the connector uses an external identifier or looks up the record before it creates one. The idempotency guide shows the request sequences.
- Record skipped by an incremental sync. A sync reads records modified after the last run's timestamp. Records updated in the same second as that timestamp, during pagination, or in another time zone are skipped. Tests write records at those boundaries and count them in both systems.
Error recovery and resync
- Rate limits. RFC 6585 section 4 defines 429 Too Many Requests, and the response MAY include a Retry-After header. Tests check that the connector waits and resumes without skipping a page of records.
- Revoked tokens. Where an accounting system rotates refresh tokens, RFC 9700 section 4.14.2 describes the mechanism: the previous refresh token is invalidated, and when an invalidated token is presented the authorization server revokes the active refresh token. Two sync workers that refresh at the same time can lose the connection. Tests check that the sync stops, alerts the customer, and resumes from the last posted record after reconnection.
- Partial batch failure. One rejected line in a batch of journal entries must not post the rest as an unbalanced entry.
- Resync after a mapping fix. Only failed records post again, and each posts once.
Processing integrity criteria PI1.2 to PI1.5 on the SOC 2 page ask for complete and accurate inputs, processing, and outputs, and these test results are input to that examination.
Related
Segments
Standards
Deliverables
Sync scenario suite per connected system
An automated suite for each connected ERP or accounting system that creates, updates, voids, and deletes every synced record type and compares the record in both systems, for engineering leads.
Field mapping and currency conversion checks
Automated checks that compare each synced account, tax code, dimension, currency, minor unit, and exchange rate with the agreed field mapping and list every mismatch, for engineering leads and finance teams.
Duplicate and missing record report
A report per connected system and record type that lists each record posted twice or absent in the ERP, with its identifier, amount, currency, and period, for finance teams and auditors.
Error recovery and resync test results
Test results for timeouts, rate limits, revoked tokens, closed periods, and rejected records that show whether each failed record posts exactly once after recovery, for engineering leads.
How ERP integration tests fit your release process
Pull requests. Mapping checks run in CI against recorded ERP responses. A change to a field mapping, rounding rule, or currency table fails the build when a mapped value differs from the agreed mapping.
Nightly, against ERP sandboxes. The sync scenario suite for each connected system runs against a sandbox or test company in that system. Sandboxes keep state and apply rate limits, so each run creates its own synthetic entity, resets it afterwards, and stays under the published request limit. A failed run names the connected system, the record type, and the field that differed.
Before a connector release. Error recovery tests need a fault-injecting proxy that drops responses after the ERP commits, returns 429, and revokes tokens. They run in staging before each connector release and before you move to a new ERP API version.
After release. A smoke run on a test company creates a bill, voids it, and confirms both states in the ERP. The same run checks that the connection token refreshes and that no entry from the smoke run stays open.
Test data. Tests use synthetic vendors, employees, and transactions. Payroll and expense exports copied from production contain personal data and account data, so they are masked before any replay.
Handover. The suites live in your repository and run without us. The duplicate and missing record report can run as a scheduled job against production after go-live. CI run logs linked to change tickets serve as test records for SOC 2 criterion CC8.1. Your team owns the sandbox credentials, the ERP test company licences, the field mapping decisions, and the list of supported ERP API versions.
Sample deliverable
Sample, synthetic data
| Connector | Happy path | Timeout and retry | Expired consent or token | Duplicate, out-of-order, or offline delivery | Coverage status and open defect |
|---|---|---|---|---|---|
| Bank connector 01 (Berlin Group NextGenPSD2) | Covered, 9 of 9 cases passed: POST /v1/consents reaches consentStatus valid after SCA, and the accounts, balances, and transactions calls return 200 for that consent | Covered, 6 of 6 cases passed: a timed-out transactions call is retried with a new X-Request-ID, and a 429 ACCESS_EXCEEDED response stops refreshes for that consent until the next day | Failed, 4 of 5 cases passed: after a 401 CONSENT_EXPIRED response, the connector keeps scheduling refreshes and shows a stale balance of 1,240.00 XTS as current | Covered, 5 of 5 cases passed: a pending transaction that returns with bookingStatus booked and a new transactionId replaces the pending entry, and overlapping dateFrom windows import no duplicates | Failed, retest scheduled after the INT-0203 fix. INT-0203 (medium): the bank connector does not set reconnect required after a 401 CONSENT_EXPIRED response |
| Bank feed 03 (OFX) | Covered, 7 of 7 cases passed: a STMTRQ for a checking account returns STMTRS with SONRS STATUS code 0, and each STMTTRN posts once to the ledger bank account | Covered, 4 of 4 cases passed: a statement request retried after a timeout reuses its TRNUID, and status 2019 Duplicate request is handled as already processed | Covered, 3 of 3 cases passed: SONRS status 15500 Signon invalid stops the bank feed and asks the user to reconnect, with no empty statement imported | Failed, 5 of 6 cases passed: overlapping DTSTART and DTEND windows repeat FITID values, and one repeated FITID with a changed TRNAMT imports as a second transaction | Failed, retest scheduled after the INT-0221 fix. INT-0221 (medium): a repeated FITID with a changed TRNAMT of 18.75 XTS imports as a second bank transaction |
| Card terminal SDK (offline mode) | Covered, 12 of 12 cases passed: online EMV contact and contactless sales return tag 8A value 00, and each approved sale posts one capture | Covered, 6 of 6 cases passed: an authorisation request with no host response before the timeout sends a reversal before the sale is retried | Covered, 4 of 4 cases passed: a terminal session token that expires while the terminal is offline is refreshed before the store-and-forward upload starts | Failed, 10 of 11 cases passed: offline sales under the terminal floor limit (tag 9F1B) complete with tag 8A value Y3, and one retried store-and-forward upload posts two captures | Blocked for release until the INT-0214 fix passes retest. INT-0214 (high): a store-and-forward upload retried after a lost acknowledgement captures one 42.50 XTS sale twice |
| Broker API A (FIX 4.4) | Covered, 10 of 10 cases passed: Logon (35=A) succeeds, and each ExecutionReport (35=8) with ExecType (150) F updates the imported position once | Covered, 5 of 5 cases passed: no inbound message within HeartBtInt (108) triggers a TestRequest (35=1), and a reconnect resumes at the next expected MsgSeqNum (34) | Covered, 3 of 3 cases passed: a Logon with an expired Password (554) is answered with Logout (35=5) and Text (58), and the broker link shows as disconnected with positions kept | Covered, 8 of 8 cases passed: a MsgSeqNum (34) gap triggers ResendRequest (35=2), and a resent ExecutionReport with PossDupFlag (43) Y and a known ExecID (17) is not counted as a second fill | Covered, with no open defects on Broker API A |
| Payout partner B (ISO 20022 pacs.008) | Covered, 8 of 8 cases passed: a pacs.008.001.08 credit transfer with a UETR returns pacs.002 TxSts ACSP and then ACSC, and the payout is marked settled once | Failed, 5 of 6 cases passed: a timed-out pacs.008 submission is followed by a pacs.028 status request, but one retry is sent as a new pacs.008 with a new UETR | Covered, 4 of 4 cases passed: a payout submitted with an expired API access token returns 401, and the token is refreshed before one resubmission with the same UETR | Covered, 6 of 6 cases passed: a pacs.002 TxSts RJCT after ACSP releases the payout hold once, and a repeated pacs.002 for the same UETR changes no balance | Blocked for release until the INT-0230 fix passes retest. INT-0230 (high): a pacs.008 retried after a timeout carries a new UETR and pays 250.00 XTS twice to one beneficiary |
Amounts use XTS, the ISO 4217 code reserved for testing. Connectors, banks, and partners are generic sandbox endpoints, and terminal sales use scheme test cards masked to BIN and last four.
Questions
What is ERP testing?
What are the main types of ERP testing?
How to test an ERP system?
Scope your ERP integration testing
Send your connected systems, synced record types, and field mapping, and we return a test scope per connected system.
Scope your testing