TL;DR: SERP rehberlerinin çoğu ilk WhatsApp teması için 30–60 dakika bekler. Bu rehber, Shopify polling veya WooCommerce webhook'ları, deduplication korumaları ve Whapi.Cloud gönderimleriyle 15 dakikalık Speed-to-Lead Kurtarma Döngüsü kurar — Meta şablon onayı gerekmez. Aşağıdaki production kalıpları Node.js, Python ve odaklı bir n8n döngüsünü kapsar.
15 Dakika Neden Standart 30–60 Dakikalık Pencereyi Geçer
Terk edilen sepetler e-ticaret mağazalarına yılda milyarlarca dolara mal oluyor; buna rağmen kurtarma altyapılarının çoğu e-postayı bir saat boyunca toplu göndermeye devam ediyor. Farkı yaratan yeni bir kanal değil — niyet soğumadan önce ne kadar hızlı ulaştığınızdır.
Sektör rehberleri ilk WhatsApp mesajı için varsayılan olarak 30–60 dakika önerir. Kurtarma platformlarından gelen veriler, ilk temas 30 dakikanın altına indiğinde %23'lük bir artış gösterdiğini ortaya koyuyor. Speed-to-Lead Kurtarma Döngüsü 15 dakikayı hedefler; çünkü kilit ekranı görünürlüğü promosyon sekmelerini geçer — ve Shopify ile WooCommerce, tetikleyicileri doğru bağladığınızda terk edilmiş sepeti bu pencerede tespit etmenize izin verir.
| Metrik | E-posta kurtarma | WhatsApp kurtarma (15 dk döngü) |
|---|---|---|
| Açılma / okunma oranı | Tipik %15–20 | %98'e kadar (kilit ekranı teslimatı) |
| İlk temas zamanlaması | 60+ dakika (ESP toplu gönderim) | 15 dakika (cron veya webhook + Wait node) |
| Kurtarma oranı | Sektör ortalaması %3–5 | Konuşmaya dayalı takiple %15–30 |
| Aylık 10 bin sepet maliyet modeli | ESP ücretleri + düşük dönüşüm | Sabit Whapi aboneliği vs $500–$1.500 Meta pazarlama ücretleri |
Orta ölçekli bir mücevher mağazası ilk temas noktasını WhatsApp ile 20 dakikaya indirdi ve 30 günde 18.400 $ kurtardı — daha büyük bir indirimle değil, alışverişçi rakip sekmesini açmadan önce ulaşarak.
Shopify: Webhook Olmadan Polling (+ Tekrar Engelleme)
Shopify'da yerleşik terk edilmiş sepet webhook'u yok — checkout webhook'ları oluşturulduğunda tetiklenir, terk edildiğinde değil. 15 dakikalık döngü için güvenilir tetikleyici, checkouts.json dosyasını polling eden bir cron job'dur.
Her 5 dakikada bir polling yapın ve 15–20 dakika önce oluşturulmuş, status=open olan ve completed_at değeri olmayan checkout'ları seçin. Tam referans: Whapi.Cloud dokümantasyonu ve Node.js WhatsApp bot rehberimiz.
// 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);
};
Idempotency: her 5 dakikada polling yapmak, işlenmiş ID'leri takip etmediğiniz sürece aynı checkout'u tekrar getirir. İlk gönderimde processed_checkout_ids değerini Redis, PostgreSQL veya hatta JSON dosyasında saklayın — sent olarak işaretlenmiş ID'leri atlayın.
// 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;
}
Göndermeden önce kontrol: Whapi'yi çağırmadan hemen önce checkout veya sipariş durumunu yeniden sorgulayın. completed_at set edilmişse veya finansal durum paid ise iptal edin — yalnızca bu koruma, DIY kurtarma botlarındaki en yaygın destek şikayetini önler.
WooCommerce: Webhook Tetikleyicisi + Veri Eşleme
WooCommerce gerçek webhook'ları destekler — Shopify'ın checkout boşluğunun aksine. Checkout güncellemelerinde webhook kaydedin, 15 dakika bekleyin, ardından metadata'yı okunabilir metne eşleyip gönderin.
Webhook kurulumu (5 adım):
- WP Admin'de WooCommerce → Ayarlar → Gelişmiş → Webhook'lar bölümüne gidin.
- Webhook ekle'ye tıklayın; Konu olarak Sipariş güncellendi seçin veya taslak siparişleri takip ediyorsanız checkout eklentisi hook'unu kullanın.
- Teslim URL'sini n8n webhook'unuza veya backend endpoint'inize ayarlayın (HTTPS zorunlu).
- Secret belirleyin ve handler'da imzayı doğrulayın.
- Handler'da 15 dakikalık gecikmeli job kuyruğa alın — yalnızca sipariş durumu hâlâ
pending/ sepet ödenmemişse devam edin.
_billing_first_name, _billing_phone ve ürün adlarını eşleyin — city_id: 4502 gibi ham ID'leri değil. API'ye gitmeden önce telefonları libphonenumber ile normalize edin. Moda ve perakende için /messages/image üzerinden ürün fotoğrafları yalnızca metin hatırlatmalarından daha iyi performans gösterir.
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 ile Gönderim (Metin + Görsel Endpoint'leri)
Whapi.Cloud, Meta şablon onayı olmadan konuşmaya dayalı kurtarma mesajları gönderir. 15 dakikalık check-in için POST /messages/text, ürün fotoğrafı hatırlamayı artırıyorsa POST /messages/image kullanın.
Metin payload'ı (Shopify polling çıktısı → gönder):
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}`
})
});
Hazır mesaj metinleri (şablon onayı gerekmez):
- 15 dakikalık check-in: "Merhaba {name}, {product} sepetinizde kaldı. Ödeme konusunda yardım ister misiniz? Buradan yazın, sizin için tutalım."
- 24 saatlik hatırlatma (isteğe bağlı): "Kısa bir güncelleme — {product} hâlâ sepetinizde. Bu hafta {X} müşteri satın aldı. Beden veya kargo sorusu mu var?"
- 48 saatlik kapanış (isteğe bağlı): "{store}'dan son not: sepetiniz yakında sona eriyor. İstediğiniz zaman STOP yazarak çıkabilirsiniz."
WABA Olmadan Onay: Dönüşüm Sağlayan Opt-In Kalıpları
Kurtarma çalıştırmak için Meta WABA onboarding gerekmez — ancak savunulabilir bir onay yolu şarttır. Checkout onay kutusu ("Sipariş güncellemelerini WhatsApp'tan gönderin") artı konuşmaya dayalı ton, soğuk mesaj yağmurunu geçer.
Pratik kalıp: checkout'ta önceden işaretli veya isteğe bağlı opt-in, onayı sipariş metadata'sında saklama ve STOP yanıtlarını CRM'de numarayı işaretleyerek onurlandırma. Rapor oranını korumak için hacmi ölçülü tutun (terk başına bir kurtarma thread'i). AB mağazaları meşru menfaat veya onay dayanağını hukuk danışmanıyla belgelemeli — bu rehber mühendislik kalıplarını kapsar, yargı alanına özel hukuki tavsiye vermez.
Kodsuz: Whapi.Cloud ile n8n 15 Dakikalık Döngü
Kodsuz yol production kodunu yansıtır: tetikleyici → 15 dakika bekle → göndermeden önce kontrol → Whapi node. Genel 30 dk / 4 sa / 24 sa dizilerini kopyalamayın — avantajınız ilk 15 dakikalık temastır.
Akış: Shopify poll tetikleyicisi (veya WooCommerce webhook) → telefon geçerliyse IF → 15 dk bekle → ödenmemiş olduğunu doğrulamak için Shopify/Woo HTTP isteği → Whapi.Cloud node → işlendi olarak işaretle. İlk mesaja yanıt gelmediyse isteğe bağlı 24 sa / 48 sa takipler. n8n WhatsApp entegrasyonu dokümantasyonuna bakın.
Production Edge Case'leri: Kurtarma Mesajları Başarısız Olduğunda
Başarısız denemelerin çoğu API hatası değil — veri veya zamanlama sorunudur. Gönderimleri ölçeklendirmeden önce aşağıdaki her hata modunu loglayın.
| Hata modu | Belirti | Çözüm |
|---|---|---|
| Geçersiz telefon / eksik ülke kodu | API 400 veya sessiz düşme | libphonenumber ile normalize edin; checkout'ta E.164 zorunlu kılın |
| Numara WhatsApp'ta değil | Teslimat hatası event'i | E-posta/SMS'e düşün; WhatsApp'ı körlemesine tekrar denemeyin |
| Zaten satın alınmış | Öfkeli müşteri yanıtı | Her seferinde sipariş durumunda göndermeden önce kontrol |
| Yinelenen gönderim (polling) | 5 dk arayla iki özdeş mesaj | processed_checkout_ids kaydı + Redis SET |
| Rate limit / ani yük | Flash sale sırasında kısıtlanmış gönderimler | Numara başına dakikada en fazla N mesaj kuyruğu |
| Yüksek AOV sepet (>$500) | Otomatik metinde düşük yanıt oranı | İnsan temsilciye yönlendirin — aşağıdaki SSS'ye bakın |
ROI Hesaplayıcı: Sabit Ücret vs Meta Mesaj Başına Maliyet
Meta Cloud API pazarlama kategorisi mesaj başına ücret alır ($0,05–$0,15). Whapi.Cloud numara başına sabit aylık ücret kullanır — hacim arttıkça kurtarma başına maliyetiniz düşer.
Kurtarma başına maliyet formülü: (aylık Whapi ücreti + altyapı) ÷ (terk edilen sepet × kurtarma oranı). Örnek: $99/ay plan, 2.000 terk, %12 kurtarma → ürün marjından önce kurtarılan sipariş başına ~$0,41 — yalnızca Meta ücretlerinde 2.000 sepet × 3 temas × $0,10 değil.
| Aylık terk edilen sepet | Meta API (3 temas × $0,10) | Whapi sabit abonelik |
|---|---|---|
| 1.000 | ~$300 / ay | Sabit plan (fiyatlandırmaya bakın) |
| 5.000 | ~$1.500 / ay | Aynı sabit plan |
| 10.000 | ~$3.000 / ay | Aynı sabit plan → ölçekte ücret yığınına karşı ~12x ROI |
Takip edilecek metrikler: kurtarma oranı (kurtarılan sepet %), checkout linki tıklama oranı, kurtarılan sepet başına maliyet, opt-out/rapor oranı ve ilk yanıta kadar geçen süre. Sabit fiyatlandırma çok temaslı dizileri ekonomik olarak mümkün kılar — 15 dakika + 24 sa kalıbını cezalandıran mesaj başına faturalandırmanın aksine.
Whapi.Cloud ayrıca WhatsApp protokol güncellemelerini upstream'de absorbe eder — Baileys veya self-hosted oturumların manuel bakım gerektirdiği yerde REST çağrılarınız stabil kalır.









