FILTER Function for GL Audit and AR Aging: Multi-Condition Boolean Logic for Accountants

A pivot table can tell you your total receivables by ageing bucket as of the day you refreshed it. It can't tell you the moment a customer makes a partial payment, and it definitely can't flag the one invoice sitting in your GL that's been open 95 days but never made it into last month's ageing report because someone filtered the wrong date range.
FILTER solves both problems, because it doesn't summarise a static snapshot — it returns a live array that recalculates the second the underlying data changes. This guide builds a genuinely dynamic AR ageing report and a GL audit filter using FILTER's Boolean logic, then layers in an allowance calculation and an auto-ranked chase list on top.

ACA | FMVA® | 19 Years in Finance
Why Pivot Tables Aren't Enough for AR Aging
Pivot tables are aggregation tools. They're excellent at summing a static range into buckets, but they have three real limitations for the way accountants actually use ageing data day to day.
- They don't recalculate live. A pivot table needs a manual or scheduled refresh. If you're chasing a customer mid-morning and a payment posts at 11am, your pivot still shows the old balance until someone refreshes it.
- They can't easily return the underlying transaction list. A pivot gives you a total per bucket. To see which invoices make up that total, you're drilling down or rebuilding a separate report — extra steps every single month-end.
- They struggle with layered conditions. Filtering a pivot to "open invoices, over 60 days, excluding disputed accounts, for one specific entity" usually means stacking multiple filter panes and hoping nobody clears one by accident.
FILTER returns a live, spillable array based on however many conditions you combine, and because it's a formula, it recalculates the instant source data changes — no refresh button required. If you're reconciling balances between entities rather than customer receivables, the two-way matching approach in our XLOOKUP for intercompany reconciliation guide is the more direct fit.
FILTER Basics: The Boolean Logic Accountants Actually Need
The general FILTER function syntax is straightforward:
The part that actually matters for accounting use cases is what goes into include. This is where you combine multiple conditions using Excel's array-multiplication trick for AND, and array-addition for OR — and it's the part most generic tutorials skip entirely, because they're built around single-condition examples.
AND Logic with * — Filtering a GL for Unposted or Unusual Entries
To return only GL lines that meet every condition simultaneously, multiply the condition arrays together:
Each condition evaluates to an array of TRUE/FALSE, which Excel treats as 1/0 when multiplied. A row only survives if every condition returns 1 — this is genuine AND logic, and it scales to as many conditions as you need by adding more multiplied terms.
OR Logic with + — Catching Multiple Exception Conditions at Once
For a GL exception report where a line should be flagged if it meets any of several conditions, add the condition arrays instead of multiplying:
Any row with at least one TRUE condition returns a value greater than zero, which FILTER treats as included. This single line replaces what would otherwise be three separate manual filters or a nested IF formula three levels deep.

The Scenario: Building a Dynamic 30/60/90 Aging Report
To make this concrete, we'll build an ageing report for a fictional B2B receivables ledger — Meridian Group's open invoice population, spanning multiple customers across several account types. The ledger has one row per invoice: customer name, invoice date, due date, original amount, and amount received to date.
The goal is a report that automatically recalculates its ageing buckets and total exposure every time a payment is logged against an invoice, with no manual refresh step.
Step 1: FILTER the Open Invoice Population
Start by isolating only invoices that still carry a balance — this is the population everything else builds on:
This single condition does more work than it looks like. A fully paid invoice drops out of the array automatically the moment a payment brings the received amount up to the original amount — no separate "paid off" flag to maintain, no manual archiving step.
Step 2: Age Bucket Classification Inside the Array
With the open population isolated, calculate days outstanding and classify each invoice into a bucket using nested IFS logic inside a calculated column:
Because this recalculates against TODAY(), the bucket an invoice sits in shifts automatically day by day — an invoice doesn't need anyone to manually move it from "Current" to "31-60 Days" once it crosses the threshold.

Step 3: Layering an ECL Allowance Calculation
For IFRS 9 expected credit loss provisioning, extend the bucket classification with a provisioning rate per bucket, then multiply through the open population from Step 1, feeding into a summary table that applies your agreed provision rate matrix:
| Aging Bucket | Provision Rate | Basis |
|---|---|---|
| Current | 0.5% | Historical loss experience |
| 31–60 Days | 2% | Historical loss experience |
| 61–90 Days | 10% | Historical loss experience, adjusted for forward-looking factors |
| 90+ Days | 35% | Historical loss experience, adjusted for forward-looking factors |
The provision rates themselves are a judgement call agreed with your audit team, not something FILTER determines — but once the bucket classification is dynamic, the ECL calculation that sits on top of it stays current automatically rather than needing manual recalculation each month-end.
Step 4: FILTER + SORT — Building an Auto-Ranked Chase List
The most useful thing you can do with a dynamic ageing report is turn it into a prioritised chase list — the invoices most worth calling today, ranked automatically:
This combines FILTER (invoices over 60 days, excluding anything already flagged as disputed) with SORT (ranked by outstanding balance, largest first). The result is a live, self-updating list — collections staff open one sheet and always see the current highest-priority accounts at the top, with no manual sorting required after each payment posts.

