Skip to content
Log in

Theory

A twelve-month cash flow forecast

A cash flow forecast example, month by month with real payment timing: prepayments, payouts twice a month, quarterly invoices and the summer valley a yearly total hides.

~9 min read · 9 exercises · 250 points

Before you start

The 2027 cash plan

Still on Klasna's product team: Hanna has finished the cash plan for 2027, and Leo has read only the total. The year ends with more cash than it starts with, so he'd like to sign the new Teams deals and stop worrying. Hanna built the plan month by month for a reason.

In this lesson you'll build a twelve-month cash flow forecast with the real timing of every payment, and find what a yearly total hides.

Payouts twice a month: half now, half next month

Leo read one number in Hanna's 2027 plan: the year ends with 4.5 million UAH more cash than it starts with. A cash plan (cash flow forecast) is built to answer a different question: will there be enough money in the bank at the end of every month? So it shows cash in, cash out and the closing balance month by month, with the real date of every payment.

The first timing rule is for tutors. They are paid twice a month: the first half of a month on the 20th, the second half on the 5th of the next month. So each month pays half of its own payouts and half of last month's.

January 2027: payouts earned were 3,281,000 UAH in December and 3,270,800 in January.

Paid in January = 3,281,000 ÷ 2 + 3,270,800 ÷ 2 = 1,640,500 + 1,635,400 = 3,275,900 UAH.

The other half of January, 1,635,400, is still owed at the end of January. The slip is to put a month's earned payouts in the same month: that hides the lag that makes June so expensive.

  • Do
    January pays 3,281,000 ÷ 2 + 3,270,800 ÷ 2 = 3,275,900
  • Don't
    January pays the 3,270,800 earned in January

    Half of January is paid on 5 February.

Teams cash follows the invoice calendar

Teams lessons happen every month, but their money comes four times a year. Klasna invoices each school-year quarter on its last day (end of February, May, August and November), and companies pay 60 days later.

So in Klasna's 2027 plan:

  • January collects the 640,000 UAH invoiced in November 2026;
  • the December–February quarter is invoiced at the end of February: 360 lessons a month × 3 × 800 = 864,000 UAH, paid in April;
  • the March–May invoice is paid in July, June–August in October.

A month with no invoice can still collect cash, and a month full of Teams lessons can collect nothing. In the plan this is two separate columns: what was invoiced (not cash) and what was collected (cash).

Dataset · 12 rows

Klasna's cash plan for 2027

One row per month, UAH, made in December 2026. Cash on 1 January 2027: 250,000. Tutor payouts earned in December 2026: 3,281,000. Teams is invoiced on the last day of each school-year quarter (February, May, August, November) and paid 60 days later.

monthfamilies_paid_uahclub_paid_uahteams_invoiced_uahteams_collected_uahpayment_fees_uahtutor_payouts_earned_uahtutor_payouts_paid_uahvideo_ai_paid_uahsalaries_uahmarketing_uahoffice_tools_uahnet_cash_flow_uahclosing_cash_uah
2027-014834000468000064000013255032708003275900342960872000260000840009745901224590
2027-0255440004905008640000150862.53598800343480034556087200030000084000847277.52071867.5
2027-03631700051750000170862.540088003803800375110872000320000840001208727.53280595
2027-0459980005400000864000163450433680041728004118109100003000008400013599404640535
2027-05508800055800086400001411504500800441880044136091000022000084000-5693104071225

First 5 of 12 rows

Download CSV

The typical slip is to book Teams money in the month of the lessons, as if it were a package. That moves cash two to five months too early and makes the spring look even better than it is.

  • Do
    "Invoiced end of February, paid 60 days later: 864,000 in April."
  • Don't
    Put April's Teams lessons into April's cash in

    They are invoiced in May and paid in July.

How to build a monthly cash plan

A cash plan is a table with one row per month. For each line you write down when the money actually moves, not when it is earned. Klasna's rules for 2027:

Dataset: Klasna's cash plan for 2027 · shown above

  • Packages and Club: families and members pay up front. Cash in the same month, minus the payment provider's 2.5%.
  • Tutor payouts: half of a month's payouts on the 20th, the other half on the 5th of the next month. Each month pays half its own and half of last month's.
  • Video, AI and Club hosts: billed monthly, paid the month after.
  • Salaries, marketing, office: paid in the same month.
  • Teams: invoiced on the last day of each school-year quarter, collected 60 days later.

Then, for every month: net cash flow = cash in − cash out, and closing cash = last month's closing cash + net cash flow. Klasna starts 2027 with 250,000 UAH.

Keep invoiced and collected amounts, earned and paid payouts in separate columns. The slip is to mix them: then the plan quietly turns back into a P&L.

  • Do
    Closing cash = last month's closing cash + cash in − cash out
  • Don't
    Use revenue and expenses from the P&L forecast as cash in and cash out

    Revenue and payment dates differ for every Klasna line.

Reading one month of the plan

When a month looks bad, read its row column by column and ask which money arrives and which leaves.

Dataset: Klasna's cash plan for 2027 · shown above

