Месяц мы рекламировали наш сайт и звали людей в форму, которая не работала
Что у нас вообще есть
Carshel — соцсеть для автомобилистов. Фото, истории, клипы, сообщества, объявления, встречи. Регистрация самая обычная: почта → письмо с кодом подтверждения → добро пожаловать.
Ключевое слово тут — «письмо». Всё остальное в этой истории вращается вокруг него.
Акт первый: месяц, когда мы искали причину не там
В начале августа было несколько регистраций. Потом — тишина. Ровная, спокойная, ничем не объяснимая тишина.
Мы честно чесали голову. Причём чесали активно: как раз в этот период мы ездили по автофестивалям. Стояли, знакомились, рассказывали про проект, раздавали наклейки. Живые люди, живой интерес, «о, прикольно, зарегаюсь вечером».
Вечером не регистрировался никто.
Дальше пошёл классический жанр — самокопание вместо диагностики. Может, идея не заходит? Может, мы плохо объясняем? Может, наклейки надо другие? Может, лендинг слабый, оффер непонятный, аудитория не та, лето, сезон, отпуска? Мы обсуждали позиционирование. Мы всерьёз обсуждали позиционирование, пока форма регистрации лежала.
И вот главная подлость: человек, у которого не пришёл код, не пишет в поддержку. Он не думает «у них сломался сервис». Он думает «ну, не работает» — и идёт дальше. Молча. Для нас он вообще не существует: в базе есть строчка «зарегистрировался», а рядом пусто.
Мы смотрели на количество регистраций. Надо было смотреть на количество подтверждённых регистраций. Разница между этими двумя цифрами и была ответом на вопрос, который мы месяц задавали маркетингу.
Акт второй: 26 августа, когда мы наконец посмотрели в правильное место
Почтовый провайдер отключил SMTP на нашем домене. Сервер честно и вежливо отвечал:
SMTP disabled
Ни одного письма. Вообще. Регистрация превратилась в форму «оставьте свою почту и подождите вечность».
Отдельный жанр — как мы об этом узнали от самого провайдера. Никаких писем в духе «с такого-то числа отправка становится платной» не приходило. Ни предупреждения, ни уведомления, ни строчки в панели. Просто в какой-то момент отправка перестала работать.
Мы написали в техподдержку. Там ответили примерно следующее: да, с августа у них такая канитель.
С августа. То есть ровно с того момента, когда у нас закончились регистрации и начались размышления о позиционировании.
И тут стоит быть честными до конца: провайдер, конечно, красавец — молча выключить отправку почты и не предупредить это сильный ход. Но проблема-то не в нём. Проблема в том, что мы узнали об этом через месяц. Провайдер может отключиться в любой день, это его право и наш риск. А вот не заметить этого — исключительно наша заслуга.
Отдельная вишенка: у нас в конфиге авторизации стоял лимит на отправку писем — 4 штуки за интервал. Задумывался он как защита от спамеров. В условиях, когда письма не уходят, а люди нервно жмут «отправить код ещё раз», он бодро добивал выживших ошибкой `over_email_send_rate_limit`. То есть система защиты работала прекрасно. Она защищала нас от пользователей.
Всё это время сервис аккуратно писал ошибки в логи. В docker-логи контейнера авторизации. Куда, как выяснилось, не смотрит ни один живой человек. А контейнер сбора логов у нас в той инсталляции был заглушён — стоял заглушкой «спи вечно», чтобы не жрал ресурсы. Так что даже если бы кто-то захотел посмотреть — не нашёл бы.
А триггером ко всему расследованию стало не наблюдение, не метрика и не алерт. Пользователь написал в личку. Дословно — «у вас там код не приходит».
Один человек оказался внимательнее и настойчивее, чем вся наша система наблюдения. Потому что системы наблюдения за этим у нас не было.
Акт третий: чиним не то, что сломалось
Первая реакция — «надо читать логи авторизации». Мы её отбросили, и это, кажется, лучшее решение во всей истории.
Потому что логи ловят одну конкретную причину. Ок, научились ловить `SMTP disabled`. А завтра протухнет пароль приложения. Послезавтра провайдер забанит ящик за рассылку. Потом кончится квота. Потом сменится API. Каждый раз — новая строчка в логах, новый парсер, новый разбор полётов.
Мы стали мониторить не причину, а результат:
> Люди регистрируются, но перестали подтверждать почту.
Всё. Эта одна фраза ловит любой сбой доставки писем — независимо от того, что именно сломалось. Нам вообще не важно, почему письмо не дошло. Нам важно, что оно не дошло.
Получилось два детектора, оба крутятся раз в 15 минут:
1. Полная остановка (critical). За последний час были регистрации, а подтверждений — ноль. С двумя оговорками, без которых он бы орал круглосуточно:- Отсрочка 10 минут. Человеку надо физически успеть открыть почту. Тот, кто зарегистрировался минуту назад, ещё не «не подтвердил», он просто идёт к ноутбуку.
- Порог в 3 регистрации. Один-два неподтвердившихся — это шум, человек отвлёкся. Три и больше — это уже сигнал. А ночью, когда регистраций нет вообще, детектор просто молчит, а не будит всех сообщением «ноль подтверждений!».
2. Вялотекущая деградация (warning). Смотрит сутки: если из зарегистрировавшихся подтвердили почту меньше 40% — предупреждение. Это на случай, когда письма ходят, но плохо: часть уезжает в спам, часть адресов режется провайдером. Падения нет, катастрофы нет, просто мы медленно теряем половину новых людей — и опять начинаем обсуждать позиционирование вместо инфраструктуры.
Оба детектора пишут события в общий журнал безопасности, который выведен на дашборд в админке. Не в логи. Не в файл. На экран, куда мы реально смотрим.
Бонус-урок: мониторинг, который молча не работает, хуже, чем никакого
Отдельно мы сделали вот что. Детектору нужен доступ к служебной таблице пользователей. Если бы прав не хватило, он бы честно отработал, честно ничего не нашёл и честно ничего не сказал — потому что внутри стоит защита «не падать при ошибке», чтобы сбой одной проверки не ронял всё расписание.
И мы бы жили дальше с ощущением, что у нас есть мониторинг. Ровно с тем самым ощущением, из-за которого мы месяц не замечали проблему.
Поэтому установка проверяет доступ заранее и падает громко, пока админ смотрит на экран. Пусть лучше не установится, чем установится и притворится работающим.
Что забрать с собой
1. Мониторьте результат, а не причину. «Письмо не отправилось» — это сто разных ошибок. «Люди перестали подтверждать почту» — одна проверка, которая ловит все сто.
2. Прежде чем винить продукт, проверьте инфраструктуру. Мы месяц обсуждали оффер, аудиторию и наклейки. Ответ был в одной строчке серверного ответа. Если метрика упала резко и без причины — это чаще поломка, чем рынок.
3. Внешние сервисы меняют правила молча. Нам не пришло ни одного письма о том, что отправка стала платной. Всё, что у вас снаружи — почта, платежи, SMS, хранилище, — может отключиться без предупреждения. Виноват в этом провайдер, а разбираться будете вы.
4. Логи, в которые никто не смотрит, — это не мониторинг. Это архив. Мониторинг — то, что само приходит к вам, а не то, куда нужно прийти.
5. Считайте не действие, а его завершение. Не регистрации, а подтверждённые регистрации. Не отправленные письма, а доставленные. Не клики на «оплатить», а оплаты.
6. Первая жалоба — это не начало проблемы, а её финал. За одним написавшим стоят десятки ушедших молча. Если вы узнаёте о сбоях от пользователей — вы узнаёте о них последними.
7. Защита от абьюза тоже умеет вредить. Наш лимит на отправку писем в штатном режиме защищал от спамеров, а в аварийном — добивал тех, кто пытался пробиться.
Ну и восьмое, некруглое: рассказывать стоит не только про рост. Про такие вещи почему-то все молчат, хотя именно они — самая полезная часть чужого опыта. Мы месяц ездили по фестивалям и зазывали людей в форму, которая не работала. Починилось это одной проверкой, которая умещается в одну фразу.
Проверьте у себя. Вдруг вы прямо сейчас тоже кого-то очень старательно приглашаете туда, куда не пускает почтовый сервер.