Неделя 161. Назвать вещи своими именами

Разбор этой статьи
Эту тему разобрали в подкасте. Слушай параллельно с чтением.
Это сто шестьдесят первая неделя с момента, как мы запустили Botseller в августе 2023 года. Период: с 24 августа 00:00 до 31 августа 00:00 по Москве.
В прошлом выпуске я рассказал, как за одни выходные платформа поднялась второй раз, на серверах в России, из того же кода, и обещал первый рабочий понедельник нового контура. Международные платежи не сдвинулись, причина прежняя. Перестаю упоминать их в каждом выпуске: напишу, когда будет что сказать.
Восемьдесят четыре записи. Неделей раньше было 221. Самая тихая неделя за месяц. По счётчику отпуск, по смыслу нет.
Мы не строили новое. Мы и не искали. Мы натыкались, и каждый раз на одно и то же: посетитель чата «не в сети» при живом соединении, вход «произошла ошибка» при обычной опечатке, логи «пусто», рассылка «идёт». Ничего не падало. Всё работало и врало.
Сырой счётчик недели: 84 записи разработки в 9 рабочих контурах, из них 41 объединённая задача и 43 прямые правки. По объёму без трёх тысяч добавленных строк.
Меня зовут Дмитрий Дьяконов, я основатель и CEO Botseller AI. Мы делаем платформу с AI-продавцом, CRM, мессенджерами, автоматизациями, рассылками, календарём и звонками. Каждую неделю я разбираю, что реально сдвинулось в продукте и зачем это нужно бизнесу. Поехали по 161-й.
Пульс недели

| Направление | Записей разработки | Что это значит простыми словами |
|---|---|---|
| Российский контур: от «поднят» к «работает» | 17 | путь «посетитель написал, бот ответил, лид в CRM» замкнут внутри российского контура |
| Тарифы, пробный период, платные модули | 16 | готовится модель «тариф плюс модули», админка видит, кто на каком пробном периоде |
| Рассылки в Telegram и Рой | 14 | бот, которого Telegram придержал, ждёт час, а не бьётся в ограничение; Рой не пишет в чужие чаты |
| WhatsApp: официальный канал и канал по QR | 10 | повторная попытка подключить номер больше не холостая, смета рассылки снова показывает сумму |
| Мониторинг: найти то, что уже записано | 7 | логи ключевых сервисов ищутся по одному имени, серверы в хранилище логов различимы |
| Понятные ошибки вместо тишины | 7 | «неверный пароль» не выглядит как поломка, каждая ошибка сервера оставляет след |
| Автостоп бота при ответе менеджера из мессенджера | 6 | бот замолкает, когда менеджер ответил из Авито, Telegram или WhatsApp |
| Внутренние доработки | 6 | клиенту не видно: уборка в коде, снятая мешавшая ошибка, выбор языка |
Главная мысль недели: молчание системы обманывает не только клиента, оно обманывает и того, у кого есть все доступы. Пять раз за неделю я поймал такое молчание, и на одно попался сам: смотрел на пустой экран логов и был уверен, что логов нет.
Один понедельник, десять причин молчания
Начну с понедельника.

