Коротко о проекте
- Для кого
- Консультант по ИИ-автоматизации, который знакомит малый бизнес в США со своим брендом и услугами.
- Моя роль
- Проектирование и вся разработка: исследование, конвейер данных, промпты, шаблон сайта, хостинг, почта и трекинг. Код — с ИИ-ассистентами Claude Code и OpenAI Codex.
- Задача
- Превратить «я могу помочь вашему бизнесу» в готовый сайт владельца из того, что о нём говорят клиенты. Такое оценивают за десять секунд.
- Что сделано
- Конвейер: находит компании без сайта, проверяет контакт, собирает и публикует сайт, пишет владельцу, проводит опрос и отдаёт файлы.
- Сроки
- 9–17 сентября 2026, от первого файла до прогона на 200 сайтов.
- Объём
- 24 128 компаний в 100 городах 13 штатов, 19 100 проверенных сайтов из карточек. 272 сайта в 29 нишах, 200 — за один день.
- Расходы на ИИ
- 2,4–4,1 цента за сайт, хостинг — бесплатный тариф Cloudflare. Данные, поиск и почту отдельно не считали.
- Защита
- Телефоны и цены берутся из данных — модель их не пишет. Каждый сайт проходит автопроверки. Письмо уходит, только если сохранено доказательство, что адрес принадлежит компании. Капчи не обходим.
Идея
В Google Maps полно малого бизнеса без сайта: цветочный с 25 отзывами, обувная мастерская со 185, мотомастерская с фото каждого восстановленного байка. Маркетинг за них уже сделали клиенты, а новых отправить некуда.
Для консультанта по автоматизации это шанс. Холодное письмо легко пролистать, а готовый сайт с фото, часами и услугами из карточки компании владелец оценит за секунды, ещё до разговора.
Заказчик попросил софт, который собирает такие сайты пачками и заодно представляет его услуги. Правил было пять:
- Никакого «ИИ-мусора»: большинство владельцев могли бы опубликовать сайт как есть.
- Ничего выдуманного. Фото — из карточки, не со стоков. Услуги — из карточки, отзывов и страниц компании, цены — только опубликованные ею. Услуги из одних отзывов компания не подтверждала. Мало данных — пропускаем.
- Нужному человеку или никому: письмо — только на адрес с сохранённым подтверждением связи с компанией.
- Дёшево на объёме: от 20–30 сайтов в день при жёстком контроле расходов на ИИ.
- Без обязательной покупки: сайт остаётся онлайн, даже если владелец не ответил на опрос и ничего не купил. Снимаем только по его просьбе.
Что получает владелец

- Личное письмо со скриншотом его сайта и двумя предложениями о том, откуда сайт взялся. Вместо продающего текста — один вопрос с кнопками: что отнимает больше всего времени в вашей неделе? Ссылка ниже ведёт сразу на сайт.
- Опрос из четырёх вопросов: что отнимает время, сколько часов, кто этим занят и что владелец отдал бы другим. Компанию определяет ссылка, имя и email вводить не нужно. Ответы показывают консультанту, где автоматизация реально могла бы помочь.
- Страница передачи: файлы, простая инструкция для бесплатного хостинга или своего домена и предложение платной помощи — правки, перенос домена, напоминания о записи, запросы отзывов, проекты с нуля.
Сайт открывается прямо из письма, а за файлами ведёт опрос. Сначала польза, вопросы потом — это специально.
Кстати, почтовые клиенты вырезают формы. Поэтому вопрос в письме — кнопки-ссылки: клик записывает ответ и открывает опрос с уже выбранным вариантом.
Из чего состоит каждый сайт

