ERP connector operations and erpLinks mapping
This memo summarizes what teams configure outside code (platform secrets, admin forms) and how each Ninon entity maps to an ERP identifier. Sync issues surface in Observability logs with source “erp-sync”.
General
The default GL extraction lookback (commonly 90 days) is set in deployment configuration. Each group entity has a JSON object erpLinks keyed by provider (dynamics365bc, xero, netsuite, sap_business_one, sap_s4hana, sage_intacct). Values filter API responses so lines land on the right entity — required for multi-branch setups before relying on sync.
Xero
Product OAuth PKCE: after consent, if multiple Xero organisations are connected you must pick the tenant in the Integrations screen (list loaded from Xero after authorisation). Optional per-entity alignment via erpLinks.xero. Ensure your Xero app scopes include accounting settings and transactions (journals).
NetSuite
Two paths: scripted token registration (integration API) or browser OAuth with a realm (account ID / SuiteTalk subdomain) entered before redirect. Register Ninon’s redirect URL on the NetSuite integration. Host-level OAuth credentials power token refresh; optional scope overrides are documented for operators. SuiteQL filters by subsidiary via erpLinks.netsuite internal id.
SAP Business One
Service Layer URL …/b1s/v1, database and user stored encrypted. Multiple branches: erpLinks.sap_business_one = BPLID (or field returned on lines). Advanced optional journalEntryCollection when your OData collection name differs (default JournalEntries). Optional verbose diagnostics for skipped lines can be enabled in deployment configuration.
SAP S/4HANA
Published OData service root plus either a pasted Bearer (manual) or OAuth client_credentials (tokenUrl, clientId, clientSecret, optional scope) with automatic refresh before expiry. erpLinks.sap_s4hana = CompanyCode. Optional entitySetName and comma-separated preferredDateFields if your GL API differs. Optional OData path diagnostics (without secrets) can be enabled in deployment configuration.
Sage Intacct
Web-services sender/company/user credentials; erpLinks.sage_intacct = LOCATIONID when locations split entities. Sync automatically paginates via Intacct readMore whenever numremaining > 0 after GLENTRY readByQuery.