AksiyonlarCustom Webhook

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ışır

Ne 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 olurUygulanan 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.

AlanZorunluNe işe yarar
Ad (name)EvetAksiyonu 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ırVarsayılan POST. GET seçersen istek gövdesiz gider (yük gönderilmez).
Başlıklar (headers)HayırJSON anahtar-değer. Content-Type: application/json otomatik eklenir; kendi Authorization vb. başlıklarını buraya ekle.
Payload şablonu (payloadTemplate)HayırGöndereceğin JSON gövde; içine {{değişken}} yerleştirebilirsin. Varsayılan boş {}.
Timeout (timeoutMs)HayırYanıt için beklenecek süre, milisaniye. Varsayılan 10000 (10 saniye).
Yeniden deneme (retryCount)HayırBaşarısız istekte kaç kez tekrar denensin. Varsayılan 0 (tek deneme).
Koşul (condition)HayırAksiyonu 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:

KategoriDeğ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)
TetikleyiciBir asistan, belirli bir görüşmedeHesap düzeyindeki olaylar
OlaylarGö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 }
İmzaYok — auth’u kendi headers alanınla eklersinHMAC-SHA256, X-Purvisor-Signature başlığı (İmza Doğrulama)
KurulumPanel → Aksiyonlar → asistana bağlaAPI anahtarı + /api/v1/hooks
KapsamTek asistan, tek aksiyonHesabı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 https olsun.
  • Auth ekle. Uç noktan halka açıksa headers alanına bir Authorization token 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ç. retryCount değ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

BelirtiOlası neden / çözüm
Webhook hiç tetiklenmediAksiyon asistana bağlı değil; aksiyon pasif; asistanla yapılan görüşme henüz tamamlanmadı.
Uç noktama boş/eksik JSON geldipayloadTemplate 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 geldiretryCount yüksek veya çift tetikleme — uç noktanı call_id ile idempotent yap.
401/403 dönüyorheaders içindeki Authorization token’ı hatalı/eksik.
GET seçtim ama gövde yokBeklenen davranış: GET metodunda yük gönderilmez; POST kullan.

İlgili