КакмыподружилиAmoCRMсЯндекс.МетрикойнаNode.jsиклиентпересталгадатьнакофейнойгуще

Как ClientID перестал теряться: React-хук, Node.js-адаптер и виджет в сделке. Результат — 93% заказов с UTM, +88% ROI, экономия 350К/мес. Код внутри.

Смотреть кейсы
📅 11.02.2026·🔄 Обновлено: 11.02.2026·⏱️ 5 мин·Продвинутый·Интеграция

Шаг 0. Эй, кто украл мои заказы?

Смотрим логи. Данные до нас:

const before = {
  crmOrders: 845,
  metrikaOrders: 438,
  coverage: ((438 / 845) * 100).toFixed(1) + '%' // 51,8% — больно
};

Ищем «призраков» через LogsAPI Яндекса:

const axios = require('axios');

async function findGhostOrders(crmIds, metrikaLogs) {
  const crmSet = new Set(crmIds);
  const metrikaSet = new Set(metrikaLogs.map(log => log.orderId));
  const ghosts = [...crmSet].filter(id => !metrikaSet.has(id));
  console.log(`👻 Пропало ${ghosts.length} заказов`);
  return ghosts;
}
// Спойлер: все они без ClientID

Вывод: ClientID не привязан → Метрика не узнаёт клиента при повторном визите.

Шаг 1. Ворвусь в форму и заберу _ym_uid

Пишем React-хук, который ловит ClientID и прячет его в скрытое поле формы.

const useYandexClientId = () => {
  const [clientId, setClientId] = useState('');

  useEffect(() => {
    if (typeof window.ym !== 'undefined') {
      window.ym(COUNTER_ID, 'getClientID', function(id) {
        if (id) {
          setClientId(id);
          console.log('✅ ClientID захвачен:', id);
        }
      });
    }
  }, []);

  return clientId;
};

// Используем в форме заявки
const YandexField = () => {
  const clientId = useYandexClientId();
  return <input type="hidden" name="ym_client_id" value={clientId} />;
};

⚠️ Без этого поля сделка для Метрики — как посылка без трек-номера.

Шаг 2. AmoCRM + Node.js: дышим через API

Теперь нужно записать ClientID в кастомное поле контакта. Пишем микросервис на Node.js.

import AmoCRM from 'amocrm-js';

const client = new AmoCRM({
  domain: 'client',
  auth: 'секретный_токен_бесконечности'
});

async function attachClientIdToContact(phone, ymClientId) {
  const contact = await client.request.get('/api/v4/contacts', {
    query: phone
  });

  if (contact && contact.id) {
    await client.request.patch(`/api/v4/contacts/${contact.id}`, {
      custom_fields_values: [{
        field_id: 123456, // ID поля для ClientID
        values: [{ value: ymClientId }]
      }]
    });
    console.log(`🏷️ ClientID ${ymClientId} привязан к контакту ${contact.id}`);
  }
}

// Вызов при сохранении заказа
attachClientIdToContact('79991234567', '1528651862599277088');

Можно было и через axios, но с SDK чуть аккуратнее.

Шаг 3. Next.js: встраиваем аналитику прямо в сделку

Менеджеры хотят видеть источник заказа, не выходя из CRM. Делаем React-виджет, который по ClientID стягивает данные из Метрики.

const AnalyticsWidget = ({ dealId }) => {
  const [stats, setStats] = useState(null);

  useEffect(() => {
    fetch(`/api/metrika/deal/${dealId}`)
      .then(res => res.json())
      .then(data => setStats(data));
  }, [dealId]);

  if (!stats) return <div className="animate-pulse">🔮 Гадаем на ClientID...</div>;

  return (
    <div className="bg-white rounded-lg shadow p-4 border border-blue-100">
      <div className="flex items-center gap-2 mb-3">
        <span className="text-xl">📎</span>
        <span className="font-medium">Сквозная аналитика</span>
      </div>
      <div className="space-y-2 text-sm">
        <p>📱 Источник: {stats.source || 'не определен'}</p>
        <p>🏷️ UTM кампания: {stats.utm_campaign || '—'}</p>
        <p>💵 Потрачено на рекламу: {stats.cost || '0'} ₽</p>
        <p className="text-green-600">✅ ClientID: {stats.clientId || 'нет'}</p>
      </div>
    </div>
  );
};

Эффект: менеджеры перестали открывать Метрику — она сама приходит к ним в карточку сделки.

Что получил клиент?

  1. До: 48% заказов — сироты без UTM.

  2. После: 93% заказов знают своё происхождение (источник, кампания, ключ).

  3. Перестали сливать ~350 000 ₽/мес на неработающие каналы.

  4. ROI контекста вырос на 88% за два месяца.

  5. Продажники: «Где кнопка „показать аналитику“? Хотим ещё!»

«Раньше я спрашивал маркетолога, где работает реклама. Теперь я захожу в CRM и вижу сам.»
— коммерческий директор

Мораль

Сквозная аналитика — это не функция, а привычка.
Привычка:
✅ Класть ClientID в кастомное поле сделки.
✅ Дёргать API Метрики и складывать данные в витрину.
✅ Рисовать красивый виджет для менеджеров.
✅ Спокойно спать, зная, что данные сходятся ±2%.

Мы написали 200 строк на Node.js, один React-хук и виджет.
Клиент перестал терять 400 заказов в месяц.
Нейросети не понадобились — только кофе и промисы.

P.S. Если ваш ClientID всё ещё не живёт в AmoCRM — вы теряете деньги прямо сейчас. Буквально.

Хотите увеличить продажи?

Мы поможем вам разработать и реализовать эффективную стратегию продвижения для вашего бизнеса.