Skip to content
SystemSyncer
Menu

Guide · Operations

How to Reconcile Shopify Payments Payouts in Your ERP

Why Shopify payouts never match your sales, and how to reconcile them in an ERP — clearing accounts, balance transactions, fees, refunds, and chargebacks.

Last reviewed:
Reading time
3 min read
Intermediate

Part 9 of 10: Shopify–ERP order-to-cash

Short answer

A Shopify Payments payout is a net bank transfer that bundles many charges, refunds, fees, chargebacks, and adjustments, so it will never match a day of sales. Reconcile it the way banks and processors expect — record customer payments into a clearing account, then, for each payout, read its balance transactions through the Admin GraphQL API, post one deposit that clears those payments, books fees and other movements to their own accounts, and lands the net amount in the bank. The clearing account should return to roughly zero after every payout; a growing balance is your alarm.

Data flow From customer payment to bank deposit
  1. Shopify order Customer pays
  2. Clearing account Payments wait here
  3. Payout deposit Fees
  4. Bank Net amount

“The Shopify deposit doesn’t match” is one of the most common complaints finance teams have about an ecommerce integration, and it’s almost never a bug in Shopify. Payouts are net amounts that bundle many movements, and books that only record gross sales will never tie out to the bank. This guide explains the accounting pattern and how to automate it. It’s integration guidance, not accounting advice — agree the account structure with your accountant. As on every page, documented marks statements from Shopify documentation, and recommendation marks our guidance.

What a payout actually contains

Documented: through the Admin GraphQL API, the Shopify Payments account exposes payouts — transfers between the Shopify Payments balance and your bank, each with a net amount, issue date, status, and a summary — and balance transactions, each recording a money movement such as a charge, refund, adjustment, or payout, with its gross amount, fee, and net, a type, and the payout it’s associated with. Reading this data requires the read_shopify_payments or read_shopify_payments_accounts access scope.

That means a single payout can contain:

Movement Effect on payout
Card charges from several days + gross amount, − processing fee
Refunds − refunded amount (fees may or may not be returned)
Chargebacks and dispute fees − disputed amount, − dispute fee
Won disputes + reversed amount
Adjustments and reserves + or −
Other gateways (PayPal, manual payments) Not included at all

The accounting pattern

Recommendation: three steps.

  1. At sale: post the payment to a Shopify Payments clearing account, not to the bank. (Other gateways get their own clearing accounts.)
  2. At payout: post one deposit per payout:
    • debit Bank for the payout net,
    • debit Merchant fees expense for processing fees,
    • debit or credit chargebacks, adjustments, and refunds to their own accounts as appropriate,
    • credit the clearing account for the gross payments the payout settles.
  3. Check: after each payout, the clearing account balance should return to roughly zero (plus payments not yet paid out). A growing balance is the signal that a payment, refund, or adjustment wasn’t posted.

Automating it with the Admin API

Recommendation: run a scheduled job (see scheduled synchronization) that:

  1. Lists payouts issued since the last checkpoint, with their status.
  2. For each payout that has reached its final status, fetches the balance transactions associated with it.
  3. Groups transactions by type and sums gross, fees, and net.
  4. Verifies that the sum of nets equals the payout’s net. If not, stop and alert — don’t post a partial deposit.
  5. Posts the deposit to the ERP with the payout ID as the external reference, so a rerun can’t post it twice.
query PayoutsSince($after: String) {
  shopifyPaymentsAccount {
    payouts(first: 20, after: $after) {
      nodes {
        id
        issuedAt
        status
        net { amount currencyCode }
      }
      pageInfo { hasNextPage endCursor }
    }
  }
}

Illustrative only. Filtering options, the balance transaction query arguments, and status values depend on your API version — check the Shopify Payments objects in the GraphQL Admin reference for the version you pin. Don’t assume every balance transaction is available the moment a payout appears: design the job to retry a payout whose transactions don’t add up yet, rather than failing permanently or posting a partial deposit.

Refunds and chargebacks

Recommendation:

  • Refunds have two sides: the sales/tax reversal in your books (posted when the refund happens — see refunds and cancellations) and the cash movement in the payout. Keep both linked through the order reference.
  • Chargebacks are their own events. Book the disputed amount and dispute fee when they hit the balance, and reverse them if the dispute is won. Don’t edit the original sale.

Multiple currencies and stores

Recommendation: reconcile per Shopify store and per payout currency, each with its own clearing account. If you sell in several currencies, decide with your accountant where currency conversion is recognized — at sale, at payout, or both — and record the exchange difference explicitly instead of letting it hide in the clearing balance.

Other channels

The same pattern works for marketplaces: Amazon and Walmart settlements net sales against their fees over a period, and you reconcile the settlement, not individual orders. See Amazon and Walmart marketplace integration. For accounting-system specifics, see Shopify + QuickBooks Online and Shopify + NetSuite.

Common pitfalls

  • Payments posted straight to the bank, so deposits never match.
  • Fees never recorded, overstating revenue and cash.
  • Posting a payout before all its balance transactions are available.
  • No external reference on the deposit, so a rerun posts it twice.
  • Ignoring other gateways, leaving PayPal or manual payments in the Shopify clearing account forever.

Frequently asked questions

Why doesn't my Shopify payout match my sales for the day?

Because a payout is a net transfer of everything that settled in a period — charges from several days, minus refunds, processing fees, chargebacks, and adjustments. It also excludes payments made through other gateways such as PayPal. Match the payout to its balance transactions, not to a day of orders.

What is a clearing account and why do I need one?

A clearing account (sometimes called an undeposited funds or Shopify clearing account) holds customer payments between the time of sale and the time the money reaches your bank. Each payout clears the payments it contains. If the account doesn't return to near zero after payouts, something wasn't posted.

Which Shopify API gives payout details?

The Admin GraphQL API exposes the Shopify Payments account, its payouts, and balance transactions. Each balance transaction has a type, gross amount, fee, and net, and is associated with the payout that settled it. Access requires the read_shopify_payments or read_shopify_payments_accounts scope.

How should chargebacks be recorded?

As their own movement — the disputed amount and any dispute fee — when they appear in balance transactions, not by editing the original sale. If the dispute is won and the funds are returned, that is another balance movement. Keep the order reference so finance can see the full history.

Should I post every order's payment or a daily summary?

Either works if the clearing account logic is right. High-volume D2C stores often post daily summaries of payments by gateway; B2B or low-volume stores may post per-order payments. What matters is that every payment that will appear in a payout is posted to the clearing account before the payout is reconciled.

Sources and further reading

Platform-specific statements on this page were checked against these sources on . Vendor APIs change; confirm details in the current documentation before you build.

  1. [1] ShopifyPaymentsAccount (GraphQL Admin API) — Shopify
  2. [2] ShopifyPaymentsPayout (GraphQL Admin API) — Shopify
  3. [3] ShopifyPaymentsBalanceTransaction (GraphQL Admin API) — Shopify