Webhook Events
Delivers events happening in the panel to your systems via HTTP POST. All requests are HMAC-SHA256 signed, failed deliveries retried 5 times with exponential backoff.
Registration & getting started
Webhook URL'i ve dinlenecek event listesi /webhooks.php sayfasından eklenir (admin yetkisi gerekir). Her endpoint için otomatik üretilen secret imza doğrulamada kullanılır. Wildcard destekli: "*" tüm olaylar, "hardware.*" tek entity'nin tüm aksiyonları.
Imzalama
Her POST isteği aşağıdaki header'ları içerir:
POST https://yourapp.example/webhook
Content-Type: application/json
User-Agent: TeknikDanisman-Webhook/1.0
X-TD-Event: hardware.created
X-TD-Signature: sha256=<HMAC_SHA256(body, secret)>
X-TD-Delivery: <16 hex>
X-TD-Signature-Previous: sha256=<...> # opsiyonel — secret rotation grace period
Doğrulama (Node.js örneği):
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-td-signature']));
Secret rotation
Secret'i değiştirdiğinizde eski secret 72 saat boyunca X-TD-Signature-Previous header'ı ile gönderilmeye devam eder — yeni secret'a kademeli geçiş yapabilirsiniz.
Retry politikası
5xx yanıt veya non-2xx alındığında deneme tekrar kuyruğa alınır. Backoff dizisi (saniye):
[ 60, 300, 900, 3600, 21600 ] # 1dk → 5dk → 15dk → 1sa → 6sa
5. denemeden sonra teslim permanently failed olarak işaretlenir ve /webhook_deliveries.php sayfasından manuel retry edilebilir.
Payload zarf formatı
{
"event": "hardware.created",
"data": { /* event-specific payload */ },
"fired_at": "2026-06-22 14:23:01",
"tenant_id": 42
}
Resource olayları
Tüm CRUD operasyonları aşağıdaki entity'ler için otomatik webhook tetikler. Olay adı <entity>.<action> formatındadır.
| Entity | Türkçe | Description |
|---|---|---|
customer |
Müşteri | Bir müşteri kaydı |
employee |
Employees | Bir employees kaydı |
hardware |
Hardware | Bir donanım varlığı |
license |
Licenses | Yazılım lisansı veya abonelik kaydı |
service |
Hizmet | Hizmet/sözleşme kaydı (DNS, hosting vb.) |
server |
Server | Server envanteri kaydı |
payment |
Payment | Payment/tahsilat kaydı |
insurance_policy |
Sigorta Poliçesi | Sigorta poliçesi/evrak kaydı |
hr_leave |
IK Izin Talebi | Employees izin talebi |
hr_warning |
IK Ihtar | Employees ihtarı/disiplin kaydı |
Aksiyonlar
| Action | Tetikleyici |
|---|---|
created Createuldu |
Yeni kayıt eklendiğinde |
updated Updatendi |
Mevcut kayıt değiştirildiğinde |
deleted Deleteindi |
Kayıt silindiğinde |
Örnek payload — hardware.created
{
"event": "hardware.created",
"data": {
"id": 1284,
"entity_id": 1284,
"actor_user_id": 7,
"actor_email": "admin@firma.com",
"changes": { "brand": "Lenovo", "model": "T14s", "serial": "PF1A2B3C" }
},
"fired_at": "2026-06-22 14:23:01",
"tenant_id": 42
}
Support talebi olayları
Müşteri destek modülünün yaydığı olaylar — SLA/CRM entegrasyonu için kullanışlıdır.
| Event | Tetikleyici |
|---|---|
support_ticket.created |
Yeni talep oluşturuldu (panel UI, e-posta inbox veya müşteri portalı). |
support_ticket.replied |
Talebe yanıt eklendi (agent veya talep sahibi). |
support_ticket.status_changed |
Talep statüsü değişti (open → pending, vb.) ancak close değil. |
support_ticket.closed |
Talep kapatıldı. |
support_ticket.assigned |
Talep bir agent'a atandı veya başka agent'a devredildi. |
Örnek payload — support_ticket.replied
{
"event": "support_ticket.replied",
"data": {
"id": 88,
"ticket_number": "TKT-2026-0088",
"subject": "Outlook senkron sorunu",
"status": "open",
"priority": "high",
"category": "email",
"customer_id": 12,
"requester_name": "Ayşe Yılmaz",
"assigned_to": 7,
"extra": { "author_id": 7, "body_preview": "Şimdi tekrar deneyebilir misiniz..." }
},
"fired_at": "2026-06-22 14:25:14",
"tenant_id": 42
}
Sistem olayları
| Event | Description |
|---|---|
webhook.test |
webhooks.php → "Test Et" butonundan manuel tetiklenen test eventi. Production akışında üretilmez. |
Teslim güvenliği
Idempotency
Aynı event aynı endpoint'e en fazla bir kez teslim edilir (queue PK). Retry'lar farklı X-TD-Delivery ID üretir; receiver tarafta delivery ID'yi 24 saat saklayarak duplicate ignore edebilirsiniz.
Rate limit
Her webhook endpoint'i için varsayılan 60 istek/dakika sınırı uygulanır. Aşıldığında o dakika boyunca yeni teslim ertelenir. /webhooks.php sayfasından endpoint başına özelleştirilebilir.
Timeout
Receiver'ın 10 saniye içinde 2xx yanıt vermesi gerekir. Daha uzun işlem için 200 OK döndürüp arka planda işleyin (async pattern).
Sorun giderme
- Tüm teslim denemeleri (success/fail)
/webhook_deliveries.phpsayfasında görüntülenir — request/response payload + HTTP code + duration. - Failed teslimleri manuel retry için aynı sayfadan tek tık.
- Endpoint geçici devre dışı bırakılabilir (
is_active = 0) — kuyruktaki bekleyenler yine teslim edilir, yeni event'ler ekran dışı tutulur.
Bu sayfa lib/Audit.php ve lib/SupportTickets.php kaynak kodu ile manuel hizalanmıştır. Eklenmesi planlanan yeni olaylar için bkz. roadmap.