Custom Webhook (Özel Webhook) Aksiyonu
Purvisor’da hazır butonu olmayan bir sisteme bağlanman mı gerekiyor? Custom Webhook tam bunun için. Asistanın, bir görüşme sırasında ya da görüşme biter bitmez, senin belirlediğin bir URL’ye HTTP isteği atar: kendi CRM’ine kayıt düşürür, Slack’e bildirim yollar, bir Google Sheet’i günceller ya da n8n/Make/Zapier’daki bir akışı tetikler. Kısacası bu aksiyon, panelde hazır entegrasyonu olmayan her sistemi bağlamanın kaçış kapısıdır — kod yazmadan, sadece bir URL ve bir payload şablonu tanımlayarak.
Bunu bir “otomatik kurye” gibi düşün: görüşme bitince asistanın topladığı bilgileri (ad, telefon, özet, duygu) bir paket haline getirir ve senin verdiğin adrese teslim eder.
Nasıl çalışır?
Görüşme başlar / biter
↓
Asistana bağlı "custom" aksiyonu tetiklenir
↓
payloadTemplate + {{değişkenler}} → JSON yük hazırlanır
↓
Senin webhookUrl'ine HTTP isteği gönderilir (POST/GET/...)
↓ (başarısızsa retryCount kadar tekrar)
Senin sistemin isteği alır → kendi otomasyonun çalışırNe zaman tetiklenir?
Custom Webhook iki ayrı anda çalışabilir. Hangi alanların uygulandığı bu ana göre değişir — bu ayrımı bilmek önemli.
| Tetiklenme anı | Ne olur | Uygulanan ayarlar |
|---|---|---|
| Görüşme sırasında (mid-call) | Asistan konuşurken bir tool çağrısıyla webhook’u anlık tetikler (örn. “stok kontrol et”). | Yalnızca webhookUrl + httpMethod. Yük sabittir (aşağıya bakın). |
| Görüşme sonrası (post-call) | Görüşme kapanıp yapay zeka analizi tamamlanınca aksiyon motoru çalıştırır. | Tüm alanlar: payloadTemplate, headers, timeoutMs, retryCount. |
Özel payload şablonun, kendi başlıkların (auth token vb.), timeout ve yeniden deneme ayarların görüşme sonrası yürütmede tam olarak uygulanır. Görüşme sırasında tetiklenen webhook ise sabit bir yük gönderir ve varsayılan başlıkları kullanır. Zengin veriyi (özet, duygu, transkript) göndermek istiyorsan post-call kullan.
Kurulum
Webhook aksiyonunu oluştur
Panelde Aksiyonlar → Custom Webhook → Yeni ile aksiyonu tanımla. Zorunlu olan iki alan var: bir ad ve hedef Webhook URL’i. Gerisi opsiyoneldir ve makul varsayılanlarla gelir.
| Alan | Zorunlu | Ne işe yarar |
|---|---|---|
| Ad (name) | Evet | Aksiyonu panelde tanıman için. |
| Webhook URL (webhookUrl) | Evet | İsteğin gönderileceği adres. Kendi sunucun, n8n/Make/Zapier “catch hook” URL’i, vb. |
| HTTP metodu (httpMethod) | Hayır | Varsayılan POST. GET seçersen istek gövdesiz gider (yük gönderilmez). |
| Başlıklar (headers) | Hayır | JSON anahtar-değer. Content-Type: application/json otomatik eklenir; kendi Authorization vb. başlıklarını buraya ekle. |
| Payload şablonu (payloadTemplate) | Hayır | Göndereceğin JSON gövde; içine {{değişken}} yerleştirebilirsin. Varsayılan boş {}. |
| Timeout (timeoutMs) | Hayır | Yanıt için beklenecek süre, milisaniye. Varsayılan 10000 (10 saniye). |
| Yeniden deneme (retryCount) | Hayır | Başarısız istekte kaç kez tekrar denensin. Varsayılan 0 (tek deneme). |
| Koşul (condition) | Hayır | Aksiyonu belirli bir duruma bağlamak için opsiyonel koşul metni. |
📸 [Ekran görüntüsü: Custom Webhook oluşturma formu — URL, metot, başlıklar, payload şablonu, timeout, retry]
Asistana bağla
Aksiyon tek başına çalışmaz; onu bir asistana bağlaman gerekir. Asistanın detayında Aksiyonlar bölümünden bu webhook aksiyonunu ekle. Aksiyonlar bağlandıkları sıraya göre çalışır. (Bkz. Asistan Oluşturma)
Bir aksiyonu yalnızca kendi asistanına bağlayabilirsin — Purvisor bağlama sırasında sahiplik doğrular.
Test et
Gerçek bir uç nokta kurmadan denemek için webhook.site gibi bir “yakalama” URL’i al, onu Webhook URL alanına yapıştır ve bu asistanla bir test araması yap. Görüşme sonrası birkaç saniye içinde webhook.site ekranında gelen isteği — metot, başlıklar ve gönderilen JSON gövdeyi — canlı görürsün.
Payload (gönderilen yük)
Görüşme sırasında — sabit yük
Asistan görüşme ortasında webhook’u tetiklediğinde gövde sabittir ve şu şekildedir:
{
"callId": "call_abc123",
"phoneNumber": "+905551112233",
"params": { "urun": "ısı pompası" },
"timestamp": "2026-07-13T10:24:00.000Z",
"source": "purvisor-ai-incall"
}params, asistanın o an tool çağrısında geçirdiği serbest alandır.
Görüşme sonrası — kendi şablonun
Post-call yürütmede yükü sen tanımlarsın. payloadTemplate alanına yazdığın JSON, gönderilmeden önce {{değişken}} etiketleri gerçek değerlerle doldurulur. Örnek şablon:
{
"ad": "{{full_name}}",
"telefon": "{{phone_number}}",
"eposta": "{{email}}",
"ozet": "{{call_summary}}",
"duygu": "{{call_sentiment}}",
"randevu_tarihi": "{{booking_date}}",
"call_id": "{{call_id}}"
}Şablonda kullanabileceğin değişkenler:
| Kategori | Değişkenler |
|---|---|
| Kişi | {{first_name}}, {{last_name}}, {{full_name}}, {{company}}, {{phone_number}}, {{email}} |
| Randevu | {{booking_link}}, {{booking_date}}, {{booking_time}} |
| Görüşme | {{agent_name}}, {{call_summary}}, {{call_sentiment}}, {{call_id}}, {{transcript}} |
Karşılığı olmayan bir değişken boş metinle değiştirilir — yani şablon yine geçerli JSON olarak gider.
Kendi başlıklarınla kimlik doğrulama örneği (headers alanına):
{ "Authorization": "Bearer SENIN_TOKENIN", "X-Kaynak": "purvisor" }Yeniden deneme ve timeout
Görüşme sonrası istekte, yanıt 2xx değilse ya da istek timeoutMs süresini aşarsa, Purvisor retryCount kadar tekrar dener. Denemeler arasında artan bir bekleme uygulanır (yaklaşık 1 sn, 2 sn, 3 sn…). Tüm denemeler tükenirse aksiyon başarısız işaretlenir; görüşmenin kendisi bundan etkilenmez.
Uç noktanı idempotent yaz: aynı call_id ile ikinci bir istek gelebilir (yeniden deneme veya çift tetikleme). İsteği call_id üzerinden tekilleştirirsen mükerrer kayıt oluşmaz.
REST-hook aboneliğinden farkı
Purvisor’da isim olarak benzeyen ama tamamen farklı iki mekanizma var. Karıştırmamak önemli:
| Custom Webhook aksiyonu (bu sayfa) | REST-hook abonelikleri (/gelistirici/webhooklar) | |
|---|---|---|
| Tetikleyici | Bir asistan, belirli bir görüşmede | Hesap düzeyindeki olaylar |
| Olaylar | Görüşme sırası/sonrası (asistana bağlı) | call.completed, contact.created, lead.hot, appointment.booked, dnc.requested, campaign.finished |
| Yük (payload) | Senin şablonun (post-call) veya sabit in-call yükü | Sabit zarf: { event, timestamp, data } |
| İmza | Yok — auth’u kendi headers alanınla eklersin | HMAC-SHA256, X-Purvisor-Signature başlığı (İmza Doğrulama) |
| Kurulum | Panel → Aksiyonlar → asistana bağla | API anahtarı + /api/v1/hooks |
| Kapsam | Tek asistan, tek aksiyon | Hesabın tamamı, olay akışı |
Kısaca: bir görüşmeye tepki vermek istiyorsan Custom Webhook; hesap genelinde olan biteni dışarı akıtmak istiyorsan REST-hook aboneliği kullan. İkisi birbirinin alternatifi değil, tamamlayıcısıdır.
İyi uygulamalar
- HTTPS kullan. Kişisel veri (telefon, transkript, özet) taşıdığın için hedef URL mutlaka
httpsolsun. - Auth ekle. Uç noktan halka açıksa
headersalanına birAuthorizationtoken koy; sahte istekleri engelle. - Timeout’u gerçekçi tut. Uç noktan yavaşsa varsayılan 10 saniye yetmeyebilir; ama çok uzun timeout, başarısız çağrıda tüm zinciri bekletir.
- Yeniden denemeyi ölçülü aç.
retryCountdeğerini 1-2 ile sınırla; idempotent olmayan bir uç noktada yüksek retry mükerrer kayıt üretir. - Zengin veri istiyorsan post-call’u tercih et.
{{call_summary}},{{call_sentiment}},{{transcript}}yalnızca görüşme sonrası şablonda dolar.
KVKK: Bu aksiyon, aradığınız kişinin ad, telefon ve görüşme içeriği gibi kişisel verilerini üçüncü bir sisteme (kendi seçtiğiniz URL’ye) aktarır. Yalnızca sizin kontrolünüzdeki, gerekli açık rıza ve veri işleme şartlarını karşılayan uç noktalara veri gönderin; gereksiz alanları ({{transcript}} gibi) yükten çıkarmayı düşünün.
Sorun giderme
| Belirti | Olası neden / çözüm |
|---|---|
| Webhook hiç tetiklenmedi | Aksiyon asistana bağlı değil; aksiyon pasif; asistanla yapılan görüşme henüz tamamlanmadı. |
| Uç noktama boş/eksik JSON geldi | payloadTemplate boş {} bırakılmış; ya da değişkenlerin karşılığı yok (kişi kaydı eksik). |
| Değişkenler boş geliyor | {{call_summary}}/{{transcript}} gibi alanlar yalnızca görüşme sonrası dolar — in-call tetiklemede sabit yük gider. |
| Sürekli “Timeout” hatası | Uç noktan timeoutMs içinde yanıt vermiyor; süreyi artır veya uç noktanı hızlandır. |
| İstek 2 kez geldi | retryCount yüksek veya çift tetikleme — uç noktanı call_id ile idempotent yap. |
| 401/403 dönüyor | headers içindeki Authorization token’ı hatalı/eksik. |
| GET seçtim ama gövde yok | Beklenen davranış: GET metodunda yük gönderilmez; POST kullan. |