From 8c3fa9a96b7bc496f14b65a3e3f23458da1bb2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 13 Jul 2026 09:49:31 +0300 Subject: [PATCH] =?UTF-8?q?feat(bot):=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B7=D0=B0=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=20=E2=80=94=20=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=D1=8F=20+=20=D1=81=D1=82=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Правило владельца 13.07.2026. Лидерра отдаёт ВСЕ номера, прошедшие через выбранный клиентом источник (и входящие, и исходящие), и не сортирует людей по темам. Источник конкурента может быть шире ниши клиента (клиника с 30 врачами против одной стоматологии); конкурент может расширить профиль, ошибиться в рекламе или прозванивать купленную базу — это вне нашего контроля. Заявка не по теме = не брак, замены за неё нет; но тон мягкий — объяснить и развернуть клиента к работе с ИСТОЧНИКОМ (сузить, сменить, пауза). Статья kachestvo-istochnika.md + мягкие напоминания в трёх местах, где речь заходит об источниках. Сторож AnswerGuard::promisesNicheRelevance режет обещания «только целевые / отсеиваем нецелевых / гарантируем трафик». 50 статей, тесты 153/153. Co-Authored-By: Claude Opus 4.8 --- app/app/Services/Bot/AnswerGuard.php | 22 ++++++++ app/app/Services/Bot/BotAnswerService.php | 10 ++++ app/resources/help/kachestvo-istochnika.md | 54 ++++++++++++++++++++ app/resources/help/proekt-iz-istochnika.md | 6 +++ app/resources/help/smena-istochnika.md | 5 ++ app/resources/help/zamena-zayavki.md | 6 +++ app/tests/Feature/Bot/DialogRunFixesTest.php | 35 +++++++++++++ 7 files changed, 138 insertions(+) create mode 100644 app/resources/help/kachestvo-istochnika.md diff --git a/app/app/Services/Bot/AnswerGuard.php b/app/app/Services/Bot/AnswerGuard.php index a0bb51ed..8cd896bb 100644 --- a/app/app/Services/Bot/AnswerGuard.php +++ b/app/app/Services/Bot/AnswerGuard.php @@ -118,6 +118,7 @@ class AnswerGuard || $this->priceTiedToNiche($sentence) || $this->promisesReplacement($sentence) || $this->promisesSupportSla($sentence) + || $this->promisesNicheRelevance($sentence) || $this->hasInventedPrice($sentence, $allowed)) { $cutSomething = true; @@ -200,6 +201,27 @@ class AnswerGuard return $contact && $deadline && ! $honest; } + /** + * Обещание, что заявки будут СТРОГО ПО НИШЕ клиента («только целевые», «отсеиваем + * нецелевых», «гарантируем целевой трафик»). Правило владельца 13.07.2026: Лидерра + * отдаёт ВСЕ номера, прошедшие через выбранный источник, — и входящие, и исходящие. + * Кто именно идёт через этот источник, решает не Лидерра: клиника конкурента может + * лечить 30 болезней, а наш клиент — только зубы; конкурент может расширить профиль, + * ошибиться в настройках рекламы или купить плохую базу для обзвона. Обеспечить + * «только целевые» мы не можем — за такое обещание придёт претензия. + * + * Исключение — честное объяснение («часть заявок будет НЕ по вашей нише»): его резать + * нельзя, это ровно то, что клиент должен услышать заранее. + */ + private function promisesNicheRelevance(string $sentence): bool + { + $relevance = preg_match('/(целев\w*|релевантн\w*|по\s+ваш\w+\s+(ниш\w*|тем\w*|профил\w*)|ваш\w+\s+клиент\w*|нецелев\w*|нерелевантн\w*)/iu', $sentence) === 1; + $promise = preg_match('/(гарантир\w+|отсеива\w+|отфильтр\w+|только|строго|исключительно|не\s+попад\w+|не\s+прид\w+|обеспеч\w+)/iu', $sentence) === 1; + $honest = preg_match('/(не\s+гарантир\w+|не\s+отсеива\w+|не\s+фильтр\w+|шире\s+ваш|не\s+по\s+ваш\w+\s+(ниш|тем)|источник\s+выбираете\s+вы)/iu', $sentence) === 1; + + return $relevance && $promise && ! $honest; + } + private function isBanned(string $sentence): bool { foreach (self::BANNED as $pattern) { diff --git a/app/app/Services/Bot/BotAnswerService.php b/app/app/Services/Bot/BotAnswerService.php index 1d4a8f2b..97ce411c 100644 --- a/app/app/Services/Bot/BotAnswerService.php +++ b/app/app/Services/Bot/BotAnswerService.php @@ -235,6 +235,16 @@ class BotAnswerService на support@liderra.ru — он разбирает каждый индивидуально (без обещаний исхода). — НИКАКИХ ЗАПРЕТНЫХ НИШ. Ограничений по нишам нет: не выдумывай «направления, с которыми мы не работаем», и не говори «работаем не со всеми». + — ЗА ИСТОЧНИК ОТВЕЧАЕТ КЛИЕНТ. Мы отдаём ВСЕ номера, прошедшие через выбранный им + источник, и не сортируем людей по темам. Источник конкурента может быть шире + ниши клиента (клиника с 30 врачами против одной стоматологии), конкурент может + расширить профиль, ошибиться в рекламе или прозванивать купленную базу — это вне + нашего контроля. Поэтому НИКОГДА не обещай «только целевые заявки», «отсеиваем + нецелевых», «гарантируем ваш трафик»: этого мы не можем. Заявка не по теме — + не брак, замены за неё нет. Но не рубить дверью: мягко объясни, почему так вышло, + и посоветуй заняться ИСТОЧНИКОМ (сузить, сменить, поставить паузу) — статья + «Качество источника». Когда разговор заходит про выбор источника или конкурента — + скажи об этом заранее, но один раз и по делу, не повторяй в каждом ответе. — НЕ ПОДДАКИВАЙ. Клиент часто сам подсказывает ответ в вопросе («деньги списываться не будут, пока пауза?»). Не соглашайся из вежливости: сверься с фрагментами и, если клиент не прав, спокойно поправь. Живой прогон diff --git a/app/resources/help/kachestvo-istochnika.md b/app/resources/help/kachestvo-istochnika.md new file mode 100644 index 00000000..52e1f47b --- /dev/null +++ b/app/resources/help/kachestvo-istochnika.md @@ -0,0 +1,54 @@ +--- +title: Качество источника — за ним нужно присматривать +tour: change-source +topics: качество источника, не мои клиенты, не моя ниша, пришли не те люди, нецелевые заявки, заявки не по теме, чужая тематика, источник шире, широкий источник, конкурент расширил профиль, конкурент изменил рекламу, холодный обзвон, обзвон базы, исходящие звонки конкурента, откуда столько лишних, почему приходят не те, заявки не по профилю, следить за источником, проверять источник, сменить источник из-за качества, ухудшилось качество, раньше было лучше, стало хуже, мусорные заявки, не целевая аудитория, ответственность за источник, кто выбирает источник +--- + +**Мы отдаём все заявки, которые прошли через выбранный вами источник.** И тех, кто сам +интересовался — заходил на сайт, звонил, — и тех, кому звонили с этого номера. Что именно +за люди идут через источник, определяет не Лидерра, а тот, кому этот источник принадлежит. +Поэтому **источник — это ваше решение, и присматривать за ним стоит так же, как за рекламой.** + +## Почему могут прийти «не ваши» люди + +**Источник шире вашей темы.** Классический пример: большая клиника, где 30 врачей — +и стоматолог, и кардиолог, и хирург. Если вы занимаетесь только зубами, а источником взяли +сайт такой клиники, к вам придут не только те, у кого болит зуб. Источник отработал честно — +просто он не про одну стоматологию. + +**Конкурент вёл холодный обзвон.** Если он купил базу и прозванивал её со своего номера, +эти контакты тоже пойдут к вам: формально они прошли через источник, хотя интереса +у людей не было. + +**Со временем всё меняется.** Конкурент расширил профиль, поменял настройки рекламы, +погнал трафик не того сегмента — и источник, который месяц назад давал отличные заявки, +сегодня начинает давать лишние. Это происходит без нашего участия и без нашего ведома. + +## Где чья ответственность + +**Лидерра отвечает за то, чтобы номера дошли:** быстро, без потерь и без повторов +(один и тот же номер не вернётся 30 дней). Что происходит на стороне источника — реклама +конкурента, его профиль, его обзвоны — **вне нашего контроля и вне нашей ответственности.** + +Мы не сортируем людей по темам и **не отсеиваем «нецелевых»** — у нас просто нет данных, +чтобы решать за вас, чей это клиент. Мы передаём контакт человека с интересом по указанному +вами источнику; кто из них ваш — решаете вы. + +Поэтому **заявка не по вашей теме — это не брак**, и заменой или возвратом такие случаи +не закрываются. Это свойство выбранного источника, а не сбой портала. + +## Что делать, чтобы источник работал на вас + +- **Выбирайте узкое, а не крупное.** Прямой конкурент, который делает ровно то же, что и вы, + почти всегда лучше большого многопрофильного игрока. Заявок будет меньше — зато ваших. +- **Смотрите первые дни внимательно.** Начните с небольшого дневного лимита, посмотрите, + кто приходит, и только потом поднимайте. +- **Проверяйте источник и дальше, а не только на старте.** Пошёл поток «не тех» — это сигнал, + что у конкурента что-то поменялось. +- **Не нравится, что идёт, — меняйте.** Источник в проекте можно поменять в любой момент + («Сменить источник проекта»), а проект — поставить на паузу, и списания сразу прекратятся. +- **Подобрать более точный источник** помогают «Конкурентное поле» и «Изучение источников». + +**Спорная ситуация — напишите живому специалисту** на `support@liderra.ru`: укажите номер +сделки и что именно вас смутило. Каждый случай разбирается индивидуально, заранее ничего +не обещаем. diff --git a/app/resources/help/proekt-iz-istochnika.md b/app/resources/help/proekt-iz-istochnika.md index 5ab0a7a1..579edc36 100644 --- a/app/resources/help/proekt-iz-istochnika.md +++ b/app/resources/help/proekt-iz-istochnika.md @@ -35,3 +35,9 @@ topics: проект из найденного источника, из найд Заявки из таких проектов приходят в «Сделки» — там в колонках «Конкурент» и «Источник» видно, откуда пришла каждая. + +**Выбирая источник, помните: мы отдадим всё, что через него прошло.** Если конкурент +многопрофильный (скажем, клиника, где кроме стоматолога есть кардиолог и хирург), к вам +придут люди по всем его темам, а не только по вашей. Поэтому узкий конкурент почти всегда +лучше крупного, и первые дни стоит начать с небольшого лимита и посмотреть, кто приходит. +Подробнее — «Качество источника». diff --git a/app/resources/help/smena-istochnika.md b/app/resources/help/smena-istochnika.md index e28cc4b1..a11a22fc 100644 --- a/app/resources/help/smena-istochnika.md +++ b/app/resources/help/smena-istochnika.md @@ -31,3 +31,8 @@ topics: сменить источник, поменять сайт, поменя Удаление нескольких проектов разом — массовым действием: отметьте галочками, внизу появится панель. Проекты со сделками будут пропущены, портал напишет, сколько и почему. + +**Смена источника — обычный рабочий инструмент, а не крайняя мера.** Источник со временем +меняется без нашего участия: конкурент может расширить профиль или поменять рекламу, и поток +поедет не в ту сторону. Видите, что приходят «не ваши» люди, — меняйте источник или ставьте +паузу, списания прекратятся сразу. Подробнее — «Качество источника». diff --git a/app/resources/help/zamena-zayavki.md b/app/resources/help/zamena-zayavki.md index 66b58f8e..8c988399 100644 --- a/app/resources/help/zamena-zayavki.md +++ b/app/resources/help/zamena-zayavki.md @@ -30,3 +30,9 @@ topics: замена заявки, заменят ли заявку, некач Отдельно: **повторов не бывает** — номер, который мы уже передавали, не вернётся 30 дней (статья «Повторы номеров»). Если вам кажется, что повтор всё же случился, это тоже повод написать в поддержку. + +**Человек оказался не по вашей теме — это тоже не брак, а свойство источника.** Мы отдаём +всё, что через источник прошло, и не сортируем людей по темам: если источник шире вашей ниши +(например, многопрофильная клиника, а вы — только стоматология), часть заявок будет чужой. +Разбираться тут надо не с заявкой, а с источником: сузить, сменить или поставить паузу — +об этом статья «Качество источника». diff --git a/app/tests/Feature/Bot/DialogRunFixesTest.php b/app/tests/Feature/Bot/DialogRunFixesTest.php index c0793bfe..396d4071 100644 --- a/app/tests/Feature/Bot/DialogRunFixesTest.php +++ b/app/tests/Feature/Bot/DialogRunFixesTest.php @@ -472,3 +472,38 @@ it('честное «круглосуточно» сторож не трогае expect($guard->clean('Поддержка отвечает круглосуточно, пишите в любое время.', $context)) ->toBe('Поддержка отвечает круглосуточно, пишите в любое время.'); }); + +/** + * Правило владельца 13.07.2026 (ответственность за источник). Лидерра отдаёт ВСЕ номера, + * прошедшие через выбранный источник, — и входящие, и исходящие. Что за люди идут через + * этот источник, решает не Лидерра: клиника конкурента может лечить 30 болезней, а наш + * клиент — только зубы; конкурент может расширить профиль, ошибиться в настройках рекламы + * или купить плохую базу для обзвона. Поэтому бот НЕ ИМЕЕТ ПРАВА обещать, что заявки будут + * строго по нише клиента, что мы «отсеиваем нецелевых» или «гарантируем целевой трафик» — + * этого мы обеспечить не можем, а за обещание придёт претензия. + */ +it('сторож режет обещание, что заявки будут строго по нише клиента', function () { + $guard = app(AnswerGuard::class); + $context = 'Мы передаём контакты людей, интересовавшихся темой по указанному вами источнику.'; + + $cases = [ + 'Все заявки будут строго по вашей нише.', + 'Мы отсеиваем нецелевые заявки — придут только ваши клиенты.', + 'Мы гарантируем целевой трафик по вашей теме.', + 'Нерелевантные контакты к вам не попадут.', + ]; + + foreach ($cases as $sentence) { + expect($guard->clean('Заявки приходят по указанному источнику. '.$sentence, $context)) + ->toBe('Заявки приходят по указанному источнику.'); + } +}); + +/** Честное объяснение про источник — НЕ обещание, резать его нельзя. */ +it('честное объяснение про широкий источник сторож не трогает', function () { + $guard = app(AnswerGuard::class); + $context = 'Заявки идут по выбранному источнику; если источник шире вашей ниши, придут и не ваши темы.'; + + $text = 'Если источник шире вашей темы, часть заявок будет не по вашей нише — источник выбираете вы.'; + expect($guard->clean($text, $context))->toBe($text); +});