ml-connector
Wave AccountingAmazon Seller Central

Wave Accounting and Amazon Seller Central integration

Amazon Seller Central runs the storefront, the orders, and the payouts. Wave Accounting keeps the books. Connecting the two moves marketplace sales and the fees Amazon deducts into Wave so the ledger reflects what actually happened, without manual entry. Orders post as Wave invoices, and the financial events behind each Amazon settlement post as journal entries against the matching accounts. ml-connector handles the very different APIs on each side and reads the data on a schedule, because Amazon releases settlement figures only after a statement closes.

How Wave Accounting works

Wave Accounting exposes its accounting data through a single GraphQL endpoint at gql.waveapps.com, where reads are queries and writes are mutations. It authenticates with the OAuth2 authorization code flow, returning an access token that expires in about two hours plus a refresh token when offline_access is granted, and every call is scoped to a business id fetched right after authorization. Key entities are customers, invoices, products, chart of accounts, and money transactions, with invoiceCreate and moneyTransactionCreate as the relevant write paths. Wave also pushes signed webhooks for events like invoice.paid, and the connected business must hold an active Wave Pro subscription for third-party access.

How Amazon Seller Central works

Amazon Seller Central exposes data through the Selling Partner API, a REST surface over HTTPS with one GraphQL sub-surface for analytics. It authenticates with Login with Amazon using a seller refresh token that is exchanged for one-hour access tokens, and most calls require a marketplace id and a region that selects the base URL. The Orders API returns buyer orders, the Finances API returns financial events such as shipment charges, fees, and refunds, and the Reports API produces authoritative settlement reports through an async create-poll-download flow. Push notifications exist but only through AWS EventBridge or SQS, not plain HTTP webhooks, and there is no settlement notification type, so finance data is polled.

What moves between them

The flow runs from Amazon Seller Central into Wave Accounting. ml-connector reads Amazon orders and posts them into Wave as sales invoices, mapping the buyer to a Wave customer and each line item to a product and income account. After Amazon releases a settlement, it reads the financial events and the settlement report and posts them into Wave as money transactions, so seller fees, FBA charges, refunds, and the net disbursement land on the correct expense and clearing accounts. Reference data such as products and customers is created in Wave as new orders reference it. Wave is the system of record for the books, so nothing financial is written back into Amazon.

How ml-connector handles it

ml-connector stores both credential sets encrypted and runs two token paths in parallel: it exchanges the Amazon refresh token for a one-hour access token on the x-amz-access-token header, and it refreshes the Wave bearer token before its two-hour expiry rather than waiting for a 401. Because Amazon settlement data is async and has no push notification type, the connector polls the Finances API and the settlement report on a schedule rather than relying on events, and it follows Amazon NextToken pagination on reads and Wave page and pageSize pagination on writes. Each Amazon order maps to a Wave invoice, and each financial event maps to a money transaction whose externalId is set from the Amazon order id, which Wave uses as an idempotency key so a retried poll never creates a duplicate journal entry. GraphQL errors come back with HTTP 200, so the connector checks the errors array on every Wave write, not just the status code. Amazon throttles per operation with HTTP 429, so reads back off and retry, and orders older than two years are skipped because Amazon does not return them. Every record carries a full audit trail and can be replayed if a downstream write fails.

A real-world example

A direct-to-consumer brand with roughly thirty employees sells on Amazon through FBA and keeps its books in Wave Accounting on a Wave Pro plan. Before the integration, the bookkeeper downloaded the Amazon settlement report every two weeks and hand-entered one lump sum into Wave, which buried referral fees, FBA charges, and refunds inside a single line and made it impossible to see true margin per channel. With Wave Accounting and Amazon Seller Central connected, each order posts as a Wave invoice and every settlement is broken out into its own journal lines for fees, refunds, and the net payout against the right accounts. The owner sees real Amazon profitability in Wave, and the manual settlement re-keying is gone.

What you can do

  • Post Amazon Seller Central orders into Wave Accounting as sales invoices with line items mapped to products and income accounts.
  • Break each Amazon settlement into Wave money transactions so referral fees, FBA charges, refunds, and net payouts hit the correct accounts.
  • Bridge the Amazon Login with Amazon refresh-token grant and the Wave OAuth2 session, refreshing both tokens before they expire.
  • Poll the Amazon Finances and Reports APIs on a schedule, since settlement data is released only after a statement closes.
  • Dedupe every posting on the Amazon order id so retries never create duplicate invoices or journal entries.

Questions

Which direction does data move between Wave Accounting and Amazon Seller Central?
Data moves from Amazon Seller Central into Wave Accounting. Orders post as Wave invoices and settled financial events post as money transactions against the matching accounts. Wave is the system of record for the books, so ml-connector does not write financial entries back into Amazon.
Why does the integration poll Amazon instead of using webhooks?
Amazon Seller Central does not deliver plain HTTP webhooks; its push notifications go only through AWS EventBridge or SQS, and there is no notification type for settlement or invoice results. Financial settlement is also async and appears only after Amazon releases a statement. For those reasons ml-connector polls the Finances API and the settlement report on a schedule rather than waiting for an event.
How are duplicate postings prevented when a sync retries?
Wave's moneyTransactionCreate mutation accepts an externalId field that acts as a caller-supplied dedup key. ml-connector sets it from the Amazon order id, so re-reading the same order or financial event on a later poll updates rather than duplicates the entry. Amazon reads also follow NextToken pagination to avoid reprocessing pages.

Related integrations

Connect Wave Accounting and Amazon Seller Central

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

Get started