Собрал SaaS в одиночку за месяц на подписке за $20. За пять месяцев заработал 200 ₽
Сильная модель принимала решения и писала ТЗ, доступные писали код. За пять месяцев так собрались семь модулей, 110 аккаунтов и одна оплата от внешнего пользователя. Разбираю по цифрам, где схема сработала и где я провалил всё, кроме разработки.
Что я проверял
Пятого апреля 2026 года я начал эксперимент с одним ограничением. Можно ли собрать работающий MVP SaaS за месяц, если работать по три-четыре часа четыре вечера в неделю и не покупать ничего, кроме подписки Cursor за $20 в месяц. Через месяц MVP был.
Сейчас, спустя пять месяцев, в проде семь модулей, 110 активных аккаунтов владельцев и одна оплата от внешнего пользователя на 200 ₽. Разработка получилась, все остальное пока нет, и именно про это интереснее всего рассказывать.
Оговорюсь сразу. RetroPoint делаю я, так что читайте это как рассказ заинтересованного лица. Разработчик в проекте один, но не с чистого листа.
Дизайн я заказал у дизайнера Натальи 10 декабря 2022 года. Она проработала только модуль ретроспектив, но этого хватило, чтобы задать визуальный язык. До полноценной разработки потом три года не доходили руки. Я вернулся к отложенной идее весной 2026-го, когда развитие AI-моделей и агентов сделало такой запуск в одиночку реалистичным, и продолжил исходную систему уже без участия дизайнера.
Все числа ниже это обезличенный read-only срез рабочей базы на 10 сентября 2026 года. Никаких оценок «примерно» и «около» в них нет.
Зачем понадобился еще один сервис ретроспектив
Я семнадцатый год в разработке, последние двенадцать из них руковожу командами разного размера и зрелости. Инструменты для командных встреч я не выбирал, а пользовался теми, что были под рукой.
Потом привычный набор рабочих сервисов стал менее предсказуемым. Менялись условия оплаты и доступа, а вместе с ними появлялся риск потерять накопленную историю встреч. Я не хотел снова строить процесс команды вокруг инструментов, доступность которых не контролирую.
Российские сервисы никуда не делись и работают. Когда я выбирал замену как тимлид, доступные мне продукты хорошо закрывали отдельные процессы, но не связывали их результаты в единый рабочий цикл.
Хорошая ретроспектива дает договоренности, и ровно на них инструменты обычно останавливаются. Цели живут в таблице, встречи в календаре, договоренности в чате, а личные заметки руководителя отдельно от всего. Перед каждой следующей встречей тимлид заново собирает контекст руками. Мне нужна была не доска, а связка «встреча, решение, действие с ответственным и сроком», чтобы следующий рабочий цикл начинался с того, чем закончился прошлый.
Экономика эксперимента
$20 в месяц это стоимость подписки Cursor, внутри которой шли и обращения к Claude Opus. Это было условие эксперимента, а не бюджет продукта.
В эти $20 не входило:
- мое время, 12–16 часов в неделю, то есть 48–64 часа за первый месяц
- VDS, домен и сертификаты
- работа дизайнера, сделанная до старта
- статус ИП, без которого прием платежей не подключить
- регистрация магазина у платежного провайдера, его модерация и перевод в рабочий режим
- комиссия провайдера с каждого платежа
- включение в реестр операторов персональных данных, оно прошло только 27 июля
Здесь стоит быть точным, потому что разница принципиальная. Код приема платежей я написал внутри того же первого месяца и внутри той же подписки: биллинг появился в репозитории 12 апреля, аддоны к нему 22 апреля, вместе с фискальными чеками по 54-ФЗ. Подписка закрыла именно разработку.
За ее пределами осталось то, что кодом не решается. Юридический статус, договор с провайдером, модерация магазина, комиссия с оборота, заявление в реестр. Ни одну из этих задач нельзя отдать модели, и по календарю они заняли больше, чем сам биллинг.
Поэтому формулировка «продукт за $20» была бы враньем. Правда в другом: за $20 в месяц я закрыл ту часть работы, которая раньше требовала команды разработки. Все, что вокруг разработки, никуда не исчезло.
Как один человек закрыл больше 60 фаз разработки
Это главное, что я вынес из пяти месяцев, и оно переносится на любой продукт.
Скорость дала не одна сильная модель, а разделение труда между двумя уровнями. Claude Opus внутри Cursor снимал неопределенность: выбирал продуктовое и архитектурное решение, а потом превращал его в подробное ТЗ с критериями готовности. Реализацию по готовому контракту забирали более доступные модели.
Экономия появилась даже не на цене запроса. Дорогая модель принимала решение один раз, и дальше его не приходилось изобретать заново в каждом исполнительском чате.
По ходу работы я изобрел свой велосипед, локальную версию Spec-Driven Development. Вместо готового фреймворка постепенно собрал процесс вокруг проектных спецификаций, которые живут рядом с кодом. Каждая фаза начинается с плана, который появляется до кода. Отдавать его исполнителю можно, когда в нем приняты все ключевые решения и тому не нужно угадывать:
- зачем нужен сценарий и кто им пользуется
- что входит в объем работ и что намеренно исключено
- какой существующий паттерн продолжать
- какие роли, права, тарифы и состояния учитывать
- как выглядит контракт API и чем доказывать готовность
Если хоть по одному пункту осталась развилка, исполнитель тихо начинает работать архитектором, и дешевая реализация превращается в дорогую переделку. Я на этом попадался: на сквозных экранах несколько попыток доступных моделей не прошли мою приемку. Дело было не в моделях. Под видом реализации я отдавал им еще не законченное проектирование.
Ровно так же вышло с дизайном. Дизайнер отдал несколько публичных экранов, раздел ретро и карту цветов с типографикой, а остальные модули я проектировал в Claude Design поверх той же системы. Помог не запрос «нарисуй красиво». Помогло то, что у агента была формализованная визуальная грамматика: семантические роли цвета, шкала типографики, сетка отступов, радиусы и размеры контролов. Макет показывает одно правильное решение, а токены объясняют агенту, почему это решение принадлежит именно этому продукту. Иерархию, плотность, состояния и права по-прежнему принимал я.
Третье, без чего все рассыпалось бы: повторяемое требование должно уходить из чата в репозиторий. Правила проекта, редакционный стиль и архитектурные ограничения лежат рядом с кодом и версионируются, а не пересказываются заново в каждой новой сессии. Критичные публичные обещания проверяются тестами. Один сверяет цифры на странице тарифов с лимитами в бэкенде, другой держит в актуальном состоянии карту сайта для AI-агентов. Агент может уверенно написать «до 10 активных досок», и остановит его только красный тест.
Что в итоге стоит в проде
Семь самостоятельных модулей: ретроспективы, Planning Poker, OKR, встречи один на один, Performance Review, рабочие встречи и командный календарь отсутствий. Подключаются по одному, независимо друг от друга.
Стек намеренно скучный: Python и FastAPI, PostgreSQL, React с TypeScript, Docker Compose и GitLab CI на обычном VDS. Данные хранятся в России, оплата идет в рублях, а 27 июля продукт включили в реестр операторов персональных данных. Для части российских команд это входное требование к новому сервису.
Где я провалился
Страница тарифов, которую невозможно прочитать
Я собрал четыре тарифа и шестнадцать дополнительных пакетов с отдельной таблицей возможностей для каждого. Вышла страница высотой около 28 500 пикселей с восемью таблицами. Мне казалось, что так честнее: человек видит все и выбирает точно. На деле выбор такой сложности человек не делает, он закрывает вкладку.
Позже я свел линейку к четырем позициям вместо двадцати. Урок не про тарифы, а про то, что честность и полнота выкладки это разные вещи, и вторая мешает первой.
Сайт на неделю пропал из выдачи из-за правки в приватной части
Одиннадцатого апреля я сделал предварительный рендер всех публичных страниц, чтобы поисковый робот получал готовый HTML, и посчитал тему закрытой.
Двадцать первого мая я занимался совсем другой задачей, восстановлением сессии в новой вкладке, и добавил обертку, которая ничего не рисовала, пока не проверит сессию пользователя. На публичных страницах это выглядело так: робот скачивал правильный HTML, запускал JavaScript и получал пустую страницу. Так продолжалось неделю, и этого хватило, чтобы поисковики убрали сайт из выдачи.
Сборка все это время проходила успешно, потому что проверяла файл на диске, а не то, что видит робот. Вывод, который стоил мне недели трафика: критерий готовности должен описывать наблюдаемый результат, а не наличие реализации. С тех пор у меня есть отдельная проверка уже опубликованных адресов, а не только сборки.
Страница регистрации отдавала 404, и рекламный кабинет отклонял ее как посадочную
Предварительный рендер знает только публичные адреса, а все остальное сервер считал несуществующим. Внешне ничего не ломалось: приложение открывалось и показывало нужный экран. Но код ответа был 404, и в первом кадре успевала мигнуть надпись «Страница не найдена».
Человек этого почти не замечал. Рекламный кабинет замечал сразу и отклонял страницу регистрации как посадочную, а мессенджеры вместо карточки ссылки показывали ошибку. То есть я готовился покупать трафик на страницу, которую внешние системы считали несуществующей. Починил первого сентября.
Один способ входа оказался точкой отказа
По срезу на 10 сентября у 70 владельцев аккаунтов из 110 вообще нет локального пароля: они входят только через внешнего провайдера. До отключения Google был самым популярным внешним способом входа, поэтому в июле исчезла не одна из кнопок, а привычный путь в продукт для заметной части аудитории.
Причина внешняя. Часть 10 статьи 8 закона № 149-ФЗ ограничивает способы авторизации пользователей в России для российских владельцев сайтов и приложений, а с 7 июля 2026 года закон № 199-ФЗ ввел за нарушение административную ответственность.
Яндекс ID уже был подключен и закрывал часть потребности. Неожиданным оказалось другое: 12 из 38 регистраций через него пришли с корпоративных доменов, всего с семи разных. Корпоративные сервисы Яндекса привели аудиторию, которую я не ожидал увидеть в этом канале.
После отключения Google я стал искать российский способ входа, который с высокой вероятностью уже есть у целевой аудитории, и выбрал Сбер ID. Он появился в продукте шестого августа и дал восемь регистраций. Для сравнения: у Яндекса за пять месяцев 38, у отключенного Google 25, у VK ни одной.
Теперь я отношусь к провайдеру входа как к части контура доступа, а не как к еще одной кнопке. Зависимость от одного популярного способа авторизации это продуктовый риск, и альтернативу лучше добавлять, пока основной канал еще работает.
Главное: семь процессов и ни одной привычки
Срез рабочей базы на 10 сентября выглядит так:
- 110 активных аккаунтов владельцев, 106 из них сейчас внутри 30-дневного триала
- ретро-доски с карточками есть у 43 человек, всего 48 досок и 871 карточка
- признак повторения есть у 11 из этих 43: девять возвращались на ту же доску в другой день, трое завели вторую доску, один сделал и то и другое
- дальше цифры падают: 8 команд, 20 встреч один на один, 22 задачи в двух сессиях Planning Poker, один цикл Performance Review и ни одного цикла OKR
- одна оплата от внешнего пользователя за все время, 200 ₽ 12 мая
Про повторение стоит отдельно сказать, как я его считаю, потому что сначала считал неправильно. Я взял за признак вторую содержательную доску и получил трех человек из 43. Цифра оказалась неверной: многие проводят несколько ретроспектив на одной доске и просто правят ее заново, второй доски у них не появляется. Поэтому теперь повторением я считаю либо вторую доску, либо возврат на ту же доску в другой день. Так получается 11 человек из 43, и это в четыре раза больше первой оценки.
Вывод все равно неприятный, просто менее катастрофичный. Скорость разработки не равна скорости изменения привычек. Семь процессов я построил заметно раньше, чем у четверти пришедших появился признак повторения хотя бы одного.
Пять месяцев я занимался тем, что умею: архитектурой, покрытием модулями, качеством текстов. И почти не занимался ни привлечением, ни тем, чтобы довести до второй ретроспективы тех, кто уже пришел. Прогресс я мерил темпом разработки, а коммиты и модули росли ровно в тот период, когда повторные пользователи и оплаты не росли вообще.
Что я меняю
Первое: перестаю добавлять модули. Восьмой модуль не сделает второй ретроспективы у тех 43 человек, которые провели первую.
Второе: ставлю аналитику воронки и разметку переходов. Сейчас я не могу сказать, откуда пришли 110 аккаунтов, потому что поля источника регистрации в базе просто нет.
Третье: беру одну метрику вместо всех и смотрю на нее. Доля владельцев с признаком повторения. Сегодня это 11 из 43.
Четвертое: разбираюсь, что происходит между первой доской и второй. Пока у меня нет данных, только догадки, и это следующая работа.
Что забрать из этой истории
- Платите сильной модели за снятие неопределенности, а масштабируйте разработку доступными исполнителями по готовому контракту. Смешивать эти режимы дороже, чем кажется.
- Формулируйте критерий готовности через наблюдаемый результат. Зеленая сборка не доказывает, что пользователь и поисковый робот видят продукт.
- Считайте способ входа частью контура доступа. Один провайдер это одна точка отказа, и отключить его могут без вашего участия.
- Проверяйте технические коды ответа на страницах, куда собираетесь вести платный трафик. Рекламные системы смотрят на них раньше, чем на дизайн.
- Не мерьте прогресс продукта темпом разработки. Скорость выпуска функций и скорость появления привычки это разные величины, и вторая почти не зависит от первой.
Продукт, о котором идет речь, это retropoint.ru.
Если вы запускали продукт в одиночку, расскажите, как вы поняли, что пора отложить новые функции и заняться привлечением. Я слишком долго оценивал прогресс по темпу разработки и хочу понять, где у других был этот переключатель.