Мотивация
Как разработчику ПО, традиционные сервисы email маркетинга и новостных рассылок кажутся мне ограниченными и недостаточно гибкими.
Мне надоело оплачивать ежемесячные счета на абстрактных (и зачастую завышенных, в долларах и без учёта покупательной способности) тарифах с искусственными порогами по количеству подписчиков и разной доступностью функций. Я не понимаю, почему я должен регулярно платить десятки долларов за список в несколько сотен подписчиков и новостную рассылку раз в месяц.
По разным причинам, провайдеры email рассылок имеют тенденцию менять продуктовую стратегию и ценообразование, отталкивая этим своих клиентов.
Когда вы разочаруетесь в email провайдере, сменить его на более подходящего будет очень проблематично. Придётся мигрировать множество вещей, включая пользовательские поля, шаблоны, маркетинговые кампании, формы подписки, архив писем, лид-магниты, и т.п. Привязка к поставщику это не шутка!
С 2010 года был опыт создания нескольких упрощенных систем рассылок (Email, SMS, Push), а также интеграции SaaS проекта с Mailchimp. Есть много не реализованных идей которые хотелось бы воплотить в жизнь.
Идея создания собственной системы новостных рассылок появилась где-то в 2018-2019 году, первый код начал писать под AWS в 2021 году, но быстро забросил из-за нехватки времени и мотивации.
В марте 2022 года Mailchimp уничтожил два моих списка рассылки без возможности забрать базу подписчиков. А за AWS стало невозможно платить, т.к. российские карты перестали принимать за рубежом. Это стало переломным моментом когда я решил во что бы то ни стало разработать свою независимую систему рассылок.
Mailchimp (Intuit) кстати имеет практику банить без предупреждения не только русских, поэтому ещё в 2018 году я разработал инструмент автоматического резервного копирования mailchimp-backup, благодаря которому оба моих списка рассылки были спасены из грязных обезьяньих лап. Многим повело меньше, например, известному российскому автору книг и курсов по копирайтингу и редактуре Максиму Ильяхову, Mailchimp уничтожил 8 лет труда и базу в 180 тысяч подписчиков. Скриншот тут.
Изначально Mailgit создавался для нужд своих проектов, но потом я решился предложить его в виде экспериментального продукта. На это решение повлияла концепция #ONCE компании 37signals. Считаю, что в условиях деглобализации, стремления стран к суверенитету, защите цепочек поставок и данных, глобальные SaaS проекты будут под давлением, а коммерческое ПО с доступным кодом наоборот получит новый шанс.
Serverless архитектура позволяет получать облачные ресурсы по модели pay as you use, легче масштабироваться, а также минимизировать администрирование инфраструктуры.
А теперь представьте себе следующее:
- Гибкая система email-рассылок, созданная для тех кто дружит с кодом и командной строкой, и кому неудобно кликать мышкой в традиционных продуктах.
- Вы можете задать маркетинговые кампании или новостные рассылки в виде кода
- Оплата осуществляется на основе фактически потреблённых ресурсов - стоимость списка в несколько сотен подписчиков и рассылки раз в месяц близка к нулю.
- Привязка к поставщику отсутствует - вы разворачиваете систему самостоятельно, имеете доступ к исходному коду и право модифицировать его под свои потребности.
- При этом вам не нужно управлять Linux машинами и конфигурировать SMTP серверы чтобы развернуть систему
Что такое Mailgit?
- Это гибкая система email маркетинга и новостных рассылок использующая Markdown, Python and SQL
- Вы приобретаете лицензию, развёртываете исходный код в облаке самостоятельно и имеете полный контроль над данными пользователей - это не SaaS с ежемесячной подпиской.
- Вы платите облаку только за то, что используете (помимо стоимости лицензии) - бессерверная архитектура масштабируется до нуля, растёт в зависимости от ваших потребностей.
- Лицензия является постоянной и включает один год бесплатных обновлений, после чего вы можете продлить её или продолжить использовать как есть.
- Доставка электронной почты (самая критическая часть) обрабатывается провайдером транзакционной электронной почты на ваш выбор.
- Брендирование - из коробки нет брендинга и всё настраивается, включая отдельный домен.
- Вы можете развертывать несколько экземпляров для нескольких списков рассылки с различным брендингом и доменами.
- Гибкая интеграция с другими системами путём написания кода на Python.
- Вместо API можно работать напрямую с БД.
- Идёт с готовыми примерами шаблонов и рассылок.
Кому подойдёт этот продукт?
- Техническим специалистам, которые хотят исключительно гибкую систему email рассылок - вы можете дорабатывать и расширять её исходный код по своему усмотрению.
- Маркетологам с навыками программирования - вместо того чтобы биться над нестандартными отчётами или сегментами, просто сделайте выборку напрямую из БД. А если вам поможет разработчик, то пределов возможностям нет!
- Разработчикам-основателям SaaS проектов поможет сэкономить время на разработку или интеграцию системы рассылок. Вы можете сделать Mailgit частью своего продукта и реализовать интеграцию произвольной сложности.
- Владельцам большого количества мелких списков рассылки на разных доменах будет возможно автоматизировать их развёртывание и конфигурирование по единым правилам.
Далее можете перейти сразу к сути предложения, или ознакомиться с возможностями системы.
Возможности
Реализованные типы рассылок
- BroadcastCampaign - широковещательная рассылка
- SequenceCampaign - цепочка писем с заданным интервалом между ними
- SubscribedEventCampaign - срабатывает при отправке формы подписки, отправляет письмо подтверждения почты и системное пуш-уведомление
- ConfirmedEventCampaign - срабатывает при подтверждении почты, отправляет системное пуш-уведомление
- UnsubscribedEventCampaign - срабатывает при отписке, отправляет системное пуш-уведомление
- ConfirmedEventIncentiveCampaign - срабатывает при подтверждении почты, отправляет письмо с лид-магнитом
Broadcast и Sequence умеют таргетироваться только на весь список рассылки, дополнительные сегменты можно реализовать путём написания YQL запросов.
Возможна реализация других типов событий.
Реализованные email провайдеры
- SMTPSender - отправка по протоколу SMTP (статус доставки не реализован)
- MailgunSender - Mailgun.com
- DashaMailSender - DashaMail.ru
- SESSender - Amazon SES (статус доставки не реализован)
- DevNullSender - тестовый провайдер для отправки писем на произвольный URL
Консольная админка
Есть минималистичная админка на базе Textual работающая прямо в терминале:
Журнал отправленных писем
Позволяет просматривать text и html версии отправленных писем:
Пуш уведомления
Получайте пуш уведомления через Pushover или ntfy когда кто-то подписывается или отписывается:
Отслеживание ссылок
Любые ссылки в тексте письма можно обернуть в отслеживающий тег:
{{ track_link("https://mailgit.app") }}
При клике на такой ссылке будет сформировано событие, на основании которого можно создать сегмент или триггерную рассылку.
Топики рассылок
Помимо обычного статуса подписки (да/нет) есть поддержка opt-in и opt-out топиков (тем), позволяющих подписчикам более гибко управлять тем что им интересно получать:
Подписаться на [{{ get_topic("promotion").name }}]({{ topic_subscribe_link("promotion") }}), чтобы узнать больше по этой теме.
Отписаться от [{{ topic.name }}]({{ topic_unsubscribe_link(topic) }}), но продолжить получать обычную рассылку.
Кроме того, есть понятие транзакционных топиков для важных рассылок от которых нельзя отписаться.
Произвольные атрибуты подписчиков
Можно задать свой класс Pydantic с произвольным набором полей информации о подписчике, чтобы потом использовать их для сегментации.
Технические детали
Архитектура
- Задавайте email рассылки в виде Python кода, YQL (SQL) и Markdown, храните их в репозитории Git. Нет необходимости возиться с GUI.
- Шаблонизация с использованием Jinja, поддержка сниппетов, условий, расширений. Пользовательские теги Markdown. HTML и plain text письма.
- Поддерживается несколько провайдеров транзакционной электронной почты, включая пользовательские.
- Развертывание через Terraform, поддержка изолированных окружений (стейджинг, отдельные списки рассылки).
- Бессерверный хостинг Yandex Cloud - масштабируется от нуля, растёт в зависимости от ваших потребностей, администрирование минимально.
Используемые сервисы Yandex Cloud
Размер кодовой базы
Количество строк кода сравнительно небольшое:
─────────────────────────────────────────────────
Language Files Lines Blanks
─────────────────────────────────────────────────
Python 37 5496 368
HTML 20 1216 45
Terraform 13 1443 172
Markdown 7 184 40
YAML 3 277 4
Autoconf 1 13 0
CSS 1 11 1
Plain Text 1 105 0
SQL 1 66 4
gitignore 1 28 5
─────────────────────────────────────────────────
Total 85 8839 639
─────────────────────────────────────────────────
Estimated Cost to Develop (organic) $241 746
Estimated Schedule Effort (organic) 8,02 months
Estimated People Required (organic) 2,68
─────────────────────────────────────────────────
Ограничения
- Если вы не владеете Python, HTML, Jinja и Markdown, то проект не для вас.
- Это экспериментальный проект в ранней стадии, многое будет меняться, обновления могут быть непростыми.
- Качество кода не идеальное, некоторые вещи нужно рефакторить, юнит и интеграционных тестов пока нет. Приоритет делался на скорость запуска в своих проектах.
- Работает только в российском Yandex Cloud (но если вам хочется запустить такую-же serverless систему рассылки писем в AWS или Azure и вы готовы спонсировать разработку - смотрите предложение).
- Тестировалась нагрузка на 10000 подписчиках, проблем не было но возможно какие-то вещи не учтены и на больших базах потребуются оптимизации или даже существенные переделки.
- Serverless не ограничивает затраты сверху (всё зависит от потребления ресурсов и нагрузки), в планах есть механизмы контроля бюджетов, но их надо разрабатывать.
- Локализация пока только на английском, в планах добавить русский язык. Опыт локализации продуктов у меня есть, данный сайт например сразу сделан двуязычным, а форма подписки уже сейчас сохраняет в БД язык браузера пользователя. Если русский язык нужен прямо сейчас, можно просто заменить в коде и шаблонах все тексты без полноценной поддержки нескольких языков.
- Среда разработки и инструменты деплоя проверялись только в macOS. Linux добавить легко, а вот если нужна Windows, то потребуется время на доработку. В планах создание повторяемого Docker контейнера со средой разработки.
- Консольный UI ходит в облако и БД напрямую, разграничение прав доступа не поддерживается.
- REST API нет, прежде чем его проектировать хотелось бы найти на него конкретных заказчиков. Острой необходимости в нём нет, т.к. можно работать напрямую с БД.
- Архивации и удаления старых данных пока нет, но можно удалять отдельных подписчиков и кампании включая историю писем.
- В админке нет паджинации (но всегда можно сделать прямые запросы в БД).
- Из-за отсутствия в Yandex Cloud триггеров на FIFO очереди, возможны ситуации гонок для кампаний срабатывающих по событиям, когда одновременно приходят разные события. На данный момент такие ситуации исключены в силу довольно простых триггерных кампаний имеющихся в системе.
- Никаких отчётов пока нет, но можно писать запросы в БД.
- Документация отсутствует, я планирую её писать по ходу дела. Пока можете полагаться на меня как источник знаний, и на исходный код.
- Импорт существующих списков рассылки нужно разрабатывать индивидуально с учётом формата данных.
- Факт открытия писем не отслеживается, в вероятно не будет реализован в силу его растущей неточности. Если вам очень нужно, можете реализовать самостоятельно.
- Чего я точно не планирую делать так это визуальный редактор писем или кострукторы кампаний. Вся концепция основана на том, что это делается в коде. Учите Python, YQL, HTML, Jinja и Markdown.
Предложение
Оферта пока не планируется, поэтому вот краткие тезисы:
- Стоимость лицензии на код пока не точная, но ориентируйтесь на стартовую цену в районе 70-100 тысяч рублей в год. Если нужно дешевле, могу порекомендовать другие проекты, например Listmonk или Sendy. Лично для меня это не стартап, и я хочу чётко понимать за счёт каких средств вести дальнейшую разработку.
- Лицензия бессрочная и включает один год бесплатных обновлений, после чего вы можете продлить её или продолжить использовать как есть. Она даёт вам право использовать и модифицировать код на неограниченном количестве доменов (никакой обфускации и проверок не предусмотрено). Но вы не можете распространять и перепродавать продукт или его производные, а также сдавать в аренду платно или бесплатно. Если хотите чего-то нестандартного, давайте обсуждать отдельные нестандартные коммерческие условия.
- Я готов дорабатывать продукт под ваши требования за ваши деньги, при этом я получаю все права на итоговый исходный код (если не оговорены особые условия), а вы получаете право его использования на общих условиях и индивидуальную скидку на продление лицензии начиная со второго года. Если заказанная вами доработка не включается в итоговый продукт (в силу её узкой специфики), то возможно вам придётся дополнительно спонсировать её поддержку при обновлениях основного продукта, либо поддерживать её самостоятельно. То же касается различных кастомных интеграций.
- Если вам хочется запустить такую-же serverless систему рассылки писем в AWS, Azure, GCP, Tencent Cloud, Huawei Cloud, Alibaba Cloud, и т.п. и вы готовы спонсировать разработку - давайте обсуждать, но это будет проект на несколько месяцев работы. Аналогично если вы хотите адаптировать систему для установки на сервер (допустим с PostgreSQL или SQLite и классической архитектурой).
- В силу того, что я веду проект в одиночку, количество времени на техподдержку ограничено. Вы можете рассчитывать на бесплатную помощь в инсталляции продукта, плюс какое-то небольшое количество часов в год поддержки по Email и созвонов в случае необходимости. Остальное оплачивается на почасовой основе.
- Если вы отлично знаете Python и хотите совместно развивать проект - давайте созваниваться и обсуждать варианты сотрудничества.
- Мой часовой пояс UTC+7 и я стараюсь отдыхать в выходные, просьба учитывать это.
Как выглядит процесс получения продукта:
- Вы оставляете свой email адрес в форме ниже (или просто пишете мне ).
- Мы с вами договариваемся о времени созвона.
- На созвоне обсуждаем все интересующие вас вопросы, уточняем сценарии использования и соответствующие возможности системы рассылок.
- Если через какое-то время вы приходите к мысли что продукт вам подходит, мы договариваемся о цене (пока продукт на ранней стадии развития её можно обсуждать) и я высылаю вам счёт на оплату (пока только для юрлиц или ИП).
- После оплаты вы получаете доступ к закрытому Git репозиторию с кодом продукта, а также доступ в чат.
- На ещё одном созвоне я помогаю вам развернуть систему в Yandex Cloud.