← Все материалы по СМС‑верификации

SMS verification API на PHP и Node.js: подтверждение телефона в форме

Как устроена СМС‑верификация изнутри: генерация OTP‑кода, хранение и проверка, отправка через шлюз, защита от SMS‑бомберов. С нашим SDK для формы, примерами на PHP, Node.js и curl и ссылками на документацию шлюзов.

Генерация СМС‑кода для формы на сайте: две схемы

Сначала о том, где рождается код и кто его проверяет, — от этого зависит, для каких форм подходит решение.

Эта страница — для разработчиков, которые собирают подтверждение номера сами. Если нужно объяснение без кода, начните со страницы как работает СМС‑верификация, а живую форму можно попробовать на демо для Tilda и Битрикс.

Любая схема OTP состоит из четырёх частей:

  1. Генерация кода — 4–6 случайных цифр.
  2. Хранение и проверка — где лежит код, сколько он живёт и сколько попыток даётся.
  3. Отправка через шлюз — HTTP‑запрос к API провайдера СМС или звонков.
  4. Защита от злоупотреблений — лимиты, чтобы форму не превратили в бесплатный SMS‑бомбер за ваш счёт.

Главный вопрос архитектуры — кто знает код. От ответа зависит, для каких задач подходит решение.

Схема А: код в браузере (наш SDK v1.2.0)

Так устроен виджет sms-otp.js: код генерируется в браузере через Math.random(), браузер сам сравнивает введённые цифры, а сервер verify.php только получает {phone, verificationCode} и передаёт текст шлюзу. Опционально пара «телефон:код» кодируется XOR + Base64 общим ключом.

  • Не нужно хранить состояние на сервере — подходит для Tilda и конструкторов
  • Ставится за минуты, шлюз меняется одной строкой
  • Код и ключ XOR видны в DevTools: это обфускация, а не шифрование
  • Подходит для фильтрации мусорных заявок, но не для входа в аккаунт
Схема Б: код на сервере (рекомендуем)

Сервер генерирует код криптостойким генератором (random_int в PHP, crypto.randomInt в Node.js), хранит только хеш со сроком жизни и счётчиком попыток, проверяет сам и отдаёт браузеру лишь «да/нет».

  • Обязательна для регистрации, входа в личный кабинет, смены пароля
  • Лимиты по номеру и IP можно реально соблюдать
  • Нужен свой бэкенд и хранилище: сессия, Redis или БД
  • Примеры на PHP и Node.js — ниже на странице
Как выбрать: для формы обратной связи, где цель — живой номер без опечаток, хватает схемы А. Для формы регистрации, где подтверждённый телефон становится логином, нужна только схема Б.

Подключение SDK к форме: интеграция СМС‑шлюза в форму обратной связи

Наш виджет sms-otp.js v1.2.0 перехватывает отправку любой HTML‑формы, показывает экран ввода кода и пропускает исходную отправку только после верного кода. Без зависимостей, работает с Tilda, 1С‑Битрикс и обычными формами.

HTML + JS — подключение SDK к форме заявки
<form id="lead-form">
  <input name="Name">
  <input name="Phone" type="tel">
  <button type="submit">Отправить</button>
</form>

<script src="/js/sdk/sms-otp-v1.2.0.js"></script>
<script>
  SmsOTP.init({
    formSelector:   '#lead-form',
    phoneFieldName: 'Phone',
    mode:           'production',  // 'demo' — код показывается на экране, СМС не уходит
    endpoint:       '/sms-verify.php',
    secretKey:      '…32+ символа, тот же, что в конфиге бэкенда…',
    digits:         4,
    countries:      ['7', '375', '994'],
    resendDelay:    60
  });
</script>

Режим mode задавайте явно: в README по умолчанию указан production, а в коде v1.2.0 — demo. Основные параметры:

ПараметрПо умолчаниюНазначение
formSelector'form'CSS‑селектор перехватываемых форм
phoneFieldName'Phone'атрибут name поля телефона
endpoint—URL бэкенда, который отправляет СМС
digits4длина кода: 4 или 6
countries['7','375','994']разрешённые коды стран; номер проверяется по длине
resendDelay60секунд до кнопки «Отправить повторно»

Единый контракт эндпоинта для всех шлюзов

