Average collection period calculator
Receivables of 45,000 against 365,000 of annual credit sales mean customers take 45 days on average to pay. Enter the two ledger totals, and a period length if it is not a 365-day year, to get the figure. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Accounts receivable
- 45,000
- Credit sales
- 365,000
- Days
- 365
- Average daily credit sales
- 1,000
- Days sales outstanding
- 45
- Average collection period
- 45
Days sales outstanding — also called the average collection period — answers a cash-flow question every credit-granting business eventually has to ask: how many days, on average, does it take this company to turn an invoice into cash? The figure is not a guess from the aging report. It is a closed-form ratio: outstanding accounts receivable divided by total credit sales for the same window, then scaled by the number of days in that window. This average collection period calculator accepts those two ledger totals, optionally a period length that defaults to a 365-day year, and returns days sales outstanding together with average daily credit sales.
How days sales outstanding and the average collection period are computed
The average collection period and days sales outstanding are the same ratio written under two classroom names. Start with accounts receivable on the balance sheet — the amount customers still owe for goods or services already delivered on credit. Pair it with total credit sales from the income statement for a matching window: a calendar year, a quarter, or a custom period you choose.
Divide receivables by credit sales to obtain the fraction of the period's credit book that is still uncollected. Multiply that fraction by the number of days in the window. The product is DSO, the average number of days a dollar of credit sale remains outstanding before it is collected.
A 360-day banker's year or a 90-day quarter is just a different days value — the formula does not change. Receivables turnover, reported when accounts receivable is positive, is credit sales divided by receivables, and DSO is then days divided by that turnover. Zero receivables with positive credit sales is a legitimate books-clean case: DSO is zero because nothing is waiting to be collected.
Negative receivables are rejected. Credit sales of zero or less are rejected because they would divide by zero or invert the meaning of the ratio. The arithmetic is a handful of finite operations; there is no aging schedule, no interest, and no forecast of who will pay late.
Where an average collection period calculator earns its keep
Controllers and treasurers use an average collection period calculator at close to turn two trial-balance lines into a single operating metric they can put next to stated terms — net thirty, net forty-five, net sixty — and see whether the book is actually collecting on that promise. Credit managers compare this year's DSO with last year's and with a peer median before they change dunning, deposits, or early-pay discounts.
Lenders and underwriters drop the same two totals into a covenant worksheet so a rising collection period is visible before it becomes a cash-conversion surprise. Failed validation does not consume balance.
What you can do with it
Month-end and year-end close
Turn ending accounts receivable and period credit sales into days sales outstanding next to stated terms before the close pack is locked.
Credit policy and dunning reviews
Compare this window's average collection period with last year or a peer set before changing deposits, discounts, or chase cadence.
Covenant and underwriting worksheets
Drop the same two ledger totals into a lender or board worksheet so a lengthening collection period is visible before cash conversion slips.
FAQ
What happens if credit sales are zero or negative?
Credit sales must be a finite number greater than zero; a zero or negative figure makes days sales outstanding undefined and is not billed.
Should I use ending receivables or average receivables?
Either convention is valid if you stay consistent. The formula does not average two balances for you.
Can I compute quarterly or 360-day DSO?
Yes. Set days to 90 for a quarter, 360 for a banker's year, or any other positive period length. Omit days to use the textbook 365-day year.
How do I read the collection period against my payment terms?
Put it next to the terms you offer, such as net thirty or net sixty. If the collection period is longer than the terms, customers are paying later than promised; comparing it with last year shows the trend.
What is receivables turnover?
It is credit sales divided by receivables: how many times the receivables book is collected during the period. The collection period is simply the number of days divided by that turnover, so both describe the same speed.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/average-collection \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"accounts_receivable":45000,"credit_sales":365000}'const res = await fetch("https://api.kit.forhosting.com/fin/average-collection", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"accounts_receivable": 45000,
"credit_sales": 365000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/average-collection",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"accounts_receivable": 45000,
"credit_sales": 365000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/average-collection", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"accounts_receivable":45000,"credit_sales":365000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"accounts_receivable":45000,"credit_sales":365000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/average-collection", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"accounts_receivable": 45000,
"credit_sales": 365000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.average_collection",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Zero or negative credit sales make the ratio undefined, so the task fails with invalid_input and is not billed.
How days sales outstanding and the average collection period are computed
Equivalently, first form average daily credit sales as credit_sales divided by days, then divide accounts receivable by that daily run-rate; both routes are algebraically identical and this capability uses the first form. When you omit days the endpoint defaults to 365, which is the textbook annual convention.
Input contract, response shape, and error behaviour
Example: forty-five thousand of receivables against three hundred sixty-five thousand of annual credit sales yields a forty-five-day collection period and one thousand of average daily credit sales. POST a JSON body with two required finite numbers and one optional period length. accounts_receivable is the outstanding receivable balance for the window (ending AR, or average AR if that is the convention you already use internally); aliases ar and receivables map to the same field. credit_sales is total credit sales — net of returns if that is how you close the book — for the same window; aliases sales, total_credit_sales, and net_credit_sales are accepted so ledgers can keep their column names. days is the number of days in that window and defaults to 365 when omitted; aliases period_days and days_in_period are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. If accounts_receivable is negative the request fails. If days is supplied and is not greater than zero the request fails. Those failures are not billed. On success the body echoes accounts_receivable, credit_sales, and days, then reports average_daily_credit_sales, days_sales_outstanding, and average_collection_period (the last two are the same rounded figure, returned under both names so a DSO dashboard and an ACP worksheet share one contract). When receivables are positive the body also includes receivables_turnover. Pair the JSON with your own aging buckets if you need a customer-level story; this endpoint returns the period average, not a schedule of invoices.
Where an average collection period calculator earns its keep
Keep credit_sales strictly positive, keep accounts_receivable non-negative, pin the rounded day figure in tests, and you get reproducible collection-period figures for close checklists, LMS plugins, and edge workers without standing up a receivables engine of your own.
Technical questions
How is the average collection period / days sales outstanding calculated?
DSO = (accounts_receivable / credit_sales) × days. days defaults to 365 when omitted. Equivalently, divide receivables by average daily credit sales (credit_sales / days). Both routes are the same ratio.
What does the average collection period calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.