Spreadsheet Studio

Home health cash forecast

Cash by month for a home health agency paid by 30-day period: every period tested against its LUPA threshold, priced for a late notice of admission, billed after it closes and collected on each payer's measured clock — beside the old per-visit forecast, so the gap is visible in dollars and in months.

Built for Brightwater Home Health, an illustrative home health agency. The data is invented; the mechanics are not.

Download the workbook

.xlsx · 7 sheets · 969 live formulas
540 inputs · 13 tie-outs · no macros

What the file finds

Three numbers the shortcut version never produces

$42,331
Promised by the old forecast by the end of August, not yet arrived

Cash!G35 · =D22

$7,690
Left on the table by LUPA periods

Exposure!C9 · =C7-C8

$87,230
Lowest closing cash in view

Cash!A35 · =MIN(C29:F29)

The mistake this model exists to catch

Cash tied to the visit or an invoice date. Under period payment the invoice date is neither when the work happened nor when the cash arrives.

The mistake this model exists to catch

Revenue recognized per visit, which reports a good month for a period that will be paid as a LUPA at a fraction of the rate — and a notice of admission filed late, which costs a slice of the payment for every day.

What you send

An export, and the rules of the business

  • The 30-day periods from the EMR: payer, dates, the case-mix payment rate, the LUPA threshold, visits by discipline
  • How each payer actually pays, measured from the remittance history
  • Per-visit LUPA rates and the fully loaded cost of a visit by discipline, opening cash, and fixed overhead

Messy is fine. The paste grid on the right is what the export becomes: one row per period, every cell yellow because every cell is yours.

What comes back

  • READMEread me first
  • Inputs36 inputs
  • Periods8 formulas
  • Payment838 formulas
  • Cash97 formulas
  • Exposure12 formulas
  • Checks14 formulas

What you send: the 30-day periods from the EMR

The paste grid. Twelve of the thirty-six periods shown.

Periods sheet: the paste grid the client's export becomes
PeriodPatientPayerPeriod startFirst?NOA filedPeriod rateLUPA thr.SNPTOTSTHHAMSW
BW-7001P-3104Medicare FFS06/05/2026Y06/08/2026$2,1404540030
BW-7002P-3110Humana Medicare Advantage06/06/2026Y06/09/2026$1,9803421020
BW-7003P-3097Medicare FFS06/08/2026N05/12/2026$2,4105652041
BW-7004P-3115UnitedHealthcare Medicare Advantage06/09/2026Y06/20/2026$2,6304560030
BW-7005P-3121Medicare FFS06/11/2026Y06/14/2026$1,7202100000
BW-7006P-3088Medicaid managed care06/12/2026N04/30/2026$2,0503330020
BW-7007P-3126Medicare FFS06/15/2026Y06/17/2026$3,1206763141
BW-7008P-3130Humana Medicare Advantage06/16/2026Y06/18/2026$2,2704430020
BW-7009P-3102Medicare FFS06/18/2026N05/22/2026$1,8903200000
BW-7010P-3134Medicare FFS06/19/2026Y06/22/2026$2,5605551030
BW-7011P-3139UnitedHealthcare Medicare Advantage06/22/2026Y06/24/2026$2,3804440021
BW-7012P-3141Medicare FFS06/23/2026Y07/06/2026$2,9105652030

The workbook

Select any cell. The formula is the file's own.

These are excerpts of the sheets, with the values the file computes. Nothing on a calculation sheet is typed: the rates are looked up from Inputs, the months roll off one date, and every total has a second route to the same number.

spreadsheet-studio-sample-home-health-cash-forecast.xlsx
D21=D19-D12

Cash in the month it actually lands, against the old per-visit forecast

Receipts by payer, the old forecast beside them, then the roll-forward.

Cash sheet of the sample workbook, A6:G30. Select a cell to read its formula.
PayerJul-26Aug-26Sep-26Oct-26Total
Month key24,31924,32024,32124,322
Medicare FFS$4,728$13,076$20,282$7,590$45,676
Humana Medicare Advantage$0$1,980$4,750$4,650$11,380
UnitedHealthcare Medicare Advantage$0$0$4,484$4,470$8,954
Medicaid managed care$0$0$2,050$4,110$6,160
Receipts — all payers$4,728$15,056$31,566$20,820$72,170
Still to land after the last month in view$4,900
Periods landing this month3814936
WHAT THE OLD PER-VISIT FORECAST EXPECTED
Visits delivered (by period start month)16710000267
Revenue the old forecast booked on those visits$34,235$20,500$0$0$54,735
Cash the old forecast expected (visit + Old_Lag days)$27,880$34,235$20,500$0$82,615
Old forecast — still to land after the last month in view$0
Old forecast less what actually lands$23,152$19,179($11,066)($20,820)$10,445
Cumulative — cash the old forecast has promised that has not arrived$23,152$42,331$31,265$10,445
CASH ROLL-FORWARD
Opening cash$120,000$95,346$87,230$104,796
Add: receipts$4,728$15,056$31,566$20,820
Less: cost of visits delivered($15,382)($9,172)$0$0
Less: fixed overhead($14,000)($14,000)($14,000)($14,000)
Closing cash$95,346$87,230$104,796$111,616
Below the minimum?okSHORTokok
Client inputs Live formulas Flags

In one picture

Same money. Different months.

The old forecast is not wrong about the quarter. It is wrong about August, and August is when payroll is due.