Бэкенды для разных провайдеров (providers/prosmo-sms/verify.php для SMS Просто, providers/aerosms/verify.php для SMS Aero) принимают и возвращают одно и то же. Поэтому смена шлюза — это замена одной строки SMS_ENDPOINT на фронтенде, без правки формы.

Контракт verify.php — запрос и ответ
# Отправить код
POST /sms-verify.php
Content-Type: application/json
{ "phone": "79991234567", "verificationCode": "4827" }
# prosmo-sms с заданным secret_key принимает и { "encodedPayload": "<base64>" }

200 { "success": true,  "sms_id": "…" }
400 { "success": false, "error": "phone and verificationCode are required" }
502 { "success": false, "error": "SMS provider unreachable" }

# Проверить ключ и баланс шлюза
GET /sms-verify.php?action=test
200 { "success": true, "message": "API key is valid", "balance": … }
curl — проверка эндпоинта из консоли
curl "https://your-site.ru/sms-verify.php?action=test"

curl -X POST "https://your-site.ru/sms-verify.php" \
  -H "Content-Type: application/json" \
  -d '{"phone":"79991234567","verificationCode":"4827"}'

Поле sms_id из ответа стоит сохранить: по нему потом сопоставляется статус доставки из webhook. Как это выглядит в живой форме, можно посмотреть на демо‑странице для Tilda и Битрикс.

SMS verification API на PHP и Node.js: код генерирует и проверяет сервер

Для регистрации и входа в личный кабинет браузеру нельзя знать код. Ниже — упрощённые эндпоинты по серверной схеме: два действия, send и check. Ключи шлюза берутся из переменных окружения и не попадают во фронтенд.

PHP: эндпоинт подтверждения телефона

Отправка идёт методом push_msg SMS Просто, как в нашем providers/prosmo-sms/verify.php. Код хранится в сессии в виде хеша, со сроком жизни и счётчиком попыток.

PHP — otp.php (упрощённо, без ключей)
<?php
session_start();
header('Content-Type: application/json; charset=utf-8');

$in    = json_decode(file_get_contents('php://input'), true) ?: [];
$phone = preg_replace('/\D/', '', $in['phone'] ?? '');

function reply(int $status, array $body) {
    http_response_code($status);
    exit(json_encode($body));
}

if (($in['action'] ?? '') === 'send') {
    if (!preg_match('/^7\d{10}$/', $phone)) reply(400, ['success' => false]);
    if (time() - ($_SESSION['otp']['sent_at'] ?? 0) < 60) reply(429, ['success' => false]);

    $code = (string) random_int(1000, 9999);          // криптостойкий ГСЧ
    $_SESSION['otp'] = [
        'phone'   => $phone,
        'hash'    => password_hash($code, PASSWORD_DEFAULT),
        'exp'     => time() + 300,                    // 5 минут
        'tries'   => 0,
        'sent_at' => time(),
    ];
    reply(200, ['success' => send_sms($phone, "Ваш код: $code")]);
}

if (($in['action'] ?? '') === 'check') {
    $otp = $_SESSION['otp'] ?? null;
    if (!$otp || $otp['phone'] !== $phone || time() > $otp['exp']) reply(410, ['success' => false]);
    if (++$_SESSION['otp']['tries'] > 5) { unset($_SESSION['otp']); reply(429, ['success' => false]); }
    if (!password_verify((string) ($in['code'] ?? ''), $otp['hash'])) reply(400, ['success' => false]);

    unset($_SESSION['otp']);
    $_SESSION['verified_phone'] = $phone;              // дальше форма/регистрация читает только это
    reply(200, ['success' => true]);
}

function send_sms(string $phone, string $text): bool {
    $ch = curl_init('http://api.sms-prosto.ru/');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => [
            'method' => 'push_msg', 'api_v' => '2.0', 'format' => 'json',
            'key'    => getenv('SMS_API_KEY'),
            'phone'  => $phone, 'text' => $text,
            'sender_name' => getenv('SMS_SENDER'),
        ],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
    ]);
    $r = json_decode((string) curl_exec($ch), true);
    return (int) ($r['response']['msg']['err_code'] ?? -1) === 0;
}

Сессионный лимит в примере — минимальная защита: бот без cookie получает новую сессию на каждый запрос. В продакшене лимиты по номеру и IP держат в Redis или в базе (подробнее — в разделе про защиту ниже).

