zurück zur Dokumentation
[reference] triggers webhooks automation events integration

Trigger & Webhooks

Event-getriebene Automatisierung in dForge: Trigger führen Aktionen aus, wenn sich Datensätze ändern, Webhooks benachrichtigen externe Services. Beide teilen sich dasselbe Event-Modell.

veröffentlicht

Zwei Systeme, dieselben Events

dForge hat zwei event-getriebene Systeme, die dieselben Datensatz-Events beobachten, beim Auslösen aber Unterschiedliches tun:

SystemKonfig-DateiWas passiertAnwendungsfall
Triggerlogic/triggers.jsonFührt eine DSL-Aktion aus (synchron oder asynchron)Interne Automatisierung: Benachrichtigungen, Kaskaden, Workflows
Webhookslogic/webhooks.jsonSendet einen HTTP-POST an eine externe URLExterne Integration: Slack, Zapier, eigene Services

Beide lösen bei denselben Event-Typen aus: insert, update, delete, status_change und any.

Event-Typen

EventLöst aus, wennAlte Werte verfügbar
insertEin neuer Datensatz angelegt wirdNein
updateEin beliebiges Feld eines bestehenden Datensatzes sich ändertJa
deleteEin Datensatz gelöscht wirdJa (die gelöschte Zeile)
status_changeDer Wert eines bestimmten Feldes sich ändert (vergleicht alt vs. neu)Ja
anyAlle obigenHängt vom Event ab

Trigger

triggers.json

{
  "triggers": [
    {
      "code": "on_opportunity_won",
      "description": "Owner benachrichtigen, wenn Opportunity als gewonnen geschlossen wird",
      "entity": "opportunity",
      "event": "status_change",
      "condition": "[stage] = 'Closed Won'",
      "action": "on_won_notify",
      "async": true
    }
  ]
}
FeldPflichtBeschreibung
codeJaEindeutiger Identifier innerhalb des Moduls
entityJaZu beobachtende Entität (kann auf Entitäten anderer Module verweisen)
eventJaEines von insert, update, delete, status_change, any
conditionNeinFormel, die gegen Datensatzdaten ausgewertet wird — Trigger löst nur aus, wenn true
actionJaAuszuführender Aktions-Code (muss in ui/actions.json definiert sein)
asyncNeintrue (Default) reiht einen Hintergrund-Job ein; false läuft in derselben Transaktion
paramsNeinStatische Parameter, die an die Aktion übergeben werden
enabledNeinDefault true. Auf false setzen, um ohne Entfernen zu deaktivieren

Bedingungen

Bedingungen verwenden dieselbe Formel-Syntax wie canExecute auf Aktionen:

[status] = 'Active'
[amount] > 1000
[stage] = 'Closed Won' AND [priority] = 'High'

Die Bedingung wird zur Modul-Installationszeit geparst und zur Event-Zeit gegen den Datensatz ausgewertet. Wenn sie nicht passt, löst der Trigger nicht aus (fail-closed).

Synchron vs. asynchron

Asynchrone Trigger ("async": true, der Default):

  • Reihen eine Zeile in die background_action-Tabelle ein
  • Ein Hintergrund-Worker greift sie innerhalb von ~10 Sekunden auf
  • Laufen in ihrer eigenen Transaktion
  • Keine Deadlocks, keine Kaskaden innerhalb der ursprünglichen Transaktion
  • Verwenden Sie sie für Benachrichtigungen, E-Mails, Logs, nicht-kritische Seiteneffekte

Synchrone Trigger ("async": false):

  • Werden sofort ausgeführt, innerhalb der ursprünglichen Transaktion
  • Atomar mit der ursprünglichen Mutation — wenn der Trigger fehlschlägt, wird die ganze Änderung zurückgerollt
  • Risiko von Endlosschleifen, daher erzwingt die Plattform eine maximale Verschachtelungstiefe von 5 und eine pro-Datensatz-Re-Entrancy-Schutz
  • Verwenden Sie sie für kaskadierende Feld-Updates, Validierung, abgeleitete Zustände