Шаблон один, а наполняют его данные самой компании:
- Первый экран: лучшее фото, пометка «открыто сейчас», которая сама считается по часам работы и часовому поясу, рейтинг Google, кнопки звонка и услуг.
- О нас — по тому, что реально пишут в отзывах.
- Услуги во вкладках. Цены — только опубликованные самой компанией, например на старом сайте или в меню. Иначе без цен, а «цены уточняйте по телефону» вырезается.
- Галерея фото из карточки с полноэкранным просмотром.
- Почему клиенты возвращаются: три-четыре повторяющиеся положительные темы из отзывов, пересказом, а не цитатами.
- Как нас найти: часы с выделенным сегодняшним днём, звонок в одно касание, маршрут и карта.
Сайт — один HTML-файл и папка с фото. Открывается из скачанной папки, работает на любом бесплатном хостинге и правится в Блокноте. Плюс простая текстовая инструкция для тех, кто никогда не имел дела с сайтами.
Как это работало
Сентябрьская кампания на этом конвейере знакомила малый бизнес в 13 штатах с брендом и услугами заказчика.
Кампанию вёл я, на компьютере с Windows: из командной строки или простого меню. Этап — одна команда (staged, qualify, make, deploy, mail), а mail без --send только готовит черновики на проверку.
На всё есть справочник команд и подробные заметки. Сейчас конвейер простаивает и ждёт новых городов и ниш.
Масштаб и стоимость

- ИИ: 2,4–4,1 цента за сайт по официальным ценам, по замерам на пяти рабочих партиях.
- Хостинг: 0$ — один проект Cloudflare Pages на бесплатном тарифе, по папке на компанию.
- Данные, поиск и почта оплачиваются поставщикам за запрос или по тарифу. Здесь они не учтены: отдельно я их не отслеживал.
Как это устроено

Больше всего возни было с фото: в карточках полно меню, размытых кадров, дублей и интерьера. В одном из ранних прогонов главным фото сайта стала раковина в туалете😅 Теперь каждое фото до публикации проверяет визуальная модель.
Факты — из данных, слова — от модели

Первый сайт Claude собрал прямо в чате: исследование, тексты, проверка. Выглядел неплохо. Но если модель пишет всю страницу, ничто не мешает ей «улучшить» номер телефона или придумать цену.
Поэтому страница делится надвое:
- Факты — из данных: название, телефон, email, адрес, часы, рейтинг, фото и опубликованные цены. Их вставляет шаблон, а структурированные поля контактов не попадают даже в промпты для текстов. Отзывы и фото при этом уходят в Claude на анализ.
- Слова — от модели: заголовки, «О нас», описания услуг и темы отзывов — отдельно для каждого раздела страницы.
Сверху — механические проверки. Обещания вроде «я всё починю», «ответьте мне» или «в тот же день» валят сборку, а «цены уточняйте по телефону» вырезается. Промпт запрещает цитировать отзывы дословно (они принадлежат авторам) и не пускает критику в «почему клиенты возвращаются»: «лучше три честные положительные темы, чем четыре, среди которых затесалась критика».
Бонус: так вышло ещё и дешевле. Разделение «факты отдельно, тексты отдельно» дало 0,18$ за сайт на самой мощной модели. Потом тексты ушли на Claude Sonnet, фото и классификация — на Claude Haiku, на каждом шаге появился кеш, и получилось 2,4–4,1 цента за сайт.
Email — только с доказательством

