Роботи / Сайти

Mawrolly: сайт і магазин проєктів After Effects для TikTok-автора на 260 тисяч підписників

Що було

У автора TikTok-каналу на 260 тисяч підписників не було свого місця в мережі. Рекламодавці писали в особисті і не знали цін. Проєкти After Effects продавалися вручну через Telegram, і покупець з іншого часового поясу чекав відповіді до ранку.

Що зробили

Зробили двомовну вітрину з формою замовлення реклами, де ціна підставляється сама, і магазин із 23 проєктів. Оплата криптою через NOWPayments, файл видає сервер за підписаним посиланням, без своєї бази даних. Поруч конвертер версій After Effects у браузері і чат-помічник на Claude Haiku зі стелею витрат.

Що отримав клієнт

Сайт живе на mawrolly.com. Наскрізна покупка справжніми грошима пройшла весь ланцюжок: рахунок, оплата, перевірка підпису, файл. Спроби підробити ціну, промокод чи посилання на проді відбиті. За два місяці 331 користувач і 1 215 переглядів, люди доходять до кошика і каси.

ЗамовникMawrolly, TikTok-автор, 260 тис. підписників (сімейний проєкт)
Моя рольДизайн, код, тексти RU/EN, оплата і видача файлів, чат-помічник, аналітика, SEO, безпека
СтатусПрацює на mawrolly.com, магазин приймає оплату, далі підключення карток
Результат23 проєкти в магазині, покупець платить і качає без участі продавця · Відкрити
Відхилено: ручна схема. Покупець пише в особисті вночі, чекає відповіді до ранку, файл іде вручну в кожній угоді. Реконструкція, не скриншот
Відхилено: ручна схема. Покупець пише в особисті вночі, чекає відповіді до ранку, файл іде вручну в кожній угоді. Реконструкція, не скриншот
Прийнято: кошик, рахунок від сервера, перевірка підпису, підписане посилання на файл на 72 години. Продавцю лише сповіщення в Telegram. Реконструкція, не скриншот
Прийнято: кошик, рахунок від сервера, перевірка підпису, підписане посилання на файл на 72 години. Продавцю лише сповіщення в Telegram. Реконструкція, не скриншот

Завдання

Канал @mawrolly монтує едіти за «Гравіті Фолз», «Фінеасом і Фербом», «Зоряною принцесою» і аніме. На старті 260,6 тисячі підписників і 22,1 мільйона лайків. Гроші приносять реклама треків і відео, продаж проєктів After Effects і монтаж на замовлення. Але свого адресу в мережі не було: рекламодавець писав у особисті і не знав цін, покупець проєкту приходив із ролика і чекав живої відповіді, часом до ранку.

Канал веде син, тому бриф ми писали самі собі: сайт-вітрина з формою замовлення реклами, магазин із оплатою і видачею файлів без продавця, два мовні варіанти. І заодно перевірити на собі повний цикл інтернет-магазину цифрових товарів без своєї бази даних і без постійних витрат.

Окрема біда покупців: проєкт із новішого After Effects у старішій версії не відкривається, а повернення немає. Тож на кожній картці мала стояти мінімальна версія, а поруч потрібен був спосіб понизити версію файлу.

Навіщо і яка ідея

Три людини, три проблеми. Рекламодавець обирає канал і тип реклами, ціна підставляється сама (реклама треку на mawrolly від 50 $, на партнерських каналах від 35 $), заявка летить у Telegram. Покупець кладе проєкт у кошик, платить криптою і отримує посилання одразу після підтвердження мережі. Власник старого After Effects бачить версію на картці і понижує файл у конвертері, який працює повністю в браузері.

Головну суперечку магазину вирішував «консиліум» із пʼяти AI-радників: попередження про плагіни й версії мають стояти перед покупкою, але не закривати товар. Відповідь: попередження і покупка стали одним кроком, галочкою «розумію умови» прямо над кнопкою оплати. Висота мобільної сторінки магазину впала з 5421 до 2946 пікселів.

Той самий консиліум скасував підводну тему з рибами, коли десятки CSS-правок не рятували шапку. Картинки для фону обирали не на око, а вимірами: контраст заголовка по пікселях самих літер, збіг кромки двох кадрів (підсумок 0,43 з 255).

Хід роботи

