Abläufe, die mitarbeiten
Beispiele für Automatisierungen
Ausführbare Lua-Vorlagen für Aufträge, Rechnungen, Mails, Lager, Webhooks und sichere Fehlerbehandlung.

Diese Vorlagen verwenden die versionierte Lua-Standardbibliothek. Im Skripteditor kannst du sie über die rechte Referenz suchen, vollständig einsetzen und mit dem angegebenen Beispiel-Ereignis testen.
Fertigen Auftrag dokumentieren
- Vorlagen-ID:
job_status_history - Auslöser: Ereignis
job.status_changed - Benötigte Aktion:
jobs.add_history - Beispiel-Ereignis:
{"type":"job.status_changed","entity_type":"job","entity_id":"42","payload":{"from":"in_progress","to":"done","title":"Badsanierung","job_number":"AU-1042"}} - Erwarteter Probelauf: Protokolliert den übersprungenen Verlaufseintrag und die betroffene Auftrags-ID.
- Risiko: Der Live-Lauf schreibt einen dauerhaften Auftragsverlaufseintrag.
-- @werkstube api=1
local target_status = ctx.require("payload.to", "Neuer Auftragsstatus fehlt")
if target_status ~= "done" then
action.log("Kein Verlaufseintrag: Auftrag ist noch nicht fertig")
return
end
local job_id = ctx.require("entity_id", "Auftrags-ID fehlt")
local title = std.text.normalize_space(ctx.get("payload.title", "Auftrag"))
action.jobs.add_history{
jobId = job_id,
text = title .. " wurde automatisch als fertig dokumentiert.",
actor = "Automatisierung",
}
action.log("Verlaufseintrag für Auftrag " .. job_id .. " vorbereitet")
Hohe Rechnung zur Prüfung melden
- Vorlagen-ID:
high_value_invoice - Auslöser: Ereignis
invoice.created - Benötigte Aktion:
notify - Beispiel-Ereignis:
{"type":"invoice.created","entity_type":"invoice","entity_id":"9","payload":{"invoice_number":"RE-1009","status":"open","gross_cents":1285000}} - Erwarteter Probelauf: Protokolliert eine übersprungene Warnungsbenachrichtigung mit Rechnungsnummer und Betrag.
- Risiko: Der Live-Lauf erzeugt eine interne Benachrichtigung, verändert aber keine Rechnung.
-- @werkstube api=1
local gross_cents = ctx.require("payload.gross_cents", "Bruttobetrag fehlt")
local threshold_cents = std.money.parse("10000,00")
if gross_cents < threshold_cents then
action.log("Rechnung unter Prüfschwelle: " .. std.money.format(gross_cents))
return
end
local invoice_id = ctx.require("entity_id", "Rechnungs-ID fehlt")
local number = std.text.trim(ctx.get("payload.invoice_number", invoice_id))
action.notify(
"Hohe Rechnung prüfen",
"Rechnung " .. number .. " über " .. std.money.format(gross_cents) .. " wurde erstellt.",
{ severity = "warning", link = "/finanzen/rechnungen/" .. invoice_id }
)
Eingegangene Mail zusammenfassen
- Vorlagen-ID:
mail_summary - Auslöser: Manuell mit übergebenem Mailtext
- Benötigte Aktionen:
ai,notify - Beispiel-Ereignis:
{"type":"manual","entity_type":"mail","entity_id":"81","payload":{"from":"kunde@example.de","subject":"Heizung tropft","body":"Seit heute Morgen verliert die Heizung Wasser. Bitte rufen Sie mich zurück."}} - Erwarteter Probelauf: Führt den KI-Schritt aus und protokolliert die übersprungene Benachrichtigung.
- Risiko: KI-Aufrufe können auch im Probelauf Kontingent verbrauchen und verarbeiten den angegebenen Mailtext.
-- @werkstube api=1
local sender = std.validate.email(ctx.require("payload.from", "Absender fehlt"))
local subject = std.text.normalize_space(ctx.require("payload.subject", "Betreff fehlt"))
local body = std.text.trim(ctx.get("payload.body", ""))
if std.text.is_blank(body) then
action.warn("E-Mail von " .. sender .. " enthält keinen Text")
return
end
local summary = action.ai(
"Fasse diese Kundenmail in höchstens drei deutschen Sätzen zusammen. " ..
"Erfinde keine Angaben.\nBetreff: " .. subject .. "\nText: " .. body
)
action.notify("Neue Mail: " .. std.text.truncate(subject, 60), summary, {
severity = "info",
link = "/posteingang",
})
Mindestbestand eskalieren
- Vorlagen-ID:
low_stock_alert - Auslöser: Ereignis
inventory.low_stock - Benötigte Aktion:
inventory.reorder_low_stock - Beispiel-Ereignis:
{"type":"inventory.low_stock","entity_type":"inventory_item","entity_id":"3","payload":{"item_number":"ART-102","name":"Heizkörper Typ 22","on_hand":"3","min_stock":"5","unit":"Stk"}} - Erwarteter Probelauf: Schreibt die Bestandswarnung und protokolliert die übersprungene Nachbestellung.
- Risiko: Der Live-Lauf kann Bestellentwürfe über die vorhandene Lageraktion erzeugen.
-- @werkstube api=1
local item_number = std.text.trim(ctx.require("payload.item_number", "Artikelnummer fehlt"))
local item_name = std.text.normalize_space(ctx.require("payload.name", "Artikelname fehlt"))
local on_hand = tonumber(ctx.require("payload.on_hand", "Bestand fehlt"))
local minimum = tonumber(ctx.require("payload.min_stock", "Mindestbestand fehlt"))
if on_hand == nil or minimum == nil then
error("Bestand und Mindestbestand müssen Zahlen sein")
end
if on_hand >= minimum then
action.log(item_number .. " liegt nicht mehr unter Mindestbestand")
return
end
action.warn(item_number .. " · " .. item_name .. ": " .. on_hand .. " von " .. minimum .. " verfügbar")
action.inventory.reorder_low_stock{}
Webhook als Anfrage erfassen
- Vorlagen-ID:
webhook_inquiry - Auslöser: Webhook
- Benötigte Aktion:
inquiries.create - Beispiel-Ereignis:
{"type":"webhook","payload":{"subject":"Anfrage Badsanierung","email":"kunde@example.de","message":"Bitte senden Sie mir einen Terminvorschlag."}} - Erwarteter Probelauf: Protokolliert die übersprungene Anfrageerstellung und den validierten Absender.
- Risiko: Öffentliche Webhooks brauchen vorgelagerte Rate-Limits; der Live-Lauf legt Datensätze an.
-- @werkstube api=1
local subject = std.text.normalize_space(ctx.require("payload.subject", "Betreff fehlt"))
local email = std.validate.email(ctx.require("payload.email", "E-Mail fehlt"))
local message = std.text.trim(ctx.get("payload.message", ""))
action.inquiries.create{
subject = std.text.truncate(subject, 120),
description = message,
email = email,
channel = "webhook",
}
action.log("Webhook-Anfrage von " .. email .. " vorbereitet")
Erwarteten Aktionsfehler behandeln
- Vorlagen-ID:
error_handling - Auslöser: manuell oder als Ereignis
- Benötigte Aktion:
jobs.get - Beispiel-Ereignis:
{"type":"manual","entity_type":"job","entity_id":"42","payload":{}} - Erwarteter Probelauf: Protokolliert den übersprungenen Ladevorgang und den sicheren Abschluss.
- Risiko: Fehler nur behandeln, wenn der Ablauf danach fachlich sicher enden darf.
-- @werkstube api=1
local job_id = ctx.require("entity_id", "Auftrags-ID fehlt")
local ok, result = pcall(function()
return action.jobs.get{ id = job_id }
end)
if not ok then
action.warn("Auftrag " .. job_id .. " konnte nicht geladen werden: " .. tostring(result))
return
end
action.log("Auftrag " .. job_id .. " wurde sicher geladen", result)
War diese Seite hilfreich?Dein Hinweis hilft uns, die Dokumentation besser zu machen.