Модуль I · IT Skills (Cloud Services & Design) · тема 3, урок 2 з 2 · 120 хвилин · проєкт STARTUP LAUNCH
Мета. Учора ти зробив чисту таблицю data/market.csv.
Сьогодні дістанемо з неї два числа.
Перше: скільки грошей лишається тобі з одного продажу. Друге: скільки продажів треба зробити, щоб вийти в нуль.
Обидва числа поїдуть на сервер — сторінкою analytics.html.
Рахувати їх учить юніт-економіка. Формул тут дві, кожна в один рядок. Ті самі дві формули рахують і кіоск із кавою, і застосунок на мільйон користувачів.
fixed_costs. Саме її треба «відбити» продажами, перш ніж говорити
про прибуток.market.csv у таблицю на кілька чисел
і бачити, який сегмент приносить найбільше грошей;Слова «юніт-економіка», «маржа», «точка беззбитковості»
і <svg> поки нічого не означають — розберемо кожне тоді,
коли воно знадобиться.
| Етап | Хв | Що робимо |
|---|---|---|
| Перевірка входу | 10 | check11 3, латаємо вчорашні червоні пункти |
| Зведені таблиці | 20 | Згорнути рядки в групи й порахувати |
| Юніт-економіка | 25 | Одиниця, маржа, постійні витрати, точка беззбитковості |
| Калькулятор і ціна | 20 | Свої числа в калькулятор, три підходи до ціни |
| Діаграма для висновку | 15 | Одна діаграма — одна думка; підпис-висновок |
| Практика: analytics.html | 25 | Таблиця, діаграма прямо в коді сторінки, три висновки з числами |
| Автоперевірка й підсумок | 5 | check11 3 повністю |
| Разом | 120 | від чистої таблиці до опублікованої сторінки |
analytics.html як інлайновий
<svg>. Растрових картинок у ~/www/ цього уроку
немає взагалі — це окремий пункт автоперевірки. Чому саме так, розберемо
на кроці 9.Згорнути рядки в групи й порахувати. Усе інше — інтерфейс
У market.csv один рядок — один запис. Поки їх десять,
ти читаєш очима. Коли їх триста, очі здаються.
Тоді береш колонку «клас» і кажеш: склади всі рядки, де стоїть 9-А. Потім те саме для 10-Б і для 11-А. Замість трьохсот рядків лишається три числа.
Це й робить зведена таблиця. Вона збирає рядки з однаковим значенням в одну групу й рахує підсумок групи.
Нових даних вона не додає й нічого не вигадує. Сума в зведеній дорівнює сумі в сирій таблиці. Так найшвидше перевірити, що нічого не загубилося.
Перед тим як тягнути поля в зони, скажи вголос одне речення: «скільки чого у розрізі чого».
Наприклад: «скільки грошей у розрізі класів». Речення склалося — зведена підходить. Не склалося — тобі потрібен фільтр або сортування.
| Питання | Рядки | Значення |
|---|---|---|
| У якому сегменті ми зібрали найбільше грошей | сегмент | сума |
| Скільки людей у кожному сегменті | сегмент | кількість |
| Яка середня готовність платити по сегментах | сегмент | середнє |
| Який канал працює в якому сегменті | сегмент | сума, у колонках — канал |
| Хто конкретно купив найбільше | це не зведена — це сортування за спаданням | |
market.csv тридцять нових рядків —
зведена оновилася сама. Виписані руками числа доведеться переписувати, і одного
разу ти забудеш. Учитель на очній перевірці саме це й дивиться: просить
змінити фільтр і перевіряє, чи змінилися числа.У тебе 340 рядків заявок: дата, клас, канал, сума. Треба відповісти на питання «у якому класі ми зібрали найбільше грошей». Що робиш?
Зведена показує суму: у рядках — «клас», у колонках — «канал». На яке питання вона насправді відповідає?
Питання, яке інвестори ставлять першим, а школярі — останнім
Ти продав одну наліпку. Скільки грошей із неї лишилося тобі? Не за місяць і не «в цілому» — з однієї штуки.
Розрахунок на одну штуку зветься юніт-економікою (від unit — одиниця).
Навіщо рахувати саме штуку. Якщо одна наліпка приносить збиток, тисяча наліпок принесе тисячу збитків. Продавати більше тут не рятує.
Тому питання «скільки ми продамо» ставлять другим. Першим — «скільки ми заробляємо з однієї».
| Тип продукту | Одиниця | Що вважаємо доходом |
|---|---|---|
| Річ на продаж: наліпки, значки, друк | один проданий екземпляр | ціна екземпляра |
| Послуга: фотозйомка, репетиторство | одне замовлення | вартість замовлення |
| Підписка: сервіс, застосунок | один клієнт за місяць | місячна плата |
| Захід: квест, майстер-клас | один квиток | ціна квитка |
| Змінні витрати | Постійні витрати | |
|---|---|---|
| Питання | Скільки коштує зробити ще одну штуку? | Скільки я плачу, навіть якщо не продав жодної? |
| Приклади | папір, друк, упаковка, доставка, комісія платіжки | сервер, домен, підписка на редактор, оренда |
| Колонка в CSV | variable_cost | fixed_costs (мета-тег сторінки) |
| Поведінка | ростуть разом із продажами | стоять на місці |
З ціни 200 грн ти віддаєш 120 грн за папір, друк і пакет. Тобі лишається 80 грн.
Ці 80 грн і звуться маржею з одиниці.
Ти продаєш наліпку за 45 грн. Папір, друк і пакет коштують тобі 28 грн за штуку. Скільки заробляє одна наліпка?
Ти платиш 400 грн на місяць за сервер, домен і пошту та 12 грн за кожну відправлену посилку. Цього місяця продажів не було зовсім. Скільки ти витратив?
Твої постійні витрати вже пораховані — на першому уроці
На уроці 1 ти збирав у калькуляторі свою конфігурацію хостингу. Ось «комфортна» з того калькулятора. Тепер це не довідка, а перший рядок твоєї юніт-економіки.
| Стаття витрат | $ / рік | $ / міс | грн / міс |
|---|---|---|---|
| VPS | 72,00 | 6,00 | 252 |
| Резервні копії | 21,60 | 1,80 | 76 |
| Пошта на домені | 12,00 | 1,00 | 42 |
Домен .com | 10,44 | 0,87 | 37 |
| TLS-сертифікат Let’s Encrypt | 0,00 | 0,00 | 0 |
fixed_costs, тільки хостинг | 116,04 | 9,67 | ≈ 400 |
Мінімальна конфігурація з уроку 1 — 68,04 $ на рік. Це 5,67 $ на місяць, приблизно 240 грн. Далі рахуємо за комфортною: 400 грн на місяць.
І це все одно нижня межа. За ці гроші сайт просто доступний, більше нічого.
У реального продукту зазвичай є ще щось щомісячне: підписка на редактор, полиця в майстерні, реклама. Ось повний розклад для продукту цього уроку.
| Стаття | грн / міс | Статус числа |
|---|---|---|
| Хостинг цілком — 9,67 $ за курсом 42 | 400 | з уроку 1, перевіряється |
| Підписка на редактор для макетів | 400 | ілюстративне |
| Місце для точки видачі — полиця в майстерні | 1200 | ілюстративне |
| Мінімальна реклама, щоб про тебе дізналися | 900 | ілюстративне |
| Упаковка, куплена партією наперед | 1100 | ілюстративне |
fixed_costs | 4000 | сума |
Точка беззбитковості — це кількість продажів, за якої дохід дорівнює витратам. Ні збитку, ні прибутку.
Чому CEILING, а не звичайне округлення. Постійні витрати
4050, маржа 80. Ділення дає 50,6.
П’ятдесятьма продажами ти закриєш лише 4000. Лишиться 50 грн збитку. А половини продажу не буває.
Тому округлюють завжди вгору: 51. Автоперевірка звіряє це число точно, без похибки — округлення вниз вона не прийме.
Маржа з одиниці — 80 грн, постійні витрати — 4000 грн на місяць. Скільки продажів потрібно, щоб вийти в нуль?
Постав свої числа — і подивись, скільки продажів на день це означає
Це той самий розрахунок, що на схемі вище, тільки живий. Тягни повзунок ціни — графік перемальовується одразу.
Дивись не на плашки з числами, а на останній рядок — вердикт. Він рахує не «скільки продати», а «яка частина твоєї аудиторії має купити». Саме тут більшість планів і розсипається.
Аудиторія за замовчуванням — 600 учнів школи. Днів продажу 21 — це навчальні дні місяця; якщо ти продаєш і у вихідні, постав 30.
analytics.html: маржа з одиниці,
fixed_costs (у мета-тег) і break_even_units.
Автоперевірка звірить третє з перших двох за формулою ceil.Ціна 200 грн, змінні витрати 120 грн, постійні 4000 грн на місяць. Скільки продажів на день це означає — і чи реально це для школи на 600 учнів?
План — це число, яке ти можеш захистити. Решта — побажання
У пітчах постійно трапляється рядок «за перший місяць продамо 1000 підписок». Питання до нього завжди одне й те саме: звідки 1000? Якщо у відповідь звучить «ну, школа велика» — це не план, а бажання.
Хороше число будується у зворотному напрямку. Спершу рахуєш, скільки треба для нуля. Потім дивишся, яка це частка від реальної аудиторії. І аж тоді говориш, скільки продаси.
| Питання | Приклад відповіді |
|---|---|
| Скільки треба продати для нуля? | 50 на місяць |
| Хто взагалі може це купити? | 600 учнів школи |
| Яка це частка аудиторії? | 50 / 600 ≈ 8,3 % — кожен дванадцятий |
| Скільки це на день? | 50 / 21 ≈ 2,4 продажу на навчальний день |
| Скільки з цих людей уже сказали «купив би»? | дані з market.csv, урок 3 |
| І тільки тепер: скільки продамо? | число, яке ти можеш захистити |
Це не поразка, а результат розрахунку. Важелів рівно три, і кожен видно у формулі.
| Важіль | Що робить із точкою беззбитковості | Ціна кроку |
|---|---|---|
| Підняти ціну | маржа росте — точка падає найшвидше | частина покупців піде; треба аргумент цінності |
| Знизити змінні витрати | маржа росте так само, як від підняття ціни | дешевші матеріали = нижча якість; партія = гроші наперед |
| Зрізати постійні витрати | точка падає прямо пропорційно | відмова від оренди, підписки, реклами |
| Змінити продукт або аудиторію | переписуються всі три числа | найчесніший вихід, якщо перші три не рятують |
Підняти ціну — найсильніший важіль. Ціна 200 при змінних 120 дає маржу 80. Піднімеш ціну до 220 — це плюс 10 %.
А маржа стане 100. Це вже плюс 25 %. Точка беззбитковості впаде з 50 до 40.
Чому так. Змінні витрати нікуди не поділися, і вся надбавка пішла в маржу. Тому маленький крок по ціні дає великий крок по маржі.
У пітчі однокласника написано: «продамо 1000 підписок за перший місяць». Що спитати першим?
Порахував: для виходу в нуль потрібно 400 продажів на місяць, а твоя аудиторія — 600 учнів. Що з цим робити?
Ціна — це рішення, а не наслідок. Її обирають, а не знаходять
Коли треба поставити ціну, майже всі роблять одне й те саме. Беруть собівартість і додають «скільки не шкода».
Це один із трьох підходів. І зазвичай найслабший.
| Підхід | Питання, на яке він відповідає | Ризик |
|---|---|---|
| Від витрат cost-plus |
Скільки мені це коштувало і скільки я хочу зверху? | Покупцеві байдужі твої витрати. Можна поставити і надто дешево, і надто дорого — обидва рази мимо |
| Від конкурентів competitive |
Скільки беруть за схоже? | У конкурента інші витрати й інші обсяги. Його ціна може бути для тебе збитковою |
| Від цінності value-based |
Скільки покупець виграє від того, що купив? | Цінність треба вміти показати, інакше вона не працює як аргумент |
Конкурент продає схожий значок за 60 грн, а твоя собівартість — 55 грн. Найрозумніша перша дія?
Твій сервіс економить репетиторові 4 години на місяць, а година його роботи коштує 300 грн. Який підхід до ціни це підказує?
Одна діаграма — одна думка. Підпис містить висновок, а не назву
Діаграму ставлять на сторінку не тому, що «має бути картинка». Вона доводить одну конкретну думку швидше за текст.
Прочитай свою діаграму й скажи, що з неї випливає. Не виходить — діаграма тут зайва.
Ще одна перевірка. Опиши одним реченням, що діаграма показує. Якщо в реченні з’явилося «а ще» або «і водночас» — це дві діаграми, які злиплися в одну.
Три частини, усі обов’язкові:
| Назва (слабко) | Висновок (сильно) |
|---|---|
| Продажі за сегментами | Сегмент «11 клас» дав 350 грн із 1380 — майже вдвічі менше за 9-А, і це найслабший сегмент, тому рекламу тут не продовжуємо |
| Динаміка реєстрацій | Після оголошення в чаті реєстрації зросли з 3 до 14 за день — повторюємо оголошення щопонеділка |
| Структура витрат | Оренда полиці — 1200 грн із 4000 постійних витрат: відмова від неї опускає точку беззбитковості з 50 до 35 продажів |
<li class="insight">
У analytics.html має бути рівно три висновки, і в кожному —
число, яке справді існує в market.csv. Автоперевірка звіряє їх
із файлом до одного знака після коми. У підписі «Сегмент А найбільший» числа
немає, тому такий висновок перевірка поки не прийме. Допиши число з таблиці —
і пункт стане зеленим.Під діаграмою написано «Кількість покупців за каналами». Що з цим підписом не так?
Інлайновий <svg> замість скриншота — і це не примха вчителя
Спокуса зрозуміла. Побудував діаграму в Sheets, зняв екран, вставив
<img> — готово.
Але знімок екрана — це сітка кольорових крапок. Число 34 на ньому вже не число, а візерунок. Виправити його на 36 не вийде: доведеться перебудовувати діаграму й знімати екран заново.
| Критерій | Скриншот PNG | Інлайновий SVG |
|---|---|---|
| На великому екрані й на ретині | розмивається, видно пікселі | малюється заново під будь-який розмір |
| У темній темі | лишається білою плямою | currentColor підхоплює колір теми |
| Вага | сотні кілобайт | кілька кілобайт тексту |
| Правка числа | перебудувати діаграму й перезняти | змінити одне число в розмітці |
| Пошук і скрінрідер | нічого не бачать | читають <title> і підписи |
| Мережа | окремий запит до сервера | уже всередині сторінки, запиту немає |
| Правила модуля | растр на сервер не їде | текст, FTP приймає без питань |
«Інлайновий» означає «прямо в HTML» — не окремим файлом і не через
<img src="chart.svg">.
Тільки так діаграма підхоплює колір і шрифт сторінки. І тільки так до неї дістається твій CSS.
<title> усередині <svg> — це
назва діаграми для скрінрідера, і саме її шукає автоперевірка. Якщо
<title> порожній або його немає зовсім, пункт лишиться
червоним, поки ти його не допишеш.viewBox замість жорстких width і
height — інакше діаграма не масштабується і ламає верстку
на телефоні.fill="currentColor" замість кольору літералом — тоді
діаграма сама перефарбовується під світлу й темну тему. Відтінки робляться
через opacity, а не через десять різних кольорів.~/www/
цього уроку має бути тільки текст.Чому діаграму в analytics.html роблять інлайновим
<svg>, а не скриншотом PNG?
Свої дані → інлайновий SVG → готовий код для analytics.html
Устав свої числа, обери тип, напиши підпис-висновок — і забери код.
Генератор малює діаграму власним кодом сторінки, без жодної бібліотеки.
Те, що ти скопіюєш, — звичайна розмітка. В analytics.html
вона працюватиме так само.
Згенерований код навмисно використовує currentColor
і opacity замість конкретних кольорів: така діаграма однаково
читається у світлій і темній темі та не тягне за собою brand.css,
якого на уроці 4 ще немає.
Виконуй по черзі. Галочки зберігаються — сторінку можна закрити
analytics.html → ~/upload/ →
~/www/. Скриншоти діаграм і чернетки лишаються на машині —
їх учитель дивиться очно, на твоєму екрані.analytics.html у UTF-8 без BOM. Якщо збираєш файл
скриптом у PowerShell, > дасть UTF-16, а -Encoding utf8
додасть BOM — парсер сторінки на сервері спіткнеться об перший рядок.
Надійний спосіб — просто зберегти файл у редакторі, обравши UTF-8.Друга частина check11 3. Спроби не обмежені
Демонстраційний режим: результат згенеровано для показу.
На сервері ця кнопка запускає check11 3 від імені учня —
утиліта робить реальний запит на твій сабдомен, парсить
analytics.html і звіряє числа з data/market.csv.
break_even_units має дорівнювати ceil(fixed_costs / margin)
з похибкою рівно 0. Округлення вниз або «на око» дає розбіжність на одиницю —
і пункт червоний. fixed_costs утиліта бере не з таблиці,
а з мета-тега <meta name="fixed-costs">: якщо його немає,
перевіряти нічим.~/www/;Це те, що бачить учитель, коли виставляє оцінку
| Складник | Вага | Результат |
|---|
break_even_units округлено вниз замість ceil.<svg>.market.csv і відповідь на питання «і що з цього випливає
для продукту?».CHANGELOG.md одним рядком із датою.brand.css із дизайн-токенами. Кольори з нього
повернуться сюди: діаграма на analytics.html зможе брати
var(--brand-accent) замість currentColor.Усе, що можна перевірити, — з відкритої документації й довідників. Перевіряти дозволено й корисно
viewBox, масштабування й система координат —
MDN. developer.mozilla.org · viewBoxcurrentColor як значення кольору — MDN.
developer.mozilla.org · currentColor<title> і role="img" —
специфікація SVG 2 і рекомендації W3C.
w3.org · SVG 2, titleCEILING у Google Таблицях — довідка функції.
support.google.com · CEILINGПовний список із поясненнями — у файлі
urok-04-джерела.md поруч із цією сторінкою. Усі суми в гривнях
на сторінці, крім рядка «хостинг» з уроку 1, — ілюстративні: вони показують
хід розрахунку, а не реальний прайс. Курс 42 грн за долар узятий округлено;
підстав поточний курс НБУ, і числа зміняться.