How to get all daily refunds via API

Topic summary

Goal: retrieve a daily list of refunds via API without iterating all orders.

Current workaround proposed: use Orders API with filters (financial_status=refunded and updated_at_min/updated_at_max). “updated_at” is the order’s last modification timestamp, not the refund time.

Reported issues:

  • Misses refunds when the order was updated later (e.g., comments/tags), so updated_at no longer matches the refund date.
  • Historical cases (refunds on old orders) are not captured by date filters reliably.
  • Example query with updated_at_min failed to return an order refunded on a different day than creation.
  • A user reports the approach no longer returns results on 2022-04 (financial_status=refunded).
  • Accurate accounting requires checking refund processedAt (refund timestamp), which isn’t directly queryable across refunds.

Suggested workarounds: consume refunds/create webhook and store refunds in an external database for date-range queries; manual reconciliation. Concerns raised about webhook reliability and lack of a robust fallback.

Shopify response: current behavior is expected; refunds must be fetched via their orders. Feedback has been passed to the product team; no commitments or timeline.

Status: unresolved/ongoing. Requests for a dedicated Refunds endpoint with date-range querying. Open questions about handling customer self-returns and API visibility post-approval.

Summarized with AI on December 19. AI used: gpt-5.

I really appreciate your answer but i want to add an example to discuss with your developers to demonstrate how mind-boggling this is.

This month there was a refund for an order that is already 4 years old. Could be any reason. Refunds can be made for any order. Now it’s the end of the month and I need to find out which refunds were done this month to export the outgoing payments (refunds) to the accounting software.

The store has ~50.000 orders every month, since 4 years, so we’re talking about 2.4 million orders in that time period, with a refund rate of 30% we’re at 720.000 refunds. And there are WAY bigger stores with WAY more orders existing out there.

Technically to find out (100% accurate) if any order was refunded this month I’d have to fetch all 720.000 orders (refunded oder partially_refunded), which already takes hours and then loop trough all of them and check if any order has a refund with “processedAt” date from this month. This is not doable so the only approach is to build a huge complex setup with another external database where refunds are stored to be fetched more effectively, triggered by refunds/create webhook. Correct me if i’m wrong and you have a more effective solution for that really common task.

But… This could be a simple call to your refunds api with a date range query. Voilà refunds from this month received within seconds. This is how we developers are used to work with apis.

Honestly, this is an absolute nightmare. People came up with this problem multiple times now and i just can’t believe that after such a long time there is still no solution for that.

Please get this fixed!

3 Likes