Неделю назад российский контур был поднят: сборка прошла, кабинет открывается. В понедельник я попробовал пройти путь клиента: открыть воронки, написать в чат на сайте, получить ответ бота, увидеть лид в CRM. Не прошёл ни одного шага.
Вот что увидел бы клиент. Ни одного сообщения об ошибке за весь день, кстати. Воронки: «не удалось подключиться к CRM», а в логах CRM ни строки, потому что российский домен не внесли в список тех, кому CRM отвечает: список жил в коде и знал только международные адреса. Виджет чата не появлялся: кабинет принимал собственный адрес на .ru за чужой партнёрский. Посетитель в карточке чата всегда «не в сети» при живом соединении: платформа спрашивала его статус у шлюза чата международного контура, тот отвечал «не знаю такого», и это тихо превращалось в «офлайн».
Это как открыть филиал, повесить вывеску и оставить на визитках телефон головного офиса. Звонки идут, там отвечают «такого клиента нет», и никто не понимает, почему в филиале так тихо.
Самая наглядная причина была не в коде. Инструкцию AI-продавца скопировали с международного контура вместе с 33 ссылками на международный сайт против двух на российский. Бот вежливо отправлял российских клиентов регистрироваться не туда. Ни одной ошибки. Просто заученная наизусть фраза с чужим адресом внутри. Там же нашли инструменты бота с адресом международного контура: заменили до запуска.
Сам чат молчал слоями. Снимаешь один, под ним следующий: сообщения некуда положить; ответы бота выключены; боту не назначена CRM, куда класть лид; справочники пустые; справочники привязаны не к тому типу записей; самого клиента в CRM нет; внутренний адрес не отвечает. Семь слоёв, и ни один не кричал: каждый отдавал «ничего», а следующий принимал это за ответ. Сверху ещё одно: платформа и CRM по-разному проверяли, кто вошёл, весь раздел CRM отдавал «нет доступа», и служебные запросы уходили не в тот контур.

Ещё три причины были совсем служебными, и все три молчали одинаково. Подсказки в чате ходили в зарубежный сервис по зашитому адресу: адрес вынесли в настройки и направили на российскую языковую модель. Заговорила она с третьего захода: сначала ключ доступа брался не из той настройки и молча обрезался при выводе на экран, потом выяснилось, что мы требуем ответ в жёстком формате, которого она не принимает, и она отвергала сам запрос. Мониторинг ходил за сертификатами через машину международного контура и сжигал там наш лимит попыток. А обновление CRM дважды за день отчиталось «готово» и ничего не обновило: в файле настроек не хватило одного невидимого символа в конце строки, из-за этого строка склеилась с соседней, и сервис подключился к базе не под тем именем. Договор, у которого последний пункт напечатали поверх строки с подписью: формально подписан, а прочитать нельзя. Такую проверку мы уже сделали для мониторинга, а в CRM не перенесли, это моя недоработка.
Десять причин, если семь слоёв чата считать за одну. Ни одна не была ошибкой в привычном смысле. Про чужие адреса, которые новое место наследует от старого, я писал неделю назад. Здесь важнее другое: ни одна из десяти причин не пожаловалась. Каждая отвечала вежливо и пусто, а вежливое «не знаю такого» неотличимо от «всё в порядке», пока кто-нибудь не пройдёт весь путь руками. Отсюда простое правило для второй точки: первый рабочий день на ней надо провести самому, от двери до чека, а не смотреть, всё ли зелёное на приборах. В 155-й неделе мы развели контуры по документам, теперь развели по каждому адресу в коде.
К вечеру путь прошёл целиком. Посетитель пишет, бот отвечает примерно за 6,5 секунды, лид появляется в CRM со статусом «Новая заявка». И одна вещь за понедельник появилась, а не починилась: поиск по базе знаний в российском контуре переехал на российскую модель. Фундамент, чтобы обходиться без зарубежной.
Пятнадцать попыток входа: ошибка назвала себя не тем словом
Дальше пятница, и она задала тему всему выпуску.