Trigger-only Aktionen

Wenn eine Aktion nur von Triggern (niemals von einem UI-Button) ausgelöst werden soll, setzen Sie ihr canExecute auf false. Hintergrund-Trigger umgehen canExecute, sodass die Aktion vom Trigger trotzdem läuft, der Button in der Oberfläche aber versteckt ist:

canExecute:
    false

execute:
    notify([owner_id], 'Automatisch: ' + [title] + ' abgeschlossen')

Webhooks

webhooks.json

{
  "subscriptions": [
    {
      "code": "on_task_completed",
      "entity": "task",
      "event": "status_change",
      "condition": "[status] = 'completed'",
      "endpointUrl": "https://hooks.example.com/dforge",
      "secretCd": "webhook_signing_key",
      "payload": {
        "include": ["task_id", "title", "status"],
        "includeOld": true
      }
    }
  ]
}
FeldPflichtBeschreibung
codeJaEindeutiger Identifier innerhalb des Moduls
entityJaZu beobachtende Entität
eventJaEvent-Typ
conditionNeinFormel — löst nur aus, wenn true
endpointUrlNeinHTTP-Endpoint zum POST-en (kann später in der Admin-Oberfläche gesetzt werden)
secretCdNeinReferenz auf ein Geheimnis, das für HMAC-SHA256-Signierung verwendet wird
payload.includeNeinArray von Feldern, die enthalten sein sollen — weglassen für alle
payload.includeOldNeintrue, um alte Werte für update/delete einzuschließen
enabledNeinDefault true

Payload

{
  "deliveryId": "163053801702424576",
  "event": "status_change",
  "timestamp": "2026-03-26T22:34:25Z",
  "subscription": { "code": "on_task_completed", "module": "tasks" },
  "folder": { "folderId": 123 },
  "entity": "task",
  "recordId": { "task_id": 456 },
  "data": { "task_id": 456, "title": "My Task", "status": "completed" },
  "changes": { "status": { "old": "in_progress", "new": "completed" } }
}

Auslieferung und Wiederholung

  • Hintergrund-Service pollt alle 5 Sekunden
  • Exponentielles Backoff: sofort → 30s → 2min → 10min → 1h
  • Maximal 5 Versuche, dann als failed markiert
  • Header enthalten X-DForge-Event, X-DForge-Entity, X-DForge-Subscription und X-DForge-Signature
  • Auslieferungs-Historie wird 30 Tage aufbewahrt

HMAC-Signierung

Wenn secretCd gesetzt ist, wird der Payload mit HMAC-SHA256 signiert und die Signatur in X-DForge-Signature gesendet. Auf der Empfängerseite verifizieren:

HMAC-SHA256(secret, request_body) == X-DForge-Signature

Trigger vs. Webhooks: Was wann verwenden

SzenarioVerwenden
Einen Anwender benachrichtigen, wenn sich ein Datensatz ändertTrigger → Aktion mit notify()
Eine E-Mail bei Statusänderung versendenTrigger → Aktion mit sendEmail()
Einen verbundenen Datensatz aktualisierenTrigger (synchron) → Aktion mit Feld-Set
In Slack/Teams/Discord postenWebhook
Daten zu einem externen CRM/ERP synchronisierenWebhook
Komplexe mehrstufige Geschäftslogik ausführenTrigger → Aktion mit voller DSL

Trigger bleiben innerhalb von dForge und haben die gesamte DSL und Datenbank zur Verfügung. Webhooks dienen dem Überschreiten der Grenze zu anderen Systemen.

/ war das hilfreich?

Stecken Sie irgendwo fest?
Sagen Sie es uns.

Wir lesen jede Nachricht und aktualisieren die Dokumentation auf Basis dessen, was Leser fragen. Der schnellste Weg, die Dokumentation zu verbessern, ist, uns zu schreiben.