Days sales outstanding, or DSO, is the average number of days it takes to collect accounts receivable. That is the definition Aaron Mills of the fractional CFO firm DAAXIT gives in a CFMA article, where tracking DSO comes first in his list of five ways to ease a cash crunch. The controller usually computes it at month end from the A/R ledger and revenue.
The standard formula divides all receivables by revenue. On a contractor’s ledger those receivables hold progress billings that are not yet due, progress billings that are past due, and retainage that will not come in until closeout. This post splits DSO into those pieces, by owner, so the number points at something a project manager or the collections team can act on.
Why the unadjusted number misleads
The formula is accounts receivable divided by revenue, multiplied by the days in the period. A quarter of $30 million in revenue works out to $333,333 a day, so $17.2 million of receivables equals 51.6 days.
Retainage inflates that figure for a reason unrelated to collections. The owner holds it under the contract, and it ages from the release date rather than the invoice date. The retainage aging post covers how to track it on its own.
The billing cycle adds days of its own. Most contractors submit one pay application a month, near month end. When the snapshot is taken the day after the pay apps go out, a full month of billing sits in receivables even if every owner pays exactly on time.
Payment terms differ by owner as well. Under FAR 52.232-27, a federal progress payment is due 14 days after the designated billing office receives a proper payment request. A private contract might allow 30 or 45 days, and the same ledger mixes all of them.
The adjustments
Each adjustment uses data already in the A/R subledger and the contract file:
- Pull receivables at month end and split them into progress billings and retainage receivable.
- For each progress billing, compute the due date as the pay application’s receipt date plus the owner’s payment terms. Sort each balance into not yet due or past due as of the report date.
- Use revenue for the trailing 90 days, and divide by 90 to get revenue per day. A three-month window smooths one large or small pay app.
- Divide each piece of receivables by revenue per day. The pieces add up to the unadjusted DSO.
- Repeat steps 2 to 4 for each owner, or each owner type.
Underbillings, which are costs and estimated earnings in excess of billings, are revenue earned but not yet billed. They never reach the A/R ledger, so DSO leaves them out. Some CFOs add them as a separate line, using the figure from the work-in-progress schedule. The underbilling post explains where that number comes from.
A worked example
The figures below are an example with round numbers. A general contractor earned $30 million from July through September 2026 on three jobs and bills each one on the last day of the month. Its receivables at September 30 total $17.2 million.
| Piece of receivables | Amount | Days of revenue |
|---|---|---|
| Progress billings not yet due | $12,200,000 | 36.6 |
| Progress billings past due | $2,500,000 | 7.5 |
| Retainage receivable | $2,500,000 | 7.5 |
| Total accounts receivable | $17,200,000 | 51.6 |
Of the 51.6 days, 36.6 are bills that are not yet due, mostly the September pay applications issued the day before the snapshot. Retainage adds 7.5 days. The remaining 7.5 days are past due, and those are the days the collections team can shorten this month.
| Owner | Payment terms (days) | Revenue Jul-Sep | Not yet due | Past due | Retainage receivable | DSO as reported | DSO without retainage | Days past due |
|---|---|---|---|---|---|---|---|---|
| Federal agency | 14 | $6,000,000 | $2,000,000 | $500,000 | $0 | 37.5 | 37.5 | 7.5 |
| Private developer | 30 | $15,000,000 | $4,500,000 | $2,000,000 | $2,000,000 | 51.0 | 39.0 | 12.0 |
| Hospital | 45 | $9,000,000 | $5,700,000 | $0 | $500,000 | 62.0 | 57.0 | 0.0 |
| All owners | $30,000,000 | $12,200,000 | $2,500,000 | $2,500,000 | 51.6 | 44.1 | 7.5 |
The hospital has the highest DSO at 62.0 days, with nothing past due. Its 45-day terms mean the August pay app, issued August 31, is not due until October 15, so two monthly bills sit in receivables at once while the hospital pays on its terms.
The private developer reports 51.0 days. Removing $2.0 million of retainage brings that to 39.0, and $2.0 million of the August bill is past due, worth 12.0 days, which puts the developer first on the collections call list.
The federal job shows the lowest DSO and still has $500,000 past due, because 14-day terms leave little room before a bill ages. FAR 52.232-27 says the billing office must return an invoice that is not a proper invoice within seven days of receipt, with the reasons. The project accountant can check whether the August pay app came back or is waiting on a receiving report. Under the same clause, the government pays an interest penalty without a request when a proper invoice is paid late and no dispute exists.
Comparing your number to published figures
Published DSO figures rarely say how they treat retainage, and that one choice changed the developer’s figure in the example by 12 days. In a CFMA article, Claire Wilson of the A/R software company Siteline cites a report on subcontractor trends that puts average DSO for subcontractors at 96 days, up from 90 in 2019. The publicly available portion of the article does not say whether retainage is included, so compare it with your DSO both with and without retainage.
Sureties also read receivable days. In a CFMA article on surety prequalification, John Killingsworth of Colorado State University names average days in accounts receivable as one of two quick checks on a contractor’s true liquidity. With the split in hand, a controller who reports 51.6 days to the surety can show that 36.6 of them are bills that are not yet due.
The payable side
The same federal clause sets the timing of what the contractor owes. FAR 52.232-27 requires a prime contractor to pay each subcontractor within seven days of receiving payment from the government, and to flow the same payment terms down to lower-tier subcontracts. When the federal agency pays the past-due $500,000, the subcontractor share on that bill comes due a week later. A cash forecast built from the owner table can schedule those payments on the day the receipt is expected.
How to start on your jobs
Pick your largest owner by revenue over the last 90 days. Pull its open pay applications, write the payment terms from the contract next to each one, and sort each balance into not yet due, past due and retainage. Divide each total by that owner’s revenue per day.
When the three numbers add up to the DSO you computed the usual way, add the next owner. Run the split at the same point in the billing cycle each month, so September and October compare on equal terms.