ml-connector
AcumaticaGoogle Sheets

Acumatica and Google Sheets integration

Acumatica Cloud ERP holds finance and procurement records. Google Sheets is a shared spreadsheet that finance teams already live in. This connection keeps a Google Sheet in step with Acumatica so bills, purchase orders, vendors, and GL accounts appear as rows people can read and edit. Approved edits made in the sheet flow back into Acumatica where the API permits writes. ml-connector handles the very different APIs on each side and moves the data on a schedule you control.

How Acumatica works

Acumatica Cloud ERP exposes vendors, AP bills, purchase orders, payments, GL accounts, and journal transactions through its Contract-Based REST API. The endpoint URL is version-locked to the customer's ERP release, so a mismatched version returns 404, and every field value in the JSON body is wrapped in a value object. Authentication is OAuth 2.0 through the OpenID Connect identity server built into each instance, with a legacy cookie session as a fallback. Acumatica can push record changes through its Push Notifications feature secured by a shared-secret header, but the common and most reliable pattern is polling with a filter on LastModifiedDateTime using top and skip offset paging.

How Google Sheets works

Google Sheets exposes data through the Sheets API v4, a REST interface over HTTPS authorized with OAuth 2.0 or a service account. It has no native ERP entities, so the connector treats each named tab as a table and reads header row one to learn the column layout. Values come back as a two dimensional array of strings, and a single range read returns all rows with no pagination, so the range is bounded in A1 notation. Append writes are not idempotent, meaning a repeated run adds duplicate rows unless a cursor is tracked. Google Sheets has no native webhook, though Drive watch channels can signal changes for up to 24 hours before they must be re-registered.

What moves between them

The main flow runs from Acumatica into Google Sheets. On each scheduled run, ml-connector reads new and changed Acumatica bills, purchase orders, vendors, payments, and GL accounts using the LastModifiedDateTime filter, then writes each record as a row into its matching sheet tab such as Invoices, PurchaseOrders, or Vendors. Edits a user makes in the sheet, such as a corrected vendor address or a coded bill line, are read back and applied to Acumatica through PUT upsert where the entity allows writes. Reference tabs like GLAccounts and Vendors are kept aligned so any coding entered in the sheet references values that exist in Acumatica. The chart of accounts is treated as read-only in the export direction to avoid risky writes.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the Acumatica client ID, secret, and instance URL with its exact endpoint version, and the Google OAuth client ID, secret, and refresh token for the target spreadsheet ID. It exchanges the Google refresh token for an access token and refreshes the Acumatica bearer token when a call returns 401, and it pins the version-locked Acumatica path so a release upgrade does not silently 404. Because neither side offers a dependable push for this pair, it polls Acumatica on your schedule and writes to Sheets with batch update calls, which count as one request against the per-project quota. Each Acumatica field is mapped to a header column discovered from row one, and Acumatica's wrapped value objects are unwrapped into plain cells. A synced-row cursor is kept per tab so the non-idempotent Sheets append never writes the same bill twice. On the read-back path, sheet edits are matched to Acumatica records by natural key and applied through upsert. Rate limit responses, HTTP 429 on both Acumatica and Google, trigger backoff with jitter, and every record carries a full audit trail and can be replayed if a write fails.

A real-world example

A regional construction firm of about 250 staff runs Acumatica for projects, procurement, and accounts payable, but its project managers track committed costs and pending vendor bills in shared Google Sheets because they are faster to open in the field. Before the integration, an accounting clerk exported bill and purchase order lists from Acumatica every few days and pasted them into the managers' sheets, and coding the managers typed back in never made it into the ERP without a second round of manual entry. With Acumatica and Google Sheets connected, each tab refreshes automatically from Acumatica on a schedule, and a manager's vendor or coding edits flow back into the ERP through upsert. The clerk stops copying and pasting, and the project sheets and the ledger stop drifting apart.

What you can do

  • Write Acumatica bills, purchase orders, vendors, payments, and GL accounts into matching Google Sheets tabs on a schedule.
  • Read approved edits from the sheet and apply them to Acumatica through PUT upsert where the entity allows writes.
  • Bridge Acumatica OAuth identity-server login and the Google OAuth refresh-token flow, both stored encrypted.
  • Map each Acumatica field to a Sheets header column and unwrap Acumatica value objects into plain cells.
  • Track a per-tab synced-row cursor so the non-idempotent Sheets append never duplicates a record.

Questions

Which direction does data move between Acumatica and Google Sheets?
The main flow is Acumatica into Google Sheets. Bills, purchase orders, vendors, payments, and GL accounts are written as rows into their matching tabs, and edits made in the sheet are read back into Acumatica through upsert where writes are allowed. The Acumatica chart of accounts is treated as read-only on export to avoid risky changes to the ledger structure.
How does the integration avoid duplicate rows in the spreadsheet?
The Sheets API append operation is not idempotent, so re-running a sync would otherwise add the same record twice. ml-connector keeps a synced-row cursor per tab and matches each Acumatica record by its natural key before writing. New records are appended and existing ones are updated in place rather than duplicated.
Does this pair use webhooks or polling?
It uses polling. Google Sheets has no native webhook, and its Drive watch channels expire within 24 hours and must be re-registered, while Acumatica push notifications are optional and not guaranteed. ml-connector reads changed Acumatica records on the schedule you set using the LastModifiedDateTime filter and writes them to Sheets in batched calls.

Related integrations

Connect Acumatica and Google Sheets

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

Get started