1. Навіщо взагалі думати про монетизацію саме зараз
До цього модуля головне питання звучало так: «це взагалі працює?». Тепер додаємо наступний рівень складності: «а чи окупається це?».
Для LLM‑застосунків це особливо болюче. Змінні витрати (LLM‑токени, rerank‑моделі, ембеддинги) легко «з’їдають» ваші звичні «сервер за $20 і Postgres за $15». Ігнорувати це — означає наприкінці місяця отримати рахунок від OpenAI, співмірний із виплатою за іпотекою.
Тож сьогодні в нас три великі теми:
- Які є моделі монетизації для ChatGPT App — і, зокрема, для нашого GiftGenius.
- Як пов’язати pricing ↔ cost_per_task і не продавати «100 підборів подарунків за $1», якщо один підбір уже коштує $0,15.
- Як ставити A/B‑експерименти «вартість ↔ якість»: змінювати модель, промпти, UX і логувати все так, щоб за кілька тижнів ухвалювати рішення на основі даних, а не відчуттів.
Водночас ми поступово готуємося до наступного модуля про LLM‑evals і quality_score, але в код поки не занурюємося.
2. Моделі монетизації ChatGPT App: B2C, B2B, фріміум і upsell
Якщо відкинути магію LLM, моделі монетизації тут дуже схожі на ті, що використовують у звичайних SaaS‑ і мобільних застосунках. Проте в розмовному (conversational) інтерфейсі є нюанс: користувач часто не відчуває, «де безплатно, а де вже платно». Це потрібно акуратно закладати в UX.
Розберімо основні варіанти на прикладі GiftGenius.
B2C: звичайні користувачі й подарунки
Тут ваші клієнти — звичайні люди, які приходять у ChatGPT і просять: «підібери подарунок для фаната космосу за 50 доларів». Ви можете продавати не свої товари, а лише послугу підбору подарунків для користувача.
Типові B2C‑моделі:
- Разова покупка.
Користувач платить за конкретний сценарій. Наприклад: безплатні 3 ідеї, далі — платний «пакет» ще з 10 ідей для одного отримувача. - Підписка.
Щомісячна плата за доступ. У GiftGenius це може бути «до 100 підборів на місяць» або «необмежені підбори для частого дарувальника». - Фріміум (безплатний і платні рівні / free vs paid tiers).
Базовий сценарій безплатний (до N підборів на місяць, урізаний функціонал), а платний дає вищі ліміти, потужнішу модель, додаткові формати підборів та історію. Це найтиповіша модель для ChatGPT App: «усередині ChatGPT — базово безплатно, а преміум‑можливості — за гроші». - Upsell усередині застосунку.
Користувач робить безплатний базовий підбір, бачить нормальний результат — і ви м’яко пропонуєте: «хочете, за $X я зроблю глибокий підбір з урахуванням вішліста, соцмереж тощо?» або «оформіть одразу подарунковий сертифікат».
B2B: команди, компанії та корпоративні подарунки
Тут у гру вступають HR, відділи маркетингу та «люди, які відповідають за подарунки співробітникам і клієнтам».
Традиційний набір:
- Ліцензія за користувача (per seat).
Наприклад, план «HR‑Team» на 10 осіб: кожен має доступ до GiftGenius, а також звіти щодо подарунків і бюджетів. - Ліцензія за компанію (per company).
«До 500 співробітників, фіксована ціна на місяць, усередині — скільки завгодно підборів». - Додаткові enterprise‑функції.
Окрема адмінпанель, інтеграції з HRIS/CRM, кастомні звіти, SLA.
В обох випадках ви рахуєте не «скільки коштує один підбір», а cost_per_user_per_month або cost_per_tenant_per_month — і порівнюєте це з ціною ліцензії.
Як обрати модель для GiftGenius
Щоб не застрягти в теорії, можна почати з простого стартового варіанта:
- B2C: фріміум.
3 підбори на місяць безплатно, далі — підписка за $5 на місяць із необмеженими підборами та преміальною моделлю. - B2B: за компанію.
Тариф «HR‑команда» за $99 на місяць, що включає до 500 підборів для співробітників, інтеграцію з HR‑системою та звітність.
Далі, коли з’являться реальні дані щодо cost_per_task і конверсії, усе це можна підлаштовувати. Наразі ці цифри, по суті, взяті «зі стелі»: вони здаються розумними, але ми ще не перевірили, у скільки нам обходиться один завершений сценарій. У наступному розділі пов’яжемо такі тарифи з реальною собівартістю — cost_per_task.
3. Зв’язок ціни та собівартості: що таке cost_per_task
Тепер переходимо до найважливішого: як не влаштувати собі благодійний фонд імені GPT‑5.
Інтуїція: ціна ≥ cost_per_task × маржа
У попередній темі ви вже бачили поняття cost_per_task. Це сукупні витрати на один успішно завершений сценарій: від «користувач почав підбір» до «отримав результат» (і, можливо, щось оплатив).
Сюди входять:
- витрати на LLM (tokens × price_per_token на вхід/вихід, включно з rerank‑моделями, ембеддингами тощо);
- частка інфраструктурних витрат на одне завдання (task) (сервери, БД, черги, MCP‑шлюз) — часто це рахують за агрегованими даними;
- за потреби — транзакційні витрати (Stripe fee, перевірки на шахрайство), якщо ви рахуєте cost_per_task до «грошей на руки».
Ідея проста: ціна сценарію або підписки має бути вищою за середню собівартість одного сценарію, помножену на запас маржі.
Якщо дуже спростити:
price_per_task >= cost_per_task * ( 1 + margin )
Ми не будемо захаращувати лекцію цифрами й відсотками маржинальності. Тут важливе саме інтуїтивне правило.
Приклад для GiftGenius
Припустімо, ви вже впровадили cost‑логування з минулої лекції й тепер маєте агрегований звіт:
- середній cost_per_task (один завершений підбір подарунка) = 0,15 USD;
- сюди вже включено LLM‑токени (кілька викликів suggest_gifts, rerank і фінальний summary) та частку інфраструктури.
Далі ви дивитеся на сценарій:
- безплатний користувач робить підбір і зрідка купує сертифікат на $50;
- конверсія в покупку серед завершених підборів — скажімо, 5 %.
Поки ми не занурюємося в повну юніт‑економіку, але вже можна прикинути: якщо зі 100 підборів:
- ви витрачаєте 100 × $0,15 = $15;
- із них 5 закінчуються оформленням покупки на $50;
- виручка: 5 × $50 = $250.
Виглядає непогано: грубо кажучи, ( $250 – $15), плюс комісії Stripe, податки та інші «приємності». Але важливо розуміти й інше: якщо підписка буде надто щедрою (скажімо, 100 підборів за $1), ви легко підете в мінус.
Міні‑приклад коду: збереження cost_per_task у TypeScript
Припустімо, у вас є MCP‑tool, який завершує робочий процес підбору й знає його загальний cost:
// Тип для фінальних метрик сценарію
type TaskMetrics = {
taskId: string;
userId: string;
costPerTaskUsd: number;
modelName: string;
completedAt: string;
};
// Умовна функція логування метрик
async function logTaskMetrics(metrics: TaskMetrics) {
console.log(JSON.stringify({
level: "info",
event: "workflow_completed",
...metrics,
}));
}
// Десь у коді обробника завершення підбору:
await logTaskMetrics({
taskId: context.taskId,
userId: context.userId,
costPerTaskUsd: context.costEstimateUsd, // пораховано з токенів
modelName: context.modelName,
completedAt: new Date().toISOString(),
});
Такий лог потім легко агрегувати в дашборді, щоб бачити розподіл cost_per_task за моделями, користувачами й сценаріями.
4. Pricing: як переводити cost_per_task у реальні ціни
Тепер, коли cost_per_task у нас є, треба вирішити: за що саме й скільки брати з користувача.
Просте правило для B2C
Для B2C можна взяти емпіричне правило:
«Ми готові витрачати на LLM та інфраструктуру не більше X % від виручки».
Наприклад, ви вирішуєте, що не хочете витрачати більше 20 % виручки на LLM‑витрати. Тоді:
- якщо cost_per_task = $0,15, то мінімальна ціна за один платний сценарій має бути ≈ $0,75, щоб 0,15 було приблизно 20 % від 0,75;
- якщо ви продаєте підписку, то оцінюєте, скільки усереднених сценаріїв припаде на одного підписника за місяць, і множите.
Цілком нормально починати «на око», а потім коригувати ціни, коли з’являться реальні дані (спойлер: не одразу).
Просте правило для B2B
У B2B зазвичай дивляться на:
- cost_per_user_per_month або cost_per_tenant_per_month;
- готовність бізнесу платити (тобто масштаб проблеми, яку ви розв’язуєте).
Наприклад, якщо HR‑команда через GiftGenius розподіляє подарунки на десятки тисяч доларів на рік, підписка за $99 на місяць виглядає скромно — навіть якщо ваші LLM‑витрати на цю команду всього $10 на місяць. Головне — не опинитися в ситуації, де cost_per_tenant = $80, а підписка — $50.
Таке теж трапляється, коли логіка приблизно така: «ми ж AI, давайте поки все буде безплатно, а там розберемося».
Невелика функція‑«охоронець» на сервері
Можна прямо в коді мати простий «guard», який підкаже, чи не вийшла вартість за розумні межі під час вибору ціни:
function checkPricingSafety(params: {
avgCostPerTaskUsd: number;
plannedPricePerTaskUsd: number;
maxCostShare: number; // наприклад, 0.3 = 30%
}): boolean {
const share = params.avgCostPerTaskUsd / params.plannedPricePerTaskUsd;
return share <= params.maxCostShare;
}
// Приклад:
checkPricingSafety({
avgCostPerTaskUsd: 0.15,
plannedPricePerTaskUsd: 0.75,
maxCostShare: 0.3,
}); // true — ок, 20% < 30%
Це не замінює фінансову модель, але дає швидку перевірку на здоровий глузд. Особливо корисно, коли ви експериментуєте з цінами.
5. Експерименти «модель / агент: вплив на cost і конверсію»
Тепер переходимо до найцікавішого: A/B‑експериментів.
Інтуїція проста:
- Варіант A — дорога модель / складніший робочий процес;
- Варіант B — дешева модель / спрощений робочий процес;
- ми хочемо зрозуміти, як це одночасно впливає на:
- cost_per_task,
- якість результату (за відчуттями користувача та за майбутніми LLM‑оцінками),
- бізнес‑метрики (конверсію, виручку).
З чим саме експериментувати
Є три основні осі експериментів:
- Модель.
Наприклад, GPT‑5 проти GPT‑5‑mini або взагалі інша лінійка. Зазвичай дорога модель дає кращу якість і вищий cost_per_task, дешева — навпаки. - Агентна логіка / промпти.
Детальніші кроки, довші промпти, складніше міркування (reasoning) — якісніше, але дорожче. Мінімалістична логіка — дешевше й іноді майже без втрати якості. - UX‑формат.
Довгий «майстер» із купою полів і підказок проти швидкого inline‑режиму. Навіть якщо модель та сама, кількість токенів і кроків може відрізнятися в рази.
Усі ці варіації ви вже можете впроваджувати. Важливо лише оформлювати їх як експерименти з логуванням.
Які поля логувати для експериментів
Поверх полів, які ви логували для cost (tokens, model, cost_estimate, user_id, request_id тощо), додаються експериментальні поля:
- experiment_id — унікальний ідентифікатор експерименту (наприклад, "gift_model_ab_2025_11").
- variant — яка гілка в конкретного користувача: "A", "B", "control", "treatment" тощо.
- model_name або agent_version — щоб потім не гадати, яка конфігурація стояла.
- результат сценарію:
- чи був workflow_completed;
- чи був checkout_success;
- підсумковий cost_per_task.
- опційно — quality_score (про нього трохи згодом: це місток у модуль про LLM‑evals).
Приклад JSON‑лога події експерименту
Типова лог‑подія може виглядати так:
{
"level": "info",
"timestamp": "2025-11-21T20:15:03.123Z",
"event": "experiment_task_result",
"experiment_id": "gift_model_ab_2025_11",
"variant": "A",
"user_id": "user_123",
"task_id": "task_456",
"model_name": "gpt-5.2",
"workflow_completed": true,
"checkout_success": false,
"cost_per_task_usd": 0.18,
"quality_score": null,
"request_id": "req_abc",
"trace_id": "trace_xyz"
}
Такі записи чудово агрегуються в будь‑якій аналітиці. Наприклад, можна будувати таблиці на кшталт «variant A vs B за cost/конверсією/доходом».
Приклад коду: логування експерименту в MCP‑tool
Уявімо, що ваш MCP‑сервер уже порахував вартість сценарію (cost_per_task) і знає, у якій гілці експерименту перебуває користувач:
type ExperimentContext = {
experimentId: string;
variant: "A" | "B";
};
async function logExperimentResult(params: {
ctx: ExperimentContext;
userId: string;
taskId: string;
modelName: string;
costPerTaskUsd: number;
workflowCompleted: boolean;
checkoutSuccess: boolean;
}) {
const event = {
level: "info" as const,
event: "experiment_task_result",
timestamp: new Date().toISOString(),
experiment_id: params.ctx.experimentId,
variant: params.ctx.variant,
user_id: params.userId,
task_id: params.taskId,
model_name: params.modelName,
cost_per_task_usd: params.costPerTaskUsd,
workflow_completed: params.workflowCompleted,
checkout_success: params.checkoutSuccess,
};
console.log(JSON.stringify(event));
}
Десь вище ви вирішуєте, до якого варіанта належить користувач (за user_id, tenant_id або випадково), і передаєте ExperimentContext в обробник workflow. На цьому рівні ми зафіксували, що і як логувати для експериментів: які поля потрібні та де їх записувати. Далі поговоримо про те, як перетворювати такі експерименти на зрозумілі продуктові гіпотези й рішення щодо pricing, а не просто на набір логів.
6. Тепер трохи про quality_score і LLM‑evals
Докладніше я розповім про цю тему в 20‑му модулі, а зараз лише поділюся ідеєю. quality_score — це оцінка якості відповіді чи розв’язання за шкалою, наприклад, від 0 до 10. Часто її ставить окрема LLM‑модель‑«суддя». Про підхід LLM‑as‑judge я теж говоритиму в 20‑му модулі.
Зараз нам не потрібні деталі реалізації — це тема наступного модуля. Але важливо зрозуміти саму концепцію:
- окрім грошей, ми хочемо вимірювати ще й якість;
- ми можемо попросити або людину, або другу модель оцінити: «наскільки добре GiftGenius підібрав подарунок за 10‑бальною шкалою?»;
- далі ми можемо дивитися, як quality_score корелює з:
- конверсією в покупку;
- утриманням користувачів;
- willingness‑to‑pay (готовністю платити).
З погляду логів це просто ще одне поле:
type ExperimentResultEvent = {
experiment_id: string;
variant: string;
user_id: string;
task_id: string;
cost_per_task_usd: number;
quality_score?: number; // 0-10, може бути undefined
};
На цьому в межах сьогоднішньої лекції зупинимося. Деталі LLM‑evals, golden‑кейсів і «LLM‑as‑judge» будуть далі за курсом. Поки що достатньо розуміти, куди цей score потім «вбудувати» в експерименти. Саме quality_score рятує від класичної помилки оптимізації «лише під вартість»: він дає змогу чисельно побачити, де ми вже надто здешевили сценарій, почали втрачати якість — а разом із нею конверсію та виручку.
7. Як використовувати експерименти для pricing і монетизації
Тепер ми не просто логуємо експерименти, а оформлюємо їх як зрозумілі бізнес‑гіпотези: із метриками успіху та впливом на монетизацію. Самого логування experiment_id недостатньо. Важливо описувати зміни продукту як гіпотези з чіткою метрикою успіху.
Приклад гіпотези: дорога модель проти дешевої
Уявімо такий експеримент для GiftGenius:
- Варіант A — дорога модель (GPT‑5), потужний reasoning, довгий «майстер».
- Варіант B — дешева модель (GPT‑5‑mini), трохи простіший промпт і коротша взаємодія.
Гіпотеза: заміна моделі на дешевшу зменшить cost_per_task щонайменше на 50 %. Водночас якість за оцінкою користувача й LLM‑оцінкою (наш quality_score) упаде не більш ніж на 5–10 %, а конверсія в покупку не знизиться.
Технічно для кожного task ви логуєте ті самі поля, що й у розділі 5.2:
- experiment_id = "gift_model_ab_2025_11";
- variant = "A" або "B";
- model_name;
- cost_per_task_usd;
- workflow_completed;
- checkout_success;
- quality_score (коли з’являться LLM‑evals).
За тиждень‑два ви можете:
- побудувати середній cost_per_task для A і B;
- порівняти checkout‑rate (частку сценаріїв з успішною оплатою);
- порівняти середній quality_score, якщо він є.
Якщо B майже не програє в якості, але вдвічі дешевший, ви можете:
- перейти на B і підвищити маржу;
- або зберегти ціну, але знизити вартість підписки для користувача — і так підсилити зростання.
Приклад гіпотези: якісний upsell
Інша гіпотеза: якщо після безплатних 3 ідей показувати преміальний upsell «повний звіт про подарунки + рекомендації щодо тексту листівки» за $4.99, конверсія в покупку зросте хоча б на 2 відсоткові пункти (2 в.п.). Водночас cost_per_task збільшиться не більш ніж на $0,05.
Тут експеримент уже не стільки про модель, скільки про UX і продуктову логіку. Але технічно все те саме:
- різні варіанти UX за variant;
- логування cost і revenue на сценарій;
- аналіз uplift (наскільки нова логіка принесла більше грошей і не роздула витрати).
Приклад коду: запис простої виручки за сценарієм
Іноді зручно поруч із cost писати й виручку за сценарієм:
type RevenueEvent = {
taskId: string;
userId: string;
experimentId?: string;
variant?: string;
revenueUsd: number;
checkoutSuccess: boolean;
};
async function logRevenue(event: RevenueEvent) {
console.log(JSON.stringify({
level: "info",
event: "task_revenue",
timestamp: new Date().toISOString(),
...event,
}));
}
Пов’язавши потім task_revenue і experiment_task_result за taskId, можна рахувати для кожної гілки:
- середній revenue_per_task;
- середній cost_per_task;
- і будувати найпростішу оцінку ROI.
8. Практична вправа: A/B‑експеримент для GiftGenius
Щоб було на що спиратися й прив’язати теорію до практики, давайте розберімо, як виглядав би експеримент «дорога проти дешевої моделі» для GiftGenius — крок за кроком, у форматі практичної вправи.
Що ми змінюємо
- Варіант A:
- модель gpt-5;
- детальніший system‑prompt і кроки агента;
- можливо, більше проміжних reasoning‑викликів.
- Варіант B:
- модель gpt-5-mini;
- дещо компактніший промпт;
- менше допоміжних tool‑викликів, спрощений флоу.
Як ми розподіляємо користувачів по гілках
Найпростіший спосіб — за хешем від user_id:
function assignVariant(userId: string): "A" | "B" {
const hash = Array.from(userId).reduce((acc, ch) => acc + ch.charCodeAt(0), 0);
return hash % 2 === 0 ? "A" : "B";
}
Так ви гарантуєте приблизно рівномірний розподіл, і один користувач завжди потрапляє в одну й ту саму гілку.
Що логуємо
Під час завершення workflow підбору ви логуєте той самий набір полів, що й у попередніх розділах (5.2 і 7.1), і додаєте виручку:
- experiment_id = "gift_model_ab_2025_11";
- variant із функції вище;
- model_name, фактично використана модель;
- cost_per_task_usd, сумарна вартість токенів та інфраструктури;
- workflow_completed (true/false);
- checkout_success (true/false);
- revenue_usd (0 або сума покупки).
Опційно (трохи пізніше в курсі) додасться quality_score.
Далі ці дані потрапляють у ваш лог або аналітику, де їх можна розкласти по таблицях:
| experiment_id | variant | avg_cost_per_task | checkout_rate | avg_revenue_per_task |
|---|---|---|---|---|
| gift_model_ab_2025_11 | A | $0,22 | 6,0 % | $3,50 |
| gift_model_ab_2025_11 | B | $0,09 | 5,8 % | $3,40 |
З такої таблиці видно: B дає майже стільки ж грошей — за вдвічі меншої вартості. Це сильний аргумент на його користь.
9. Візуальна схема: як виглядає контур «вартість ↔ якість ↔ монетизація»
Щоб зібрати все разом, намалюймо невелику схему в дусі «дані ходять туди‑сюди»:
flowchart TD
U[Користувач у ChatGPT] --> A["ChatGPT App (GiftGenius)"]
A --> E[Модуль експерименту
призначає variant A/B]
E --> AG[Агент / MCP tools
з різними моделями]
AG -->|LLM-виклики| L[Журнали usage & cost]
AG -->|Результати підбору| UI[Віджет / чат-відповідь]
UI -->|поведінка: кліки, покупки| BE[Commerce backend]
L --> M[Метрики: cost_per_task,
cost_per_user]
BE --> M
M --> D[Дашборд pricing & експериментів]
subgraph "Майбутній модуль 20"
J[LLM-суддя
quality_score]
J --> M
end
Зараз ви рівно посередині цієї схеми: уже вмієте логувати cost і виручку, а тепер додаєте поверх цього експерименти та pricing. У наступному модулі додасться тема «судді» (LLM‑суддя).
10. Типові помилки під час роботи з монетизацією та експериментами
Коли в голові є загальна схема, легше помітити, де зазвичай усе ламається. Нижче — набір типових помилок. Його зручно тримати під рукою як чек‑лист під час роботи з монетизацією та експериментами щодо cost.
Помилка №1: оптимізувати лише під вартість і забувати про якість.
Поширений сценарій: ви переходите на дешевшу модель, бачите, що рахунок від OpenAI приємніший, і оголошуєте перемогу. А потім за місяць помічаєте, що користувачі рідше купують подарункові сертифікати, гірше повертаються, а в підтримці з’являється більше звернень на кшталт «мені запропонували якусь нісенітницю». Якщо не логувати ні quality_score, ні хоча б проксі‑метрики (кліки по ідеях, збереження, конверсії), легко перейти в режим «дешево, але даремно».
Помилка №2: рахувати cost_per_task лише за LLM і ігнорувати інфраструктуру та платежі.
Іноді розробники акуратно рахують токени, але забувають про Redis, черги, сторонні API, Stripe fee та інше. У результаті cost_per_task виходить суттєво заниженим, і ціни здаються комфортнішими, ніж є насправді. Інфраструктуру зазвичай рахують за агрегованими даними, але її частку все одно потрібно закладати в собівартість сценарію.
Помилка №3: змінювати моделі/UX без явних experiment_id і variant.
«Ми тут трохи переписали промпт — ніби стало краще»; за місяць ніхто не пам’ятає, коли саме змінили, на яких даних це базується і до чого призвело. Без явного маркування експериментів у логах (experiment_id, variant) і прив’язки до конкретних релізів складно аналізувати ретроспективу та доводити, що поліпшення не випадкові.
Помилка №4: ухвалювати рішення на надто малих даних або надто рано.
Якщо експеримент триває два дні й ви на підставі десяти оплат вирішуєте, що модель B «набагато вигідніша», це класичний приклад висновку зі статистичного шуму. Потрібен щонайменше мінімальний горизонт — тиждень, а краще більше — і достатня кількість сценаріїв, щоб порівнювати середні значення та конверсії. У цій лекції ми не занурюємося в статистику, але правило «не робіть висновків за 5 подіями» варто тримати в голові.
Помилка №5: використовувати складне ціноутворення без простого правила.
Можна намалювати трирівневий тарифний план, ціни в різних валютах і знижки за реферальними кодами — і водночас не мати простого продуктового правила на кшталт «на LLM‑cost ми готові витрачати не більше X % виручки» або «ціна сценарію не має опускатися нижче 3× середній cost_per_task». Без таких обмежувачів легко втратити маржу й не помітити цього до кінця місяця.
Помилка №6: забувати про зв’язок монетизації з маркетингом і зростанням.
Монетизація і pricing не живуть у вакуумі: що дорожча підписка, то вищий відтік і нижча конверсія; що нижча ціна, то вищі вимоги до cost‑оптимізації. Помилка — дивитися лише на «скільки ми зараз заробляємо» і не пов’язувати це з метриками залучення/активації/утримання (acquisition/activation/retention), про які йтиметься в наступній темі модуля. Експерименти щодо pricing краще одразу логувати в тому ж ключі, що й експерименти щодо якості та cost, щоб бачити повну картину.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