ml-connector
Wave AccountingAdobe Commerce

Wave Accounting and Adobe Commerce integration

Adobe Commerce runs the storefront and order pipeline. Wave Accounting keeps the books for a small business. Connecting the two means each completed sale, customer, and refund on the store lands in Wave without anyone re-typing it. ml-connector reads orders, invoices, customers, and credit memos from Adobe Commerce and records them in Wave as customers, invoices, and money transactions mapped to the correct income and tax accounts. It handles the very different APIs and auth on each side and moves the data on a schedule you control.

How Wave Accounting works

Wave Accounting is a cloud accounting product with a single GraphQL endpoint at gql.waveapps.com for all reads and writes. It authenticates with a 3-legged OAuth 2.0 authorization code flow, returns a bearer access token that expires in about two hours, and issues a refresh token when offline_access is requested. Every query and mutation is scoped to a businessId fetched right after authorization. It exposes customers, invoices, products, chart-of-accounts entries, money transactions, vendors, and sales taxes. Wave also pushes signed webhooks such as invoice.created, customer.created, and transaction.created, but invoices and customers have no patch mutation and there is no purchase order, bill, or payroll object.

How Adobe Commerce works

Adobe Commerce exposes orders, invoices, customers, products, companies, and refund credit memos through its REST Web APIs, with GraphQL available for read-heavy storefront queries. The PaaS edition signs requests with OAuth 1.0a integration credentials while the Cloud Service uses IMS OAuth 2.0 client credentials whose tokens last about 24 hours. List endpoints page through searchCriteria parameters and return a total_count for paging. Adobe Commerce supports synchronous outbound webhooks and async Adobe I/O Events, but it has no GL chart-of-accounts resource and no standalone payments resource, so payment detail is read from the order and invoice objects.

What moves between them

The flow runs from Adobe Commerce into Wave Accounting. ml-connector reads new storefront customers and writes them as Wave customers, reads the product catalog and creates matching Wave products, and turns completed Commerce orders and invoices into Wave invoices or money transactions posted to the correct income and tax accounts. Refund credit memos from Adobe Commerce post into Wave as offsetting money transactions. Reading runs on a schedule because Adobe Commerce webhooks are synchronous and block the storefront, so polling is the safer trigger. Wave is the accounting destination, so ml-connector does not write orders or catalog changes back into Adobe Commerce.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Adobe Commerce side it signs each REST call with OAuth 1.0a on PaaS or requests an IMS bearer token on the Cloud Service and refreshes it before the 24-hour expiry. On the Wave side it runs the authorization code flow once, stores the refresh token, fetches the businessId, and renews the two-hour access token proactively rather than waiting for a 401. Commerce records are read by paging through searchCriteria with a total_count check, because Commerce webhooks run synchronously and would stall checkout if used as the trigger. Commerce customers map to Wave customers by email, SKUs map to Wave products, and each order or invoice becomes a Wave invoice or a money transaction whose externalId is set to a stable id like erp-order-{increment_id} so a retry never creates a duplicate journal entry. Wave returns GraphQL errors with an HTTP 200, so ml-connector inspects the errors array on every response, backs off on rate limits, and keeps a full audit trail with replay on each record. The connected Wave business must hold an active Wave Pro subscription or the OAuth grant is refused.

A real-world example

A specialty home goods retailer with about 30 staff sells through an Adobe Commerce store and keeps its books in Wave Accounting. Before the integration, a bookkeeper exported the week's orders and refunds from Commerce and hand-entered sales totals, customers, and tax into Wave, which left the ledger days behind and produced mismatched customer records. With Adobe Commerce and Wave Accounting connected, each completed order posts into Wave as an invoice on the right income and tax accounts, new buyers become Wave customers automatically, and refunds post as offsetting transactions. The books stay current to the day and the manual export step is gone.

What you can do

  • Post completed Adobe Commerce orders and invoices into Wave Accounting as invoices or money transactions on the correct income and tax accounts.
  • Create and match Wave customers from Adobe Commerce storefront buyers, keyed on email.
  • Mirror the Adobe Commerce product catalog into Wave products so invoice lines reference real items.
  • Record Adobe Commerce refund credit memos in Wave as offsetting money transactions.
  • Bridge Adobe Commerce OAuth 1.0a or IMS tokens to Wave's bearer token and businessId, with proactive token refresh, retries, and a full audit trail.

Questions

Which direction does data move between Wave Accounting and Adobe Commerce?
Data moves from Adobe Commerce into Wave Accounting. Storefront customers, products, completed orders, invoices, and refund credit memos flow into Wave as customers, products, invoices, and money transactions. Wave is the accounting destination, so ml-connector does not push orders or catalog changes back into Adobe Commerce.
Does the integration use webhooks or polling?
It relies on scheduled polling of Adobe Commerce. Commerce outbound webhooks are synchronous and make the store wait for a response, so using them as a trigger can stall checkout. ml-connector pages through the Commerce REST endpoints on a schedule you set and uses each record id for dedup, while Wave's own webhooks remain available for accounting-side events.
What does it take to authorize the Wave Accounting side?
Wave uses a 3-legged OAuth 2.0 authorization code flow, so an account owner approves the app once, after which ml-connector stores the refresh token and renews the two-hour access token automatically. The connected business must hold an active Wave Pro subscription, since third-party API access is refused on the free tier. ml-connector also fetches the businessId right after authorization because every Wave query and mutation requires it.

Related integrations

Connect Wave Accounting and Adobe Commerce

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

Get started