С 10:39 до 10:49 один из клиентов пятнадцать раз подряд ввёл неверный пароль. Каждый раз кабинет писал ему «Произошла ошибка при входе». Человек сделал единственный разумный вывод: у нас сломалась CRM. В 10:52 он воспользовался «Забыли пароль», в 10:53 вошёл.
Сбоя не было вообще. Была опечатка и сообщение, которое назвало её не тем словом.
Кабинет считал любой ответ «нет доступа» признаком того, что вход устарел, и уходил обновлять его. Обновление падало, кабинет вызывал выход, и наружу летела ошибка обновления, в которой не было ни слова про пароль. Текст был формально правдой: обновление и правда упало. Но правдой не о том.
Домофон, который на неверный код пишет «Дверь неисправна». Все звонят в управляющую компанию, а надо набрать код ещё раз.
Исправление вышло в тот же день, в 13:47. Теперь при неверном пароле кабинет пишет «Неверный логин или пароль», а при слишком частых попытках отдельный текст про это.
Теперь неудобное. На вопрос клиента «почему мой прежний пароль не подошёл» ответа у меня нет. Смена пароля пока не оставляет отдельной записи в журнале, и восстановить, что случилось с прежним паролем, нельзя. Открытая слепая зона.
В 157-й неделе вход падал по-настоящему. Здесь вход работал, и это обошлось дороже: десять минут клиент считал платформу сломанной, а мы об этом не знали. Отсюда то, что я забираю с собой: сообщение об ошибке должно называть причину для пользователя, а не последнее звено внутренней цепочки. «Ошибка при входе» пугает. «Неверный пароль» объясняет. Разница в одном слове, а стоила она клиенту десяти минут уверенности, что мы лежим.
Логи были. Найти их было нельзя
А теперь про то, как я сам ошибся, разбирая ту пятницу.

В пятницу, разбирая эти пятнадцать попыток, я полез в логи ядра платформы и не нашёл там ничего. Пусто. И уверенно заключил: ядро не пишет логи.
Логи были. Все. Сверил: 1020 строк у самого сервиса против 1026 в хранилище за одно окно. Они лежали под другим именем. В метриках имя сервиса писалось через подчёркивание, в логах и цепочках запросов через дефис, а выбор сервиса в панелях брался из метрик. Панели «Логи сервиса» и «Логи ошибок» были пустыми для всех ключевых сервисов, а инструкция по разбору инцидентов предлагала заведомо пустой запрос. Инструмент, по которому я уверенно говорил «в логах пусто», отвечал пустотой из-за одного символа.
Архив, в котором документы на месте, но в картотеке фамилия через дефис, а на папке через пробел. Поиск возвращает «ничего нет», и ты убеждён, что документов не существует.
Один инцидент, два исправления за один день. В 13:47 починили текст ошибки входа, в 15:17 привели имя сервиса к одному виду во всех трёх системах наблюдения.
По дороге нашли ещё два молчания того же класса. Часть меток в логах ставилась по признаку, которого на живых серверах не бывает: правило не срабатывало ни для кого, и никто этого не видел. А закладка «докуда дочитано» у сборщика логов лежала во временной папке: после каждого перезапуска он читал всё с начала, и около двенадцати часов свежих строк в хранилище не было. В любой инцидент сразу после перезапуска мы смотрели бы в логи и видели вчерашний день.
Мониторинг чинился ещё трижды, до вечера воскресенья, и последний заход правил имена серверов, которые предпоследний записал неверно. Четыре захода за три дня. Ключевые сервисы теперь под одним именем, хвост остался.
Той же пятницей правка в CRM. Когда внутри что-то ломалось, клиент получал голую «ошибку сервера», а описание поломки уходило туда, где сервер его просто выбрасывал. Теперь описание пишется в лог, клиент видит понятный ответ. Ошибка обязана оставлять след.
Данные, которые лежат «под другой фамилией», для вас не существуют. Справочник имён между системами важнее ещё одного отчёта. У вас это «Иванова» в CRM и «Ivanova» в WhatsApp, «Маникюр» в записи и «Маникюр классический» в прайсе: каждая система честно отвечает «не нашлось».
Бот не замолкал, когда менеджер отвечал из мессенджера
Среда и четверг ушли на дефект, которого по нашим представлениям не существовало: автостоп «работал».

