01
About this report
For each of the last twelve months, the report gives the accounts receivable balance at month end, the revenue posted in the month, and DSO. The balance adds up every posting to receivable accounts through that month. Revenue is postings to income accounts. DSO is the balance divided by the month's revenue, times the days in the month. A rising DSO means customers are paying later relative to what you bill.
Months with no revenue show no DSO. Figures are in base currency from the general ledger, primary accounting book.
02
Sample preview
Fictional figures in the shape you will see. Yours come from your account.
| Month | Receivables at month end | Revenue | DSO (days) |
|---|---|---|---|
| 2026-04 | 402,100 | 318,500 | 37.90 |
| 2026-05 | 388,900 | 342,800 | 35.20 |
| 2026-06 | 415,600 | 301,200 | 41.40 |
| 2026-07 | 441,300 | 296,400 | 46.20 |
| 2026-08 | 398,700 | 351,900 | 35.10 |
| 2026-09 | 376,200 | 336,100 | 33.60 |
03
The SuiteQL
This is the query each report runs. Read it, copy it, or change it after import.
SELECT m.period,
m.ar_balance,
m.revenue,
CASE WHEN m.revenue > 0 THEN ROUND(m.ar_balance / m.revenue * m.days_in_month, 1) END AS dso
FROM (SELECT g.period,
SUM(g.ar_change) OVER (ORDER BY g.period) AS ar_balance,
g.revenue,
TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE(g.period || '-01', 'YYYY-MM-DD')), 'DD')) AS days_in_month
FROM (SELECT TO_CHAR(t.trandate, 'YYYY-MM') AS period,
SUM(CASE WHEN a.accttype = 'AcctRec' THEN tal.amount ELSE 0 END) AS ar_change,
SUM(CASE WHEN a.accttype = 'Income' THEN -tal.amount ELSE 0 END) AS revenue
FROM transactionaccountingline tal
JOIN accountingbook ab ON ab.id = tal.accountingbook AND ab.isprimary = 'T'
JOIN transaction t ON t.id = tal.transaction
JOIN account a ON a.id = tal.account
WHERE tal.posting = 'T'
AND a.accttype IN ('AcctRec', 'Income')
GROUP BY TO_CHAR(t.trandate, 'YYYY-MM')) g) m
WHERE m.period >= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -11), 'YYYY-MM')
AND m.period <= TO_CHAR(SYSDATE, 'YYYY-MM')
ORDER BY m.period04