Why hasn't my customer received their refund even though Shopify shows it as completed a month ago?
A month-old refund that still has not shown up on a customer's card is almost always stuck on the bank's side, not Shopify's. Here is how to prove which one it is and get it resolved.
What's going on
A customer emails saying they returned an item, or you cancelled and refunded an order, weeks ago, and the money still has not shown up on their card or bank statement. You check Shopify admin and it shows the refund as issued. The customer checks their bank and sees nothing. Now you are stuck in the middle, fielding repeated follow-ups with no way to prove where the money actually is.
This is one of the more common post-sale support headaches for merchants using Shopify Payments or a similar gateway, because the refund lifecycle has several separate legs: Shopify issuing the refund, the card network and processor routing the funds, and the customer's bank posting the credit. A delay or silent failure at any one of these legs can look identical from the merchant's side, a refund that Shopify says is done but the customer insists never happened.
Why it happens
A Shopify Payments refund is a multi-hop process: Shopify releases the funds from its settlement account, the card network routes the credit back to the issuing bank, and only then does the customer's bank post it to their statement. Shopify's admin only has visibility into its own action, so once it shows a refund as issued, that reflects what Shopify did, not confirmation that the customer's bank has actually posted the funds.
Banks, especially for debit cards, prepaid cards, or non-US issuers, can take longer than the typical few-business-day window to match an incoming credit to the original purchase and post it. Sometimes it does not appear until the next full statement cycle, and sometimes it requires the customer to call their bank and have a representative manually locate it using a reference number from the transaction.
Less commonly, the refund attempt itself fails silently on Shopify's side, for example against a card that has since expired or been closed. This looks the same to the merchant as a healthy refund unless the specific transaction status is checked rather than just the order summary.
5 ways to fix it
Confirm in Shopify admin that the refund actually completed, not just that it was issued
Open the order and check the specific transaction status, not just the order summary. A Shopify Payments refund can be issued from Shopify's side within a few business days, but the card network and the customer's issuing bank can then take several more business days to post the credit, and it can occasionally stretch into the next full billing cycle, especially with debit cards, prepaid cards, or banks outside the US. Before you escalate anything, verify the refund shows as completed rather than pending or failed, and note the exact date it was issued.
Pull the refund's reference number from the order and give it to the customer
Once a refund has been processed by Shopify Payments, the order's transaction details sometimes include a reference or trace number, such as an Acquirer Reference Number, that banks use to locate an incoming credit. If one is present, give it to the customer and have them read it directly to their bank's phone support rather than only checking their banking app, since these numbers often only surface when a bank representative searches their internal systems rather than the customer-facing statement feed.
Have the customer escalate directly with their card-issuing bank
If Shopify shows the refund as completed and it has been well beyond the normal posting window, the delay is almost always on the bank's side, not the merchant's. The customer needs to contact their card issuer directly, provide the refund amount, the date it was issued, and any reference number you gave them, and ask the bank to manually locate and post the credit. Banks can often find a refund this way even when it has not automatically matched to the original purchase, and this step resolves most cases where a refund seems to have vanished.
If the bank still has no record, contact Shopify Support to trace the payout
When the refund has shown as completed in Shopify admin for well beyond the typical posting window and the customer's bank genuinely has no record of it, contact Shopify Support through the Help Center in admin and ask them to trace the transaction with the payment processor. This confirms whether the funds actually left Shopify's settlement account, which is the key fact you need before pushing the bank any further or considering other options.
If the refund actually failed, reissue it through an alternate method
Occasionally a refund fails silently, for example against a card that has since expired or been closed. If Shopify admin shows the refund as failed rather than completed, reissue it, either by retrying the original payment method if the processor allows it, or by refunding through an alternate method such as store credit, a gift card, or a manual transfer if the original card can no longer accept a credit. Always confirm the failure status first so you do not end up double-refunding a transaction that actually succeeded.
Bottom line
Most refunds that seem to vanish are stuck in a bank posting delay rather than a failure on Shopify's side, so the fastest path to resolution is to confirm the refund actually completed in Shopify admin, hand the customer any reference number on the transaction, and have them take that directly to their card issuer instead of waiting for a statement to update. This is fundamentally a support workflow problem, not something an app fixes, since no app can speed up how quickly a bank posts a credit. The real solution is a clear internal process for refund escalations: check status, grab any reference number, use a standard customer message, and escalate to Shopify support only when you are genuinely stuck.
Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.