ml-connector
AcumaticaGoCardless

Acumatica and GoCardless integration

Acumatica runs finance and AR. GoCardless collects payments directly from customer bank accounts. Connecting the two turns open Acumatica AR invoices into bank debit collections without manual entry, and brings the resulting payments and payouts back into the ledger. ml-connector creates GoCardless payments from Acumatica invoices against each customer's active mandate, then records confirmed collections as Acumatica AR payments. It also reconciles each GoCardless payout against the invoices it settled so the bank deposit matches the ledger.

How Acumatica works

Acumatica Cloud ERP exposes customers, sales invoices, AR payments, GL journal entries, vendors, and accounts through its Contract-Based REST API at a tenant-specific instance URL such as mycompany.acumatica.com. The endpoint path embeds the exact ERP version, for example 24.200.001, and a version mismatch returns HTTP 404. Authentication is OAuth 2.0 against the built-in OpenID Connect server, with a legacy cookie session as a fallback, and all field values in request and response bodies are wrapped in value objects. Acumatica can push record changes through its Push Notifications feature, but the reliable pattern is polling with a filter on LastModifiedDateTime.

How GoCardless works

GoCardless exposes customers, customer bank accounts, mandates, payments, subscriptions, payouts, refunds, and an events log through its REST Payments API at api.gocardless.com. Every request carries a Bearer access token plus the pinned GoCardless-Version header 2015-07-06, list endpoints use cursor pagination, and amounts are integers in the smallest currency unit such as pence or cents. A payment cannot be created without a pre-existing active mandate. GoCardless pushes state changes in real time through signed webhooks, batching up to 250 events per request and signing each delivery with HMAC-SHA256 in the Webhook-Signature header.

What moves between them

The outbound flow runs from Acumatica into GoCardless. ml-connector polls Acumatica for open AR sales invoices on customers that have an active GoCardless mandate and creates a matching GoCardless payment for each, using the invoice reference number to tie the two together. The inbound flow runs from GoCardless into Acumatica: payment confirmed, paid out, failed, and chargeback webhooks drive AR payment records and status updates in Acumatica, and each GoCardless payout is reconciled against its payout items so the deposited amount maps back to the settled invoices. Customer and mandate reference data is aligned so every payment points at a valid Acumatica customer and a valid GoCardless mandate.

How ml-connector handles it

ml-connector stores both credential sets encrypted, refreshes the Acumatica OAuth token when a call returns 401, and sends the GoCardless Bearer token and version header on every request. Because GoCardless requires an active mandate before any payment, the connector checks for one on the linked customer and skips invoices that have no mandate yet rather than failing the run. Acumatica invoice totals are decimal, so they are converted to the smallest currency unit before the GoCardless payment is created, and a per-invoice Idempotency-Key prevents a retried run from double-charging. Acumatica is polled on a filter over LastModifiedDateTime with a stored high-water mark, since its push notifications are not guaranteed, while GoCardless events arrive by webhook verified with HMAC-SHA256; a bad signature returns 401, never 200. Payments settle on a delay set by the bank scheme, so an invoice is not marked paid in Acumatica until the confirmed or paid_out event arrives, and each payout is split through its payout items so fees and refunds land on the right GL accounts. Both sides rate limit with HTTP 429, so the connector backs off with jitter and retries.

A real-world example

A subscription software vendor with about 80 staff bills several hundred UK and EU customers monthly from Acumatica Cloud ERP and collects by direct debit through GoCardless. Before the integration, an accounts clerk exported the open invoice list from Acumatica each cycle, keyed each collection into GoCardless by hand, then weeks later tried to match lumped bank payouts back to individual invoices in the ledger. With Acumatica and GoCardless connected, each open invoice becomes a GoCardless payment automatically against the customer's mandate, confirmed collections post back as AR payments, and every payout is broken down by payout item so the bank deposit reconciles to the invoices it covers. The manual keying and the month-end reconciliation guesswork are gone.

What you can do

  • Create GoCardless bank debit payments from open Acumatica AR invoices against each customer's active mandate.
  • Post confirmed and paid-out GoCardless collections back into Acumatica as AR payments via signed webhooks.
  • Reconcile each GoCardless payout against its payout items so the bank deposit matches the settled invoices.
  • Convert Acumatica decimal invoice totals into the smallest currency unit and dedupe with a per-invoice idempotency key.
  • Bridge Acumatica OAuth and its version-locked tenant URL to the GoCardless Bearer token and pinned version header.

Questions

Which direction does data move between Acumatica and GoCardless?
Both directions. Open AR invoices flow from Acumatica into GoCardless as bank debit payments, and confirmed collections plus payout reconciliation flow back from GoCardless into Acumatica as AR payments. Customer and mandate references are aligned on both sides so each payment points at a valid Acumatica customer and an active GoCardless mandate.
What happens if a customer has no GoCardless mandate yet?
GoCardless cannot create a payment without a pre-existing active mandate, so ml-connector checks for one on the linked customer before billing. Invoices for customers without an active mandate are skipped and reported rather than failing the whole run. Once the mandate becomes active, those invoices are picked up on the next sync.
How does the integration handle the delay between collection and payout?
Bank debit payments are not instant, so an Acumatica invoice is not marked paid until the GoCardless confirmed or paid_out webhook arrives. GoCardless bundles many payments into one payout, so ml-connector reads the payout items to split each deposit back into individual payments, fees, and refunds. That lets each line post to the correct Acumatica GL account so the payout reconciles to the ledger.

Related integrations

Connect Acumatica and GoCardless

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

Get started