Guide
How to reconcile approved refunds with Shopify Payments transactions
Refund approvals live in a helpdesk, a returns app or a spreadsheet; the money moves in Shopify Payments. Most months they agree. The cases that cost money are a refund issued twice, a partial refund that never followed, or a refund nobody approved. This is the method behind RefundMatch.
1. One store, one month, an approval cohort
Reconcile one Shopify store at a time, one reporting month at a time. The month is the month the refunds were approved: the October report answers “did every refund we approved in October happen, once and in full?” An order belongs to October when one of its approvals is dated in October. Its comparison then uses every approval and every refund for that order in your files, whatever their dates, so an earlier partial refund is not mistaken for an extra one.
2. Export the approved refunds
One row per approval: order, approved_date (YYYY-MM-DD) and amount; approval_id, currency and reason are used when present. Two partial approvals for the same order are two rows. Start from the approved refunds template. Include the previous month’s approvals too if orders were refunded in parts across months.
3. Export Shopify Payments transactions
Export the Shopify Payments transactions for a date range that covers the orders being reconciled and runs through your reporting cutoff. Include late refunds and any earlier transactions for those orders. The export’s own headers are read as they are: Transaction Date, Type, Order, Card Brand, Card Source, Payout Status, Payout Date, Available On, Amount, Fee, Net, and Currency when present. If your data comes from somewhere else, use the normalized transactions template, which also accepts an optional transaction_id.
4. Keep refunds only and match by order
- Type decides what a row is. Only rows whose Type is
refundare refunds. Charges, adjustments, chargebacks and payouts are not counted. A type that mentions refunds but is not a refund (for example a failed refund) makes the order “invalid or ambiguous” so a person looks at it. - Payout status is not refund status. Payout Status, Payout Date and Available On describe when Shopify pays out a balance. A refund on a pending payout has still been refunded; a paid payout says nothing about whether the refund was approved.
- The key is the order plus the currency. The Order value is trimmed and a leading
#is removed, so#1001and1001match. Nothing else is changed. An order with rows in two currencies is matched once per currency. - Refund amounts are magnitudes. Shopify exports refunds as negative amounts (
-85.00); they are compared with the approved85.00.
5. Partial refunds, equal amounts and IDs
All approvals of one order and currency are added up, and so are all its refund rows, in exact cents. $25.00 + $15.00 approved against $25.00 + $15.00 refunded is a match; every row stays visible.
- Equal amounts
- Two refund rows of $85.00 for an order approved once at $85.00 are $170.00 refunded: $85.00 more than approved. Without a transaction ID, two equal rows are two refunds. RefundMatch points them out so you can check them in Shopify.
- Repeated explicit IDs
- When your CSV has an ID column, the same ID twice with identical content is one transaction, counted once. The same ID with different content is ambiguous: every occurrence is left out of the confirmed totals and the order is marked for review.
6. The settlement and report cutoff
A refund approved on October 30 may be issued on November 4. It belongs to the October report, because the cohort is the approval month, but it only appears in a transactions export that reaches November. Payouts and settlement come later again and do not change whether a refund was made. So:
- Export transactions through at least two weeks after the month ends before treating “No refund found” as final.
- RefundMatch shows the date range the transactions file covers and warns when it ends before, or only a few days after, an approval.
- Refunds dated after the month are normal for late approvals and are counted.
7. Reading the results
- Matched: refund rows add up exactly to the approved total.
- No refund found / Refunded less than approved: approved money with no or too little refund in the file. Check the cutoff first, then whether the refund was issued outside Shopify Payments.
- Refunded more than approved: look for repeated refunds and for approvals missing from the file.
- No approval found: a refund in the month for an order with no approval in the file.
- Invalid or ambiguous: fix the row or the export and match again.
Every result is a statement about the two files, not proof: a refund made by another payment method, an approval recorded elsewhere or an export with the wrong date range all look like differences.
8. Month-end checklist
- Approvals file covers the month (and earlier months for orders refunded in parts)
- Transactions export starts with the month and ends at least two weeks after it
- Every “Refunded more than approved” is explained or recovered
- Every “No refund found” is refunded, or re-checked after the cutoff
- Every “No approval found” has an approval traced or is escalated
- Invalid or ambiguous rows are corrected and matched again
Match your refunds Try the demo
RefundMatch compares the files you give it. It does not connect to your store, cannot see refunds made outside the transactions file and never decides whether a refund should have been approved.