Skip to main content
Card class: HeroCategory: Ecommerce Platform
Average days from invoice issue to cash applied. Rising DSO is the earliest warning of cash-flow trouble.

At a glance

Average days from Invoice issue to cash applied. The single most-watched cash-flow KPI in mid-market commerce. Rising DSO is the earliest warning of cash-flow trouble.
What it countsStandard formula: DSO = (AR Balance ÷ Total Credit Sales) × Number of Days. Card uses 90-day rolling window. NetSuite’s variant follows the same convention.
Tax treatmentIncludes tax in both numerator (AR) and denominator (Credit Sales). Net result is the same as a tax-exclusive calculation.
AR balanceOpen Invoice Amount Due, gross of Credit Memos.
Credit salesInvoiced Revenue (Cash Sales excluded; only credit transactions count, otherwise DSO is artificially low).
Cash Sales / DTC prepaidExcluded from both numerator and denominator.
CurrencyOneWorld: reporting currency.
Subsidiary scopeRespects dashboard filter.
Time window30D vsP (rolling DSO computed on 90-day denominator)
Alert trigger>45 days OR up >5 vsP, sentiment dso
Rolesowner, finance

Calculation

Calculated automatically from your NetSuite data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A US wholesale apparel distributor on NetSuite. Snapshot 14 Apr 26.
ComponentValue
Open AR (excludes Cash Sales)$11,920,000
90-day Credit Sales (Invoiced Revenue)$19,800,000
Days in window90
DSO (this card)(11.92M ÷ 19.80M) × 90 = 54.2 days
This periodPrior 30DvsP
DSO54.249.8+4.4 days
Five things to notice:
  1. DSO at 54.2 days exceeds the alert threshold (45 days). Net-30 customers are paying ~24 days late on average. The card fires the sentiment alert.
  2. vsP is +4.4 days, just below the 5-day jump threshold. Trend is bad but not yet at panic. The Controller has 1-2 weeks to act before it spikes through.
  3. The breakdown helps diagnose. Three accounts in the 60+ aging bucket are pulling DSO up disproportionately. Resolving 2 of them would drop DSO back under 50.
  4. Net-30 textbook DSO is 35-40 days for healthy B2B (terms + 5-10 days slack). 54.2 days means the average is now Net-30 + 24 days late. Compare to last year’s average; if 12 months ago it was 42, the trend is structural.
  5. Cash Sales correctly excluded. If this merchant included DTC prepaid web orders (which clear instantly), DSO would compute artificially low because cash hits same-day. The card excludes them so the number reflects credit-customer behaviour only.

Sibling cards merchants should reference together

CardWhy pair it with DSO
Invoice Aging SummaryThe bucket detail behind DSO.
AR Aging BucketsPer-customer detail.
Cash CollectedReceipts side. Strong cash-collected days reduce DSO.
Overdue Invoices ValuePressure target. Overdue % of AR drives DSO.
Cash Application RateOperations efficiency.
Customer Credit UtilisationPredictive risk view.
Top B2B AccountsConcentration.

Reconciling against the vendor’s own dashboard

Where to look in NetSuite: NetSuite does not have a standard DSO report. Most accounts build a saved search with the formula. The closest native equivalent is:
Reports → Receivables → Days Sales Outstanding (custom KPI tile in some workspace setups) Saved search: (SUM AR) / (SUM Credit Sales × 90) × 90
Why our number may legitimately differ from a manual calculation:
ReasonDirectionWhy
Window selectionEitherSome Controllers use 90-day rolling, some use trailing 12-month. Card defaults to 90-day.
Cash Sales inclusionCard excludesIncluding Cash Sales artificially deflates DSO because they clear instantly.
Tax inclusionEitherSome calculations use net-of-tax in both; others use gross. Card uses gross consistently.
Subsidiary scopeEitherCard defaults to all subs.
Cross-connector reconciliation: This card has no commerce-platform counterpart. Commerce platforms collect at order placement; DSO is meaningless.

Known limitations / merchant FAQs

What’s a “good” DSO? Net-30 B2B target: 35-40 days. Net-60 target: 65-75. Net-90 target: 95-110. The healthy range is your terms + 5 to 15 days of slack. Anything beyond that signals collection or credit issues. Why is DSO rising even though cash collected is rising? Because revenue (denominator) is rising faster than cash (effectively). Or AR balance (numerator) is rising disproportionately due to a few late-paying customers. Drill into AR Aging Buckets to see who. What’s the difference between DSO and BPDSO? BPDSO = Best Possible DSO (sales fully collected within terms). It’s a theoretical floor. DSO ÷ BPDSO ratio shows collection efficiency; >1.5 means collections are slipping. Should I include Cash Sales? No. Cash Sales clear instantly so they push DSO toward zero artificially. DSO is meant to measure credit-customer payment behaviour. Multi-currency, FX impact? Each component (AR, Credit Sales) is translated to reporting currency. The ratio is currency-neutral. FX shifts don’t move DSO directly. What about subscription / recurring billing? Each billing cycle is treated as a credit sale. DSO captures whether subscribers pay on time. Healthy SaaS-adjacent businesses see DSO at terms + 0-5 days because subscriptions auto-charge. Is 45 days the right alert threshold? Default. Tunable per workspace. Net-60 businesses should set higher (~75-80). Net-30 with strict policy can set lower (40). Single-subsidiary vs OneWorld behaviour? Identical formula. OneWorld scope just consolidates AR + Credit Sales across subs in reporting currency. ASC 606 deferred revenue, does it bias DSO? Yes if you include it in Credit Sales. ARM-deferred revenue not yet billed shouldn’t be in the denominator. The card uses Invoiced Revenue (billed) only, so the bias is avoided.

Tracked live in Vortex IQ Nerve Centre

Days Sales Outstanding (DSO) is one of hundreds of KPI pulses Vortex IQ tracks across NetSuite and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.