Version Compatibility and the #CALC! Trap
FILTER requires Excel 365 or Excel 2021. On older versions, the formula returns a #NAME? error rather than a result. There's a second, less obvious issue worth flagging: if a FILTER formula's result array would spill into cells that already contain data, Excel returns a #SPILL! error rather than overwriting anything — which is a deliberate safeguard, but it means inserting a new column into a "protected" spill range downstream will break every report built on it. Leave clear blank space below and to the right of any FILTER formula before building on top of it.
Three Mistakes That Break FILTER-Based Reports
Using AND (*) where OR (+) is needed, or vice versa
This is the single most common error, and it fails silently — the formula still returns a result, just the wrong population. If your exception report looks emptier than expected, check whether you actually wanted "any of these conditions" instead of "all of these conditions."
Referencing a fixed range instead of a Table
=FILTER(A2:F500, ...) stops updating the moment row 501 gets added. Structured references to an Excel Table (InvoiceData[...]) expand automatically as rows are appended, which matters enormously for a ledger that grows every week.
Forgetting the if_empty argument
If your conditions ever return zero matching rows — a genuinely good outcome, meaning nothing is overdue — FILTER without an if_empty value throws a #CALC! error instead of showing an empty result. Always include a third argument, even if it's just "No matches."
When FILTER Isn't Enough
This approach handles a single-entity ledger comfortably into the tens of thousands of rows. Once you're consolidating ageing across multiple entities with different currencies, or pulling raw exports from several ERPs that need cleaning before any filter logic can run reliably, the transformation work belongs in Power Query ahead of the filtering layer — a decision we cover in a dedicated Power Query vs formulas comparison. For the general case of when to reach for SUMIFS instead, see our SUMIFS for financial analysis guide.
If you'd rather not rebuild the bucket logic, ECL matrix, and chase-list ranking from scratch every time, AR Intelligence Manager has this exact structure — dynamic ageing, IFRS 9 provisioning, and an auto-ranked chase list — already built into the workbook.
Frequently Asked Questions
Why does my FILTER formula return a #CALC! error?
This happens when your conditions return zero matching rows and you haven't supplied the optional if_empty argument. Add a third argument to the formula, even a simple text string like "No matches", so an empty result displays cleanly instead of throwing an error.
What's the difference between using * and + inside a FILTER condition?
Multiplying condition arrays together (*) creates AND logic — a row is only included if every condition is true. Adding condition arrays together (+) creates OR logic — a row is included if at least one condition is true. Using the wrong one is the most common FILTER mistake, and it fails silently rather than throwing an error, so always check whether your result population looks like what you'd expect.
Can FILTER replace a pivot table entirely for AR aging?
Not entirely — pivot tables remain useful for quick ad-hoc summarisation and cross-tabulation. But for a recurring, self-updating ageing report that recalculates the moment a payment posts, FILTER-based formulas outperform a pivot table, which requires a manual or scheduled refresh to reflect the same change.
Does FILTER work with data pulled from an external ERP export?
Yes, as long as the exported data is structured as an Excel Table, not a plain range, so the FILTER formula's reference expands automatically as new rows are appended. If the raw export needs significant cleaning first — inconsistent headers, merged cells, mixed data types — that cleanup is better handled in Power Query before FILTER runs on top of it.
How do I stop a #SPILL! error from breaking my FILTER-based report?
Leave clear blank space below and to the right of any FILTER formula so its result array has room to expand. A #SPILL! error means Excel found existing data blocking the array's expansion range — check for stray values, and consider placing FILTER formulas on their own dedicated calculation sheet rather than mixed in with other content.
Is this the same ageing logic used in AR Intelligence Manager?
The core structure — a dynamic open-invoice population, automatic bucket classification, an ECL provisioning matrix, and a ranked chase list — mirrors what AR Intelligence Manager runs natively, with cash flow forecasting and multi-currency handling layered on top.
Conclusion: From Static Snapshots to a Living Aging Report
A pivot table tells you where your receivables stood at the last refresh. FILTER, combined with Boolean AND/OR logic, SORT, and a bucket classification layer, gives you a report that's accurate the moment you open it — no refresh button, no manually rebuilt chase list, no invoice quietly ageing past 90 days without anyone noticing.
Your action plan:
- 1Convert your invoice ledger to an Excel Table if it isn't already — FILTER's structured references depend on it for automatic range expansion
- 2Replace static pivot ageing with a FILTER + IFS bucket formula that recalculates against TODAY() rather than a fixed refresh date
- 3Add the if_empty argument to every FILTER formula to avoid #CALC! errors when a filter genuinely returns zero rows
- 4Layer SORT on top of FILTER to turn your ageing report into a ranked, self-updating chase list
Once this is running, your ageing report stops being a month-end task and becomes something you can open any morning and trust.
Prefer This Running Automatically Every Month?
AR Intelligence Manager includes this ageing engine natively alongside automated ECL provisioning under IFRS 9, and a ranked chase list — no bucket formulas to rebuild by hand.
See AR Intelligence Manager
Prashant Panchal is a Chartered Accountant (ACA) and Financial Modelling & Valuation Analyst (FMVA®) with 19 years of experience in finance, FP&A, and financial modelling across the GCC region. He is the founder of FinDataPro.
Discussion
Leave a Comment
Comments are moderated and appear once approved.