Коли Що відбувалося
Етап 1 Референс у стилі Jinx/Arcane. Версії v1-v4 йшли то в піратську тему, то в корпоративний стиль, повертали до правила: структура з референсу, тематика з реального контенту каналу. Палітру зняли з пікселів банера і аватарки
Наступні дні Підводна тема: шапка над водою, середина і дно під водою. Багато раундів правок шва між зонами, спійманий баг зі схлопуванням відступів
Через 9 днів Консиліум скасував «рибʼячу» тематику. Шапку замінили одним кадром зі вбудованою ватерлінією. Куплено домен, сайт на mawrolly.com, ціни на рекламу затверджено
Наступний день Магазин на 3 товари, логотип «M з монтажної стрічки», заголовки безпеки, robots і sitemap, GA4 і Clarity
Через тиждень Свій конвертер версій замість чужого, кошик, крипто-оплата NOWPayments, автоматична видача файлів
Через два дні Тестова покупка справжніми грошима пройшла весь ланцюжок. Переписано умови, три пункти яких були неправдою. Консиліум: номер замовлення будує сервер, замовлення пишеться знімком угоди, сповіщення в Telegram, ліміт на створення рахунків
Ще через день Чат-помічник на Claude Haiku 4.5 на проді
Через три тижні Новий мальований логотип через CSS-маску, промокоди, акція з автоматичним закінченням. Далі акція -50% безстроково і безкоштовний проєкт з окремою видачею без оплати
Наступний місяць Четвертий канал на головній, блок спільноти, розмітка подій воронки в GA, лічильник підписників знову автоматичний. Перевірка захисту, стеля витрат на чат, CSP без unsafe-inline

Чим робили

Сайт зібраний зі статичних HTML-сторінок і serverless-функцій Node.js на Vercel, своєї бази даних немає. Домен і DNS на Cloudflare, проксі вимкнено, щоб Vercel міг випустити сертифікат. Фони і логотип генерувалися в Nano Banana Pro, шрифти Russo One і Rubik. Картинки і значки міряли скриптами на Python з PIL.

Оплата: NOWPayments, рахунок створює /api/checkout. Ціни і знижки рахує сервер зі свого каталогу, а не браузер. Сповіщення про оплату перевіряється за підписом HMAC, без неї відповідь 401. Комісію мережі доплачує покупець.

Видача файлів: архіви проєктів лежать у приватному сховищі Vercel Blob. Право на завантаження зашите в саме посилання: id товару, номер замовлення, строк 72 години і підпис. Сервер перераховує підпис, тому база замовлень для видачі не потрібна. Telegram-бот пише власнику про кожну оплату, недоплату і збій запису замовлення.

Чат: Claude Haiku 4.5 через Anthropic API, кеш системного промпта, інструменти create_lead і check_ae_version. Усі числа (порівняння версій, кількість товарів, вилку цін) рахує звичайний код, модель тільки переказує. Стеля 200 відповідей на добу на сайт і 30 на одну людину, тобто не більше ~15 $ на місяць.

Захист: CSP без вбудованих скриптів (14 інлайн-блоків винесені у файли), HSTS, X-Frame-Options DENY, ліміти частоти на оплату, безкоштовну видачу, промокоди, чат і статус замовлення. Усі ключі тільки в змінних оточення Vercel. Аналітика: GA4 з подіями воронки, Microsoft Clarity для теплових карт, Search Console. Загалом близько 7 200 рядків коду в сторінках, функціях і скриптах магазину.

Результат

Головна: повноекранна шапка з островом і кораблями, вода йде вниз під весь сайт. Лічильники каналу, блок «Мої канали» на чотири акаунти, три обрані проєкти, спільнота (Discord і Telegram), форма замовлення реклами. Дві мови, вибір спільний для всіх сторінок. Лічильник підписників читає публічні сторінки профілів TikTok із кешем на 6 годин, при відмові показує вшиті цифри.

Магазин: 23 товари, 21 едіт, 1 пак кольорокорекції, 1 безкоштовний проєкт. У кожній картці превʼю-відео, версія After Effects, список платних плагінів, без яких ефекти відкриються як missing. Сторінка товару з розміткою Product для пошуку, у пака кольорокорекції галерея: один кадр під кожен із 9 пресетів. Кошик з однією галочкою на всі товари, оплата криптою, запасний шлях через Telegram, після оплати сторінка сама опитує статус і показує кнопки завантаження.

