Theory
Case: write Klasna's discount policy
A year of promo codes, English package sales by month and the September 2026 sale buyers. Find what the discounts bought and what they gave away, then write the policy Klasna will follow.
~6 min read · 9 exercises · 250 points
Before you start
Leo's plan
Back at Klasna for the module's case, October 2026: Leo calls September a triumph, 740 families used SEPT10, and wants it every year. With a year of promo codes, monthly English sales and the sale's buyers, your job is to find what each discount bought and write the discount policy Klasna will follow.
Count who would have bought anyway
A discount's headline number is how many people used it. Its real value is how many it changed: buyers who wouldn't have bought, or bought less, without it. Everyone else received a gift.
To separate the two you need a baseline: what happens without the discount. For SEPT10, Hanna has one: in September 2024, with no sale at all, 150 families bought their first English package, because the school year restart brings them anyway. The buyers file adds the rest: of 740 sale families, 560 had bought before, and 90 opened checkout in August and waited.
Dataset · 4 rows
Who bought in the September 2026 sale (SEPT10)
The 740 families who used SEPT10 (10% off every English package, 1–30 September 2026), by their history with Klasna. One package per family. Money in UAH.
A baseline from one year is an estimate, not a fact; say so. But without one, every discount looks like growth.
- Do“180 first-time families against a no-sale baseline of 150: about 30 extra.”
- Don't“740 families used it, so it brought 740 sales.”
Most would have bought anyway.
The year's waterfall for English
Before judging any discount, draw the waterfall for the whole year. English, October 2025 – September 2026: 3,600 packages, 60,800 lessons, list value 37,144,000 (a list average of 610.92 a lesson).
Dataset · 9 rows
Klasna promo codes, October 2025 – September 2026
Every code used by families paying in UAH, all subjects. One code per order: codes never stack. Money in UAH.
First 5 of 9 rows
Dataset · 14 rows
English packages by month, August 2025 – September 2026
English packages bought by families paying in UAH. August 2025 is the last August before the first September sale (September 2025: 10% off 16-packs only). Money in UAH.
First 5 of 14 rows
- minus sale discounts 968,120 and code discounts 814,840 → 35,361,040 paid;
- minus the 2.5% fee, 884,026, and refunds, 201,000 → 34,276,014;
- ÷ 60,800 lessons = 563.75 a lesson, 7.72% below the list average.
Only 2,046 of 3,600 packages, 56.83%, sold at full price. That's the size of the problem the policy has to address.
- Do“List average 610.92, realized 563.75 a lesson.”
- Don't“Our English price is 620 a lesson.”
That's one list price; the year realized 563.75.
Compare August with August
A seasonal dip can hide a learned one. To tell them apart, compare the same month across years, picking a year before the habit could form.
August 2025 was the last August before families had seen a September sale: 70 + 230 + 60 = 360 English packages. August 2026: 40 + 150 + 40 = 230. Change: (230 − 360) ÷ 360 = −36.11%.
Dataset: English packages by month, August 2025 – September 2026 · shown above
Holidays happen every August, so they don't explain a third fewer packages. The sale does: families who knew a discount was coming in September waited.
- Do“August packages: 360 → 230, −36.11%, after one September sale.”
- Don't“August is slow every year, ignore it.”
The same month a year earlier wasn't this slow.
The full-price share
A simple number shows whether discounts are taking over: the full-price share, packages sold without any discount divided by all packages.
August 2025, the last August before families had ever seen a September sale: 330 of 360 at full price, 91.67%. August 2026: 113 of 230, 49.13%, and total August packages fell 36.11%. In September 2026, not one English package was bought at full price.
Dataset: English packages by month, August 2025 – September 2026 · shown above
That's what training buyers to wait looks like in data: demand moves into the sale month and the full-price share collapses around it. Track it monthly; a falling share is an early warning before the realized price shows it.
- Do“Full-price share in August: 91.67% → 49.13%.”
- Don't“August is always slow, holidays.”
Compare August with August: the drop came with the sale.
Discount per extra customer
Divide what a discount gave away by the customers it added, not by everyone who used it.
SEPT10 gave 778,760 of discount. 180 first-time families bought, against 150 in a no-sale September, so about 30 were extra: 778,760 ÷ 30 = 25,958.67 per extra family. Even counting all 180 as extra, their packages at the sale price leave 351,840 of contribution, less than half of what was given away; for 30 families it's 58,640.
Dataset: Who bought in the September 2026 sale (SEPT10) · shown above
The baseline is one year's number, so present 30 as an estimate. The conclusion survives a wide range of estimates.
- Do“About 26,000 of discount per extra family.”
- Don't“778,760 ÷ 740 families: only about 1,050 each.”
Most of the 740 would have bought anyway.
Judge each code by what it bought
For codes that claim to win new families, a fair yardstick is discount per first-time family:
- FRIEND5: 83,148 ÷ 165 = 503.93, and every order was a new family;
- SEPT10: 778,760 ÷ 180 = 4,326.44;
- CHAT10: 360,464 ÷ 44 = 8,192.36, only 13.17% of orders new;
- NOV15: 322,980 ÷ 38 = 8,499.47.
Dataset: Klasna promo codes, October 2025 – September 2026 · shown above
Across all codes, only 532 of 2,119 orders (25.11%) were first-time families. Apply the yardstick with care: SIBLING10 and HELP20 aren't meant to find new families (more lessons from one family; a social choice), so judge them by their own purpose.
- Do“FRIEND5 wins new families at about 504 each; CHAT10 at about 8,192.”
- Don't“HELP20 brings no new families, cut it.”
It's a social choice, not an acquisition tool.
A discount policy and its guardrails
A discount policy turns case-by-case giving into rules anyone can apply. For every discount it names what it buys, who qualifies and how that's checked, the size, and who approves exceptions; then how it will be measured.
Guardrails for all of them:
- no stacking: one discount per order, the larger applies;
- never below the floor;
- real dates on every promotion and the 30-day lowest price as the reference;
- checks with dignity: for HELP20, look at the document once, record “eligible”, keep no copy.
SEPT10 gives way to a dated first-package offer for accounts that have never bought; sibling and social discounts stay.
How it fits together: draw the waterfall, count who'd have bought anyway, judge each code by what it bought and write rules with guardrails. Next module: changing the list price itself.
- Do“One discount per order, the larger applies, never below the floor.”
- Don't“Stack HELP20 and SIBLING10 for families who qualify for both.”
Together they put the 32-pack below cost.
Ready to practise?
Answer the lesson's exercises and earn 250 points the first time you finish it.
Start the exercises