У нас есть автостоп: когда менеджер вступает в диалог, бот замолкает. Из рабочего кабинета это работало. Но менеджеры отвечают с телефона: из Авито, Telegram, WhatsApp. И там автостоп срабатывал только на ответы, у которых канал не указан, а ответ из мессенджера всегда приходит с каналом. Когда посчитали, вышло 88%: столько ответов менеджеров автостоп не вызывали. Два голоса в одном диалоге. Как долго это жило и кто первым заметил, в данных не видно, и это само по себе неприятно.
Был и второй, ещё проще. Отметку «бот молчит» система ставила в одном месте, а искала в другом. Чтение промахивалось всегда.
Секретарь, который замолкает, когда вступил директор, но узнаёт директора только по голосу из кабинета. Директор звонит по телефону, а секретарь продолжает говорить поверх.
В среду в 21:00 оба дефекта закрыли, с пятью тестами. В четверг вернулись к нему ещё дважды: убрали задвоение сообщений менеджера в чате и лишний внутренний запрос, из-за которого ответ приходил медленнее.
И тут же новое, которое мы принесли сами. Автостоп не отличает ответ менеджера от эха собственного сообщения бота, которое Авито возвращает обратно. В середине дня 28 августа бот ответил клиенту, через секунду тот же текст пришёл эхом, автостоп сработал, и бот замолчал на весь диалог, дорабатывал менеджер вручную. За два дня после починки один такой случай, но цена его: диалог целиком.
Вариантов было два: ограничить автостоп по типу источника, и тогда он перестал бы работать там, где сидят менеджеры, или учить систему узнавать эхо по тексту недавнего ответа бота. Правильный путь второй, и он ещё не пройден. Вывод локальный: «работает» и «работает в канале, где сидят менеджеры» это две разные вещи.
Telegram и Рой: научились ждать, не научились показывать, что ждут
У одного клиента рассылка в Telegram двое суток подряд стояла со статусом «идёт». Отправок ноль. Он написал нам сам: из кабинета это выглядело как работа, а результата не было. Разбирался я с этим уже на следующей неделе, а на этой мы учили рассылку ждать.

Линия продолжает прошлую неделю, когда мы учили систему различать «номера нет» и «Telegram придержал проверку». В понедельник четыре правки, и все про одно. Упёрлась проверка номера в ограничение Telegram на частые запросы: задача останавливается с ошибкой, а не ломится снова. Придержали бота: он получает паузу на час, и поле «когда можно снова» обновляется принудительно. Текст сообщения собирается из нескольких вариантов, чтобы сотня получателей не получила слово в слово одинаковое письмо. Зачем всё это: аккаунт, который упёрся в ограничения Telegram, дороже любой рассылки.
Водитель у закрытого шлагбаума теперь ждёт час, а не таранит его каждые пять минут. Хорошо. Но табло в диспетчерской по-прежнему показывает «в пути».
Система научилась ждать. Не научилась показывать, что ждёт: статуса «остановилась» у рассылки нет ни в базе, ни на экране. Про то, что «ок» и «ничего не сделал» должны выглядеть по-разному, я писал три недели назад. Неприятно находить тот же класс снова, и снова у себя. Правило, которое теперь буду проверять в каждой автоматизации: если система умеет останавливаться, у неё должен быть статус «остановилась». «Идёт» при нуле отправок хуже, чем «остановлена»: клиент видит работу там, где её нет.
Рой, наш диспетчер Telegram-аккаунтов, получил три правки за два дня. Что видел клиент: часть новых сообщений в своих чатах Рой просто не замечал, зато иногда отвечал там, где ему делать нечего. Первое лечится тем, что отметку «докуда прочитано» он теперь берёт только из своего чата, второе запретом писать в чужой.
И оговорка, которую легко забыть. Причину закрыли во вторник, а отметки, испорченные до вторника, остались испорченными: в тех чатах Рой новых сообщений не увидит, пока данные не почистишь руками. Это как исправить опечатку в бланке: новые карточки заполняются правильно, а старые так и лежат с опечаткой. Правка кода не чинит уже испорченные записи.
Официальный канал WhatsApp: холостая попытка и пустая смета
Вторник дал два сюжета про официальный канал WhatsApp, и оба про «успех», который ничего не сделал.

