<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Стратегія Розвитку SMM-Відділу | LOCOMOTIVE</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
<!-- Chosen Palette: Calm Corporate -->
<!-- Application Structure Plan: The SPA is designed as a persuasive narrative for management, flowing from problem to solution. It starts with a high-level dashboard (Section 1), dives into a detailed diagnosis of financial and operational problems (Section 2), presents the new standardized model as the solution (Section 3), demonstrates the financial payoff with an interactive calculator (Section 4), directly addresses key management concerns like fixed costs vs. freelancers (Section 5), outlines potential risks and mitigation strategies (Section 6), and concludes with a clear implementation roadmap (Section 7). This structure guides the user logically through the argument, making the complex strategy easy to understand and approve. -->
<!-- Visualization & Content Choices:
- Goal: Show current vs. target state -> Method: KPI cards (HTML/Tailwind) -> Interaction: Static -> Justification: Quick, high-impact overview.
- Goal: Highlight financial instability -> Method: Bar Chart (Chart.js) showing extreme project profitability variance -> Interaction: Hover for details -> Justification: Visually demonstrates the chaos and lack of control.
- Goal: Show operational chaos -> Method: Large number comparison (HTML/Tailwind) for "Promise vs. Reality" (7 vs 95 specialists) -> Interaction: Static -> Justification: A powerful, memorable visual punch.
- Goal: Explain the new financial model -> Method: Donut Chart (Chart.js) breaking down the 65k UAH check -> Interaction: Hover for details -> Justification: Clearly shows the "golden standard" of 40% profitability.
- Goal: Present the new team -> Method: Structured org chart (HTML/Tailwind) -> Interaction: Static -> Justification: Clearly defines roles and scalability.
- Goal: Demonstrate financial potential -> Method: Interactive slider/calculator (JS) -> Interaction: User can drag slider to see profit change -> Justification: Engages management, allows them to 'own' the projection, and builds confidence.
- Goal: Address freelancer vs. in-house debate -> Method: Comparison Table (HTML/Tailwind) -> Interaction: Static -> Justification: Directly compares pros and cons to overcome a key objection.
- Goal: Outline implementation -> Method: Visual Timeline (HTML/Tailwind) -> Interaction: Static -> Justification: Provides a clear, actionable plan.
- Library/Method: Chart.js for all charts (Canvas-based), custom JS for interactivity, Tailwind CSS for layout and styling. -->
<!-- CONFIRMATION: NO SVG graphics used. NO Mermaid JS used. -->
<style>
html { scroll-behavior: smooth; }
body {
font-family: 'Manrope', sans-serif;
background-color: #F8F7F4;
color: #2c3e50;
}
.nav-link {
transition: all 0.3s ease;
border-bottom: 2px solid transparent;
}
.nav-link:hover, .nav-link.active {
color: #3B82F6;
border-bottom-color: #3B82F6;
}
.kpi-card {
background-color: #FFFFFF;
border-radius: 0.75rem;
padding: 1.5rem;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
border: 1px solid #E5E7EB;
}
.kpi-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
}
.chart-container {
position: relative;
width: 100%;
max-width: 800px;
margin-left: auto;
margin-right: auto;
height: 400px;
max-height: 50vh;
}
@media (max-width: 768px) {
.chart-container {
height: 300px;
max-height: 60vh;
}
}
.section-title {
font-size: 2.25rem;
font-weight: 800;
line-height: 2.5rem;
color: #1a202c;
}
.section-subtitle {
font-size: 1.25rem;
color: #4a5568;
margin-top: 0.5rem;
}
.accent-bg { background-color: #EFF6FF; }
.accent-text { color: #3B82F6; }
.btn-primary {
background-color: #3B82F6;
color: white;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
font-weight: 600;
transition: background-color 0.3s ease;
}
.btn-primary:hover {
background-color: #2563EB;
}
.table-header {
background-color: #F3F4F6;
}
.timeline-item::before {
content: '';
position: absolute;
left: 1rem;
top: 1.5rem;
bottom: -1.5rem;
width: 2px;
background-color: #D1D5DB;
}
.timeline-item:last-child::before {
display: none;
}
.timeline-dot {
position: absolute;
left: calc(1rem - 0.5rem + 1px);
top: 1.5rem;
height: 1rem;
width: 1rem;
border-radius: 9999px;
background-color: white;
border: 2px solid #3B82F6;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 24px;
height: 24px;
background: #3B82F6;
cursor: pointer;
border-radius: 50%;
margin-top: -8px;
}
input[type=range]::-moz-range-thumb {
width: 24px;
height: 24px;
background: #3B82F6;
cursor: pointer;
border-radius: 50%;
}
</style>
</head>
<body class="antialiased">
<header class="bg-white/80 backdrop-blur-lg sticky top-0 z-50 shadow-sm">
<nav class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<div class="flex-shrink-0">
<h1 class="text-xl font-bold text-gray-800">LOCOMOTIVE | SMM Strategy</h1>
</div>
<div class="hidden md:block">
<div class="ml-10 flex items-baseline space-x-4">
<a href="#dashboard" class="nav-link px-3 py-2 rounded-md text-sm font-medium">Дашборд</a>
<a href="#problem" class="nav-link px-3 py-2 rounded-md text-sm font-medium">Проблема</a>
<a href="#solution" class="nav-link px-3 py-2 rounded-md text-sm font-medium">Рішення</a>
<a href="#forecast" class="nav-link px-3 py-2 rounded-md text-sm font-medium">Прогноз</a>
<a href="#risks" class="nav-link px-3 py-2 rounded-md text-sm font-medium">Ризики</a>
<a href="#roadmap" class="nav-link px-3 py-2 rounded-md text-sm font-medium">План</a>
</div>
</div>
</div>
</nav>
</header>
<main>
<section id="dashboard" class="py-16 md:py-24">
<div class="container mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-base font-semibold text-blue-600 tracking-wide uppercase">Стратегія розвитку SMM-відділу</h2>
<p class="mt-2 text-3xl font-extrabold text-gray-900 tracking-tight sm:text-4xl">Від операційного хаосу до прогнозованого прибутку</p>
<p class="mt-5 max-w-3xl mx-auto text-xl text-gray-500">Шлях до досягнення 40% рентабельності, масштабування до 20 клієнтів та побудови стійкої, керованої бізнес-моделі.</p>
<div class="mt-12 grid gap-8 md:grid-cols-2 lg:grid-cols-4">
<div class="kpi-card">
<h3 class="text-lg font-medium text-gray-500">Поточна рентабельність</h3>
<p class="mt-2 text-4xl font-bold text-red-500">24.43%</p>
</div>
<div class="kpi-card">
<h3 class="text-lg font-medium text-gray-500">Цільова рентабельність</h3>
<p class="mt-2 text-4xl font-bold text-green-500">40%</p>
</div>
<div class="kpi-card">
<h3 class="text-lg font-medium text-gray-500">Поточний середній чек</h3>
<p class="mt-2 text-4xl font-bold text-red-500">~53 000 грн</p>
</div>
<div class="kpi-card">
<h3 class="text-lg font-medium text-gray-500">Цільовий чек</h3>
<p class="mt-2 text-4xl font-bold text-green-500">65 000 грн</p>
</div>
</div>
</div>
</section>
<section id="problem" class="py-16 md:py-24 accent-bg">
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="section-title">Діагностика: Чому ми не досягаємо цілей?</h2>
<p class="section-subtitle max-w-3xl mx-auto">Наша поточна модель активно саботує власну ефективність. Аналіз даних виявив дві фундаментальні проблеми, що унеможливлюють зростання та стабільний прибуток.</p>
</div>
<div class="mt-16 grid md:grid-cols-2 gap-12 items-start">
<div class="bg-white p-8 rounded-lg shadow-lg">
<h3 class="text-2xl font-bold text-gray-900">1. Фінансова нестабільність</h3>
<p class="mt-4 text-gray-600">Ми не керуємо прибутком — ми на нього сподіваємось. Рентабельність окремих проєктів коливається від глибоко збиткової до надприбуткової, що унеможливлює будь-яке фінансове планування.</p>
<div class="mt-6 chart-container">
<canvas id="profitabilityChart"></canvas>
</div>
<p class="text-center text-sm text-gray-500 mt-2">Рентабельність ключових проєктів</p>
</div>
<div class="bg-white p-8 rounded-lg shadow-lg">
<h3 class="text-2xl font-bold text-gray-900">2. Операційний хаос</h3>
<p class="mt-4 text-gray-600">Існує величезна прірва між тим, що ми обіцяємо клієнтам, і тим, як ми працюємо насправді. Це створює приховані витрати, знижує якість та блокує масштабування.</p>
<div class="mt-8 grid grid-cols-2 gap-8 text-center">
<div>
<p class="text-6xl font-extrabold accent-text">7</p>
<p class="mt-2 text-lg font-medium text-gray-700">Спеціалістів у команді<br><span class="text-sm text-gray-500">(що ми обіцяємо клієнту)</span></p>
</div>
<div>
<p class="text-6xl font-extrabold text-red-500">95</p>
<p class="mt-2 text-lg font-medium text-gray-700">Унікальних фрилансерів<br><span class="text-sm text-gray-500">(з ким ми працюємо насправді)</span></p>
</div>
</div>
<p class="mt-8 text-gray-600">Наслідки: адміністративне перевантаження менеджерів, непослідовна якість, нульова масштабованість. Якщо для ~7 клієнтів потрібно 95 фрилансерів, для 20 знадобиться понад 300. Модель не витримає такого навантаження.</p>
</div>
</div>
</div>
</section>
<section id="solution" class="py-16 md:py-24">
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="section-title">Стратегічне рішення: Нова операційна модель</h2>
<p class="section-subtitle max-w-3xl mx-auto">Ми пропонуємо фундаментальний перехід від реактивного підходу до стандартизованого, прогнозованого та масштабованого продукту.</p>
</div>
<div class="mt-16 space-y-16">
<div class="grid md:grid-cols-2 gap-12 items-center">
<div>
<h3 class="text-2xl font-bold text-gray-900">1. "Золотий стандарт": Юніт-економіка одного клієнта</h3>
<p class="mt-4 text-gray-600">Встановлюємо непорушні фінансові правила для кожного проєкту. Чек у 65 000 грн розподіляється на чіткі, контрольовані категорії, що гарантує 40% рентабельності. Це наш закон.</p>
</div>
<div class="chart-container h-80 max-h-[40vh]">
<canvas id="unitEconomicsChart"></canvas>
</div>
</div>
<div class="grid md:grid-cols-2 gap-12 items-center">
<div class="order-2 md:order-1">
<h3 class="text-2xl font-bold text-gray-900">2. Нова командна структура</h3>
<p class="mt-4 text-gray-600">Замість хаотичної мережі з 95 фрилансерів ми формуємо ефективну штатну команду з 14 осіб для обслуговування 20 клієнтів. Це забезпечує якість, керованість та прогнозоване навантаження.</p>
<div class="mt-6 space-y-4">
<div class="p-4 bg-gray-100 rounded-lg">
<p class="font-bold">Керівник SMM-відділу (1)</p>
</div>
<div class="grid grid-cols-2 gap-4">
<div class="p-4 bg-blue-100 rounded-lg">
<p class="font-bold">Проєктний менеджер (2)</p>
<p class="text-sm text-gray-600">10 проєктів/ПМ</p>
</div>
<div class="p-4 bg-blue-100 rounded-lg">
<p class="font-bold">Таргетолог (1)</p>
<p class="text-sm text-gray-600">20 проєктів</p>
</div>
</div>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="p-3 bg-green-100 rounded-lg">
<p class="font-bold">SMM-спеціаліст (4)</p>
<p class="text-sm text-gray-600">5 пр./спец.</p>
</div>
<div class="p-3 bg-green-100 rounded-lg">
<p class="font-bold">Дизайнер (2)</p>
<p class="text-sm text-gray-600">10 пр./спец.</p>
</div>
<div class="p-3 bg-green-100 rounded-lg">
<p class="font-bold">Відеограф (2)</p>
<p class="text-sm text-gray-600">10 пр./спец.</p>
</div>
<div class="p-3 bg-green-100 rounded-lg">
<p class="font-bold">Монтажер (2)</p>
<p class="text-sm text-gray-600">10 пр./спец.</p>
</div>
</div>
</div>
</div>
<div class="order-1 md:order-2">
<h3 class="text-2xl font-bold text-gray-900">3. Конкурентна модель зарплат</h3>
<p class="mt-4 text-gray-600">Ми залучаємо та утримуємо найкращих спеціалістів, пропонуючи зарплати вище ринкових та прозору систему бонусів, що прив'язана до рентабельності та утримання клієнтів.</p>
<div class="overflow-x-auto mt-6">
<table class="w-full text-left border-collapse">
<thead>
<tr>
<th class="table-header p-3 text-sm font-semibold tracking-wide">Посада</th>
<th class="table-header p-3 text-sm font-semibold tracking-wide text-right">Зарплата (грн)</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tr><td class="p-3">Проєктний менеджер</td><td class="p-3 text-right font-semibold">60 000</td></tr>
<tr><td class="p-3">SMM-спеціаліст</td><td class="p-3 text-right font-semibold">40 000</td></tr>
<tr><td class="p-3">Дизайнер</td><td class="p-3 text-right font-semibold">35 000</td></tr>
<tr><td class="p-3">Відеограф/Монтажер</td><td class="p-3 text-right font-semibold">35 000</td></tr>
<tr><td class="p-3">Таргетолог</td><td class="p-3 text-right font-semibold">50 000</td></tr>
<tr class="bg-gray-100"><td class="p-3 font-bold">Загальний ФОП (13 осіб)</td><td class="p-3 text-right font-bold">540 000 / міс.</td></tr>
<tr class="bg-blue-100"><td class="p-3 font-bold">Гнучкий бонусний фонд</td><td class="p-3 text-right font-bold">30 000 / міс.</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="forecast" class="py-16 md:py-24 accent-bg">
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="section-title">Інтерактивний фінансовий прогноз</h2>
<p class="section-subtitle max-w-3xl mx-auto">Змоделюйте потенціал нової стратегії. Пересуньте слайдер, щоб побачити, як змінюється прибуток зі зростанням кількості клієнтів.</p>
</div>
<div class="mt-12 bg-white p-8 rounded-lg shadow-lg max-w-4xl mx-auto">
<div class="flex flex-col md:flex-row justify-between items-center mb-6">
<label for="clientSlider" class="font-semibold text-lg mb-4 md:mb-0">Кількість клієнтів: <span id="clientCount" class="text-blue-600 font-bold text-2xl">10</span></label>
<input id="clientSlider" type="range" min="1" max="20" value="10" class="w-full md:w-2/3 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer">
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 text-center mt-8">
<div class="p-6 bg-gray-50 rounded-lg">
<h4 class="text-lg font-medium text-gray-500">Місячний дохід</h4>
<p id="monthlyRevenue" class="text-3xl font-bold text-gray-800 mt-2">650 000 грн</p>
</div>
<div class="p-6 bg-red-50 rounded-lg">
<h4 class="text-lg font-medium text-gray-500">Місячні витрати</h4>
<p id="monthlyCosts" class="text-3xl font-bold text-red-600 mt-2">427 500 грн</p>
</div>
<div class="p-6 bg-green-50 rounded-lg">
<h4 class="text-lg font-medium text-gray-500">Місячний прибуток</h4>
<p id="monthlyProfit" class="text-3xl font-bold text-green-600 mt-2">222 500 грн</p>
</div>
</div>
<div class="mt-8 p-6 bg-blue-50 rounded-lg text-center">
<h4 class="text-xl font-semibold text-blue-800">Прогнозований скоригований річний прибуток</h4>
<p id="annualProfit" class="text-5xl font-extrabold text-blue-600 mt-3">2 670 000 грн</p>
<p class="text-sm text-gray-600 mt-2">(Враховує відтік 2.5 клієнтів/міс та вартість залучення 30 000 грн/клієнт)</p>
</div>
</div>
</div>
</section>
<section id="risks" class="py-16 md:py-24">
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="section-title">Штат vs Фриланс: Зняття заперечень</h2>
<p class="section-subtitle max-w-3xl mx-auto">Основне занепокоєння — ризик фіксованих витрат на штатну команду. Розглянемо, чому стабільна команда є стратегічно вигіднішою інвестицією, ніж ілюзорна гнучкість фрилансу.</p>
</div>
<div class="mt-12 max-w-5xl mx-auto">
<div class="grid md:grid-cols-2 gap-8">
<div class="bg-red-50 border border-red-200 rounded-lg p-6">
<h3 class="text-xl font-bold text-red-800">Модель на фрилансерах (Поточна)</h3>
<ul class="mt-4 space-y-3 text-gray-700">
<li class="flex items-start"><span class="text-red-500 mr-2">✗</span> <strong>Приховані витрати:</strong> Величезні витрати часу ПМ на пошук, контроль та менеджмент 95+ людей.</li>
<li class="flex items-start"><span class="text-red-500 mr-2">✗</span> <strong>Нестабільна якість:</strong> Відсутність єдиних стандартів та глибокого занурення в проєкт.</li>
<li class="flex items-start"><span class="text-red-500 mr-2">✗</span> <strong>Немасштабованість:</strong> Модель руйнується при зростанні. Більше клієнтів = експоненційне зростання хаосу.</li>
<li class="flex items-start"><span class="text-green-500 mr-2">✓</span> <strong>Уявна гнучкість:</strong> Легко "вимкнути" витрати, якщо немає проєктів, але це ілюзія, бо якість послуг падає.</li>
</ul>
</div>
<div class="bg-green-50 border border-green-200 rounded-lg p-6">
<h3 class="text-xl font-bold text-green-800">Штатна команда (Пропонована)</h3>
<ul class="mt-4 space-y-3 text-gray-700">
<li class="flex items-start"><span class="text-green-500 mr-2">✓</span> <strong>Прогнозовані витрати:</strong> Чіткий ФОП дозволяє точно розрахувати рентабельність.</li>
<li class="flex items-start"><span class="text-green-500 mr-2">✓</span> <strong>Висока якість та швидкість:</strong> Злагоджена команда працює швидше, якісніше та з єдиним баченням.</li>
<li class="flex items-start"><span class="text-green-500 mr-2">✓</span> <strong>Масштабованість:</strong> Додавання нового клієнта не руйнує процеси, а лише збільшує навантаження в межах норми.</li>
<li class="flex items-start"><span class="text-red-500 mr-2">✗</span> <strong>Ризик фіксованих витрат:</strong> Потребує стабільного потоку клієнтів для покриття ФОП, що є ключовим завданням для продажів.</li>
</ul>
</div>
</div>
<div class="mt-12 bg-white p-8 rounded-lg shadow-lg">
<h3 class="text-2xl font-bold text-gray-900 text-center">Ключові ризики та стратегії їх мінімізації</h3>
<div class="mt-8 grid md:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="bg-gray-50 p-4 rounded-lg">
<h4 class="font-bold">Фінансовий ризик</h4>
<p class="text-sm text-gray-600 mt-2">Касовий розрив через фіксовані витрати.</p>
<p class="text-sm text-blue-600 font-semibold mt-3">Рішення: Поетапний перехід, створення фін. резерву, жорсткий контроль продажів.</p>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<h4 class="font-bold">Кадровий ризик</h4>
<p class="text-sm text-gray-600 mt-2">Конкуренція за таланти, плинність кадрів.</p>
<p class="text-sm text-blue-600 font-semibold mt-3">Рішення: Конкурентна зарплата + бонуси, сильний бренд роботодавця, план наступності.</p>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<h4 class="font-bold">Операційний ризик</h4>
<p class="text-sm text-gray-600 mt-2">"Розповзання" обсягу робіт, опір змінам.</p>
<p class="text-sm text-blue-600 font-semibold mt-3">Рішення: Жорсткі регламенти та KPI, система платного погодження дод. робіт.</p>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<h4 class="font-bold">Стратегічний ризик</h4>
<p class="text-sm text-gray-600 mt-2">Ринкове несприйняття ціни 65 000 грн.</p>
<p class="text-sm text-blue-600 font-semibold mt-3">Рішення: Потужне обґрунтування цінності, фокус на клієнтах, для яких результат важливіший за ціну.</p>
</div>
</div>
</div>
</div>
</section>
<section id="roadmap" class="py-16 md:py-24 accent-bg">
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<h2 class="section-title">Поетапний план впровадження</h2>
<p class="section-subtitle max-w-3xl mx-auto">Дорожня карта трансформації SMM-відділу на 12 місяців.</p>
</div>
<div class="mt-16 max-w-3xl mx-auto">
<div class="relative space-y-12">
<div class="timeline-item relative pl-8">
<div class="timeline-dot"></div>
<h3 class="text-xl font-bold">Етап 1: Фундамент (Місяці 1-2)</h3>
<p class="mt-2 text-gray-600">Затвердження фінансової моделі, структури команди та стандартизованого пакета послуг. Розробка HR-стратегії для найму ключових співробітників.</p>
<p class="mt-2 font-semibold text-blue-600">KPI: Затверджені та задокументовані операційна та фінансова моделі.</p>
</div>
<div class="timeline-item relative pl-8">
<div class="timeline-dot"></div>
<h3 class="text-xl font-bold">Етап 2: Пілотна програма (Місяці 3-6)</h3>
<p class="mt-2 text-gray-600">Набір "ядра" команди. Застосування нової моделі до всіх *нових* клієнтів. Розробка та виконання плану переходу для 2-3 існуючих клієнтів.</p>
<p class="mt-2 font-semibold text-blue-600">KPI: 3-5 клієнтів успішно працюють за новою моделлю з рентабельністю 40%+.</p>
</div>
<div class="timeline-item relative pl-8">
<div class="timeline-dot"></div>
<h3 class="text-xl font-bold">Етап 3: Масштабування (Місяці 7-12)</h3>
<p class="mt-2 text-gray-600">Агресивні продажі пакета за 65 000 грн. Проактивне доукомплектування команди. Створення функції залучення клієнтів для компенсації відтоку.</p>
<p class="mt-2 font-semibold text-blue-600">KPI: Досягнення та утримання стабільного портфоліо у 20 клієнтів при збереженні цільової рентабельності.</p>
</div>
</div>
</div>
</div>
</section>
</main>
<footer class="bg-gray-800 text-white">
<div class="container mx-auto py-6 px-4 sm:px-6 lg:px-8 text-center">
<p>© 2025 LOCOMOTIVE MEDIA GROUP. Стратегія розвитку SMM-відділу.</p>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', () => {
const profitabilityData = {
labels: ['rahlis', 'estem.ua', 'oberig', 'justbuy', 'xsport', 'avant', 'altexa'],
datasets: [{
label: 'Рентабельність проєкту (%)',
data: [-217.71, -81.38, 4.24, 3.03, -0.96, 94.17, 96.67],
backgroundColor: (context) => {
const value = context.raw;
return value < 0 ? 'rgba(239, 68, 68, 0.6)' : 'rgba(34, 197, 94, 0.6)';
},
borderColor: (context) => {
const value = context.raw;
return value < 0 ? 'rgba(239, 68, 68, 1)' : 'rgba(34, 197, 94, 1)';
},
borderWidth: 1
}]
};
const profitabilityCtx = document.getElementById('profitabilityChart').getContext('2d');
new Chart(profitabilityCtx, {
type: 'bar',
data: profitabilityData,
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: false,
ticks: {
callback: function(value) {
return value + '%';
}
}
}
},
plugins: {
legend: { display: false },
title: { display: false },
tooltip: {
callbacks: {
label: function(context) {
return `Рентабельність: ${context.raw.toFixed(2)}%`;
}
}
}
}
}
});
const unitEconomicsData = {
labels: [
'Чистий прибуток',
'Оплата праці команди',
'Накладні витрати',
'Проєктні витрати'
],
datasets: [{
label: 'Розподіл чеку 65 000 грн',
data: [26000, 28500, 7500, 3000],
backgroundColor: [
'#10B981',
'#3B82F6',
'#6366F1',
'#F97316'
],
hoverOffset: 4
}]
};
const unitEconomicsCtx = document.getElementById('unitEconomicsChart').getContext('2d');
new Chart(unitEconomicsCtx, {
type: 'doughnut',
data: unitEconomicsData,
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { position: 'bottom' },
title: {
display: true,
text: 'Розподіл чеку 65 000 грн',
font: { size: 16 }
},
tooltip: {
callbacks: {
label: function(context) {
let label = context.label || '';
if (label) {
label += ': ';
}
const value = context.raw;
const total = context.chart.getDataVisibility(0) ? context.chart.getDatasetMeta(0).total : 0;
const percentage = total > 0 ? (value / total * 100).toFixed(1) + '%' : '0%';
return `${label}${value.toLocaleString('uk-UA')} грн (${percentage})`;
}
}
}
}
}
});
const clientSlider = document.getElementById('clientSlider');
const clientCountEl = document.getElementById('clientCount');
const monthlyRevenueEl = document.getElementById('monthlyRevenue');
const monthlyCostsEl = document.getElementById('monthlyCosts');
const monthlyProfitEl = document.getElementById('monthlyProfit');
const annualProfitEl = document.getElementById('annualProfit');
const CHECK_AMOUNT = 65000;
const COST_PER_CLIENT = 39000;
const PROFIT_PER_CLIENT = CHECK_AMOUNT - COST_PER_CLIENT;
const CHURN_RATE = 2.5;
const CAC = 30000;
function updateForecast() {
const clients = parseInt(clientSlider.value);
clientCountEl.textContent = clients;
const monthlyRevenue = clients * CHECK_AMOUNT;
const monthlyOperationalCosts = clients * COST_PER_CLIENT;
const monthlyOperationalProfit = monthlyRevenue - monthlyOperationalCosts;
const monthlyAcquisitionCost = CHURN_RATE * CAC;
const adjustedMonthlyProfit = monthlyOperationalProfit - monthlyAcquisitionCost;
const adjustedAnnualProfit = adjustedMonthlyProfit * 12;
monthlyRevenueEl.textContent = `${monthlyRevenue.toLocaleString('uk-UA')} грн`;
monthlyCostsEl.textContent = `${monthlyOperationalCosts.toLocaleString('uk-UA')} грн`;
monthlyProfitEl.textContent = `${monthlyOperationalProfit.toLocaleString('uk-UA')} грн`;
annualProfitEl.textContent = `${adjustedAnnualProfit.toLocaleString('uk-UA')} грн`;
}
clientSlider.addEventListener('input', updateForecast);
updateForecast();
const navLinks = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('main section');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
navLinks.forEach(link => {
link.classList.toggle('active', link.getAttribute('href').substring(1) === entry.target.id);
});
}
});
}, { rootMargin: "-50% 0px -50% 0px" });
sections.forEach(section => observer.observe(section));
});
</script>
</body>
</html>