Cash received each month: on each payer's clock, and as the old per-visit forecast expected it
Cash received each month: on each payer's clock, and as the old per-visit forecast expected it. Period billing, each payer's clock against The old per-visit forecast, by month. The table below carries the values.$0k$10k$20k$30k$40kJul-26: Period billing, each payer's clock $4,728Jul-26: The old per-visit forecast $27,880Jul-26$4,728$27,880Aug-26: Period billing, each payer's clock $15,056Aug-26: The old per-visit forecast $34,235Aug-26Sep-26: Period billing, each payer's clock $31,566Sep-26: The old per-visit forecast $20,500Sep-26Oct-26: Period billing, each payer's clock $20,820Oct-26: The old per-visit forecast $0Oct-26
Table view
MonthPeriod billing, each payer's clockThe old per-visit forecastDifference
Jul-26$4,728$27,880$23,152
Aug-26$15,056$34,235$19,179
Sep-26$31,566$20,500($11,066)
Oct-26$20,820$0($20,820)

The Checks sheet

Proved able to fail

The last sheet in the file is 13 tie-outs. Each reads OK on the recalculated file — which proves nothing on its own, because a check can be written so it cannot fail. So before this file shipped, a script typed a wrong number over 15 live formula cells, one at a time, and recalculated each copy.

15 of 15corruptions caught by a red check

The negative-control log
baseline: 13/13 checks OKcorrupt Payment        @M7                      col     -> CAUGHT by C8
corrupt Payment        @J10                     col     -> CAUGHT by C9
corrupt Payment        @H10                     col     -> CAUGHT by C10
corrupt Payment        @L9                      col     -> CAUGHT by C11
corrupt Payment        @R7                      col     -> CAUGHT by C12
corrupt Payment        @O7                      col     -> CAUGHT by C13
corrupt Payment        @Q7                      col     -> CAUGHT by C6,C7
corrupt Payment        @F9                      col     -> CAUGHT by C16
corrupt Cash           Receipts — all payers    col 4   -> CAUGHT by C14
corrupt Cash           Closing cash             col 5   -> CAUGHT by C14
corrupt Cash           @D14                     col     -> CAUGHT by C7
corrupt Cash           @D19                     col     -> CAUGHT by C15
corrupt Cash           @D17                     col     -> CAUGHT by C18
corrupt Exposure       @C9                      col     -> CAUGHT by C17
corrupt Exposure       @C18                     col     -> CAUGHT by C17
The tie-outs on the Checks sheet and what each one proves
Tie-outResult

Receipts by month plus what lands later equals every expected payment

The monthly grid did not drop, duplicate or misdate a period's cash.

OK

Every period lands in exactly one cash month

A payer typed differently from the Inputs table would look up to a zero lag and land in the wrong month; a broken date would land nowhere. This counts the periods that landed.

OK

Expected payment re-derived from basis, rates and penalties

The expected-payment column is rebuilt from its parts: LUPA periods at per-visit, the rest at the period rate less penalty. A number typed over any period's payment shows up here.

OK

LUPA payments re-derived from the visit counts and the per-visit rates

Visits by discipline on the paste grid, times the rate on Inputs, for every LUPA period — a second route to the same dollars.

OK

LUPA flags agree with the thresholds on every period

The flag column and the visit counts cannot disagree about how many periods fall short.

OK

A penalty never exceeds its period's payment, and never applies to a LUPA

The late-NOA reduction is capped at the payment and only applies to periods paid as periods.

OK

Visit cost re-derived per discipline

Visits by discipline on the paste grid times the cost on Inputs. A cost typed into a single period is caught.

OK

Every period matched a payer's payment lag

A payer name that does not match Inputs would collect on day zero — the most optimistic error a cash forecast can make.

OK

Closing cash roll-forward agrees with a direct recompute from the periods

Opening plus receipts less visits less overhead, month by month, equals the same figure rebuilt straight from the period list in one formula.

OK

The old forecast's cash closes against its own revenue

The comparison is honest: the old forecast is re-run in full, not caricatured. It differs from the actual only in WHEN the cash lands and in the periods it books at rates that will not be paid.

OK

Visits per period re-added from the six discipline columns

The visit total on Payment is re-summed straight off the paste grid. A typed-over total — which would also flip a LUPA decision — is caught.

OK

The exposure figures re-derived from the Payment sheet

The three dollar figures on Exposure are rebuilt from the period list in one formula, so a number typed over any of them is caught.

OK

Visits in view, plus visits before and after it, equal the paste grid

Every visit is counted exactly once: in a month in view, or before it, or after it. A typed-over cell in the monthly grid breaks the partition.

OK

On your numbers

Have this built on your numbers

Forecast / budget vs. actual is included — like every other build type — on the one plan, at $1,950 a month with a 48 hours for reporting, 2–4 business days for models turnaround. A request like this one is the export above, the rules of the plan in plain language, and the question the model has to answer. The finished file comes back the same shape as this one: Inputs first, Checks last, and a README that explains itself.

How the money moves in home health and hospice agencies, and the other workbooks this business runs on: Home health & hospice.

Spreadsheet Studio

The same care, on your numbers.

Every workbook is recalculated with a formula engine, its checks are proved able to fail, and a second pass re-derives the headline numbers before it ships.

Not ready? Get a free teardown of a sheet you already rely on.