Basis Ventures · Guides for Shopify B2B merchants

How to make an accounts receivable aging report in Shopify

The free spreadsheet method, why Shopify has no built-in one, and the three things the spreadsheet quietly gets wrong.

If you sell wholesale on net terms through Shopify, at some point you go looking for one number: how much are my customers behind, and by how long? You will not find a report for it in the admin. This guide shows you how to build that report yourself for free, and where the free method breaks down.

What an accounts receivable aging report actually is

An aging report groups every unpaid invoice by how overdue it is, into buckets:

The buckets are the point. "$18,000 outstanding" tells you almost nothing on its own. "$12,000 current, $6,000 over 90 days late" tells you that a third of what you are owed is at real risk of never arriving — and exactly who to call first.

Why Shopify has no built-in one

Shopify knows whether an order is paid or pending. What it does not do is age that unpaid balance against the net-30 or net-60 terms attached to the order. So the number you actually need — the sorted, bucketed picture of who owes you — is not a screen you can open. You have to assemble it. That is the honest reason you could not find it.

The free spreadsheet method, step by step

  1. In the admin, go to Orders, filter to Payment status: Pending (and Partially paid if you take deposits), and Export to CSV.
  2. Delete the rows that are already paid or are dead (abandoned or test orders). What is left is your real receivables list.
  3. Add a Due date column. For each order that is the order date plus its terms — for net 30, = order date + 30.
  4. Add a Days overdue column: = TODAY() - Due date.
  5. Add a Bucket column with one formula, for example:
    =IF(Days<=0,"Current",
       IF(Days<=30,"1-30",
       IF(Days<=60,"31-60",
       IF(Days<=90,"61-90","90+"))))
  6. Make a pivot table: rows = customer, columns = bucket, values = sum of the outstanding amount. Sort by the 90+ column, largest first. That is your aging report.

That is genuinely all it takes to get started, with no app and no cost.

The three things the spreadsheet quietly gets wrong

1. Draft-order invoices go missing

If you invoice a wholesale customer who is not set up as a B2B Company — you raise a draft order and send them the invoice — those orders are easy to leave out of the export filter, so they never make it into your aging report. They are often your oldest debts. Make sure your "unpaid" set includes orders created from draft orders, not just B2B Company orders.

2. Off-Shopify payments inflate the total

When a customer pays by bank transfer or cheque, the order in Shopify can still read "pending" forever. Until you reconcile those by hand, your total is overstated — and worse, you risk chasing someone who already paid you, which sours a wholesale relationship fast.

3. Orders with no agreed due date are not really "late"

If an order never had payment terms attached, you are inferring the due date, not reading it. It is more honest — and it collects better — to treat that as a gentle payment query ("is this one still open on your side?") than a past-due demand you cannot actually back up.

Turning the report into money collected

The report is only useful if it changes what you do on Monday morning:

Keeping it accurate

A spreadsheet is a snapshot. It is stale the moment the next order lands, so re-running it becomes a monthly (really, weekly) chore, and it is easy to double-count partially paid orders. That maintenance cost is the real reason most people eventually stop keeping the spreadsheet — and stop seeing who owes them.

Disclosure — this is my app. The spreadsheet method above got annoying enough to maintain that I built a small, read-only Shopify app that produces exactly this report automatically: Basis Receivables.

It reads your B2B companies, orders and payment terms and shows one aging report — current, 1-30, 31-60, 61-90 and 90+ days, per company, worst first — plus a statement of account per company you can print or Save as PDF, and, on the paid plans, a reminder drafted for each overdue invoice (you send it from your own mailbox). It also ages unpaid orders raised from draft orders, so wholesale customers who are not set up as B2B Companies are covered too. It is read-only — no write access, so it cannot change an order, a price or a customer — and it keeps no database: it stores no order or customer record. The free tier shows the full aging report for up to five companies and five unpaid invoices outside Companies; drafted reminders come with the paid plans.

See it on sample data — no install

Or find it on the Shopify App Store: Basis Receivables. Either way, the weekly aging habit above is the real fix.

Frequently asked questions

Does Shopify have an accounts receivable aging report?

No. Shopify records whether an order is paid or pending, but it does not age an unpaid balance against the net terms on the order, so there is no built-in aging report. You build it from an order export, or use an app that reads the same data.

How do I see which wholesale customers owe me money?

Export your Orders, keep the unpaid rows, and sort by how overdue each one is. Include unpaid orders raised from draft orders for customers who are not B2B Companies, or they are left out.

What are the aging buckets?

Current (not yet due), 1-30 days overdue, 31-60, 61-90, and 90 or more days overdue. Grouping by bucket shows not just how much you are owed but how much of it is at risk.

More guides