Переезжай на Whapi · от 500 ₽/мес Наш WhatsApp API работает штатно Регистрация
Реклама CTWA · сценарий WhatsApp API

От клика по рекламе WhatsApp к лиду в CRM и первому ответу

Лид получает первый ответ в чате WhatsApp, который открыла реклама; иначе оплаченные клики ждут, пока человек наберёт текст вручную. Когда кто-то нажимает объявление Click-to-WhatsApp в Meta*, бэкенд может записать Lead или Purchase и отправить этот прогрев через Whapi.Cloud. Страница показывает интеграторам, как собрать этот поток через WhatsApp API.

Входящий messages.post с context.ad Текст прогрева — обычное сообщение в чате
Реклама Meta* на телефоне рядом с чатом WhatsApp, который ждёт первого ответа, и карточкой лида CRM у треда.
Декоративный пузырь
Сценарий

Когда уместен этот поток

Триггер — клик по Click-to-WhatsApp в Meta*

Поток уместен, если человек пришёл, нажав объявление Click-to-WhatsApp в Meta*, а не набрал номер вручную без рекламного контекста.

Клик должен создать запись в CRM

Поток уместен, если клик должен создать на бэкенде Lead или Purchase, а не если тред остаётся только в WhatsApp.

Первый ответ остаётся в том же личном чате

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

Экран телефона с чатом WhatsApp, где лид только что получил первый ответ после нажатия на объявление Click-to-WhatsApp, рядом карточка CRM с меткой Lead.
Опыт клиента

Лид получает первый ответ после рекламы

Без автоматизации чат пустой после нажатия на объявление, пока менеджер не напишет, а продажи так и не видят клик в CRM.

Когда поток отработал, лид видит прогрев в этом чате WhatsApp, а у команды на карточке CRM есть Lead или Purchase. Интеграторы собирают этот результат через WhatsApp API.

Поток

От клика по рекламе к первому ответу

1

Клик по объявлению Click-to-WhatsApp в Meta*

Кто-то нажимает объявление Click-to-WhatsApp в Meta*, и входящий чат попадает на ваш канал. В payload messages.post есть context.ad и при наличии context.conversion. Бэкенд пишет Lead или Purchase в CRM из этого payload. Whapi.Cloud не хостит CRM.

2

Отправьте сообщение прогрева

POST /messages/text

sendMessageText отправляет в тот же личный чат текст прогрева, который выбрал бэкенд. В to поставьте телефон отправителя или id чата из вебхука.

Нужен контроль доставки? Если прогрев остаётся в pending, он не доставлен. Дальнейшие изменения приходят в statuses.post и statuses.put. Узнать о статусе доставки →

Что подготовить

Перед запуском потока

Подключите номер WhatsApp, который принимает эти рекламные чаты, и авторизуйте каждый запрос токеном API этого номера. Сопоставление с CRM и текст прогрева остаются на вашем бэкенде.

По желанию — углубиться в этот поток

Реализация API

Вызов, который отправляет прогрев

Бэкенд уже прочитал входящее с атрибуцией рекламы и записал событие в CRM. Этот вызов доставляет текст прогрева в тот же личный чат.

Получите токен API бесплатно после регистрации на whapi.cloud и подставьте его в код вместо Your_Token из примеров.

Отправьте сообщение прогрева

Отправьте текст прогрева после входящего Click-to-WhatsApp из Meta*.

curl --request POST \
     --url https://gate.whapi.cloud/messages/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "15052462002",
  "body": "Hello"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/text"
payload = {"to": "15052462002", "body": "Hello"}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)
const response = await fetch("https://gate.whapi.cloud/messages/text", {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer Your_Token",
    "content-type": "application/json"
  },
  body: JSON.stringify({ to: "15052462002", body: "Hello" })
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .method("POST", body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "15052462002", body = "Hello" });
var response = await client.ExecuteAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{
  "to": "15052462002",
  "body": "Hello"
}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Доставка

