How-to
How to Read an Aging Report — and Build One from Shopify in 15 Minutes
An aging report is a list of who owes you money, sorted by how late they are — the one screen that answers "where's my cash?" for a store selling on Net 30. Shopify doesn't have that screen built in (checked 6 August 2026: orders show paid or pending individually, and there's no receivables report in analytics) — but everything the report needs sits in a plain orders export, and building one takes about 15 minutes. This guide shows the build, then the part that actually makes you money: how to read it.
What does an aging report look like?
One row per buyer, one column per lateness bucket. "Aging" is just how long an invoice has been sitting unpaid: still inside its terms is current, then 1–30 days late, 31–60, and over 60. Here's a store with four terms buyers (sample numbers):
| Company | Current | 1–30 late | 31–60 late | Over 60 | Total |
|---|---|---|---|---|---|
| Harbor Foods | $4,100 | — | — | — | $4,100 |
| Bloom & Co | $2,300 | $1,900 | — | — | $4,200 |
| Cedar Supply | — | $3,600 | $2,800 | — | $6,400 |
| Quarry Lane | — | — | — | $2,900 | $2,900 |
| Total: $17,600 | $6,400 | $5,500 | $2,800 | $2,900 |
Four rows, four different situations — we'll read them properly in a minute. First, the build.
How do you build one from Shopify in 15 minutes?
You need no app for this, just the admin and a spreadsheet. A real merchant asked the Shopify Community for exactly this — "I can't seem to find a way to create an accounts receivable aging report for invoiced orders" — and every answer was "buy a reporting app." You don't have to.
- Filter to unpaid orders. In Orders, filter Payment status to Payment pending. Terms orders live under that status from checkout until they're paid (once past due, they also wear an Overdue badge).
- Export them. Click Export and choose "orders matching your search." Shopify emails you a CSV for anything over 50 orders; small lists download straight away.
- Keep four columns. The export carries more than 60 columns (documented here); you need Billing Company, Outstanding Balance, Next payment due at, and Name (the order number, for chasing specifics later). Outstanding Balance — not Total — is the number that's still actually unpaid, so part-payments are already handled.
- Add a Bucket column. With the due date in column D, this formula
works in Google Sheets and Excel:
=IF(TODAY()<D2,"Current",IF(TODAY()-D2<=30,"1–30",IF(TODAY()-D2<=60,"31–60","Over 60")))
(If the due date imports as text with a time stuck to it, split off the time first — Data → Split text to columns on the space.) - Pivot it. Rows: Billing Company. Columns: Bucket. Values: sum of Outstanding Balance. That's the table above — your actual one.
Two things the export can't see: invoices you've only sent as draft orders (not completed into real orders yet), and anything you invoice outside Shopify. Add those lines by hand, or better, complete drafts into orders so the due date is on the record. Then put a 15-minute repeat in your calendar for every Monday — an aging report you built once and never rebuilt is just a souvenir. (If you'd rather the report maintain itself, this is the exact screen our app's free plan provides — but the spreadsheet version above is genuinely enough at small scale.)
How do you actually read it?
Start with two totals, then read the rows like stories:
- Total outstanding vs. your monthly terms sales. Selling $10,000/month on Net 30, roughly 1.5× that — $15,000 — outstanding is the natural level (this month's invoices plus stragglers). Our sample store carries $17,600: slightly heavy, and the excess is sitting in the late columns, which is the bad place for it.
- The over-60 share. My rule: under 5% of total outstanding. Money past 60 days hasn't just slowed down — it's started to be in doubt. Here it's $2,900 of $17,600, 16%. That number is the report shouting.
Now the rows:
- Harbor Foods — everything current. The buyer you want more of. No action.
- Bloom & Co — mostly current, a slice at 1–30. Normal life on net terms. The native reminder emails are doing their work here; let them.
- Cedar Supply — nothing current, everything late, sliding right. This is drift, and it's the pattern that costs real money later. Their newest invoice is already late and the older one is a bucket further along — payments have quietly stopped while orders kept coming. Cedar gets the firm email today and no new credit until the 31–60 money lands.
- Quarry Lane — one lump, over 60. Past email. This is a phone call, this week, and a credit hold until it clears.
One more habit: glance at concentration. Cedar and Quarry together hold 53% of this store's outstanding money. When half your float is in two names, those two names are a business risk, not a bookkeeping detail — you'd feel their bad quarter personally.
What action does each bucket trigger?
The report only earns its 15 minutes if each bucket maps to something you actually do. The mapping most wholesale suppliers converge on:
| Bucket | What it means | What you do |
|---|---|---|
| Current | All fine | Nothing. (A "due Friday" heads-up is the cheapest collections tool there is — Shopify can't send pre-due nudges, so it's manual or an app.) |
| 1–30 late | Normal friction | Let the five native reminders run; add your own firm-but-warm note at +14 if it's quiet. |
| 31–60 late | The money-saving window | Firm email the day they cross 31, phone call by +45, no new credit meanwhile. Chasing here is a nudge between partners; at +61 it's a confrontation. |
| Over 60 | In doubt | Personal call + statement + credit hold. Goal: a written payment plan with dates. |
Past 90 with silence, you're deciding between a payment plan, a collections agency, and writing it off as tuition — and updating one number: that buyer's credit limit, downward. Note where Shopify's own automation stops in all this: the built-in reminders max out at five emails and end 30 days past due (details and your options), which is exactly when the 31–60 column starts needing you.
When is the report overkill?
Under about five open terms invoices, skip the pivot table. Read the filtered orders list with your eyes, put each due date in your calendar, and spend the 15 minutes selling instead. The report starts paying for itself around invoice eight or ten — usually the same week you first forget one.
Common follow-up questions
Does Shopify have a built-in aging report?
No — as of August 2026 there’s no receivables or aging report anywhere in Shopify’s analytics. Orders show paid or pending one at a time. The report has to come from an orders export (this guide) or an app.
What’s the difference between an aging report and a statement?
The aging report is for you: every buyer, every open invoice, one screen. A statement is for one buyer: their open invoices and total, sent so their bookkeeper can schedule payment. You read the first, you send the second.
What if a buyer has part-paid an invoice?
Use the Outstanding Balance column from the export, not Total. It holds what’s actually still unpaid on each order, so partial payments are handled for you.
How often should I rebuild the report?
Weekly, same day and time — Monday morning works. Monthly is too slow: a buyer can go from current to 30 days late between two looks, and you’ll have missed the window where a nudge was enough.
Which buckets are standard?
Current, 1–30, 31–60, 61–90, and over 90 days late. On a small book you can merge everything past 60 into one bucket — the action ("call them, stop new credit") is the same either way.
If chasing invoices is the part you dread: TermsPilot sits on top of the native setup this guide covers — one aging dashboard, reminder emails that keep going until the invoice is paid, and per-company credit limits. The Free plan shows you who owes you what before you pay us anything.