Що перевірили. Наскрізна покупка: рахунок на 10 $, прийшло 10,147 USDT у мережі BSC, сповіщення пройшло перевірку підпису, файл видано, посилання віддає справжній .aep. Підміна id товару в посиланні дає «Посилання недійсне». Спроби підробки на проді: прислали ціну 0,01 $, сервер виставив свої 15 $; промокод із підсунутим відсотком 99 дав чесні -10 %; платний товар через безкоштовну видачу отримав 403; сповіщення без підпису 401; прямий адрес файлу в сховищі 403. Конвертер: зібрали штучний «проєкт із AE 2026» зі справжнього і прогнали назад униз, результат збігся з оригіналом байт у байт, усі 6 686 589 байт. Чат: системний промпт і інструменти 7 558 токенів, прогін із 7 питань коштував 1,76 цента.

Відвідуваність за два місяці: 1 215 переглядів, 331 користувач. За один тиждень: 171 перегляд (+40 % до попереднього), 15 додавань у кошик, 5 переходів до оплати, 4 безкоштовні завантаження і 0 оплат. Пʼятеро дійшли до рахунку і ніхто не заплатив: єдиний спосіб оплати зараз крипта. Наступний крок уже вирішений, LiqPay для карток. Чого ми поки не знаємо: чи відкривається файл після конвертера в живому After Effects. Байти сходяться, перевірка в програмі за автором каналу.

Помилки і що винесли

CSS не вміє оптику.Шов між шапкою над водою і підводною частиною правили більше тижня: розмиття, відблиск, хвиляста лінія, смуга переходу. Заломлення на межі води верстка переконливо не малює. Рішення: один кадр, де ватерлінія вже частина знімка. Правило: якщо правка повторюється третій раз, зупинитися і шукати першопричину.
Умови на сайті брехали покупцю.Місяць висіло «посилання допускає до 3 завантажень», а лічильника завантажень у коді не було взагалі. Ще два пункти описували ручну схему, якої вже не існувало. Правило: кожну обіцянку в тексті звіряти з конкретним рядком коду.
Моделі не можна довіряти числа.Чат-бот пропонував людині з AE 2017 проєкти з позначкою «2018+», а потім сказав «близько 30 едітів» при 22. Умовляння в промпті допомагали частково, помилка пролазила приблизно в кожній третій відповіді. Допомогло забрати розрахунок у код: порівняння версій і підрахунки робить функція, модель тільки переказує.
Номер замовлення збирався з того, що прислав браузер.Сміття із запиту потрапляло в номер, а потім той самий номер не проходив перевірку формату. Людина заплатила б і лишилася без файлу. Тепер номер будує сервер із перевірених товарів і випадкового хвоста.
Акція -50 % пройшла по вітрині, але не скрізь.Код-ревʼю знайшло чотири місця, де ціна бралася без знижки: заявка в Telegram, відповіді бота, знімок замовлення в журналі (виручка завищувалася вдвічі), перевірка безкоштовного кошика. Правило: будь-яку зміну ціни перевіряти в усіх місцях, де ціна зʼявляється.
Політика безпеки мовчки вимикала те, що ми додавали.Лічильники аналітики не вантажилися, поки їхні домени не прописали в CSP. Конвертеру потрібен воркер через blob:, без точкового винятку конвертація просто не йшла. Правило: після будь-якого нового скрипта перевіряти подію securitypolicyviolation, а не консоль на око.
Затемнювальний шар «про всяк випадок» двічі став головною проблемою.Шар 58-78 % поверх фону магазину зʼїв картинку до нерозрізненості, хоча текст карток і так стояв на своїй підкладці. Знизили до 22-38 %. Правило: не додавати шарів, поки не доведено, що без них погано.
Версію проєкту прочитали за рядком.Усередині файлу було «After Effects 2026», на картці так і написали. Конвертер показав, що формат файлу 2019, а 2026 це збірка, в якій зберігали. Версію визначаємо розбором формату.

Інструменти

HTML, CSS, JavaScriptNode.js serverless на VercelVercel BlobNOWPaymentsClaude Haiku 4.5Telegram Bot APIGA4, Clarity, Search ConsoleCloudflare Registrar і DNSNano Banana ProPython, PILClaude Code