Webhook Events
Panel'de gerçekleşen olayları kendi sistemlerinize HTTP POST ile iletir. Tüm istekler HMAC-SHA256 ile imzalanır, başarısız teslimler exponential backoff ile 5 kez denenir.
Kayıt & başlangıç
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ı.
İmzalama
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
}
Kayıt olayları
Olay adı <varlık>.<eylem> biçimindedir. Panel formu, liste sayfasındaki hızlı işlemler (onay, arşiv, iptal),
REST API, AI asistanı ve toplu silme aynı olay adlarını üretir; kaynak yükteki bağlamdan anlaşılır (ör. "source": "api").
Toplu silmede her kayıt için ayrı .deleted olayı gönderilir.
| Varlık | Olaylar | Açıklama |
|---|---|---|
hardwareDonanım |
hardware.createdhardware.updatedhardware.deleted |
Donanım varlığı (zimmetten çıkarma ve şube taşıma dahil) |
employeePersonel |
employee.createdemployee.updatedemployee.deleted |
Personel kaydı (çıkış ve şube taşıma dahil) |
licenseLisans |
license.createdlicense.updatedlicense.renewedlicense.deleted |
Yazılım lisansı veya abonelik kaydı |
paymentÖdeme |
payment.createdpayment.updatedpayment.deleted |
Ödeme / tahsilat kaydı |
customerŞube |
customer.createdcustomer.updatedcustomer.deleted |
Şube / müşteri kaydı |
serviceServis |
service.createdservice.updatedservice.renewedservice.deleted |
Alan adı, hosting, SSL, yedekleme kaydı |
serverSunucu |
server.createdserver.updatedserver.deleted |
Sunucu envanteri kaydı |
insurance_policySigorta Poliçesi |
insurance_policy.createdinsurance_policy.updatedinsurance_policy.renewedinsurance_policy.deleted |
Sigorta poliçesi / evrak kaydı |
hr_leaveİK İzin Talebi |
hr_leave.createdhr_leave.updatedhr_leave.deleted |
Personel izin talebi |
hr_warningİK İhtar |
hr_warning.createdhr_warning.updatedhr_warning.issuedhr_warning.deleted |
Personel ihtarı / disiplin kaydı |
Güncelleme yükü — hr_leave.updated
changes yalnız değişen alanları {from, to} olarak verir. before / after yalnız işlemin
dokunduğu alanları içerir; şifre, lisans anahtarı, T.C. kimlik no ve uzak erişim kimliği gibi alanlar •••• olarak maskelenir.
{
"event": "hr_leave.updated",
"data": {
"id": 18,
"status": "onaylandi",
"employee_id": 15,
"changes": { "status": { "from": "bekliyor", "to": "onaylandi" } },
"before": { "status": "bekliyor" },
"after": { "status": "onaylandi" }
},
"fired_at": "2026-09-29 14:23:01",
"tenant_id": 42
}
Oluşturma yükü — hardware.created
{
"event": "hardware.created",
"data": { "id": 1284, "brand": "Lenovo", "model": "T14s", "customer_id": 12 },
"fired_at": "2026-09-29 14:23:01",
"tenant_id": 42
}
Destek talebi olayları
Destek modülünün yaydığı olaylar — SLA/CRM entegrasyonu için. SLA süresi aşıldığında support_ticket.status_changed
"extra": {"sla_breached": true} ile gönderilir.
| Olay | Tetikleyici |
|---|---|
support_ticket.created |
Destek talebi açıldı |
support_ticket.replied |
Destek talebine yanıt yazıldı |
support_ticket.assigned |
Destek talebi atandı |
support_ticket.status_changed |
Destek talebi durumu değişti (SLA aşımı dahil) |
support_ticket.closed |
Destek talebi kapandı |
support_ticket.deleted |
Destek talebi silindi |
Örnek yük — 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": { "sender_type": "user", "sender_name": "Mehmet (BT)", "internal": false, "body": "Şimdi tekrar deneyebilir misiniz?" }
},
"fired_at": "2026-06-22 14:25:14",
"tenant_id": 42
}
Abonelik ve hesap olayları
Panel aboneliğinizdeki değişiklikler — muhasebe/ERP entegrasyonu ve iç bildirimler için. Kaynak yükteki
source alanındadır: payment (ödeme bildirimi), renewal_cron (günlük yenileme kontrolü),
self_service (Üyelik sayfası), admin (Teknik Danışman yönetimi).
| Olay | Tetikleyici |
|---|---|
subscription.renewed |
Abonelik ödemesi alındı, dönem uzadı |
subscription.plan_changed |
Plan değişti |
subscription.payment_failed |
Abonelik ödemesi başarısız |
subscription.expiring |
Abonelik dönemi bitiyor (30/7/1 gün kala) |
subscription.past_due |
Dönem sonu geçti, ödeme süresi başladı |
subscription.cancel_scheduled |
Dönem sonunda iptal planlandı |
subscription.cancel_reverted |
Planlanan iptal geri alındı |
tenant.suspended |
Hesap askıya alındı |
tenant.reactivated |
Hesap yeniden etkinleştirildi |
Örnek yük — subscription.renewed
{
"event": "subscription.renewed",
"data": {
"plan_code": "business",
"previous_plan_code": "business",
"cycle": "yearly",
"period_end": "2027-10-14 00:00:00",
"amount": 11988.00,
"currency": "TRY",
"source": "payment"
},
"fired_at": "2026-10-14 09:12:40",
"tenant_id": 42
}
Sistem olayları
| Event | Açıklama |
|---|---|
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.
Olay listesi uygulamanın kullandığı katalogdan otomatik üretilir. Eklenmesi planlanan yeni olaylar için bkz. roadmap.