Наверное, многим приходилось делать специфические инструменты под свои узкозаточенные нужды — скрипты или Excel-таблицы. И после задумываться: что, если точно такое же решение нужно кому-то ещё? Как об этом узнать и понять, можно ли на этом заработать?
Моя история началась с достаточно простой задачи. Мне нужно было посчитать всего лишь одно число: годовую доходность для своих инвестиционных инструментов. Обшарив весь интернет и не найдя готового решения, мне пришлось сделать его на основе Гугл-таблиц самому. Получилось хорошо — и я решил проверить, существует ли коммерческий спрос на мою разработку.
В этой статье я расскажу:
Сразу же на ум приходит следующая формула
Что делать, если я вносил деньги несколькими частями в разное время или выплаты происходили периодически? В этой ситуации сложно понять, какая сумма и какое количество времени была на счету. Естественно я не первый, кто столкнулся с такой проблемой и на данный момент существует два решения:
Если сложить все денежные потоки (вычесть вложения и прибавить снятия), то полученная разница — это доход. Например, вложили 10 000 руб в банк, через год сняли 10 600 руб, доход при этом 600 руб. Также доход можно получить, умножив сумму вложения на процентную ставку. Например, 10 000 руб умножаем на банковскую ставку 6%, получаем 600 руб.
Дальше интереснее, мы изменяем денежные потоки на такое число, которое компенсировало бы полученную прибыль. Вот более грамотное описание, но по сути вся логика заключается в следующей формуле:
IRR — это неизвестная доходность годовых. Подставляем значения из примера с банковским вкладом: — 10 000 руб/(1+6%)^0 + 10 600 руб/(1+6%)^1 = 0. Все сходится. Теперь остается выразить IRR и посчитать уже программным путем с помощью циклов или функцией ЧИСТВНДОХ в Excel.
Для расчета IRR достаточно знать суммы операций и даты, когда они были совершены. Составил несколько столбцов в таблицах.
Я записал названия инструментов, все операции по ним (с плюсом — вложение, с минусом — снятие), даты операций и стоимость активов (сколько сейчас на счету). Не увидев элегантного решения с помощью формул, перешел к написанию скрипта. Гугл-документы используют обрезанный javascript поэтому проблем с изучением не возникло. Переходим по Инструменты -> Редактор скриптов. Пишем наш код.
Переходим в таблицу, запускаем скрипт. Годовая доходность с учетом всех операций и периодов посчитана!
Добавил всякие допформулы и графики. Теперь точно красота.
Чтобы каждый раз не обновлять файл вручную, в Sheets можно настроить запуск скрипта по событию: открытию таблицы, клику, изменению. Для этого из редактора скриптов переходим в Изменить -> Триггеры текущего проекта. Там выставляем следующие значения.
Теперь расчеты обновляются автоматически. Таблица готова. Дорабатывать есть что, но мне и так сойдёт.
Прежде, чем разбираться в формулах и писать код для вычисления всего лишь одного значения, я обшарил весь интернет и не нашёл готового решения. Значит, видимо, и спроса нет. Но теперь, когда таблица готова, «и увидел он, что вышло хорошо», стало интересно проверить — существует ли какой-то потенциальный спрос на подобное решение?
Кучи знакомых инвесторов для проведения проблемного интервью у меня нет, поэтому обращаемся к доступным и быстрым методам проверки.
В статистике поисковых запросов Яндекса виден некоторый интерес в данной области, но объёма рынка недостаточно, чтобы было экономически выгодно разрабатывать и развивать отдельный сервис.
С другой стороны, проведённый мной опрос на vc.ru показал, что 46% используют таблицы для учёта.
Возможно, из-за небольшой выборки результаты находятся в рамках погрешности.
Тем не менее, явно есть люди, которые не нашли готового сервиса и составили табличку. А вдруг для них это самый удобный вариант или трудности настолько незначительные, что даже Google Play или App Store открывать не хочется?
Для проверки этого предположения я создал опрос в Google-формах с возможностью оставить почту для получения сырой версии программы.
Чтобы залить туда хоть какой-то трафик, написал статью на vc. Итог: 1095 просмотров, 1 человек оставил заявку. Конверсия 0,1% не доказывает низкий спрос, так как зависит ещё от множества факторов: понятности статьи, интересов аудитории, расположения целевого действия и т.д. Полученная же заявка говорит о том, что человеку было не лень дать почту для решения проблем с учётом.
Чтобы больше узнать о проблеме и недостатках существующих решений — нужны люди. Трафик с бесплатного поста временный и недостаточно целевой. Решил дать контекстную рекламу по ключевым запросам.
Отправлять людей сразу на таблицу нельзя — не поймут, что происходит. Соответственно, нужен лендинг, и чем проще, тем лучше.
Открываем конструктор, Wix или Tilda, выбираем шаблон, изменяем текст и ссылки, публикуем, оплачиваем. Дел на 20 минут.
Всё просто, но с последним пунктом возникли сложности. После увольнения отдыхал несколько дольше чем планировал, вклады распаковывать не хотелось. Какое-то время пришлось жить на неравномерно приходящие небольшие дивиденды. В тот момент не было даже 700 рублей на оплату полной версии. В бесплатной нельзя подключить аналитику, домен, проработать SEO.
Пришлось делать качественнее. Нашёл не сильно страшный бесплатный bootstrap-шаблон. Скачал, удалил лишние блоки, заменил текст и картинки.
Основная задача — это узнать как можно больше о проблемах, решениях, людях. Для сбора данных я буду использовать Яндекс-метрику, Google Analytics, Google Tag Manager, сокращатель ссылок.
Зачем две веб-аналитики? Во-первых, чтобы сверяться и вовремя понять, если аналитика работает неправильно. Во-вторых, возможно, в дальнейшем буду давать рекламу не только в Яндексе, но и в Гугле, а для эффективной рекламной кампании нужны данные о поведении пользователей. Более того, уже сейчас есть возможность просто сказать Яндексу: приведи мне людей, которые купят этот товар, а нейронная сеть сделает остальное. Так что маркетологам пора задумываться о новой профессии.
Зачем GTM? Google Tag Manager — это современный способ подключения аналитики, который даёт следующие преимущества:
Создаём новый счетчик и копируем HTML-код в Яндекс-метрике.
Идем в Google Tag Manager, создаём аккаунт и контейнер.
После чего сервис покажет код для подключения на сайт. Нажимаем Создать тег. Тег — это настройка того, что должно запускаться (конфигурация тега) и при каком событии (триггере).
В конфигурации тега выбираем «пользовательский HTML», вставляем туда код метрики, а в качестве триггера — «просмотр всех страниц». Теперь при просмотре любой страницы пользователем будет запускаться Яндекс метрика.
На данном примере польза не очень велика, счётчик было бы проще вставить напрямую, а вот настраивать события через GTM гораздо полезнее.
Возвращаемся в метрику. Настройка -> Цели -> Добавить цель. Придумываем название и идентификатор, они должны быть краткими и описывать цель.
Я поставил галочку рядом с Ретаргетинг, чтобы рекламная кампания могла ориентироваться на данную цель, когда привлекает людей. Копируем код ниже, сохраняем и идем в GTM. Создаём новый тег, как и до этого вставляем скопированный код. Создаём новый триггер, на этот раз с типом Клик.
Здесь же в моём случае выбираем «некоторые клики» и ставим, что триггер будет активироваться при клике по элементу с ID равным btn_sheet. Чтобы узнать ID элемента — заходим на сайт через Chrome, нажимаем Ctrl+Shift+C и нажимаем на нужный элемент.
Сохраняем триггер, нажимаем «Предварительный просмотр» и переходим на сайт.
На сайте появится консоль для проверки. Сверху — события, которые выполнились, ниже — все остальные. Нажимаем на кнопку и соответствующее событие должно переместиться вверх. Если так, то можно переходить дальше.
Регистрируемся в Аналитике, создаём аккаунт и ресурс.
Здесь будет гораздо проще, так как с Аналитикой GTM имеет интеграцию. Для подключения достаточно выбрать соответствующий тег.
Для добавления событий не нужно копировать и вставлять HTML-код, их также можно настроить в соответствующем тэге. После создания всех триггеров можно публиковать версию, нажимаем «Отправить». Теперь Аналитика и Метрика настроены.
Я планирую выстроить следующую воронку: реклама -> сайт -> таблица -> форма для записи на тестирование. От рекламы и до таблицы информация о пользователе будет идти в Метрику, а вот дальнейшие его шаги остаются загадкой.
Для подсчёта переходов решил использовать сокращатель ссылок. Таких сайтов огромная куча. Перебрав штук пять, выбрал самый оптимальный — to.click. Он умеет:
Зарегистрировался, создал ссылки для отслеживания следующих переходов:
Зарегистрировал хостинг в Timeweb за 179 руб. Он крупный, функциональный и дешевый. Там же взял домен в зоне .ru за те же 179 руб + бесплатный SSL-сертификат (показывает, что сайту можно доверять). Название домена нейтральное, чтобы в дальнейшем бесплатно создавать сколько угодно поддоменов (например poddomen.neitralnoe-nazvanie.ru) и проверять на них другие проекты. Удобно регистрировать все в одном месте, не нужно потом связывать домен и сервер, подключать сертификат, все происходит автоматически. Закидываю все файлы сайта на сервер через файловый менеджер Timeweb — сайт готов.
Не буду рассказывать, как обманывать сервисы — скажу лишь, что получил ещё бонус в 200 рублей по реферальной программе, и мой друг также получил 200 руб. Итого трат вышло на (179+179-200) 158 руб (если бы мой друг был мной, я был даже оказался в плюсе на 42 руб).
Сайт готов, теперь нужны только люди. Есть много рекламных стратегий, в моей ситуации мне нужен был подход с минимальным бюджетом, что означало, что я смогу привлечь только небольшое число людей. Соответственно, нужно, чтобы эти пользователи были максимально целевыми. То есть, только те, которым нужен именно мой продукт.
Также мне необходимы максимальные конверсии. То есть, чтобы на каждый следующий этап с предыдущего переходило как можно больше людей. Таких шагов сейчас три: реклама -> сайт -> таблица -> запись на тестирование. Добиваться высокой конверсии я решил с помощью простоты, удобства, релевантности, постоянных улучшений с помощью экспериментов и изучения пользователей.
Выбор пал на контекстную рекламу с низкочастотными запросами. То есть, показ рекламы в выдаче по малочисленным поисковым запросам — по ним ниже конкуренция и стоимость клика.
Сначала нужно подобрать как можно больше слов которые ассоциируются с областью моего продукта. У меня это два столбца: действие и базовое слово. В данной области не так много запросов, но в другой может быть больше, например, адрес, цвет, характеристика и т.д.
Закидываем полученные в комбинатор ключевых слов (их много, по функционалу все одинаковые).
Сервис сопоставляет каждое слово с каждым из всех столбиков, получается куча словосочетаний. После скачиваем Словоёб — это реальное название бесплатной и очень полезной программы для маркетинга. Заходим в Настройки -> Парсинг -> Yandex.Direct. Добавляем созданный новый аккаунт Яндекса (не личный, его могут заблокировать).
Сохраняем дальше переходим в Данные -> Добавить фразы. Вставляем список, полученный в комбинаторе фраз. После переходим в раздел Сбор данных.
У меня достаточно короткие фразы (из 2 слов) — возможно, есть более длинные, а, значит, редкие (низкочастотные). Поэтому нажимаю на Пакетный сбор из левой колонки. Программа найдёт все запросы с содержанием данных фраз, которые искали в Яндексе ранее. После завершения парсинга берём ключевые фразы со столбиком частотности и кидаем в Excel.
Приступаем к настройке Директа: нажимаем Добавить -> Кампанию -> Текстово-графические объявления.
Расписание показов, регион оставляю как есть. Мой продукт можно использовать в любое время и в любом месте. Подключаю счетчик Яндекс-метрики, назначаю стратегию: показывать только на поиске и ручное управление ставками. Это значит, что Яндекс будет стараться показать моё объявление всегда, вне зависимости от цены клика у конкурентов. Я предполагаю, что с такими низкочастотными фразами она будет маленькой.
В корректировке ставок я уменьшаю ставку для смартфонов до минимума. С таблицей на смартфоне пользователю будет разобраться сложнее — значит, с них будет плохая конверсия.
Минус-фразы вношу исходя из запросов, которые получил ранее. Кто-то ищет конкретные методики, авторов курсов или вещи совсем из другой области. Например, запрос «сравнение актив 1 и актив 2» оказался не про финансы, а про модели часов. Плюс в интернете есть универсальные списки минус-фраз. В моём случае это курсовая, диплом, задача и т.д. На данном этапе нельзя отсечь все нерелевантные запросы, поэтому нужно будет постоянно мониторить аналитику и новые фразы.
В дополнительных настройках оставляю расширенный географический таргетинг, добавляю свой чат с оператором на базе Яндекса. Сейчас мне важно как можно больше общаться с пользователями. Переходим в Яндекс-Диалоги, Создать чат -> Чат для бизнеса.
Здесь важно добавить иконку такую же как на сайте. Создаю картинку 2 размеров. favicon.png 64x64 px для сайта ее нужно закинуть в папку с сайтом. И такую же 224x224 для диалогов.
После сохранения на вкладке Виджет нужно скопировать код и добавить на свой сайт, чтобы диалог с оператором можно было открыть не только в поисковике, но и на сайте. После чего на вкладке Общие сведения копируем идентификатор диалога и вставляем его в рекламную компанию Директа.
Включаю ещё пункт «останавливать объявления при неработающем сайте», и сохраняю рекламную кампанию.
Дальнейшее редактирование будем проводить в таблице Excel, поэтому в интерфейсе создаём группу и объявление только для примера. Добавить -> Группу. Здесь нужно написать любую строку в ключевые фразы. После сохранения Директ предложит создать объявление.
Забиваем любой заголовок, основной и дополнительный. Текст объявления можно написать сразу какой-нибудь универсальный. Изображение и видео не добавлял, пока нет времени париться с креативами. Будет показываться только текстовая реклама, она же более конверсионная.
Контактной информации и виртуальной визитки у меня нет. В страницу перехода можно добавить дополнительную информацию. Например site.ru/#invest-programa. Хоть она и не ведёт на отдельную страницу, но увеличивает размер объявления, делая заметнее. Если каждому запросу прописать ссылку с соответствующим названием, то для пользователя она будет релевантнее.
Добавляем уточнения и быстрые ссылки. Вот здесь и понадобятся ранее созданные в сокращателе отслеживаемые ссылки. Я создаю следующие:
Три из них ведут на одну и ту же форму записи на тестирование, так что это возможность выяснить заодно, какой формат приложения хотят пользователи. К ссылкам добавляю описание — опять же, для увеличения размера объявления. Сохраняем.
Для более точной настройки стоит создать объявление для каждой ключевой фразы. Их у меня больше 100. А лучше даже создать по 2 дополнительных фразы, 2 текста и, путём комбинирования, получить по 4 объявления на каждую ключевую фразу. А уже алгоритм опытным путём выявит самые конверсионные. Такое количество нереально сделать в интерфейсе, поэтому переходим в Инструменты -> Управление с помощью Excel. Скачиваем таблицу.
Выглядит страшно, но, так как мы предварительно заполнили одну группу и объявление, разобраться можно. Удаляем ID группы, фразы, объявления, тогда при загрузке в Директ будут создаваться новые объявления, а не обновляться.
Возвращаемся к ключевым фразам, которые мы собирали ранее. Здесь прям нужно попотеть. Удаляем все, что не подходят по контексту.
Возвращаемся в выгрузку. Строку с объявлением нужно скопировать столько раз, сколько ключевых фраз осталось. Дальше вставляем столбик ключевых фраз в 3 места: название группы, фраза, заголовок. Да, запрос пользователя будет полностью дублироваться в заголовке объявления, так получается максимальная конверсия. Если он превышает 35 символов, нужно обрезать. Вот и всё, получилась следующая картина. Как я говорил, при желании можно создать несколько комбинаций объявлений.
Сохраняем и загружаем обратно в Директ. Должно было получиться множество групп, каждая с одной ключевой фразой и одним объявлением. В принципе, можно было бы создать несколько групп, в каждой по несколько ключевых фраз общих по смыслу и столько же объявлений с соответствующим заголовком, но Яндекс не всегда корректно выбирает объявление. Не знаю, с чем это связано.
Можно оплачивать и запускать кампанию. Для такой низкочастотной рекламы, если всё правильно сделать, на первых порах можно уложиться 10 000 руб. Я закинул 1500.
Так как с таким бюджетом пользователей немного, я получил возможность проследить практически за каждым по отдельности.
С помощью Метрики смотрел, какой запрос он ввёл, из чего узнал новые сферы проблем и добавил минус-фразы к объявлениям. Через Вебвизор следил за всеми действиями на сайте. Изучал пути переходов по ссылкам и ошибки из логов Google Apps.
Перейдём к цифрам.
Конверсии действительно неплохие, но, повторюсь, я ориентировался на небольшое количество супер-целевых пользователей. Если увеличивать охват, понадобится менять стратегию, поднимать бюджет и терпеть уменьшение конверсии.
Также из такого маленького количества не вывести какую-либо статистику. Нельзя сказать, что 20% пользователей MVP записываются на тестирование, если речь всего о двух пользователях из десяти — они вполне могли попасть в рамки погрешности.
Как видно, за месяц было потрачено 342 руб. при стоимости клика 1,54 руб. Это только 20% от заложенного бюджета, поэтому, возможно, позже я запущу ещё одну кампанию с расширением аудитории и добавлю больше полезной информации на лендинг — но на данный момент всё работает примерно так, как и задумывалось.
Моя история началась с достаточно простой задачи. Мне нужно было посчитать всего лишь одно число: годовую доходность для своих инвестиционных инструментов. Обшарив весь интернет и не найдя готового решения, мне пришлось сделать его на основе Гугл-таблиц самому. Получилось хорошо — и я решил проверить, существует ли коммерческий спрос на мою разработку.
В этой статье я расскажу:
- как сделать таблицу для расчёта годовой доходности инвестиций с учётом всех операций и периодов;
- как создать лендинг и настроить аналитику для потенциальных пользователей;
- как проверить гипотезу и потенциальный спрос с помощью контекстной рекламы в Яндексе с бюджетом в 1500 рублей.
I. Расчёт годовой доходности: разработка инструмента
Сразу же на ум приходит следующая формула
[прибыль]/[вложенные средства]/[количество дней]*365 = [доходность в %/годовых]Она действительно работает, когда вложил деньги и через какое-то время снял больше.
Что делать, если я вносил деньги несколькими частями в разное время или выплаты происходили периодически? В этой ситуации сложно понять, какая сумма и какое количество времени была на счету. Естественно я не первый, кто столкнулся с такой проблемой и на данный момент существует два решения:
- Посчитать доходность за каждый день и получить среднее. В этом случае придется каждый день записывать стоимость активов, что было бы очень затруднительно. Можно конечно взять больший период: неделю или месяц, но пострадает точность.
- IRR или внутренняя норма доходности. Наверное, самый популярный способ вычисления годовой доходности. В чём суть?
Если сложить все денежные потоки (вычесть вложения и прибавить снятия), то полученная разница — это доход. Например, вложили 10 000 руб в банк, через год сняли 10 600 руб, доход при этом 600 руб. Также доход можно получить, умножив сумму вложения на процентную ставку. Например, 10 000 руб умножаем на банковскую ставку 6%, получаем 600 руб.
Дальше интереснее, мы изменяем денежные потоки на такое число, которое компенсировало бы полученную прибыль. Вот более грамотное описание, но по сути вся логика заключается в следующей формуле:
IRR — это неизвестная доходность годовых. Подставляем значения из примера с банковским вкладом: — 10 000 руб/(1+6%)^0 + 10 600 руб/(1+6%)^1 = 0. Все сходится. Теперь остается выразить IRR и посчитать уже программным путем с помощью циклов или функцией ЧИСТВНДОХ в Excel.
MVP в Google-таблицах
Для расчета IRR достаточно знать суммы операций и даты, когда они были совершены. Составил несколько столбцов в таблицах.
Я записал названия инструментов, все операции по ним (с плюсом — вложение, с минусом — снятие), даты операций и стоимость активов (сколько сейчас на счету). Не увидев элегантного решения с помощью формул, перешел к написанию скрипта. Гугл-документы используют обрезанный javascript поэтому проблем с изучением не возникло. Переходим по Инструменты -> Редактор скриптов. Пишем наш код.
Получаем данные из таблицы
var ss = SpreadsheetApp.getActiveSpreadsheet(); // получаем таюлицы
var sheet = ss.getSheetByName("Портфель"); // выбираем лист "Портфель"
var instruments = sheet.getRange("E4:F").getValues(); // Какие есть инструменты и какой баланс в каждом в $
var operations = sheet.getRange("A4:C").getValues(); // Cколько и когда внесли или вытащили $ из каждого инструмента
Перебираем все операции
//////////// для подсчета доходности портфеля
// коэвиценты для каждого инструмента
var dohNaProc = 0;
// суммарный доход
var allDohod = 0;
// перебираем все инструменты
insts.forEach(function (inst,i){
// суммы вложений и снятий
var summs = [];
// даты вложений и снятий
var dates = [];
// считаем доход в $
var dohod = inst[1];
// перебираем все операции
ops.forEach(function(op,n){
// все операции с данным инструментом
if(inst[0] == op[0]){
// записываем инвертированную сумму
summs.push(-1*op[2]);
// записываем дату
dates.push(op[1]);
// считаем доход
dohod -= op[2];
}
})
// добавляем то, что на балансе
summs.push(inst[1])
// Если баланс счета равен 0 (счет закрыт), ставим дату закрытия счета, как дату последней операции
// Если на счету что-то есть, счет открыт по сегодняшний день
dates.push( (inst[1] == 0) ? dates[dates.length-1] : new Date() )
// считаем доход в процентах с округлением до 1 знака после запятой
const dohodProc = (XIRR(summs,dates)*100).toFixed(1)
// расчитываем коэфицент для дальнейших расчетов
dohNaProc += (dohodProc != 0) ? dohod/dohodProc : 0
// расчитываем суммарный доход
allDohod += dohod
// считаем доход в долларах с округлением до 2 знака после запятой
dohod = dohod.toFixed(2)
Logger.log(dohNaProc+" "+allDohod)
// номер текущей строки
var strN = 4+i
// функция для подсчета дохода в %
var func = '=ROUND((((SUMIFS(C$'+strN+':C;A$'+strN+':A;E'+strN+';C$'+strN+':C;"<0")*(-1)+F'+strN+')/SUMIFS(C$'+strN+':C;A$'+strN+':A;E'+strN+';C$'+strN+':C;">0"))-1)*100;1)';
// выводим результат
sheet.getRange("G"+strN+":I"+strN).setValues([
[dohodProc.replace(".",","), dohod.replace(".",","),func]
]);
})// end foreach insts
// рассчитываем доходность портфеля
const allDohodProc = (allDohod/dohNaProc).toFixed(1)
// выводим результат
sheet.getRange("G3").setValues([["Дох. портф. "+allDohodProc+" % / год"]]);
Отправляем в функцию расчета IRR
function XIRR(values, dates, guess) {
// Credits: algorithm inspired by Apache OpenOffice
// Calculates the resulting amount
var irrResult = function(values, dates, rate) {
var r = rate + 1;
var result = values[0];
for (var i = 1; i < values.length; i++) {
// result += values[i] / Math.pow(r, moment(dates[i]).diff(moment(dates[0]), 'days') / 365);
result += values[i] / Math.pow(r, daysLag(dates[i],dates[0]) / 365);
}
return result;
}
// Calculates the first derivation
var irrResultDeriv = function(values, dates, rate) {
var r = rate + 1;
var result = 0;
for (var i = 1; i < values.length; i++) {
// var frac = moment(dates[i]).diff(moment(dates[0]), 'days') / 365;
var frac = daysLag(dates[i], dates[0]) / 365;
result -= frac * values[i] / Math.pow(r, frac + 1);
}
return result;
}
// Check that values contains at least one positive value and one negative value
var positive = false;
var negative = false;
for (var i = 0; i < values.length; i++) {
if (values[i] > 0) positive = true;
if (values[i] < 0) negative = true;
}
// Return error if values does not contain at least one positive value and one negative value
if (!positive || !negative) return '#NUM!';
// Initialize guess and resultRate
var guess = (typeof guess === 'undefined') ? 0.1 : guess;
var resultRate = guess;
// Set maximum epsilon for end of iteration
var epsMax = 1e-10;
// Set maximum number of iterations
var iterMax = 50;
// Implement Newton's method
var newRate, epsRate, resultValue;
var iteration = 0;
var contLoop = true;
do {
resultValue = irrResult(values, dates, resultRate);
newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);
epsRate = Math.abs(newRate - resultRate);
resultRate = newRate;
contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);
} while(contLoop && (++iteration < iterMax));
if(contLoop) return '#NUM!';
// Return internal rate of return
return resultRate;
}
Считаем количество дней между датами
/// разница между датами в днях////
function daysLag(d1, d2){
// переводим даты в формат js
var date1 = new Date(d1);
var date2 = new Date(d2);
// считаем разницу
return( Math.ceil(Math.abs(date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)) );
}
Переходим в таблицу, запускаем скрипт. Годовая доходность с учетом всех операций и периодов посчитана!
Добавил всякие допформулы и графики. Теперь точно красота.
Чтобы каждый раз не обновлять файл вручную, в Sheets можно настроить запуск скрипта по событию: открытию таблицы, клику, изменению. Для этого из редактора скриптов переходим в Изменить -> Триггеры текущего проекта. Там выставляем следующие значения.
Теперь расчеты обновляются автоматически. Таблица готова. Дорабатывать есть что, но мне и так сойдёт.
II. Расчёт годовой доходности: анализ спроса
Прежде, чем разбираться в формулах и писать код для вычисления всего лишь одного значения, я обшарил весь интернет и не нашёл готового решения. Значит, видимо, и спроса нет. Но теперь, когда таблица готова, «и увидел он, что вышло хорошо», стало интересно проверить — существует ли какой-то потенциальный спрос на подобное решение?
Кучи знакомых инвесторов для проведения проблемного интервью у меня нет, поэтому обращаемся к доступным и быстрым методам проверки.
В статистике поисковых запросов Яндекса виден некоторый интерес в данной области, но объёма рынка недостаточно, чтобы было экономически выгодно разрабатывать и развивать отдельный сервис.
С другой стороны, проведённый мной опрос на vc.ru показал, что 46% используют таблицы для учёта.
Возможно, из-за небольшой выборки результаты находятся в рамках погрешности.
Тем не менее, явно есть люди, которые не нашли готового сервиса и составили табличку. А вдруг для них это самый удобный вариант или трудности настолько незначительные, что даже Google Play или App Store открывать не хочется?
Для проверки этого предположения я создал опрос в Google-формах с возможностью оставить почту для получения сырой версии программы.
Чтобы залить туда хоть какой-то трафик, написал статью на vc. Итог: 1095 просмотров, 1 человек оставил заявку. Конверсия 0,1% не доказывает низкий спрос, так как зависит ещё от множества факторов: понятности статьи, интересов аудитории, расположения целевого действия и т.д. Полученная же заявка говорит о том, что человеку было не лень дать почту для решения проблем с учётом.
Чтобы больше узнать о проблеме и недостатках существующих решений — нужны люди. Трафик с бесплатного поста временный и недостаточно целевой. Решил дать контекстную рекламу по ключевым запросам.
Отправлять людей сразу на таблицу нельзя — не поймут, что происходит. Соответственно, нужен лендинг, и чем проще, тем лучше.
Лендинг
Открываем конструктор, Wix или Tilda, выбираем шаблон, изменяем текст и ссылки, публикуем, оплачиваем. Дел на 20 минут.
Всё просто, но с последним пунктом возникли сложности. После увольнения отдыхал несколько дольше чем планировал, вклады распаковывать не хотелось. Какое-то время пришлось жить на неравномерно приходящие небольшие дивиденды. В тот момент не было даже 700 рублей на оплату полной версии. В бесплатной нельзя подключить аналитику, домен, проработать SEO.
Пришлось делать качественнее. Нашёл не сильно страшный бесплатный bootstrap-шаблон. Скачал, удалил лишние блоки, заменил текст и картинки.
Аналитика
Основная задача — это узнать как можно больше о проблемах, решениях, людях. Для сбора данных я буду использовать Яндекс-метрику, Google Analytics, Google Tag Manager, сокращатель ссылок.
Зачем две веб-аналитики? Во-первых, чтобы сверяться и вовремя понять, если аналитика работает неправильно. Во-вторых, возможно, в дальнейшем буду давать рекламу не только в Яндексе, но и в Гугле, а для эффективной рекламной кампании нужны данные о поведении пользователей. Более того, уже сейчас есть возможность просто сказать Яндексу: приведи мне людей, которые купят этот товар, а нейронная сеть сделает остальное. Так что маркетологам пора задумываться о новой профессии.
Зачем GTM? Google Tag Manager — это современный способ подключения аналитики, который даёт следующие преимущества:
- Без программирования
Достаточно один раз вставить кусок кода на сайт и аналитику больше не нужно писать
ТЗ по разметке для разработчика и перепроверять за ним. Он сам может настраивать
события через личный кабинет без знания программирования в большинстве случаев.
- Не нужно релизить
Из пункта выше следует, что изменения кода не происходит, все подгружается
автоматически. Теперь не нужно заливать изменения на сервер, если вы захотели,
например, добавить всего одно событие.
- Контроль версий
В GTM все изменения публикуются в виде версий, это очень помогает не путаться в
правках и быстро откатиться назад в случае ошибок.
- Предварительный просмотр
Перед релизом можно запустить предварительный просмотр, протыкать все сценарии, а
консоль покажет, какие события при этом сработали.
- Интеграция с популярными системами
В Tag Manager интегрирована куча сервисов и есть возможность добавить вручную
те, которых нет в списке, что и придётся сделать с Яндекс-метрикой.
- Готовые шаблоны
Есть возможность сохранять свои конфигурации или использовать уже готовые от
сторонних разработчиков.
Создаём новый счетчик и копируем HTML-код в Яндекс-метрике.
Идем в Google Tag Manager, создаём аккаунт и контейнер.
После чего сервис покажет код для подключения на сайт. Нажимаем Создать тег. Тег — это настройка того, что должно запускаться (конфигурация тега) и при каком событии (триггере).
В конфигурации тега выбираем «пользовательский HTML», вставляем туда код метрики, а в качестве триггера — «просмотр всех страниц». Теперь при просмотре любой страницы пользователем будет запускаться Яндекс метрика.
На данном примере польза не очень велика, счётчик было бы проще вставить напрямую, а вот настраивать события через GTM гораздо полезнее.
Возвращаемся в метрику. Настройка -> Цели -> Добавить цель. Придумываем название и идентификатор, они должны быть краткими и описывать цель.
Я поставил галочку рядом с Ретаргетинг, чтобы рекламная кампания могла ориентироваться на данную цель, когда привлекает людей. Копируем код ниже, сохраняем и идем в GTM. Создаём новый тег, как и до этого вставляем скопированный код. Создаём новый триггер, на этот раз с типом Клик.
Здесь же в моём случае выбираем «некоторые клики» и ставим, что триггер будет активироваться при клике по элементу с ID равным btn_sheet. Чтобы узнать ID элемента — заходим на сайт через Chrome, нажимаем Ctrl+Shift+C и нажимаем на нужный элемент.
Сохраняем триггер, нажимаем «Предварительный просмотр» и переходим на сайт.
На сайте появится консоль для проверки. Сверху — события, которые выполнились, ниже — все остальные. Нажимаем на кнопку и соответствующее событие должно переместиться вверх. Если так, то можно переходить дальше.
Google Analytics
Регистрируемся в Аналитике, создаём аккаунт и ресурс.
Здесь будет гораздо проще, так как с Аналитикой GTM имеет интеграцию. Для подключения достаточно выбрать соответствующий тег.
Для добавления событий не нужно копировать и вставлять HTML-код, их также можно настроить в соответствующем тэге. После создания всех триггеров можно публиковать версию, нажимаем «Отправить». Теперь Аналитика и Метрика настроены.
Сокращатель ссылок
Я планирую выстроить следующую воронку: реклама -> сайт -> таблица -> форма для записи на тестирование. От рекламы и до таблицы информация о пользователе будет идти в Метрику, а вот дальнейшие его шаги остаются загадкой.
Для подсчёта переходов решил использовать сокращатель ссылок. Таких сайтов огромная куча. Перебрав штук пять, выбрал самый оптимальный — to.click. Он умеет:
- Изменять название короткой ссылки после создания
- Показывает страны и устройства пользователей
- Добавить собственный домен (платная версия)
- Добавить пиксель для большего отслеживания (платная версия)
Зарегистрировался, создал ссылки для отслеживания следующих переходов:
- С рекламы в Яндексе на таблицу
- С рекламы в Яндексе на тестирование веб-версии
- С рекламы Яндексе на тестирование iOS-приложения
- С рекламы в Яндексе на тестирование Android-приложения
- С сайта на таблицу
- С сайта на тестирование
- С таблицы на тестирование
Хостинг и домен
Зарегистрировал хостинг в Timeweb за 179 руб. Он крупный, функциональный и дешевый. Там же взял домен в зоне .ru за те же 179 руб + бесплатный SSL-сертификат (показывает, что сайту можно доверять). Название домена нейтральное, чтобы в дальнейшем бесплатно создавать сколько угодно поддоменов (например poddomen.neitralnoe-nazvanie.ru) и проверять на них другие проекты. Удобно регистрировать все в одном месте, не нужно потом связывать домен и сервер, подключать сертификат, все происходит автоматически. Закидываю все файлы сайта на сервер через файловый менеджер Timeweb — сайт готов.
Не буду рассказывать, как обманывать сервисы — скажу лишь, что получил ещё бонус в 200 рублей по реферальной программе, и мой друг также получил 200 руб. Итого трат вышло на (179+179-200) 158 руб (если бы мой друг был мной, я был даже оказался в плюсе на 42 руб).
Реклама
Сайт готов, теперь нужны только люди. Есть много рекламных стратегий, в моей ситуации мне нужен был подход с минимальным бюджетом, что означало, что я смогу привлечь только небольшое число людей. Соответственно, нужно, чтобы эти пользователи были максимально целевыми. То есть, только те, которым нужен именно мой продукт.
Также мне необходимы максимальные конверсии. То есть, чтобы на каждый следующий этап с предыдущего переходило как можно больше людей. Таких шагов сейчас три: реклама -> сайт -> таблица -> запись на тестирование. Добиваться высокой конверсии я решил с помощью простоты, удобства, релевантности, постоянных улучшений с помощью экспериментов и изучения пользователей.
Выбор пал на контекстную рекламу с низкочастотными запросами. То есть, показ рекламы в выдаче по малочисленным поисковым запросам — по ним ниже конкуренция и стоимость клика.
Подбор ключевых слов
Сначала нужно подобрать как можно больше слов которые ассоциируются с областью моего продукта. У меня это два столбца: действие и базовое слово. В данной области не так много запросов, но в другой может быть больше, например, адрес, цвет, характеристика и т.д.
Закидываем полученные в комбинатор ключевых слов (их много, по функционалу все одинаковые).
Сервис сопоставляет каждое слово с каждым из всех столбиков, получается куча словосочетаний. После скачиваем Словоёб — это реальное название бесплатной и очень полезной программы для маркетинга. Заходим в Настройки -> Парсинг -> Yandex.Direct. Добавляем созданный новый аккаунт Яндекса (не личный, его могут заблокировать).
Сохраняем дальше переходим в Данные -> Добавить фразы. Вставляем список, полученный в комбинаторе фраз. После переходим в раздел Сбор данных.
У меня достаточно короткие фразы (из 2 слов) — возможно, есть более длинные, а, значит, редкие (низкочастотные). Поэтому нажимаю на Пакетный сбор из левой колонки. Программа найдёт все запросы с содержанием данных фраз, которые искали в Яндексе ранее. После завершения парсинга берём ключевые фразы со столбиком частотности и кидаем в Excel.
Яндекс-директ
Приступаем к настройке Директа: нажимаем Добавить -> Кампанию -> Текстово-графические объявления.
Расписание показов, регион оставляю как есть. Мой продукт можно использовать в любое время и в любом месте. Подключаю счетчик Яндекс-метрики, назначаю стратегию: показывать только на поиске и ручное управление ставками. Это значит, что Яндекс будет стараться показать моё объявление всегда, вне зависимости от цены клика у конкурентов. Я предполагаю, что с такими низкочастотными фразами она будет маленькой.
В корректировке ставок я уменьшаю ставку для смартфонов до минимума. С таблицей на смартфоне пользователю будет разобраться сложнее — значит, с них будет плохая конверсия.
Минус-фразы вношу исходя из запросов, которые получил ранее. Кто-то ищет конкретные методики, авторов курсов или вещи совсем из другой области. Например, запрос «сравнение актив 1 и актив 2» оказался не про финансы, а про модели часов. Плюс в интернете есть универсальные списки минус-фраз. В моём случае это курсовая, диплом, задача и т.д. На данном этапе нельзя отсечь все нерелевантные запросы, поэтому нужно будет постоянно мониторить аналитику и новые фразы.
В дополнительных настройках оставляю расширенный географический таргетинг, добавляю свой чат с оператором на базе Яндекса. Сейчас мне важно как можно больше общаться с пользователями. Переходим в Яндекс-Диалоги, Создать чат -> Чат для бизнеса.
Здесь важно добавить иконку такую же как на сайте. Создаю картинку 2 размеров. favicon.png 64x64 px для сайта ее нужно закинуть в папку с сайтом. И такую же 224x224 для диалогов.
После сохранения на вкладке Виджет нужно скопировать код и добавить на свой сайт, чтобы диалог с оператором можно было открыть не только в поисковике, но и на сайте. После чего на вкладке Общие сведения копируем идентификатор диалога и вставляем его в рекламную компанию Директа.
Включаю ещё пункт «останавливать объявления при неработающем сайте», и сохраняю рекламную кампанию.
Дальнейшее редактирование будем проводить в таблице Excel, поэтому в интерфейсе создаём группу и объявление только для примера. Добавить -> Группу. Здесь нужно написать любую строку в ключевые фразы. После сохранения Директ предложит создать объявление.
Забиваем любой заголовок, основной и дополнительный. Текст объявления можно написать сразу какой-нибудь универсальный. Изображение и видео не добавлял, пока нет времени париться с креативами. Будет показываться только текстовая реклама, она же более конверсионная.
Контактной информации и виртуальной визитки у меня нет. В страницу перехода можно добавить дополнительную информацию. Например site.ru/#invest-programa. Хоть она и не ведёт на отдельную страницу, но увеличивает размер объявления, делая заметнее. Если каждому запросу прописать ссылку с соответствующим названием, то для пользователя она будет релевантнее.
Добавляем уточнения и быстрые ссылки. Вот здесь и понадобятся ранее созданные в сокращателе отслеживаемые ссылки. Я создаю следующие:
- Excel-таблица
- Веб-приложение
- iOS-приложение
- Android-приложение
Три из них ведут на одну и ту же форму записи на тестирование, так что это возможность выяснить заодно, какой формат приложения хотят пользователи. К ссылкам добавляю описание — опять же, для увеличения размера объявления. Сохраняем.
Добавление объявлений через Excel
Для более точной настройки стоит создать объявление для каждой ключевой фразы. Их у меня больше 100. А лучше даже создать по 2 дополнительных фразы, 2 текста и, путём комбинирования, получить по 4 объявления на каждую ключевую фразу. А уже алгоритм опытным путём выявит самые конверсионные. Такое количество нереально сделать в интерфейсе, поэтому переходим в Инструменты -> Управление с помощью Excel. Скачиваем таблицу.
Выглядит страшно, но, так как мы предварительно заполнили одну группу и объявление, разобраться можно. Удаляем ID группы, фразы, объявления, тогда при загрузке в Директ будут создаваться новые объявления, а не обновляться.
Возвращаемся к ключевым фразам, которые мы собирали ранее. Здесь прям нужно попотеть. Удаляем все, что не подходят по контексту.
Возвращаемся в выгрузку. Строку с объявлением нужно скопировать столько раз, сколько ключевых фраз осталось. Дальше вставляем столбик ключевых фраз в 3 места: название группы, фраза, заголовок. Да, запрос пользователя будет полностью дублироваться в заголовке объявления, так получается максимальная конверсия. Если он превышает 35 символов, нужно обрезать. Вот и всё, получилась следующая картина. Как я говорил, при желании можно создать несколько комбинаций объявлений.
Сохраняем и загружаем обратно в Директ. Должно было получиться множество групп, каждая с одной ключевой фразой и одним объявлением. В принципе, можно было бы создать несколько групп, в каждой по несколько ключевых фраз общих по смыслу и столько же объявлений с соответствующим заголовком, но Яндекс не всегда корректно выбирает объявление. Не знаю, с чем это связано.
Можно оплачивать и запускать кампанию. Для такой низкочастотной рекламы, если всё правильно сделать, на первых порах можно уложиться 10 000 руб. Я закинул 1500.
Результаты
Так как с таким бюджетом пользователей немного, я получил возможность проследить практически за каждым по отдельности.
С помощью Метрики смотрел, какой запрос он ввёл, из чего узнал новые сферы проблем и добавил минус-фразы к объявлениям. Через Вебвизор следил за всеми действиями на сайте. Изучал пути переходов по ссылкам и ошибки из логов Google Apps.
Перейдём к цифрам.
Конверсии действительно неплохие, но, повторюсь, я ориентировался на небольшое количество супер-целевых пользователей. Если увеличивать охват, понадобится менять стратегию, поднимать бюджет и терпеть уменьшение конверсии.
Также из такого маленького количества не вывести какую-либо статистику. Нельзя сказать, что 20% пользователей MVP записываются на тестирование, если речь всего о двух пользователях из десяти — они вполне могли попасть в рамки погрешности.
Как видно, за месяц было потрачено 342 руб. при стоимости клика 1,54 руб. Это только 20% от заложенного бюджета, поэтому, возможно, позже я запущу ещё одну кампанию с расширением аудитории и добавлю больше полезной информации на лендинг — но на данный момент всё работает примерно так, как и задумывалось.