Node.js: Express + fetch

Тот же сценарий на Node.js 18+ (встроенный fetch). Отправка — через шлюз SMS Aero v2 с HTTP Basic Auth (email + API‑ключ), как в providers/aerosms/verify.php.

Node.js — server.js (упрощённо, без ключей)
import express from 'express';
import crypto from 'node:crypto';

const app = express();
app.use(express.json());

const store = new Map();   // phone → { hash, exp, tries, sentAt }; в проде — Redis с TTL
const sha = (s) => crypto.createHash('sha256').update(s).digest();
const clean = (p) => String(p || '').replace(/\D/g, '');

app.post('/otp/send', async (req, res) => {
  const phone = clean(req.body.phone);
  if (!/^7\d{10}$/.test(phone)) return res.status(400).json({ success: false });
  const prev = store.get(phone);
  if (prev && Date.now() - prev.sentAt < 60_000) return res.status(429).json({ success: false });

  const code = String(crypto.randomInt(1000, 10000));
  store.set(phone, { hash: sha(phone + code), exp: Date.now() + 300_000, tries: 0, sentAt: Date.now() });

  const qs = new URLSearchParams({ number: phone, text: `Ваш код: ${code}`, sign: process.env.SMS_SIGN });
  const auth = Buffer.from(`${process.env.SMSAERO_EMAIL}:${process.env.SMSAERO_KEY}`).toString('base64');
  const r = await fetch('https://gate.smsaero.ru/v2/sms/send?' + qs, { headers: { Authorization: 'Basic ' + auth } });
  const data = await r.json();
  res.json({ success: Boolean(data.success) });
});

app.post('/otp/check', (req, res) => {
  const phone = clean(req.body.phone);
  const otp = store.get(phone);
  if (!otp || Date.now() > otp.exp) return res.status(410).json({ success: false });
  if (++otp.tries > 5) { store.delete(phone); return res.status(429).json({ success: false }); }
  const ok = crypto.timingSafeEqual(otp.hash, sha(phone + String(req.body.code || '')));
  if (ok) store.delete(phone);
  res.status(ok ? 200 : 400).json({ success: ok });
});

app.listen(3000);

Защита формы от спама через СМС‑код и от SMS‑бомберов

Каждая СМС стоит денег, поэтому открытый эндпоинт отправки — первая цель для ботов. Ниже отдельно: что реально есть в нашем коде и что стоит добавить.

Что уже есть в коде

  • Таймер повторной отправки. SDK блокирует кнопку «Отправить повторно» на resendDelay секунд (по умолчанию 60). Это ограничение на стороне клиента: оно защищает от случайных двойных кликов, но не от скрипта, который шлёт запросы напрямую.
  • Проверка номера. SDK пропускает только разрешённые коды стран (7, 375, 994) и проверяет длину номера — мусорный ввод не доходит до шлюза.
  • CORS. verify.php отдаёт Access-Control-Allow-Origin только для домена сайта из конфига. Чужой сайт не сможет вызвать эндпоинт из браузера, но curl этим заголовком не остановить.
  • Белый список доменов и лимит по IP есть в бэкенде Mobile ID (providers/aerosms/mobile-auth/backend.php): запрос с чужого Origin получает 403, а превышение лимита запросов с одного IP (по умолчанию 30 за 60 секунд) — 429. Это файловый лимит в режиме best effort, и в verify.php для СМС его пока нет.

Что рекомендуем добавить

Ниже — рекомендации, а не описание текущего кода. Для публичной формы мы считаем их обязательным минимумом:

  1. Лимит на номер: не чаще одной СМС в минуту и не больше 3–5 в сутки на один номер. Хранить в Redis или БД, а не в сессии.
  2. Лимит на IP и подсеть: бомберы перебирают номера, но ходят с небольшого числа адресов.
  3. Попытки ввода: 5 неверных вводов — и код аннулируется; срок жизни кода 3–5 минут.
  4. Капча перед отправкой: невидимая капча (например, Yandex SmartCaptcha) проверяется на сервере до обращения к шлюзу.
  5. Honeypot и время заполнения: скрытое поле и отказ, если форма отправлена быстрее 2–3 секунд после загрузки.
  6. Белый список стран на сервере: защищает от накрутки дорогих международных СМС.
  7. Мониторинг баланса: GET ?action=test возвращает остаток — резкое падение за час стоит превратить в алерт.

