TL;DR: Большинство гайдов из выдачи ждут 30–60 минут до первого WhatsApp-касания. Здесь — 15-минутный Speed-to-Lead Recovery Loop с polling Shopify или webhook WooCommerce, защитой от дублей и отправкой через Whapi.Cloud — без одобрения шаблонов Meta*. Ниже — продакшен-паттерны для Node.js, Python и сфокусированного цикла в n8n.
Почему 15 минут работают лучше стандартных 30–60
Брошенные checkout обходятся e-commerce миллиардами в год, а recovery-стеки по-прежнему откладывают email на час. Главное — не новый канал, а скорость: успеть к покупателю, пока намерение ещё горячее.
Отраслевые гайды ставят первое WhatsApp-сообщение на 30–60 минут. Данные recovery-платформ показывают +23% к результату, если первое касание укладывается в 30 минут. Speed-to-Lead Recovery Loop нацелен на 15 минут: lock-screen заметнее промо-вкладок, а Shopify и WooCommerce позволяют поймать брошенную корзину в этом окне — если триггеры настроены правильно.
| Метрика | Recovery по email | Recovery в WhatsApp (15-мин цикл) |
|---|---|---|
| Open / read rate | обычно 15–20% | до 98% (доставка на lock-screen) |
| Время первого касания | 60+ минут (батчинг ESP) | 15 минут (cron или webhook + Wait node) |
| Recovery rate | 3–5% в среднем по отрасли | 15–30% при диалоговом follow-up |
| Модель затрат при 10k корзин/мес | ESP + низкая конверсия | Фиксированная подписка Whapi vs $500–$1,500 marketing fees Meta* |
Ювелирный магазин среднего сегмента перенёс первое касание на 20 минут через WhatsApp и за 30 дней вернул $18 400 — не за счёт большей скидки, а потому что успел до того, как покупатель открыл вкладку конкурента.
Shopify: polling без webhook (+ дедупликация)
У Shopify нет нативного webhook брошенной корзины — checkout webhook срабатывает при создании, а не при уходе. Cron с polling checkouts.json — надёжный триггер для 15-минутного цикла.
Опрашивайте каждые 5 минут и выбирайте checkout, созданные 15–20 минут назад, с status=open и без completed_at. Полный справочник: документация Whapi.Cloud и наш гайд по WhatsApp-боту на Node.js.
// Fetch checkouts created between 15 and 20 minutes ago
const fetchAbandonedCheckouts = async () => {
const fifteenMinsAgo = new Date(Date.now() - 15 * 60000).toISOString();
const twentyMinsAgo = new Date(Date.now() - 20 * 60000).toISOString();
const url = `https://${SHOPIFY_STORE}/admin/api/2024-04/checkouts.json?created_at_min=${twentyMinsAgo}&created_at_max=${fifteenMinsAgo}&status=open`;
const response = await fetch(url, {
headers: { 'X-Shopify-Access-Token': process.env.SHOPIFY_TOKEN }
});
const { checkouts } = await response.json();
return checkouts.filter(c => !c.completed_at);
};
Идемпотентность: polling каждые 5 минут снова вернёт тот же checkout, если не отслеживать обработанные ID. Храните processed_checkout_ids в Redis, PostgreSQL или даже JSON-файле — после первой отправки пропускайте ID со статусом sent.
// After a successful Whapi send — mark checkout as processed
async function markCheckoutSent(checkoutId) {
await redis.sadd('processed_checkout_ids', checkoutId);
}
async function shouldSend(checkoutId) {
const alreadySent = await redis.sismember('processed_checkout_ids', checkoutId);
return !alreadySent;
}
Check-before-send: перед вызовом Whapi перепроверьте статус checkout или заказа. Если completed_at заполнен или financial status = paid — отменяйте отправку. Эта проверка одна убирает самую частую жалобу в DIY recovery-ботах.
WooCommerce: webhook и маппинг данных
WooCommerce поддерживает настоящие webhook — в отличие от checkout-пробела Shopify. Зарегистрируйте webhook на обновление checkout, подождите 15 минут, затем превратите метаданные в понятный текст перед отправкой.
Настройка webhook (5 шагов):
- В WP Admin: WooCommerce → Settings → Advanced → Webhooks.
- Нажмите Add webhook; Topic — Order updated или hook плагина checkout, если отслеживаете черновики заказов.
- Delivery URL — ваш n8n webhook или backend endpoint (нужен HTTPS).
- Задайте Secret и проверяйте подпись в обработчике.
- В обработчике поставьте отложенную задачу на 15 минут — продолжайте только если статус заказа всё ещё
pending/ корзина не оплачена.
Маппите _billing_first_name, _billing_phone и названия товаров — не сырые ID вроде city_id: 4502. Нормализуйте телефоны через libphonenumber перед вызовом API. Фото товара через /messages/image работает лучше текстовых напоминаний в fashion и retail.
import requests
import os
def send_recovery_image(phone, product_name, image_url):
payload = {
"to": f"{phone}@s.whatsapp.net",
"media": image_url,
"caption": f"Hi! We noticed you left the {product_name} in your cart. Ready to complete your order?"
}
headers = {
"Authorization": f"Bearer {os.getenv('WHAPI_TOKEN')}",
"Content-Type": "application/json"
}
response = requests.post("https://gate.whapi.cloud/messages/image", json=payload, headers=headers)
return response.json()
Отправка через Whapi API (text и image)
Whapi.Cloud отправляет диалоговые recovery-сообщения без одобрения шаблонов Meta*. Используйте POST /messages/text для 15-минутного check-in и POST /messages/image, когда фото товара повышает recall.
Text payload (вывод polling Shopify → отправка):
await fetch('https://gate.whapi.cloud/messages/text', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WHAPI_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: `${phone}@s.whatsapp.net`,
body: `Hi ${firstName}, still thinking about ${productName}? Your cart is saved here: ${checkoutUrl}`
})
});
Готовые тексты (без одобрения шаблона):
- 15-минутный check-in: «Здравствуйте, {name}! Вы оставили {product} в корзине. Помочь с оформлением? Ответьте здесь — мы зарезервируем товар.»
- 24-часовой nudge (опционально): «Короткое напоминание: {product} всё ещё в корзине. {X} покупателей взяли его на этой неделе. Нужна помощь с размером или доставкой?»
- 48-часовое закрытие (опционально): «Последнее сообщение от {store}: корзина скоро истечёт. Ответьте STOP, чтобы отписаться.»
Согласие без WABA: opt-in, который конвертирует
Для recovery не нужен onboarding Meta* WABA — но нужен обоснованный путь согласия. Чекбокс на checkout («Присылайте обновления заказа в WhatsApp») плюс диалоговый тон работают лучше холодных рассылок.
Практичный паттерн: opt-in на checkout (предвыбранный или опциональный), хранение согласия в метаданных заказа, обработка STOP — помечайте номер в CRM. Держите объём умеренным (одна recovery-ветка на брошенную корзину), чтобы не ронять report rate. Для EU-магазинов зафиксируйте legitimate interest или consent с юристом — здесь инженерные паттерны, не юридическая консультация по юрисдикциям.
No-code: 15-минутный цикл в n8n с Whapi.Cloud
No-code повторяет продакшен-код: триггер �� Wait 15 minutes → check-before-send → Whapi node. Не копируйте generic-последовательности 30 мин / 4 ч / 24 ч — ваше преимущество в первом касании через 15 минут.
Поток: триггер polling Shopify (или webhook WooCommerce) → IF телефон валиден → Wait 15 min → HTTP к Shopify/Woo для проверки неоплаты → Whapi.Cloud node → mark processed. Опциональные follow-up на 24 ч / 48 ч — только если на первое сообщение не было ответа. См. интеграцию WhatsApp с n8n.
Продакшен: когда recovery-сообщения не доходят
Большинство неудачных пилотов — не баги API, а данные или тайминг. Залогируйте каждый сценарий ниже, прежде чем масштабировать отправки.
| Сценарий сбоя | Симптом | Решение |
|---|---|---|
| Невалидный телефон / нет кода страны | API 400 или тихий drop | Нормализация через libphonenumber; E.164 на checkout |
| Номер не в WhatsApp | Событие delivery failure | Fallback на email/SMS; не ретраить WhatsApp вслепую |
| Уже купил | Раздражённый ответ клиента | Check-before-send статуса заказа каждый раз |
| Дубль (polling) | Два одинаковых сообщения за 5 мин | Реестр processed_checkout_ids + Redis SET |
| Rate limit / burst | Throttling при flash sale | Очередь с max N сообщений/мин на номер |
| Корзина с высоким AOV (>$500) | Низкий reply rate на авто-текст | Передать живому агенту — см. FAQ ниже |
ROI: фиксированная подписка vs оплата за сообщение Meta*
Meta* Cloud API берёт marketing fees за сообщение ($0.05–$0.15). Whapi.Cloud — фиксированная месячная плата за номер: cost-per-recovery падает с ростом объёма.
Формула cost-per-recovery: (месячная плата Whapi + infra) ÷ (брошенные корзины × recovery rate). Пример: план $99/мес, 2 000 брошенных, 12% recovery → ~$0.41 на восстановленный заказ до маржи — не $0.10 × 3 касания × 2 000 корзин только в Meta* fees.
| Брошенных корзин в месяц | Meta* API (3 касания × $0.10) | Фиксированная подписка Whapi |
|---|---|---|
| 1 000 | ~$300 / мес | Фиксированный план (см. pricing) |
| 5 000 | ~$1 500 / мес | Тот же flat plan |
| 10 000 | ~$3 000 / мес | Тот же flat plan → ~12× ROI vs fee stack при масштабе |
Метрики для отслеживания: recovery rate (% восстановленных корзин), CTR по ссылке checkout, cost per recovered cart, opt-out/report rate и time-to-first-reply. Flat pricing делает multi-touch последовательности экономически viable — в отличие от per-message billing, который наказывает паттерн 15 мин + 24 ч.
Whapi.Cloud также берёт на себя обновления протокола WhatsApp upstream — ваши REST-вызовы остаются стабильными, тогда как Baileys или self-hosted сессии потребуют ручного сопровождения.









