Monthly rate at which an organization draws down its cash reserves.
Formula:
brr = ( cash_boy - cash_eoy ) / months_in_periodDefinitional Range
Bounded below at zero (cash cannot be negative). Values below 1.0 indicate cash depletion; values above 1.0 indicate cash accumulation. Ratios near zero indicate near-complete cash exhaustion. The ratio is undefined (NA) when beginning-of-year cash is zero, which occurs in the first year of operation or after a complete cash drawdown.
Benchmarks and rules of thumb
A ratio consistently below 1.0 over multiple years is a warning sign; a single year below 1.0 may reflect planned reserve spending.
Below 0.50 in a single year (cash halved) warrants investigation.
A ratio consistently above 1.0 indicates accumulating liquidity reserves.
Calculated For: 990 + 990EZ filers.
Usage
get_cash_burn_ratio( df,
cash_eoy = "F9_10_ASSET_CASH_EOY",
cash_boy = "F9_10_ASSET_CASH_BOY",
months_in_period = 12,
winsorize = 0.98 ,
range = "zp",
sanitize = TRUE,
summarize = FALSE )Arguments
- df
A
data.framecontaining the fields required for computing the metric.- cash_eoy
Cash on hand, end of year.
- cash_boy
Cash on hand, beginning of year.
- months_in_period
Number of months in the reporting period. Defaults to 12 for a standard annual filing. Adjust for short-year filers.
- winsorize
The winsorization value (between 0 and 1), defaults to 0.98, which winsorizes at the 1st and 99th percentiles.
- range
Character string specifying the theoretical range of the ratio, used to set winsorization bounds. Default
"zp". Options:"np"(negative to positive),"zp"(zero to positive),"zo"(zero to one),"nz"(negative to zero), or a custom"lo;hi"pair (e.g."0;10").- sanitize
Logical (default
TRUE). IfTRUE, NA values in the financial input columns are imputed to zero before the ratio is computed, respecting form scope: Part X and VIII/IX fields (990 only) are imputed only for 990 filers; Part I summary fields (990 + 990EZ) are imputed for all filers. The returned dataframe always contains the original unmodified input columns.- summarize
Logical. If
TRUE, prints asummary()of the results and plots density curves for all four output columns (raw, winsorized, z-score, percentile). Defaults toFALSE.
Value
Object of class data.frame: the original dataframe appended with four
new columns:
- `cash_burn` - monthly burn rate in dollars (raw)
- `cash_burn_w` - winsorized version
- `cash_burn_z` - standardized z-score (based on winsorized values)
- `cash_burn_p` - percentile rank (1-100)Details
Primary uses and key insights
The burn rate ratio compares end-of-year cash to beginning-of-year cash, measuring the rate at which an organization is accumulating or depleting its cash position over a single fiscal year. A ratio below 1.0 means the organization ended the year with less cash than it started with (burning cash); a ratio above 1.0 means it accumulated cash. It is most useful for detecting multi-year cash erosion trends before they reach a crisis point.
Formula variations and their sources
The term "burn rate" originates in startup finance, where it refers to monthly cash
outflows. The nonprofit adaptation here is an annual version: EOY cash divided by BOY
cash. An alternative formulation computes the dollar change (EOY - BOY) divided by
annual expenses to express the burn as a fraction of the operating budget, but that
version requires an additional variable and is better captured by the days/months of
cash functions (get_days_cash_operations(), get_months_cash_operations()).
Why this formula was chosen
The EOY/BOY ratio is the simplest formulation and requires only two fields from the Part X balance sheet. It directly answers "is the cash position improving or deteriorating year-over-year?" without requiring expense data, making it calculable even for organizations where Part IX data is incomplete.
Canonical citations
Zietlow, J., Hankin, J.A. & Seidner, A. (2007). Financial Management for Nonprofit Organizations. Wiley. - Discusses cash trend analysis for nonprofits.
Nonprofit Finance Fund. (Annual). State of the Nonprofit Sector Survey.
Annual survey tracks cash position changes as a sector-wide indicator.
Examples
library( fiscal )
data( dat10k )
d <- get_cash_burn_ratio( df = dat10k )
head( d[ , c( "cash_burn", "cash_burn_w", "cash_burn_z", "cash_burn_p" ) ] )
#> cash_burn cash_burn_w cash_burn_z cash_burn_p
#> <num> <num> <num> <int>
#> 1: NA NA NA NA
#> 2: -5214.5833 -5214.5833 -0.5777694 29
#> 3: 393444.1667 183044.3667 3.7522370 100
#> 4: NA NA NA NA
#> 5: -308.3333 -308.3333 0.1077133 54
#> 6: NA NA NA NA