Защита формы от спама через СМС‑код работает, только если сам код нельзя получить бесплатно и без ограничений. Там, где СМС дорого или не доходит, дешевле подтверждать номер звонком (Flash Call) или через Mobile ID оператора — там пользователь вообще не вводит код. Разбор жалоб «код не пришёл» и резервных каналов — на странице не приходит СМС‑код.

Документация SMS‑шлюзов: webhook статусов доставки и Flash Call через curl

Официальные материалы шлюзов, с которыми мы работаем или которые часто выбирают клиенты. Тарифы и набор каналов меняются — сверяйтесь с документацией перед интеграцией.

Как отправить Flash Call через curl

Пример по документации RedSMS: код — это 4 цифры, которые пользователь увидит в номере входящего звонка. Заголовок secret — MD5 от строки ts + API‑ключ, где ts — любое уникальное значение запроса.

curl — Flash Call через RedSMS
TS=$(date +%s%N)
curl -X POST "https://cp.redsms.ru/api/message" \
  -H "login: $REDSMS_LOGIN" \
  -H "ts: $TS" \
  -H "secret: $(echo -n "$TS$REDSMS_API_KEY" | md5sum | awk '{print $1}')" \
  -H "Content-type: application/json" \
  -d '{"route":"fcall","to":"+79993332211","text":"1234"}'

Для сравнения — обычная СМС с кодом через SMS Просто, теми же параметрами, что использует наш verify.php:

curl — СМС через push_msg (SMS Просто)
curl -X POST "http://api.sms-prosto.ru/" \
  -d method=push_msg -d api_v=2.0 -d format=json \
  -d key="$SMS_API_KEY" -d sender_name="$SMS_SENDER" \
  -d phone=79991234567 --data-urlencode text="Ваш код: 4827"

Обработка статусов доставки СМС: webhook API

Шлюз сам сообщает, дошло ли сообщение, — не нужно опрашивать API по таймеру. По документации SMS Просто присылает GET‑запрос с полями id_sms, state, phone, last_update; RedSMS — POST в формате application/x-www-form-urlencoded с полями uuid, status, status_time и ждёт ответа не дольше 10 секунд. Один обработчик может принимать оба формата:

PHP — sms-status-webhook.php
<?php
// Отвечаем быстро: тяжёлую обработку — в очередь
if (isset($_GET['id_sms'])) {
    // SMS Просто: значения state — по таблице в документации
    save_status('sms-prosto', $_GET['id_sms'], $_GET['state'] ?? '');
} elseif (isset($_POST['uuid'])) {
    // RedSMS: например status = delivered
    save_status('redsms', $_POST['uuid'], $_POST['status'] ?? '');
}
http_response_code(200);

function save_status(string $gw, string $id, string $status): void {
    // UPDATE otp_messages SET status = ? WHERE gateway = ? AND message_id = ?
    // message_id — это sms_id / uuid из ответа на отправку
}

Что делать со статусом: если через 30–60 секунд после отправки сообщение так и не доставлено, предложите пользователю другой канал — звонок или Mobile ID оператора. RedSMS рекомендует принимать webhook только с их IP‑адресов; раз эндпоинт должен быть доступен без авторизации, фильтр по IP или секретный токен в URL лишним не будет.

FAQ по SMS verification API