Когда прогрев доходит

Успешный ответ на отправку не значит, что лид уже получил прогрев. Первый статус до вебхука — pending. Поздние смены статуса приходят только в statuses.post и statuses.put. Если статус застрял в pending и не перешёл в sent, delivered или более поздний ack, сообщение не доставлено. Проверьте payload и право аккаунта отправлять этот тип.

  • Статус, который остаётся pending, значит, прогрев не доставлен.

  • Смотрите statuses.post и statuses.put на sent, delivered и read.

  • Не считайте клик прогретым, пока прогрев не выйдет из pending или лид не ответит.

Что прочитать про доставку и вебхуки

Напишите в поддержку, если что-то пошло не так
Когда что-то ломается

Разбирайте сбои на каждом шаге

Если messages.post пришёл без пригодных context.ad или context.conversion, sendMessageText отклонён или не доставлен, либо запись в CRM на бэкенде упала — повторите или поднимите алерт и не считайте клик прогретым или записанным.

Клик по рекламе дошёл, а записи нет?

Держите запись в CRM на бэкенде отдельно от доставки WhatsApp. Если нет рекламного контекста, не отправляйте и поднимите алерт. Если прогрев не прошёл, повторите sendMessageText или предупредите команду и не помечайте клик как Lead или Purchase. Если после повтора отправка всё равно падает, напишите в поддержку Whapi с id канала и id неуспешного запроса.

Напишите в поддержку, если что-то пошло не так

Разбор по шагу API

Статус Что значит Что делать
200 Created
400 Wrong request parameters
401 Need channel authorization for send message
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient
413 Request body too large
429 Too many requests
500 Internal Error
Вопросы

Вопросы про лиды из рекламы

Нет. Этот поток пишет Lead или Purchase в CRM и отправляет прогрев. Квалификационные вопросы в чате рекламы — другая ветка.
Нет. Бэкенд выбирает Lead или Purchase и пишет запись. Whapi.Cloud отдаёт входящий рекламный контекст и отправку прогрева.
Атрибуция есть, когда клик по объявлению дал сообщение и поля рекламы стоят на этом входящем. Если нет context.ad, повторите или поднимите алерт и не считайте клик записанным.
Нет. Исходящий WhatsApp из HubSpot стартует с события CRM. Этот поток стартует с клика Click-to-WhatsApp в Meta*.
Нет. Позиции заказа каталога — другой источник. Здесь Purchase — событие CRM, которое бэкенд пишет после чата с атрибуцией рекламы.
Поддерживаемые функции WhatsApp

Всё, что нужно для создания автоматизации WhatsApp

Whapi.Cloud предоставляет доступ к полному набору функций WhatsApp — сообщениям, медиа, группам, каналам, вебхукам и не только. Создавайте ботов, автоматизации и интеграции без функциональных ограничений.

Выбор разработчиков

Нам доверяют 3 300+ разработчиков и SaaS-команд

Разработчики по всему миру используют Whapi.Cloud для создания автоматизаций, ботов, CRM-интеграций, массовых рассылок и продвинутых WhatsApp-воркфлоу. Наша инфраструктура обрабатывает миллионы API-запросов с высокой стабильностью — и этот показатель растёт каждый месяц.

Иконка функции

5,5K+

активных API-каналов

Иконка функции

21M+

API-запросов в месяц

«Всё просто, интуитивно и легко. Документация понятная, и вся нужная информация всегда под рукой. Отличная работа.»

Roberto K. / Web-разработчик

«Мы подключили WhatsApp к нашим процессам через n8n всего за несколько минут. Без кода, без сложностей — всё заработало с первого раза.»

Martin P. / Разработчик

«Whapi.Cloud стал важной частью нашей коммуникации с клиентами. Мы автоматизировали обновления по продуктам, уведомления о заказах и поддержку — без шаблонов и модерации.»

Oscar T. / CTO

Декоративный пузырь