Dittofeed
Движок поведенческих рассылок с открытым кодом: автоматические сценарии по событию и разовые массовые рассылки по почте, SMS, push, в WhatsApp и Slack. Альтернатива Customer.io и OneSignal для своего сервера. Развернули облегченный стек, замерили ресурсы, зашли в живой конструктор сценариев и связали с PostHog - как часть замены Intercom по работе с жизненным циклом клиента.
Вердикт
- кому нужны письма по поведению без подписки: «зарегался, но не купил», win-back при отвале
- продуктовым командам с событийной аналитикой (PostHog/Segment) - Dittofeed по когортам ведет сценарии
- тем, кто хочет данные о клиентах на своем сервере, а не в чужом облаке
- нужна только разовая рассылка новостей - проще Listmonk
- нужен маркетинг-комбайн с лендингами и lead scoring - смотрите Mautic
- не готовы подключать ESP (Sendgrid/SES) для реальной отправки
Зачем это в поиске замены Intercom
Мы собираем комплект вместо Intercom для своего сервера. Квартет систем поддержки закрыл переписку, PostHog - аналитику поведения (видно, КАК клиенты двигаются по онбордингу), Twenty CRM - продажи. Но оставался пробел: увидеть когорту «зарегался, ничего не купил» - это одно, а автоматически отправить ей письмо - другое. Этот слой и закрывает Dittofeed.
Связка с PostHog: PostHog строит воронку и когорту «зарегался, но не купил», Dittofeed по этой когорте ведет email-сценарий. PostHog видит поведение - Dittofeed по нему шлет сообщения.
Что это и какую задачу решает
Dittofeed - омниканальная платформа для коммуникаций с клиентами, с открытым кодом. Создаете автоматические сценарии (Journeys) или разовые массовые рассылки (Broadcasts) и шлете сообщения по любому каналу: email, SMS, push, WhatsApp, Slack. Сегментация с гибкими операторами, шаблоны на MJML или в low-code редакторе, интеграции с ESP (Sendgrid, Amazon SES), прием событий по Segment-совместимому API и аналитика доставки. Позиционируется как dev-friendly альтернатива Customer.io, OneSignal и Segment Engage.
Данные о пользователях и события лежат в PostgreSQL и ClickHouse, оркестрация сценариев - на Temporal (движок длительных процессов). Приложение на TypeScript/Node + React. Ядро под лицензией MIT; multi-tenancy, embedding и white-label - под отдельной коммерческой лицензией (open-core).
Чем отличается от платных решений
Сравнение с Customer.io / OneSignal / Braze по тому, что влияет на выбор.
| Параметр | Dittofeed | Customer.io / OneSignal / Braze |
|---|---|---|
| Модель цены | бесплатно, ядро под MIT | подписка, часто по объему |
| Где данные о клиентах | ваш сервер | облако вендора |
| Автоматические сценарии | визуальный builder | есть |
| Каналы | email/SMS/push/WhatsApp/Slack | есть |
| Процесс разработки (git, тесты) | да, ориентация на разработчиков | ограниченно |
| Зрелость / экосистема | моложе, комьюнити меньше | годы на рынке |
Тех-стек и архитектура
Мы ставили lite-режим - официальный docker-compose.lite.yaml на готовых образах. Пять контейнеров: lite (api + dashboard + worker в одном образе, слушает 3000), postgres (метаданные, Drizzle ORM), clickhouse-server (события/аналитика), temporal (оркестрация сценариев поверх того же Postgres) и наш caddy для TLS. Аутентификация - single-tenant по паролю.
Минимальная конфигурация
Реальные требования против официального минимума.
| Реально в простое (наш замер) | ~845 MiB на 5 контейнеров |
| ClickHouse (лимит контейнера) | 2 GB |
| lite (лимит контейнера) | 1 GB |
| Образы на диске | ~5.2 GB |
| Тариф Fatmetal | CPU4-RAM8-DISK100 |
Важно: в простое стек держит около 845 MiB - легко для класса «событийная платформа с ClickHouse + Temporal». Но ClickHouse требователен к CPU (SSE4.2) и любит память под нагрузкой, поэтому берем CPU4-RAM8, а не тариф CPU4-RAM8-DISK100.
Развертывание на Fatmetal
Fatmetal Cloud Server (CPU4-RAM8) + Ubuntu 24.04 + Docker, наружу через Caddy с TLS.
Взять официальный lite-compose
git clone --depth 1 https://github.com/dittofeed/dittofeed cd dittofeedLite-режим использует готовые образы (сборка не нужна): один контейнер приложения + Postgres + ClickHouse + Temporal.
Сменить дефолтные секреты
В
.envзадайте свои значения: ключSECRET_KEYи паролиPASSWORD(вход в кабинет),CLICKHOUSE_PASSWORD,DATABASE_PASSWORD- сгенерируйте черезopenssl rand. Там же укажитеDASHBOARD_API_BASEс вашим доменом.Поднять стек
docker compose -f docker-compose.lite.yaml up -dНа первом запуске
BOOTSTRAP=trueсидит рабочее пространство и шаблон Welcome Email - после старта его закомментируйте. Наружу отдаем порт 3000 через Caddy с автоматическим TLS.
Что измерили после запуска
Цифры со свежей установки на нашем сервере, без нагрузки.
| RAM в простое (всего, 5 контейнеров) | ~845 MiB |
| lite (app: api+dashboard+worker) | ~403 MiB |
| clickhouse-server | ~227 MiB |
| postgres / temporal / caddy | ~120 / ~82 / ~12 MiB |
| Образы всего | ~5.2 GB |
Главное: для событийной платформы это очень экономно - ~845 MiB против 12+ GiB у PostHog. Dittofeed решает узкую задачу (сообщения по поведению), поэтому и стек компактнее.
Проверено на версии v0.23.0 (dittofeed-lite), июль 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Дефолтные пароли. В compose по умолчанию пароль входа PASSWORD равен слову password, плюс тестовый SECRET_KEY и такой же CLICKHOUSE_PASSWORD. Обязательно сменить до выхода наружу - иначе кабинет открыт всем.
BOOTSTRAP только на первый запуск. Оставите BOOTSTRAP=true - при рестарте повторно инициализирует. После первого старта закомментируйте.
Для реальной отправки нужен ESP. Sendgrid, Amazon SES или SMTP. Для демонстрации сценариев можно обойтись без отправки или локальным MailHog.
Безопасность и обновления
Наружу - только через reverse-proxy с TLS: у нас Caddy с Let's Encrypt, приложение слушает 3000 на localhost. Сразу смените дефолтные секреты и задайте сильный PASSWORD для single-tenant входа. Персональные данные клиентов (профили, события) остаются у вас - помните про 152-ФЗ. Обновление - через профиль admin-cli и смену тега образа; перед апгрейдом бэкапьте PostgreSQL и данные ClickHouse.
Связь с другими стеками
- Аналитика поведения - PostHog: строит воронку и когорты, Dittofeed по ним шлет письма.
- Простые рассылки - Listmonk, если нужны только регулярные письма без автоматических сценариев.
- Обратный прокси - Caddy или Traefik для TLS и домена; данные о клиентах держите на своей виртуалке.
Когда это НЕ ваш выбор
Нужна только рассылка новостей
Если задача - разово разослать письмо базе, Dittofeed избыточен. Listmonk легче и проще под регулярные письма.
Нужен маркетинг-комбайн
Лендинги, формы, lead scoring, полноценные кампании - это скорее Mautic. Dittofeed - про триггерные сообщения по продуктовым событиям.
Нет событий о пользователях
Сила Dittofeed - в поведенческих сценариях. Без потока событий (из продукта, PostHog или Segment) остаются только простые массовые рассылки.
Частые вопросы
Сколько Dittofeed ест в простое?
Около 845 MiB на 5 контейнеров (lite 403 / clickhouse 227 / postgres 120 / temporal 82 / caddy 12 MiB).
На чем написан?
TypeScript/Node + React; данные в PostgreSQL и ClickHouse, оркестрация сценариев - на Temporal.
Это правда бесплатно?
Ядро под MIT («free forever»). Multi-tenancy, embedding и white-label - под отдельной коммерческой лицензией.
Чем отличается от Customer.io?
Тем же ядром (сценарии, сегменты, каналы), но на своем сервере, без подписки по объему; ориентирован на разработчиков.
Как связать с PostHog?
PostHog собирает поведение и когорты, события прокидываются в Dittofeed (Segment-совместимый API), а сценарии шлют письма по этим когортам.
Что нужно для реальной отправки?
Подключить ESP - Sendgrid, Amazon SES или SMTP. Для демо сценариев можно обойтись без отправки.
Какая версия у вас?
dittofeed-lite v0.23.0, single-tenant, за Caddy с TLS.
Итог
Dittofeed - недостающий кирпич «письма по поведению» в замене Intercom для своего сервера: автоматические сценарии и массовые рассылки по всем каналам, с данными о клиентах на вашем сервере и без подписки по объему. При этом он на удивление легкий - ~845 MiB против 12+ GiB у PostHog, потому что решает узкую задачу. В связке с PostHog получается полный цикл: увидели, что клиент «зарегался, но не купил» - и автоматически отправили ему письмо; отвалился - запустили win-back. Для разовых рассылок берите Listmonk, для маркетинг-комбайна - Mautic, а для триггерных сообщений по продуктовым событиям Dittofeed - точное попадание.
Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100 за Caddy с TLS. Нашли баг в гайде - напишите, поправим в течение дня.