Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Разработчик за компьютером и гигантская капибара

Страх продвижения: почему разработчики прячутся в код и как запустить пет-проект

Страх перед продвижением часто заставляет разработчиков прокрастинировать, бесконечно улучшая код вместо релиза. На примере запуска Telegram-бота с Chrome-расширением показано, как бороться с этим барьером, построить отказоустойчивый парсер сайтов и замерить реальную воронку активации пользователей.

Страх продвижения: почему разработчики прячутся в код и как запустить пет-проект

Ловушка прокрастинации под видом продуктивности

Создание своего продукта — мечта многих инженеров. Кажется, формула проста: пишем код, делаем фичи, и пользователи придут сами. Но часто техническая часть готова, а о продукте никто не знает. Вместо продвижения автор начинает бесконечно рефакторить код, писать тесты, оптимизировать БД и добавлять новые функции.

Это классическая ловушка прокрастинации под видом технической продуктивности. Кодинг — комфортная, предсказуемая среда, где тесты сразу дают обратную связь. Продвижение же связано с выходом в публичное пространство и риском получить игнорирование или критику. Страх критики заставляет инженера откладывать запуск, придумывая оправдания для написания еще одной фичи.

Кейс OporaReadBot: от MVP до затишья в Chrome Web Store

Яркий пример — разработка Telegram-бота OporaReadBot для сохранения ссылок «на потом», их суммаризации нейросетью и отправки напоминаний.

Его MVP написали за две недели в апреле. Бот отлично справлялся с задачами. Позже автор сделал расширение для Chrome, чтобы сохранять вкладки в один клик, а также импорт закладок. Расширение прошло модерацию и 12 июня появилось в Chrome Web Store.

Но после этого наступило трехнедельное затишье. Автор не опубликовал анонсов, не написал в чаты и не сообщил ждавшим пользователям. Вместо продвижения он потратил месяц на систему напоминаний, улучшение Mini App и сложный парсер. Это пример того, как страх маркетинга блокирует развитие готового проекта.

Техническая изнанка: как устроен отказоустойчивый парсер

Вместо маркетинга разработчик писал отказоустойчивую систему парсинга (scraping pipeline) для Хабра, VC.ru, Дзена, Пикабу и Ленты. Сложность в том, что площадки защищаются от роботов: просят CAPTCHA, блокируют IP, проверяют User-Agent или отдают пустой HTML, скрывая контент внутри JS (SPA).

Для стабильного сбора спроектировали каскадную fallback-цепочку парсинга:

  1. Readability + JSDOM. Страница загружается по HTTP, оборачивается в DOM с помощью jsdom и очищается библиотекой @mozilla/readability (как в режиме чтения Firefox). Это убирает баннеры и комментарии.
  2. Open Graph Metadata. При ошибке Readability скрипт достает описание страницы из метатега og:description через cheerio.
  3. Селекторы Cheerio. Если метатеги пусты, HTML парсится по семантическим селекторам (теги article, main, абзацы p внутри них).
  4. Обход блокировок. Подменяется User-Agent. В исходном проекте делались ретраи под видом Googlebot, но это несет юридические риски и ведет к блокировкам. Безопаснее использовать официальные API или headless-браузеры с прокси.
  5. Порог длины. Если длина текста после очистки меньше 150 знаков, бот сохраняет только ссылку без нейросетевого анализа. Это исключает галлюцинации LLM на пустых страницах.

Замеры конверсии: суровые цифры реальной воронки

Когда автор перешел к маркетинговым экспериментам, он решил замерить эффективность различных подходов к написанию промо-постов на Хабре. Результаты показали колоссальную разницу в метриках внимания и реального действия.

Во-первых, критически важную роль сыграл призыв к действию (CTA) и расположение ссылок:

  • Непрямой (мягкий) призыв. В первой статье ссылка на бота была вписана в контекст в середине текста. Из 103 пользователей, дочитавших статью, переход по ссылке совершили всего 2 человека (конверсия ~1.9%).
  • Прямой и дублированный CTA. Во второй статье призыв к действию был оформлен явно, а ссылка на бота дублировалась в начале и в конце текста. Из 154 дочитавших пользователей по ссылке кликнул 41 человек (конверсия ~26.6%). Таким образом, простое изменение подачи ссылок увеличило CTR более чем в 13 раз.