Самым сложным оказалось не собрать сайты, а найти, кому их отправить. Малый бизнес без сайта редко публикует email, а нестрогий поиск охотно «находит» чужой.
Первая версия брала адрес, если название компании было где-то в URL страницы. Так она «нашла» email для 14 компаний из 27, а верными оказались ~3. Остальные принадлежали маркетплейсу подарочных карт, картографическому сайту, продавцу наград и клининговой компании из другого города.
Агрегаторы вставляют названия компаний в свои URL, так что правило я перестроил под точность:
- характерное слово из названия — в имени ящика, домене email или хосте страницы, а не только в пути; общие вроде «nails» или «cleaners» не в счёт;
- домены платформ — в чёрном списке;
- поиск в три шага: открытый веб → соцсети → имя владельца; большинство настоящих адресов нашлось на страницах компаний в соцсетях;
- в боевом режиме адрес остаётся, только если на той же странице есть телефон компании или её адрес с улицей и городом; этот фрагмент сохраняется как доказательство.
Мораль: точность важнее охвата. Лучше упустить лид, чем написать не той компании.
Кому сайт действительно нужен
Пустое поле «сайт» в карточке Google не доказывает, что сайта нет. В первой тестовой партии из десяти компаний «без пригодного сайта» у четырёх он был: онлайн-запись, страница заказов, JavaScript-приложение.
Wix, Squarespace, Square и сервисы заказов рисуют сайт через JavaScript, и в исходном HTML рабочей страницы бывает всего 27 слов. Поэтому правила консервативные:
- загружается страница — значит, сайт есть;
- сайт вне карточки засчитывается, только если в его хосте два характерных слова из названия: одно — часто просто город;
- соцсети и мультиссылки сайтом не считаются.
Отдельная группа — те, чей сайт из карточки не прошёл автопроверку: из 19 100 проверенных ~470 не ответили или только перекидывали на соцсети. Им ушло другое письмо: «Сайт в вашем профиле Google Maps не работает. Я сделал рабочий».
Честно: с «не работает» я поторопился — автопроверка видит лишь, что сайт не открылся у неё, а не что он лежит у всех.
Удаление по просьбе
По просьбе владельца сайт заменяется уведомлением «удалено по просьбе владельца», а компания уходит в стоп-лист. Его сверяют поиск, сборка и отправка, так что сайт не пересоберётся и не уйдёт повторно.
Подвох нашёлся в кеше: сначала CDN Cloudflare держал страницы семь дней, и правка или удаление дошли бы до людей через неделю. Теперь страницы перепроверяются каждые пять минут, а картинки, которые не меняются, остаются в кеше.
Разработка: 9 дней
| Дата | Что происходило |
|---|---|
| 9 сентября | Исследование ниш, первый сайт вручную с Claude, архитектура «шаблон + JSON», первый деплой на Cloudflare Pages. Обход капчи Google отмели: данные берём официально, у Google. |
| 10 сентября | Заказчик посмотрел десять сайтов и письма. Две проблемы: сайты для тех, у кого сайт уже был, и для тех, кому некуда писать. Правило: сначала — нет сайта и есть подтверждённый email, а поиск email стал строже. Первый полностью автоматический прогон на десять сайтов. |
| 11–12 сентября | Два прохода по 1 500 парам «город — ниша» (24 128 компаний), аудит 19 100 сайтов из карточек. Первые письма владельцам. |
| 11–16 сентября | Жёсткие подтверждения контактов, память против повторных писем, логи и учёт открытий и кликов. Партии по 10–20 сайтов, каждая модель — на задаче, где она сильнее, кеш на каждом шаге. Опрос, страница передачи, заголовки кеширования, удаление по просьбе и стоп-лист. |
| 17 сентября | 200 сайтов за один день🚀 Письма владельцам ушли в тот же день. |
Кому это подойдёт
- Веб-студиям и фрилансерам, которые продают сайты местному бизнесу: показать готовый сайт до первого звонка.
- Агентствам, которые продают через рассылки: персональный лендинг или демо каждому потенциальному клиенту.
- Сервисам для местного бизнеса (запись, отзывы, заказы): готовое демо на данных самого клиента.
- Консультантам, которые, как этот заказчик, хотят знакомить с услугами через что-то полезное.
Те же данные подойдут для сводок отзывов, аудитов локального поиска или рекламных лендингов. Эта версия — под адресную рассылку: проверка контактов, черновики на просмотр, стоп-лист.
Технические подробности
Технические подробности
Детали этапов
- Поиск: запрос «ниша в городе, штат», затем полные данные — адрес, часы, рейтинг, тексты отзывов и ссылки на фото.
- Отбор: рейтинг от 3,8, от 10 до 1 500 отзывов и указанные часы работы; сети и карточки не по нише исключаются.
- Фото: от 1 000 px, дубли — по контрольной сумме. Модель смотрит их на контактных листах, по многу на одной картинке ради экономии, отбрасывает меню, тёмные кадры и повторы и выбирает главный кадр.
- Сборка: факты, проверки, страница владельца, инструкции и ZIP.
- Аналитика: открытия, клики, ответы на опрос и передачи файлов — по каждому письму.
Каждая команда пишет полный протокол в лог, результаты моделей кешируются по компании — повторный запуск не платит дважды. Перед работой компания сверяется с историей по place ID, slug и названию с улицей и городом, чтобы не обработать её и не написать ей дважды.
Подвох платформы: бессерверные функции получают только пути из файла маршрутов, а не внесённая туда функция молча не срабатывает, и запрос получает статическую страницу. Теперь у каждой новой функции есть маршрут.
Данные и приватность в этой сборке
- Только публичная информация: карточка в Google и открытые страницы из поиска. Отзывы и фото уходят в Claude на анализ, а в них самих бывают контакты.
- Источник раскрыт: каждый сайт и каждое письмо говорят, что сайт собран по публичной информации.
- Опрос не просит имя и контакты. Ответы, открытия писем и клики привязаны к компании через трекинговый ID письма.
- Отписка: каждое письмо заканчивается фразой «Ответьте „stop“, и я больше не буду писать». В этой кампании ответы разбирались вручную: адрес уходил в стоп-лист, сайт снимался по просьбе владельца.
- Хранение: события трекинга и ответы на опрос лежат в Cloudflare D1, автоматически ничего не удаляется.
- Фото — из публичных карточек. Публичность не даёт права их перепубликовать, а тот, кто загрузил фото, не обязательно владеет на него правами.
- Ключи — в локальном
.envвне публикуемой папки.
Что добавляется при внедрении у клиента
Модуль рассылки настраивается под каждого клиента:
- отправка с домена клиента: SPF, DKIM, DMARC, график прогрева и дневные лимиты;
- понятная отписка и действующий почтовый адрес отправителя в каждом письме, как требует закон США (CAN-SPAM): ссылка для отписки с автоматическим стоп-листом плюс уведомление об отслеживании открытий и кликов;
- юридическая проверка правил рассылок для целевых регионов;
- фото, которые принадлежат компании или одобрены ею, либо лицензированные стоки; картографические данные — по условиям поставщика;
- повторные письма и подключение CRM;
- проверка человеком перед отправкой — уже встроена: сначала черновики, потом
--send.
Качество
Автопроверки на каждой сборке (запрещённые обещания, пустые фразы о ценах, пустые разделы), валидация партии и живая проверка опубликованных URL после каждого деплоя. Юнит-тесты покрывают защиту от повторов, листы с фото, ссылки на профили, отправку и бюджет на поиск.
Стек
| Слой | Технологии |
|---|---|
| Конвейер | Python 3.12: requests, aiohttp, Jinja2, Pillow, Playwright. CLI на 18 команд и меню для Windows |
| Данные | Google Places API; поиск — Serper, запасной — Tavily |
| ИИ | Claude Sonnet 5 — тексты; Claude Haiku 4.5 — фото, отзывы и классификация карточек. Стоимость каждого вызова пишется в лог |
| Сайт | Шаблон Jinja2 со встроенными CSS и JavaScript, плюс мобильная панель для звонка |
| Хостинг и трекинг | Cloudflare Pages (бесплатный тариф), Pages Functions на JavaScript, Cloudflare D1, Wrangler |
| Почта | SMTP; HTML и простой текст со встроенным скриншотом сайта, одно письмо на адрес |
Всего ~6 000 строк на Python, ~500 на JavaScript и ~1 100 строк шаблонов и CSS.