Сначала про подключение. Клиент подключает номер у провайдера в несколько шагов. Если с первого раза не установился адрес, на который провайдер шлёт события, сигнал о завершении подключения до нас не доходил. На второй попытке код видел, что приложение у провайдера уже создано, возвращал ссылку и пропускал установку адреса. Каждая следующая попытка была бесполезна и выглядела как успех. Второй дефект следом: после подключения бот стартовал с пустыми реквизитами и не запускался. Во вторник в 16:29 две правки в разных сервисах вышли в одну минуту: теперь каждая попытка делает всю работу заново.
Охрана на проходной, которая во второй раз говорит «вы уже в списке» и не выдаёт карту. А вы стоите у турникета.
Второй сюжет я сначала счёл мелочью для разработчиков. Ошибся: мелочь была про деньги. Правка в ядре во вторник, четыре строки. Ошибка, которую они закрыли, с 16 августа ломала смету рассылки в официальном канале: девять дней клиент видел пустоту вместо суммы, и ни одной ошибки на экране. В прошлом выпуске я чинил тот же пустой прямоугольник со стороны кабинета и решил, что вопрос закрыт. Причина была вторая, и лежала глубже. Ещё один молчаливый отказ, на этот раз прямо перед кнопкой «Отправить». Утром того же вторника служба WhatsApp по QR перестала падать, когда приходит сообщение неожиданного вида: мелочь из той же серии, пережить, а не замолчать.
Про деньги отдельно, и это не радует. В понедельник один из клиентов сверил свою рассылку по двум отчётам. В отчёте канала отправлено 303, доставлено 258. В нашем кабинете у той же рассылки доставлено ноль и 314 ошибок. Разобрался в тот же день: отчёт канала складывает в одну строку все версии отредактированного шаблона, поэтому его «доставлено» и наше просто про разное, а отказы у нас настоящие, поштучные, у каждого своё время. До людей эти сообщения не дошли, расхода за них не было, и клиенту я так и ответил.
Дальше неприятное. Автоматической сверки нашего отчёта с отчётом канала у нас нет: написал за день, выпустить на этой неделе не успел. «Расхода не было» и «сверка не сработала» пока выглядят одинаково.
Тарифы плюс модули: сначала увидеть, потом менять
Короткий сюжет, клиенту его пока не видно.
Я хочу перейти на модель «тариф плюс платные модули», о которой писал в 159-й неделе. И боюсь её трогать. До этой недели ответ на вопрос «сколько у нас людей на пробном периоде и у кого подключён AI-сотрудник» приходилось собирать по одному. Руками. Менять цены в системе, где текущее состояние видно только так, это менять меню, не зная, что сейчас стоит на плите.
Поэтому среда ушла не на тарифы, а на доску в кухне: семь заходов подряд, и админка теперь показывает пробные периоды, подписки и платные модули по каждому клиенту. В пятницу появилась связка «какой тариф какие модули включает», крупнейшая правка недели. Колонка «Тариф», которую я показывал в прошлом выпуске, наконец получила, чем заполняться.

Дат и цен нет. Условия действующих клиентов от этих правок не меняются, и это единственное, что я обещаю про тарифы заранее.
Главный итог недели

Эта неделя была про поломки, которых не видно на графиках.
Пять раз за неделю система отчиталась «всё в порядке», и пять раз это было не так. Ни одна не упала. Каждая работала и сообщала о себе не то.