Дополнительные инсайды маркетинговых замеров:

  • Визуальное оформление. Использование яркой мемной обложки (с капибарой) увеличило показатель открываемости статьи (open rate) до 69%.
  • Тон повествования. Искренний, человеческий стиль изложения без рекламного копирайтинга показал более высокую вовлеченность.
  • Эффект отложенного трафика. Сразу после публикации статистика первого дня показала всего 2 клика при 122 дочитываниях. Однако через неделю количество переходов выросло до 41 благодаря алгоритмам платформы.

Главное открытие эксперимента лежало на стыке переходов и активаций. Из 41 пользователя, кликнувшего по ссылке, до самого бота дошли и нажали кнопку /start только 2 человека. Конверсия из клика в активацию составила всего 4.9%. Это доказывает, что метрики кликов являются тщеславными (vanity metrics). Настоящая проблема проекта крылась во внутреннем onboarding-процессе бота: пользователи открывали его, но не понимали, что делать дальше, и закрывали диалог.

Пошаговое руководство: как настроить сборщик контента

Для реализации надежного парсера статей на Node.js вам понадобятся библиотеки jsdom, @mozilla/readability и cheerio. Установите их через ваш пакетный менеджер: npm install jsdom @mozilla/readability cheerio.

Пример кода каскадной fallback-цепочки парсинга:

const { JSDOM } = require("jsdom");
const { Readability } = require("@mozilla/readability");
const cheerio = require("cheerio");

async function parseArticle(url, htmlContent) {
  try {
    const dom = new JSDOM(htmlContent, { url });
    const article = new Readability(dom.window.document).parse();
    if (article?.textContent?.trim().length >= 150) {
      return { title: article.title, text: article.textContent.trim(), method: "readability" };
    }
  } catch (err) { console.error("Readability failed", err); }

  const $ = cheerio.load(htmlContent);
  const ogDescription = $('meta[property="og:description"]').attr("content");
  if (ogDescription?.trim().length >= 150) {
    return { title: $('meta[property="og:title"]').attr("content") || $("title").text(), text: ogDescription.trim(), method: "og" };
  }

  let textElements = [];
  $("article p, main p").each((i, el) => { textElements.push($(el).text().trim()); });
  const extractedText = textElements.join("
").trim();
  if (extractedText.length >= 150) {
    return { title: $("h1").first().text().trim() || $("title").text(), text: extractedText, method: "cheerio" };
  }
  return { title: $("title").text().trim(), text: "", method: "failed" };
}

Безопасность и ограничения: Очищайте полученный HTML-код с помощью библиотек вроде dompurify для защиты от XSS. Cheerio не является браузером — он не выполняет клиентский JS. Для SPA (React, Vue) используйте Puppeteer. Уважайте robots.txt, лимиты запросов сайтов и авторские права.

Пошаговое руководство: как замерить воронку запуска

Для перехода от интуитивного маркетинга к анализу данных настройте сквозное отслеживание путей пользователей от поста до запуска приложения.

Шаги настройки аналитики:

  1. Маркировка ссылок (UTM): для внешних переходов используйте UTM-метки. Согласно документации Google Analytics, параметры кампании (такие как utm_source, utm_medium, utm_campaign) в URL позволяют системе веб-аналитики точно определять источники трафика.
  2. Глубокие ссылки в Telegram (Deep Linking): для переходов в бота используйте формат https://t.me/OporaReadBot?start=campaign_id, где параметр start содержит ваш идентификатор (например, habr_fear).
  3. Обработка в боте: при первом запуске бот получает команду /start campaign_id. Приложение должно распарсить параметр и записать его в БД в профиль пользователя.
  4. Регистрация метрик: фиксируйте дочитывания статьи, клики по ссылке, команды /start с меткой, и первые сохранения ссылок.
  5. Анализ: оценивайте воронку по истечении первой недели, когда алгоритмы площадки распределили трафик, чтобы избежать поспешных выводов.

Выводы: что делать дальше

Главный урок этого кейса: техническое совершенство продукта бесполезно, если о нем никто не знает. Написание кода не должно служить убежищем от страха перед запуском и продвижением.

Если замеры показывают высокую кликабельность по ссылкам, но крайне низкую активацию в самом продукте (конверсия 4.9% в OporaReadBot), усилия нужно направить не на закупку рекламы или бесконечный рефакторинг парсеров, а на онбординг. Необходимо упростить первое знакомство пользователя с ботом, добавить интерактивные подсказки и наглядно показать ценность сервиса в первые 60 секунд. Переход к анализу метрик воронки — способ превратить пет-проект в успешный работающий продукт.