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
}
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 | Description |
|---|---|---|
hardwareHardware |
hardware.createdhardware.updatedhardware.deleted |
Hardware varlığı (zimmetten çıkarma ve branches taşıma dahil) |
employeeEmployees |
employee.createdemployee.updatedemployee.deleted |
Employees kaydı (çıkış ve branches taşıma dahil) |
licenseLicenses |
license.createdlicense.updatedlicense.renewedlicense.deleted |
Yazılım lisansı veya abonelik kaydı |
paymentPayment |
payment.createdpayment.updatedpayment.deleted |
Payment / tahsilat kaydı |
customerCustomer |
customer.createdcustomer.updatedcustomer.deleted |
Customer / müşteri kaydı |
serviceService |
service.createdservice.updatedservice.renewedservice.deleted |
Alan adı, hosting, SSL, yedekleme kaydı |
serverServer |
server.createdserver.updatedserver.deleted |
Server envanteri kaydı |
insurance_policySigorta Poliçesi |
insurance_policy.createdinsurance_policy.updatedinsurance_policy.renewedinsurance_policy.deleted |
Sigorta poliçesi / evrak kaydı |
hr_leaveIK Izin Talebi |
hr_leave.createdhr_leave.updatedhr_leave.deleted |
Employees izin talebi |
hr_warningIK Ihtar |
hr_warning.createdhr_warning.updatedhr_warning.issuedhr_warning.deleted |
Employees ihtarı / disiplin kaydı |
Updateme 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
}
Createma 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
}
Support talebi olayları
Support 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 |
Support ticket opened |
support_ticket.replied |
Support ticket replied |
support_ticket.assigned |
Support ticket assigned |
support_ticket.status_changed |
Support ticket status changed (incl. SLA breach) |
support_ticket.closed |
Support ticket closed |
support_ticket.deleted |
Support ticket deleted |
Ö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 |
Subscription payment received, period extended |
subscription.plan_changed |
Plan changed |
subscription.payment_failed |
Subscription payment failed |
subscription.expiring |
Subscription period ending (30/7/1 days left) |
subscription.past_due |
Period ended, grace period started |
subscription.cancel_scheduled |
Cancellation scheduled at period end |
subscription.cancel_reverted |
Scheduled cancellation reverted |
tenant.suspended |
Account suspended |
tenant.reactivated |
Account reactivated |
Ö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 | 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.
Olay listesi uygulamanın kullandığı katalogdan otomatik üretilir. Eklenmesi planlanan yeni olaylar için bkz. roadmap.