Как сделать подтверждение телефона в форме регистрации на PHP?
Нужны два серверных действия. Send: проверить номер, сгенерировать код через random_int, сохранить хеш кода со сроком жизни 5 минут и отправить СМС через API шлюза. Check: сравнить введённый код с хешем через password_verify, учесть число попыток и записать подтверждённый номер в сессию. Браузер кода не видит — полный пример есть выше на странице.
Можно ли генерировать СМС‑код для формы на сайте прямо в браузере?
Можно, если задача — отсеять опечатки и случайные номера в форме заявки: так работает наш SDK sms-otp.js v1.2.0. Для регистрации и входа так делать нельзя: код, сгенерированный в JavaScript, виден в DevTools, и проверку можно обойти. Там код генерирует и проверяет только сервер.
Какую библиотеку с GitHub взять для генерации OTP‑кодов?
Для СМС‑кода библиотека не нужна: достаточно random_int() в PHP, crypto.randomInt() в Node.js или модуля secrets в Python. Не используйте Math.random() и rand() — они не криптостойкие. Библиотеки вроде otplib (Node.js), OTPHP (PHP) и pyotp (Python) нужны для другого случая: TOTP и HOTP, то есть кодов из приложения‑аутентификатора.
Как отправить Flash Call через curl?
У RedSMS это обычный POST на /api/message с полем route=fcall, номером в to и четырьмя цифрами кода в text. Авторизация идёт через заголовки login, ts и secret (MD5 от ts + API‑ключ). Готовая команда приведена в разделе «Документация SMS‑шлюзов». У других провайдеров названия методов свои — сверяйтесь с их документацией.
Как обрабатывать статусы доставки СМС через webhook API?
Укажите URL обработчика в личном кабинете шлюза. При отправке сохраните идентификатор сообщения (sms_id или uuid), а в обработчике обновляйте по нему статус и сразу отвечайте 200. SMS Просто присылает GET с id_sms и state, RedSMS — POST с uuid и status. Если через минуту статус не «доставлено», предложите пользователю другой канал.
Как защитить форму от спама и SMS‑бомберов через СМС‑код?
Одного таймера в браузере мало. Нужны серверные лимиты по номеру и IP, ограничение попыток ввода, короткий срок жизни кода, невидимая капча перед отправкой, honeypot‑поле и белый список стран. Без этого бот может разослать СМС на тысячи номеров за ваш счёт.
Что делать, если пользователям не приходит СМС с кодом?
Проверьте статусы в webhook, регистрацию имени отправителя и баланс (в нашем эндпоинте его возвращает GET ?action=test). Держите резервный канал: звонок или Mobile ID. Подробный разбор причин — на странице «Не приходит СМС‑код».

Другие статьи и инструкции

Как снизить стоимость лида в Яндекс Директ Набор решений: СМС‑верификация, цели, офлайн‑конверсии, сквозная аналитика и CRM Фрод при оплате за конверсии в Директе Как не платить за заявки с несуществующими номерами, когда цена цели выше 1 000 ₽ Как снизить CPL с ID‑авторизацией Яндекс ID, Сбер ID, Т‑Банк и офлайн‑конверсии: обучение автостратегий на продажах из CRM Не приходит СМС‑код: причины и решение Чек‑лист для пользователя и владельца сайта: как не терять заявки, если код не дошёл Мобильный ID операторов на сайте Вход по номеру с push‑подтверждением от оператора и резервным СМС‑кодом СМС‑верификация формы на Tilda и Bitrix Живой пример OTP‑формы: ввод телефона, код из СМС, адаптивный дизайн SMS verification API на PHP и Node.js Для разработчиков: SDK формы, серверная генерация кода, webhook статусов, защита от SMS‑бомберов Дашборд рекламы для агентства с Claude Code API Директа и Метрики, ограничения ЕПК, Google Sheets и MCP‑сервер с Telegram‑ботом Офлайн‑конверсии из amoCRM в Метрику и Директ Пошаговая настройка через Google Таблицу и Apps Script: ClientID в сделке, загрузка через API, расчёт ДРР Как сделать сайт видимым в ChatGPT, Gemini и Claude SEO для ИИ‑поиска, уникальный контент и публичные MCP‑серверы с примерами ИИ‑менеджер по продажам: что умеет ИИ Возможности ИИ в автоматизации продаж по этапам воронки, внедрение по шагам и метрики Сквозная аналитика из WhatsApp Как доказать клиенту, что в WhatsApp пишут с рекламы, а не по сарафану HLR‑запрос: зачем он нужен для СМС‑рассылок Как проверить, что номер жив, до отправки СМС: статус, оператор, перенос номера и экономия на мёртвой базе Как почистить базу номеров перед рассылкой Формат, дубли, отписки, HLR и подтверждённые номера: порядок очистки без потери живых клиентов Можно ли делать СМС‑рассылку без имени отправителя Что уйдёт абоненту без регистрации подписи, чем рискуете и в каких случаях можно обойтись Рассылка по закону о рекламе: как не получить штраф за спам Согласие абонента, отписка, доказательство согласия и роль подтверждения номера Как сделать СМС‑рассылку по базе клиентов из amoCRM Какие поля и статусы выгружать, как сегментировать и не слать на мёртвые номера Офлайн‑конверсии Яндекса из amoCRM без платных виджетов Бесплатный коннектор Метрики за 10 минут: ClientID в сделку, статусы в цели, проверка журнала
Все статьи блога