Самое неудобное: я сделал то же самое. Посмотрел на пустой экран логов и уверенно сказал «ядро не пишет». Инструмент промолчал, я поверил. Разница между мной и клиентом с пятнадцатью попытками входа только в том, что у меня был доступ к серверу.
Если смотреть с 156-й недели, то месяц ушёл на одно: заставить систему говорить правду о себе. Сначала цифры, потом отчёты, теперь ошибки. Расти на данных, которые молчат, это расти в неизвестную сторону.
Тихая неделя оказалась самой полезной за месяц. Нового за семь дней ровно одна вещь, поиск по базе знаний в российском контуре. Всё остальное это переименование: система стала называть вещи своими именами. «Неверный пароль» на месте «ошибки». Одно имя сервиса на месте двух. След в логах на месте пустоты. На этом будут стоять фичи следующих недель, потому что строить на системе, которая молчит, значит строить наугад. И одна проверка для вас: откройте свой отчёт там, где стоит ноль. Это ноль или «не нашлось»? Разные вещи, и у нас эта разница стоила дня, потраченного на поиск того, что всё это время лежало на месте.


Следующая неделя начнётся с двух разборов: почему у одного клиента рассылка в Telegram двое суток показывала «идёт» при нуле отправок, и почему бот подтверждал клиентам запись, которой на самом деле не было. Расскажу, что нашёл, а не что планировал.
Приходите в Telegram-канал
Если этот формат отчётов вам полезен, подпишитесь на наш Telegram-канал @botseller_ai. Там я каждую неделю выкладываю бортовые журналы и короткие заметки про продуктовые решения, эксперименты и инциденты. Без рекламы, без воды, только то, что мы сами считаем важным.
Если хотите попробовать Botseller в своём бизнесе, используйте кнопку регистрации в шапке сайта. Я не вставляю отдельную ссылку в текст: платформа сама выберет правильный путь входа в зависимости от контура и настроек.
FAQ
Что значит «российский контур заработал» для меня как клиента?
Что весь путь от сообщения посетителя до лида в CRM проходит на серверах в России: бот отвечает примерно за 6,5 секунды, лид создаётся. Пока это проверено на чате сайта. Неделю назад контур был развёрнут, но чат не появлялся. Плюс поиск по базе знаний переведён на российскую модель.
Я ввёл пароль и увидел «ошибка при входе». Это сбой платформы?
Скорее всего нет. До пятницы кабинет показывал общий текст на любой неверный пароль, потому что путал опечатку с истёкшим входом. Теперь при опечатке вы увидите «Неверный логин или пароль», а при слишком частых попытках предупреждение о лимите. Если пароль точно верный, а войти не получается, напишите в поддержку.
Менеджер отвечает клиенту с телефона из Авито или Telegram. Бот теперь замолкает?
Да. Раньше автостоп надёжно срабатывал только на ответы из рабочего кабинета. Теперь ответ из любого канала останавливает бота. Известный хвост: в Авито бот может принять за менеджера эхо собственного сообщения и замолчать раньше времени. Пока не исправлено, знаем, где чинить.
Что происходит с рассылкой в Telegram, если Telegram придержал проверку номера?
Бот, который упёрся в ограничение, получает паузу на час и не долбит проверку повторно: так он не копит нарушений. Пока пауза стоит на боте, его рассылка стоит вместе с ним. Слабое место: в кабинете она в этот момент всё ещё выглядит как «идёт», отдельного статуса «ждём» пока нет. Это открытый хвост.
Я подключал официальный канал WhatsApp повторно, и ничего не происходило. Почему?
Потому что повторная попытка не делала всю работу заново: система видела, что приложение у провайдера уже создано, и пропускала настройку адреса для событий. Если он не встал с первого раза, все следующие попытки были холостыми. Теперь каждая попытка переустанавливает всё нужное, поэтому достаточно пройти подключение ещё раз.
Тарифы изменятся?
Готовится модель «тариф плюс платные модули», о которой я рассказывал в 159-й неделе. Под неё построен фундамент: админка видит пробные периоды и подписки, появилась связка тарифных планов с модулями. Дат и цен пока нет, условия действующих клиентов не менялись.



