ml-connector
Wave AccountingShopify

Wave Accounting and Shopify integration

Wave Accounting handles your books. Shopify handles your store. Connecting them keeps your AR ledger in sync with your actual sales and payments. Shopify orders automatically become Wave invoices, mapped to the right customer, and payment confirmations from Shopify post as revenue transactions in Wave without manual re-entry. ml-connector handles the OAuth flows on both sides and manages the webhook handshake so every sale reaches your ledger on schedule.

How Wave Accounting works

Wave Accounting is a cloud accounting platform accessed via GraphQL at a single POST endpoint (https://gql.waveapps.com/graphql/public). Authentication uses OAuth 2.0 Authorization Code flow with 2-hour access tokens and refresh tokens (offline_access scope required). Wave exposes business records, customers, invoices, products, accounts, transactions, and vendors. The connected business must maintain a Wave Pro subscription. Wave supports webhooks for invoice lifecycle events (created, updated, paid), payment creation, customer lifecycle, transaction creation, and product changes. Webhook deliveries require HTTP 200 acknowledgment; Wave retries on 500. Bills and purchase orders are not exposed through the GraphQL API, and payroll is not accessible.

How Shopify works

Shopify is an e-commerce platform accessed via GraphQL Admin API at https://{shop}.myshopify.com/admin/api/2026-04/graphql.json. Authentication uses OAuth 2.0 Authorization Code grant, issuing offline tokens (long-lived, prefix shpat_) and online tokens (session-scoped, prefix shpua_). Shopify exposes orders, customers, transactions, products, refunds, disputes, and draft orders. Finance-relevant webhooks include orders/create, orders/updated, orders/paid, orders/cancelled, customers/create, customers/update, and disputes/create. Shopify deduplicates webhooks via X-Shopify-Webhook-Id header. Shopify has no native purchase order or vendor entity; vendor is a product string attribute only. The General Ledger and AP/AR systems are not exposed via API.

What moves between them

Data flows bidirectionally. Shopify order and customer events arrive via webhook; ml-connector maps each order to a Wave customer (creating if new) and creates a Wave invoice dated the order date, with line items tied to Wave products. Shopify payment confirmations (order.paid events) trigger Wave payment records against the matching invoice. Wave transactions created outside this flow (manual adjustments, refunds) are read and synced back to Shopify order metadata for reconciliation. The sync runs in near real time when webhooks are active; Wave transactions are polled on a schedule for completeness.

How ml-connector handles it

ml-connector stores Wave refresh tokens encrypted and uses them to refresh access before expiry. Shopify offline tokens (which do not expire) are also encrypted at rest. Both systems use GraphQL; ml-connector translates Shopify order line items into Wave line items with amount, description, and product reference. Shopify customer names map to Wave customers by email (exact match) or are created as new customers. Wave invoices are generated in draft status and posted when Shopify marks the order as paid. Shopify webhook signatures are verified using HMAC-SHA256 against the x-shopify-webhook-id header. Wave webhook signatures use HMAC-SHA256 against the x-wave-signature header with a 5 minute replay window. The main challenge is Wave's lack of an update operation on invoices once created; changes to a Shopify order after Wave invoice creation result in a refund + new invoice pattern or manual adjustment in Wave. Every transaction carries a full audit trail, allowing replay if either system becomes temporarily unavailable.

A real-world example

A small online retailer sells furniture and decor via Shopify and uses Wave Accounting for invoicing and AR. Before the integration, the owner manually exported daily orders from Shopify, created invoices in Wave, and matched payment confirmations by hand. Month-end reconciliation required hunting for orders paid in Shopify but not yet invoiced in Wave, leading to discrepancies and delayed closing. With Shopify and Wave connected, each order automatically becomes a Wave invoice the moment it ships, payment confirmations post as revenue, and the AR aging report reflects actual cash collected. The owner now spends no time on data entry and closes books two days faster.

What you can do

  • Map Shopify orders to Wave Accounting invoices automatically, with line items, amounts, and customer details.
  • Create Wave customer records from Shopify customers on first order, maintaining a single source of truth for AR.
  • Post Shopify payment confirmations as Wave payment records against the matching invoice.
  • Authenticate both Wave and Shopify with OAuth 2.0, store tokens encrypted, and refresh before expiry.
  • Verify webhook signatures on both sides and provide a full audit trail of every synced transaction for reconciliation.

Questions

What happens if a Shopify order is changed after the Wave invoice is created?
Wave Accounting does not support updating an invoice after creation. ml-connector detects the change, creates a reversal/credit memo in Wave and generates a new invoice for the updated amount. Both invoices remain in the audit trail so the reconciliation is complete.
Does ml-connector handle refunds from Shopify into Wave?
Yes. When Shopify records a refund (full or partial), ml-connector creates a corresponding credit memo or negative transaction in Wave, mapped to the original invoice. The refund is tracked in the audit log for reconciliation.
How often are Shopify orders synced to Wave if webhooks fail?
Shopify order and customer events arrive via webhook in near real time. If a webhook delivery fails (Shopify returns a non-200 response), Shopify retries up to 19 times over 48 hours. ml-connector also polls Shopify orders on a configurable schedule (e.g., hourly) as a backstop, so no order is ever permanently missed.

Related integrations

Connect Wave Accounting and Shopify

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

Get started