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.
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.
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.
= order date + 30.= TODAY() - Due date.=IF(Days<=0,"Current", IF(Days<=30,"1-30", IF(Days<=60,"31-60", IF(Days<=90,"61-90","90+"))))
That is genuinely all it takes to get started, with no app and no cost.
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.
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.
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.
The report is only useful if it changes what you do on Monday morning:
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.
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.
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.
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.