Лондон, 21:00, уже темно и идет дождь. Влад с фонариком ищет что-то, но что? Час назад ему позвонила незнакомая девушка с американским акцентом и продиктовала координаты. Прохожие смотрят на него с подозрением, а в его голове крутится только одна мысль − “Как я в это влип?”
А влип он в это из-за меня.
Влад мой очень близкий друг. Но я забыл о его дне рождения и решил уж лучше поздно чем никогда. Вот только подарок должен быть очень необычным.
Вначале идея была очень простой, написать поздравление, закодировать его в QR код и отправить почтой. Но как-то слишком банально, и я начал придумывать способы это усложнить.
В письме я дал ссылку на файл с приватным ключом для SSH и IP сервера. На сервере его ждала игра в тетрис, победив которую он получил ссылку на инструкцию перевести 1 сатоши на биткойн адрес. После проверки транзакции Влад получил следующий ключ для SSH, но что бы узнать пароль к нему пришлось скачать armv6 бинарник с IPFS и забрутфорсить пин (~4 часов на Raspberry Pi). Дальше − сообщение ждать звонка. Третий ключ я записал на флэшку и спрятал под лавочкой в парке в Лондоне, попросил знакомую позвонить Владу и дать координаты. Пароль к ключу был закодирован как программа на Brainf*ck. Используя третий ключ сервер дает ссылку на сессию VNC в виртуальную машину с Windows 3.1, где Владу нужно найти скрытый файл на диске. В нем − ссылка на страницу с сообщением в духе Happy Birthday!
Все это было усыпано фактами и аллюзиями, которые мог знать только Влад. Его сестра любезно помогла достать нужную информацию ????
На создание ушло 2 месяца, в основном по 20-30 минут вечером. Прохождение квеста растянулось на 2 недели.
Шутка получилась славная, Владу тоже очень понравилось (и он с пониманием принял опоздавшие поздравления).
А может сделать с этого пет-проджект?
Если понравилось Владу, может понравится и другим?
Я решил взять несколько пазлов, связать их в кучу, добавить сайт где можно указать имя и финальное сообщение. Скрипт это все генерирует и отдает уникальный QR код, который можно дарить гикам.
Изначально идея была отправлять открытку, но с физической стороной оказалось много проблем. Печатный станок или USPS царапали открытку с QR кодом, и он не всегда правильно читался. Время доставки иногда затягивалось более чем на неделю. К тому же, мало кто хотел оставлять свой физический адрес, а получатель мог принять открытку за спам.
Поэтому я решил перевести фокус исключительно на цифровой аспект. Покупатели сами могут распечатать, передать на телефон или спрятать на десктопе.
Под капотом
Сначала хотел все написать сам (ведь я же программист-фронтэдщик), но быстро понял, что так дело застрянет еще надолго. Поэтому для сайта магазина взял Shopify. Популярный, есть API, оплата, аналитика, возвраты, отчеты.
Первые заказы обрабатывал вручную. Приходит push notification на телефон, я бегу за комп и быстренько вбиваю данные в локальный скрипт, потом отправляю результат по почте.
Заказов в начале было немного, и адреналин от каждых $20 приносил кайф. Но вставать среди ночи быстро надоело. К тому же, хотелось создать приятное впечатление и instant free delivery.
Пришло время Автоматизации. Shopify для каждого заказа умеет дергать web hook, а там я могу генерировать новую открытку и отправлять по почте.
Сначала это был микросервисный зоопарк − скрипт на Ruby, лямбда на Node.js, DynamoDB, файлы на S3, Zapier, Mailchimp. Создавалось все по вечерам по принципу “как бы проще и быстрее”. Но в результате получился монстр, иногда скрипты падали и заказы терялись.
Как начался COVID карантин, переписал все на Ruby on Rails. Теперь мой бэкэнд − это гордый монолит с тестами. После 5 лет JavaScript и Node, рельсы как глоток свежего воздуха. Все работает из коробки и не надо для каждой задачи искать фреймворк недели.
Итого я провел над проектом 80-100 часов.
Первые $20
Как все было готово, закинул $50 на рекламу в Facebook. В результате 200 лайков и ноль заказов. Долго крутил разные параметры, практически без результатов.
Первых пользователей я нашел в локальное группе Bay Area, написал что есть вот такой оригинальный подарок ко дню программиста для айтишников и айтишниц. Рекламировать было жутко неприятно, ждал гневных реакций и бана, но через пол часа на телефон приходит уведомление от Shopify, вот он, твой первый покупатель! Кайф.
С тех пор сайт сам растет потихоньку. Кто-то о нем в твиттере напишет, кто-то из LinkedIn узнает. Даже какие-то медиа о нас писали, “20 подарков для программистов на Рождество”.
Одна девушка из США заказала мою открытку подруге в Германии, а та потом купила такую же для друга в Израиле, а тот потом подарил квест для брата в Чехии.
Несколько раз бывало так что менеджер или тимлид заказывал сразу 10-15 штук для всей команды. Одного из таких я нашел на LinkedIn, Head of Security team @ Starbucks.
В конце пазла у меня есть небольшая форма для фидбэка. Не все ее заполняют, но вот так выглядит статистика.
Финансы
В рунете я редко вижу статьи о финансовой стороне пет-проектов. На западе есть Indie Hackers, на котором основатели таких проектов открыто делятся доходами, отчетами и провалами.
Этот пост я тоже сначала опубликовал в закрытом сообществе, но мне кажется в нем есть польза для всех.
Открытка стоит $19.99, иногда покупают со скидкой. За период с 1 сентября 2020 по 1 сентября 2021 было 276 заказов, всего выручка $5 217.
Shopify кушает ~4% с каждой транзакции, просит $32 в месяц за сервис и $36 в год за домен.
Бекэнду нужен сервер на Heroku ($7 в месяц), база данных Postgres ($7 в месяц) и один VPS ($10 в месяц) для квеста + домен ($13 в год).
Итого $721 расходов.
Профит $5 217 - 4% - $721 = $4 287 в год ($357 в месяц).
Много ли это?
С одной стороны очень неплохо для пет-проекта. Два года назад проект с трудом вышел в ноль.
С другой стороны, время, которое я на него потратил я бы мог потратить на что-то другое. $357/месяц не так уж много если сравнить с зарплатами программистов.
Сложности
Когда-то я читал книгу о создании маленьких бизнесов Start Small, Stay Small. Там автор говорит, что техническая часть это максимум 10% от всей работы.
Мне было очень комфортно залезть в код, писать тесты, оптимизировать скорость — там все понятно, всегда можно найти интересные задачи, изучить новый фреймворк.
Но вскоре я увидел на своем опыте, что технические штуки не двигают проект вперед. А заниматься маркетингом, продажами и рекламой трудно — ничего не понятно, интернет забит низкокачественными статьями, везде нужно тратить деньги.
Например, в рекламе для себя я выделил две целевые аудитории:
Гики, которые выкупают фишку такого подарка, и у них есть друзья, которым они такое захотят подарить. У этих ребят и девчонок полная рекламная слепота, Facebook на них не влияет.
Люди, которые в технологиях не разбираются, но у которых сын или девушка − программист. Они смотрят Facebook и кликают на рекламу, но им сложно донести крутость такого подарка.
Но я не считаю что деньги, которые я потратил на рекламу, потрачены зря. Это помогло мне понять, что не работает, и правильно построить свои ожидания.
13 сентября − День Программиста
Традиционно 256й день в году, не забудьте поздравить друзей :)