Не хотите писать сами — внедрим под ключ

Подключим СМС‑верификацию или Flash Call к вашей форме, поставим серверные лимиты от SMS‑бомберов, настроим webhook статусов и передачу заявок в CRM. От вас только доступы.

Частые вопросы о СМС‑верификации и ID‑авторизации

tildasms.ru — сервис с опытом в настройке рекламы. Решение придумано именно для экономии на рекламе: снижения стоимости лида и борьбы с фродовыми заявками.

Что такое сервис верификации номера по СМС?
Это технология, которая подтверждает, что заявку на сайте оставил реальный человек с настоящим номером телефона: пользователь получает одноразовый код в СМС и вводит его в форме. tildasms.ru внедряет такую верификацию под ключ — мы много лет настраиваем рекламу и разработали это решение именно для того, чтобы клиенты экономили на трафике и не платили за фродовые и нецелевые заявки.
Как добавить проверку номера в форму на сайте?
Достаточно подключить наш JS‑скрипт к существующей форме — без переделки дизайна и вёрстки. Мы настраиваем интеграцию для Tilda, Bitrix, WordPress, OpenCart, Wix и других платформ за 1–3 дня, включая передачу данных и UTM‑меток в вашу CRM.
Как снизить стоимость лида в рекламе?
Внедрите верификацию номера телефона. Опыт настройки рекламных кампаний показывает: значительная часть бюджета в Яндекс Директе и других каналах уходит на фродовые и некачественные заявки. Отсекая их SMS‑верификацией или ID‑авторизацией, вы платите только за реальных клиентов — по нашей статистике стоимость целевого лида снижается на 40% и более.
Как зарегистрировать номер для отправки одноразовых СМС?
Номер отправителя регистрируется через SMS‑шлюз (например, SMSAero, SMS.ru или smsc.ru) — там же оформляется имя отправителя и тарифицируются сообщения. Мы помогаем подобрать подходящий шлюз, регистрируем отправителя и настраиваем отправку OTP‑кодов с вашего сайта под ключ.
Как внедрить коды через СМС на сайте?
Мы подключаем к вашей форме готовый OTP‑виджет: пользователь вводит номер, получает СМС с кодом, подтверждает его — и только после этого заявка уходит в CRM. Никакого программирования с вашей стороны не требуется, всё настраивается за 1–3 рабочих дня.
Как внедрить авторизацию через WB ID?
Авторизация через WB ID позволяет пользователю входить на сайт одной кнопкой, без ввода номера и оплаты SMS. Мы настраиваем OAuth‑интеграцию с WB ID и передачу полученных данных (телефон, ФИО) прямо в вашу CRM — это особенно эффективно для селлеров и партнёров Wildberries.
Как внедрить логин пользователя на сайте через Яндекс ID?
Подключаем кнопку входа через Яндекс ID к вашей форме или личному кабинету: пользователь авторизуется в один клик, а верифицированные ФИО, телефон и email автоматически попадают в CRM. Это дешевле SMS‑верификации в 3–5 раз и повышает конверсию формы.
Безопасна ли авторизация на сайте через Т‑Банк, Альфа, Сбер ID?
Да. Авторизация через ID банков-экосистем (Т‑Банк ID, Альфа ID, Сбер ID) использует защищённый протокол OAuth 2.0 — сайт не получает и не хранит пароли пользователя, только подтверждённые данные профиля. Мы настраиваем такую интеграцию и подключаем сразу несколько провайдеров на выбор пользователя.
Как внедрить авторизацию через Госуслуги, ВК ID?
Госуслуги и ВК ID дают максимально проверенные данные пользователя (вплоть до паспортных для Госуслуг) и подходят для ниш с высокими требованиями к достоверности контактов — недвижимость, финансы, визы. Мы подключаем нужный провайдер ID‑авторизации к вашей форме или кабинету и настраиваем передачу данных в CRM.
Задать свой вопрос в WhatsApp