В этой статье я хотел бы поделиться своим опытом создания SaaS-сервиса на базе LAMP стека, Postio и доведения сервиса до состояния, когда он стал приносить 3 700 долларов ежемесячно (до обрушения рубля было почти 7 000). Сразу надо сказать, что эта история не имеет ничего общего с инвесторами, с золотой лихорадкой Кремниевой долины и с какой-то сверхсовременной технологией. Просто незамысловатая история от независимого разработчика о создании прибыльного SaaS-сервиса, который может сделать любой. Этот веб-сервис был сделан для внутреннего рынка России, поэтому я перевёл всё на английский и в доллары для удобства (пожалуйста, обратите внимание, что это перевод моей статьи, которая изначально была написана для англоязычной аудитории). Но, с другой стороны, этот опыт является довольно универсальным и может быть применён везде. По сути, это инструкция по созданию проектов такого рода.
Три года назад я решил заняться SMM, и самым простым способом сделать это показалось запустить свою собственную группу в какой-нибудь нише и попытаться развить её. Facebook был уже, мягко говоря, довольно конкурентным на тот момент, поэтому я запустил свою тестовую группу на базе «ВКонтакте». Я выбрал очень популярную нишу, потому что всё, что я хотел, — это научиться, а не доминировать на рынке.
Наверное, я должен немного отвлечься и сказать, что VK.com имел и до сих пор имеет процветающую «экосистему» таких групп, которая приносит прибыль их владельцам. Это — своеобразный рынок, который Facebook прикрыл уже давно. И этот базар является прекрасной средой для обучения и экспериментов.
Пример группы на VK.com
Вернёмся к моей группе. Первое, на что я обратил внимание в том, что касается функционирования, это был постоянный поиск контента для размещения на сайте. Контент представляет собой, в большинстве случаев, какое-то изображение и текст, и группы, в основном, копировали контент у своих конкурентов. Последние, в свою очередь, копировали его откуда-то ещё. Обычно это «ещё» было контентом авторов, которых было трудно отследить и идентифицировать. Иногда это был явный плагиат.
Во всяком случае, я никогда особо не любил ручной труд и решил сделать небольшой инструмент, чтобы помочь себе извлекать контент с постов моих конкурентов (которые делали то же самое с другими источниками) и публиковать их в моей группе на регулярной основе. VK.com имеет хорошо сделанный API, поэтому всё было чрезвычайно лёгким. Я «прошерстил» множество постов и сделал небольшой интерфейс, который помогал мне двигаться по постам и удалять неподходящие, например, посты со ссылками, с непристойными выражениями и с очень малым числом лайков. Я также избавлялся от постов, которые были явно украдены у какого-то легко идентифицируемого источника.
Инструмент для отсортировки и обработки постов для моей группы
Я закончил работу со своим инструментом отсортировки и публикации, получив собственную базу высококачественных постов, релевантных моей нише. Благодаря этой базе я мог не тратить буквально ни минуты времени на контент и сосредоточиться на маркетинге, который был моей главной задачей.
Хотя я пытался не привлекать к себе внимания, один из моих конкурентов заметил необычно стабильное и большое присутствие постов высокого качества в моей группе и спросил меня об этом. Я рассказал о системе, и мне было предложено около 200 долларов за неё.
Я отказался от этого предложения и сделал встречное — платить мне ежемесячно. Конкурент согласился.
Это было начало.
Выбор стека и фреймворка
Я чрезвычайно счастливый разработчик, потому что из всего веб-девелоперского инструментария, я знаю лишь LAMP, jQuery и Codeigniter. Но знаю этот стек очень хорошо и могу создавать системы в рекордно-короткие сроки. Поэтому выбор здесь был очевиден.
Еще одним большим плюсом этого стека является его простота и популярность. А это значит, что когда мне придется уступать разработку кому-нибудь другому (а этот момент обычно наступает быстрее, чем мы предполагаем), то это будет легко и просто.
Кстати, вы не поверите, какое количество веб-разработчиков боятся начинать свои проекты, поскольку думают, что их скилл недостаточно высок. Это, разумеется, полный бред, и я знаю случаи, когда люди создавали продукты, приносящие $15000 в месяц, через полгода после того, как впервые познакомились с PHP.
Есть и другая каста — уверенные в том, что для того, чтобы сделать хороший сервис, им обязательно нужно овладеть хорошим языком программирования, а не этим ужасным PHP. Оставим последнее заявление на их совести.
Создание программы с минимально необходимым функционалом (MVP)
Мой только что сделанный инструмент не имел ничего, что должен иметь зрелый веб-сервис, кроме самой базовой функциональности. Но у него было одно большое преимущество — он был уже проверен в деле, так что я мог бы инвестировать значительные средства в его инфраструктуру, поскольку ясно, что Vk.com был не единственной социальной сетью, которой, как я полагал, могла бы понадобиться моя поддержка.
Кроме того, из моего предыдущего стартапа я знал, что мне нужна продвинутая система статистики и регистрации для предельно быстрого отслеживания и исправления ошибок всех видов. Я понимал, что ошибок будет много, потому что, когда ваш проект в значительной степени зависит от других сервисов, их ошибки становятся вашими.
Я подготовил краткий список функций моей программы с минимально необходимым функционалом (MVP). Он оказался довольно длинным, поскольку я решил включить в него некоторый материал, который я обычно не держу в MVP (например, автоматизированные платежи и все дополнительные интерфейсы). Вот то, что мне было нужно и что я имел, в конечном счёте:
Платёжный сервис. Поскольку стартап был предназначен для работы на рынке России, я выбрал один из самых популярных соответствующих шлюзов — Робокасса. Можно было обратиться к Stripe, но они не работали в России в тот момент (и до сих пор не работают), а возиться с созданием компании где-нибудь в Делавере не имело особого смысла с позиции финансов и хлопот.
Сборы Робокассы
Комиссии Робокассы были не очень подходящими, и я к настоящему времени уже перешёл на «Яндекс.Кассу»; но тогда для начала они были приемлемыми.
Контент, соответствующий нише. Я решил начать только с трёх самых популярных ниш, а именно: бизнес и мотивация, общий контент, ориентированный на мужчин, общий контент, ориентированный на женщин. Для этого я создал гремучую смесь из общедоступного контента, из некоторого предположительно защищённого авторским правом контента от неизвестных авторов, а также из постов групп, которые дали мне своё разрешение в обмен на размещение водяных знаков их логотипов. Этого было достаточно для начала.
Система управления публикацией. Сеть VK.com была первой и, вероятно, самой большой (помните, что рассматривается только российский рынок) социальной сетью, для которой я должен был обеспечить поддержку. Однако я понимал, что в будущем, необходимо поддерживать также Facebook, Twitter и «Одноклассники», поэтому следовало добавить своего рода ответвления для них. В конце концов, я просто сделал единую функцию, которая вызывала методы API восходящей социальной сети для каждой группы, готовой к обслуживанию, и добавил её вызов в CRON. CRON срабатывал через каждые 15 минут.
Здесь показан элемент этой функции:
<?
function process() {
$groups = $this->Group_model->getReadyToPublish();
foreach ($groups as $group) {
switch ($group->type) {
case 'vk':
$result = $this->Pub->vk();
break;
case 'ok':
$result = $this->Pub->ok();
break;
case 'tw':
$result = $this->Pub->tw();
break;
case 'fb':
$result = $this->Pub->vk();
break;
}
switch ($result->error){
case 1:
// process error
break;
case 2:
//process error
break;
...
case 0:
// charge user and move to next group
break;
}
}
}
?>
Да, конечно, всё это очень недоработанное и выглядит непрофессионально. Возможно, я должен был бы использовать какое-то существующее решение с очередями, но, как я всегда пишу, я не считаю себя разработчиком и совсем немного знаю о современных решениях. Я всё программирую сам с самого начала, потому что это можно делать быстро, и я могу незамедлительно реагировать на пользовательскую обратную связь. В дальнейшем я с удовольствием передаю эту работу кому-нибудь умнее меня.
Всесторонняя статистика и логирование. В моих предыдущих проектах всё обычно шло наперекосяк именно из-за отсутствия данных для анализа тенденций и ошибок. На этот раз я не хотел делать ту же ошибку и решил собрать как можно больше данных с самого начала.
Месячная статистика после полутора лет работы; строки представляют дни месяца.
На самом деле, когда речь идёт о статистике и регистрации, их трудно переоценить. Чтобы принимать правильные решения, нужно иметь множество данных по каждой отдельной части вашего сервиса. Особенно это важно для ценообразования.
Биллинг. Некоторые из социальных сетей (да, я смотрю на вас, VK.com и OK.com) были весьма ненадёжными, поэтому я решил не использовать модель подписки и отказался от неё в пользу взимания платы с пользователей на основе каждого поста. Таким образом, я мог не беспокоиться, если не смогу доставить контент моим клиентам из-за проблем, связанных со сбоями социальных сетей.
Когда всё у меня было настроено и готово, настало самое время подумать, как же я получу первых клиентов и на чем, собственно, будем делать сервис.
Запуск
В то время у меня был очень ограниченный бюджет, и потратить его на платную рекламу было бы просто безумием. Поэтому я должен был найти способы получить пользователей бесплатно.
Задача сводилась к следующему: мне нужно было найти способ связаться с владельцами групп и при этом не быть заблокированным как спам. Поэтому прямая рассылка не проходила.
Однако я заметил, что у групп была очень интересная особенность: любой желающий мог предложить пост в группу, который владелец после ознакомления может опубликовать. Этой особенностью уже серьёзно злоупотребляли, но, если сделать хорошо и правильно, она всё же могла бы сработать.
Я взял несколько групп в нишах, для которых Postio (так я назвал этот сервис) имел контент, и начал предлагать им посты, как то, что показано на скриншоте ниже.
Один из рекламных постов (только как пример)
Поскольку я сам был владельцем группы, я знал довольно хорошо, как подготовить пост, который понравится модератору.
Результат был впечатляющим: почти 70% владельцев, которым я предложил посты, зарегистрировались в Postio. Почти 60% из тех, кто зарегистрировался, пополнили свой баланс в системе. Некоторые из них даже нашли меня в социальных сетях и поблагодарили за сервис. Эта часть была самой удовлетворительной для меня.
Помимо этого приёма с предложением поста я также опубликовал пост в своей собственной группе и предложил владельцам групп подписаться на Postio. Я знал, что многие из них читали группы друг друга для отслеживания тенденций, постов и обстановки в целом. Это дало мне еще некоторое количество подписавшихся и платящих клиентов.
В конце месяца статистика была следующая:
Пополнение баланса и доход приведены в долларах США
Это было хорошо, но я всё ещё не выяснил, сколько надо взимать с моих клиентов. Пришло время разобраться с этим.
Установление цены
У меня не было никакого представления о том, сколько пользователи готовы платить за такой сервис, поэтому я просто задал цену в 1 цент за один пост. Однако, как я писал несколько раз в моих прежних статьях, этот подход наугад к ценообразованию является весьма дорогостоящим. Даже малейшая ошибка (будь то заниженная или завышенная цена) может стоить целое состояние в долгосрочной перспективе.
Поэтому я решил применить свой обычный подход и выяснить цену, которая принесёт наибольший доход. Я назначил случайным образом цену из заранее определённого набора для каждого пользователя и отслеживал все действия, связанные с этой ценой.
Вот так это выглядело в коде:
Используя метод incTestValue, разбросанный по всем критичным участкам кода, я мог собирать требуемые показатели для конкретной цены.
Вскоре я получил следующую статистику:
Помните, что исходной валютой был не доллар США, поэтому колонка платежа за сервис выглядит не совсем ровно. В рублях все было красивее.
Этот сплит-тест выявил довольно интересные моменты:
- Цена один цент имеет наибольшее количество опубликованных постов.
- Цена два цента оказалась наиболее прибыльной.
- На данном этапе было бесполезно тестировать цены, превышающие два цента за пост.
- Люди, получившие цену два цента, пополняли свой баланс в два раза чаще. Это могло бы означать, что они были удовлетворены первой попыткой использования этого сервиса и сделали дополнительное пополнение.
В любом случае два цента за пост оказались наиболее прибыльной ценой на данном этапе, поэтому я остановился на ней. Но это совсем не означает, что это всегда будет так. Вероятно, по мере развития Postio пользователи будут готовы платить больше, но это предмет тестирования в дальнейшем.
Теперь, когда у нас есть наша цена, полученная на основе данных, давайте немного расширим наше предложение.
Особенности программы, расширяющие возможности
Помимо увеличения количества ниш и социальных сетей, поддерживаемых моим сервисом, было ещё, что я мог сделать. Некоторые клиенты просили меня сделать инструмент для обработки изображений, которые они вставляли в свои посты. Речь шла о закруглении углов, добавлении некоторых эффектов и размещении водяных знаков. Это была прекрасная возможность дополнительной продажи.
Я сделал простой интерфейс, который позволял пользователям задавать их собственные характеристики для изображений. Каждый эффект имел свою отдельную цену, которая добавлялась к базовой цене поста. Вот как это выглядело:
Сейчас я бы сказал, что это довольно грубо, и было глупо взимать плату с пользователей за каждый чих, но все мы были молодыми, верно?
Алгоритм, реализовывавший эти эффекты, был сравнительно простым. Это была просто функция с множеством аргументов и некоторая программа внутри, базирующаяся на ImageMagick.
Я добавил в таблицу статистики дополнительную колонку, показывающую, какие эффекты пользователи применяли и как часто они делали это. Эта функция набрала обороты довольно быстро.
Слева — пример статистики, а справа — динамика изменения
Кроме того, я добавил много других функций, таких как паузы, загрузку пользовательских постов и поддержка нескольких учётных записей, но это не так интересно, так что давайте перепрыгнем несколько глав и посмотрим, что я сделал с трафиком.
Расширение трафика
У меня был очень ограниченный бюджет (около 500 долларов), поэтому прямая покупка трафика не проходила. Однако я заметил естественным образом растущий поисковый трафик к главной странице, который даже имел ключевые слова, связанные с моей нишей, но не принадлежавшие ей непосредственно.
После быстрого анализа объёма трафика с данными ключевыми словами я решил вложить весь бюджет в два направления: написание статей для наиболее популярных поисковых запросов и покупку рекламных постов у блогеров в моей нише.
Я составил список ключевых слов, которые мои пользователи чаще всего задавали в поисковых системах, и нанял копирайтера для подготовки статей на их основе. Это были выражения типа «как сделать группу Вконтакте», «как сделать меню в группе Вконтакте» и т.п.
После того, как статьи были опубликованы в разделе справки Postio, я согласовал специальные цены с наиболее перспективными блогерами в моей нише, и они сделали несколько постов о моём сервисе.
Все эти действия подняли поисковый трафик:
Кстати — основная часть этого трафика пришлась на одну статью о том, как сделать меню в группе Vk.com. Это привело к тому, что я сделал ещё один SaaS-сервис для создания меню, Menumake. Я описал процесс его создания в другой статье (переведенная версия здесь). Посмотрите её, там тоже есть довольно любопытные моменты.
В завершении, я ввёл партнёрскую программу. Это было довольно просто: пользователи имели свою уникальную ссылку, которую они использовали, чтобы пригласить других пользователей и получить 10% партнёрской платы на свои расходы. Вроде бы ничего особенного, но этот источник не только дал 15% всех регистраций, но и обеспечил для Postio несколько высококачественных обратных ссылок из различных источников. И это, несомненно, только на пользу рейтингу сайта в поисковых системах.
Потребовалось 14 месяцев, чтобы достичь ежемесячной прибыли 3 700 долларов (тогда это было ещё 7 000), и единственной крупной потерей было значительное снижение курса валюты, с которой работал этот сервис.
Как работать с API систем, который постоянно падают
Управление Postio никогда не было легкой прогулкой. Наверное, вы можете себе представить, что клиенты и слушать не хотят отмазки из разряда “Простите, что вы остались без постов — у нас соцсеть упала”. Таких случаев хочется иметь как можно меньше.
При создании любых систем, я применяю правило антихрупкости, сформулированное Нассимом Талебом — система должна становиться надежнее с каждым сбоем или ошибкой. Или, в версии Ницше: “Все, что нас не убивает, делает нас сильнее.” В Постио это применяется очень просто — нужно внимательно отслеживать любые ошибки и флуктуации API соцсетей и под каждый кейс писать обработчики и страховщики.
К примеру, главная функция публикации в Postio — та, которая раз в 15 минут пробегается по всем группам и находит те, которым нужны посты — за все время работы сервиса увеличилась раз в 20. Именно за счет необходимости обрабатывать невероятное количество сбоев и ошибок 4-х социальных сетей. Да, ее давно пора структурировать и написать отдельный модуль для работы с исключениями, но у меня не хватает на это времени.
Правило антихрупкости очень простое, весь его секрет кроется в двух скучных словах — методичность и систематичность. Конкурентам Постио (мир праху их) этого как раз и не хватало.
Заключение
Выведение SaaS-сервиса на прибыльность никогда не было лёгким делом, и невозможно объяснить каждый аспект этого процесса в такой небольшой статье, как эта. Однако такой сервис может сделать почти любой разработчик. Не требуется партнёр, инвестор или даже какая-то великая идея. Просто начните делать что-то, и вы неизбежно наткнётесь на задачку, которую надо бы решить. Нет в мире совершенства, и это — хорошая новость.
Я надеюсь, что эта история оказалась чем-то полезна вам, и, как обычно, я открыт для любых вопросов здесь или в моем Твиттере. Если же владеете английским, то обратите внимание на мой блог на Медиуме — я делюсь там историями и информацией о создании стартапов, без венчура и смузи.
Спасибо за прочтение!
Примечание автора оригинальной статьи: я просмотрел и дополнил этот перевод, поэтому за все ошибки и недочеты ругать меня, а не переводчика.
Автор: LukinB