Klasna's June 2027:

  • cash in: packages 1,650,000 + Club 531,000 + Teams 0 = 2,181,000 UAH. Teams invoiced nothing in June and collects nothing until July;
  • cash out: fees 54,525 + tutor payouts 3,352,800 + video and AI 457,560 + salaries 796,000 + marketing 160,000 + office 84,000 = 4,904,885 UAH;
  • net cash flow: 2,181,000 − 4,904,885 = −2,723,885 UAH.

The biggest item explains the month. June pays 3,352,800 to tutors although June's own lessons earned only 2,204,800: half of May's 4,500,800 falls due on 5 June. The video and AI bill is May's too. So June pays for a busy May with the cash of a quiet June.

The slip is to skip a column: forgetting fees or office makes the outflow look smaller, and taking "payouts earned" instead of "payouts paid" understates June by more than a million.

  • Do
    Use tutor_payouts_paid (3,352,800), not tutor_payouts_earned (2,204,800)
  • Don't
    Add teams_invoiced to June's cash in

    Invoices are not cash; nothing is collected in June.

The summer valley

Follow the closing balance down the year and a shape appears. Spring prepayments lift Klasna's cash to 4,640,535 UAH in April. Then the calendar turns:

  • in June families buy few packages (1,650,000 UAH instead of over 5 million), yet June still pays half of May's busy payouts;
  • June alone takes 2,723,885 UAH out of the bank;
  • July and August keep sliding: 915,930 and then 592,132.50 UAH, the lowest month-end of the year;
  • September's new prepayments lift cash back to 2,759,997.50.

This valley is not bad luck. It comes every summer, because the spring money was paid for lessons that are taught and paid out in summer, while new prepayments pause until September.

Reading the plan means finding the minimum of the closing balance column, not only its last row. A year can end at 4.7 million and still have a month where one late payment would hurt. The slip is to look at December's balance or the yearly total and stop there.

Dataset: Klasna's cash plan for 2027 · shown above

  • Do
    "Lowest month-end: August, 592,132.50."
  • Don't
    "We end the year at 4.7 million, so cash is never a problem."

A good year can hide bad months

Klasna's 2027 plan adds 4,455,267.50 UAH over the year: it starts with 250,000 and ends December at 4,705,267.50. That total is true, and it answers almost nothing about the summer.

A yearly sum adds strong months and weak months together. Spring's surplus and September's prepayments easily outweigh the June–August outflows, so the total looks calm. But money is needed on specific dates: salaries at the end of July, payouts on 5 and 20 August. On those dates the balance is what matters, not the December result.

In the plan, two months end below Hanna's 1,000,000 UAH buffer: July at 915,930 and August at 592,132.50. January (1,224,590) and June (1,347,340) end only just above it.

Dataset: Klasna's cash plan for 2027 · shown above

So when someone says "the year is fine, let's sign", ask for the lowest month and its distance to the buffer. Leo planned to sign new Teams deals on the strength of the total. A cash plan exists precisely to stop that kind of decision.

  • Do
    "+4.46 million for the year, but July and August end below the buffer."
  • Don't
    "+4.46 million for the year, so we can afford anything this summer."

Measure against the buffer, not zero

"It never goes below zero" sounds reassuring, but zero is the point where Klasna stops paying tutors and staff. A plan that only avoids zero has no room for anything going wrong.

So a finance team sets a buffer: a minimum month-end balance it wants to keep. Hanna's is 1,000,000 UAH, about one month of salaries, coordinators and office plus room for a bad week. Then the question for every month is the distance to the buffer.

  • Above the buffer: fine.
  • Below the buffer but above zero: a cash gap waiting to happen. One late Teams payment or a weaker September and the bills can't be paid on time.
  • Below zero: a gap that is already in the plan.

In the 2027 plan, July (915,930) and August (592,132.50) sit in the middle zone. Neither breaks zero; both need action.

The buffer is a choice, not a law. Pick it from the size of your fixed monthly payments and how uncertain the plan is, then hold every month to it.

  • Do
    "August is 407,867.50 below the buffer."
  • Don't
    "August stays positive, so we're safe."

    Positive is not the same as safe: the buffer exists for slips.

Size the gap, then pick a lever

Once you know the lowest month, put a number on the problem: how much more cash would it need to end at the buffer?

Gap = buffer − lowest month-end balance.

August 2027 ends at 592,132.50 UAH, and Hanna wants 1,000,000:

1,000,000 − 592,132.50 = 407,867.50 UAH.

Now the discussion has a size. Anything that moves at least about 408,000 UAH of cash into the summer, or moves spending out of it, closes the gap:

  • earlier prepayments, e.g. an offer for summer packages paid in May;
  • a different payment date, such as monthly Teams invoices instead of quarterly ones;
  • spending moved to September, such as a marketing push or an annual tool fee.

A lever has to be timed as well as sized: saving 408,000 in December doesn't help August. And new Teams deals starting in spring would deepen the valley, because their invoices are paid two to five months later while tutors are paid within weeks. The slip is to answer the gap with "cut costs" without saying what, how much and in which month.

  • Do
    "August is 407,867.50 short; a summer-package offer paid in May that brings 410,000 forward closes it."
  • Don't
    "August is short, so let's save money somewhere this year."

    No size, no month: the lever may not reach August at all.

Ready to practise?

Answer the lesson's exercises and earn 250 points the first time you finish it.

Start the exercises