Skip to content
Report · Receivables

DSO trend

Days sales outstanding for each of the last twelve months, from receivables at month end and that month's revenue.

  • monthly
  • trend
  • kpi
Sample preview, fictional dataYour own figures appear after import.

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.

MonthReceivables at month endRevenueDSO (days)
2026-04402,100318,50037.90
2026-05388,900342,80035.20
2026-06415,600301,20041.40
2026-07441,300296,40046.20
2026-08398,700351,90035.10
2026-09376,200336,10033.60

03

The SuiteQL

This is the query each report runs. Read it, copy it, or change it after import.

DSO trend
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.period

04

Appears in

ReportReceivables

DSO trend

Screenshot of the DSO trend report in HiScale Advanced Reports, filled with fictional sample data
Sample preview, fictional dataOpen image full size (opens in a new tab)