Rezepte
Zuletzt aktualisiert 23 May 2026

1. Eine personalisierte Begrüßung, die nie kaputt aussieht
Wo: in E-Mail- oder SMS-Vorlagen, oder in einem beliebigen Nachrichtentext.
Hi {{ coalesce(first_name, "there") }},
(Aktueller Datensatz = der Kontakt.) coalesce gibt den ersten Wert zurück, der nicht leer ist, sodass ein fehlender Vorname auf there zurückfällt. Sie können so viele Rückfallwerte verketten, wie Sie brauchen: coalesce(a, b, c, "default").
2. Eine Zeile für eine überfällige Rechnung
Wo: in einer Rechnungserinnerungs-E-Mail oder in einer Workflow-E-Mail-Aktion.
Aktueller Datensatz = die Rechnung.
{% if status != "paid" and daysBetween(due_date, now()) > 0 %}
Invoice {{ number }} is {{ daysBetween(due_date, now()) }} days overdue.
Amount due: {{ formatCurrency(total_incl_tax, "€", 2, ".|,", "after") }}.
{% else %}
Thank you, your account is up to date.
{% endif %}
3. Ein Block mit der Kontozusammenfassung eines Kunden
Wo: in einer Konto-Übersichts-E-Mail, einem PDF oder einer Workflow-Notiz.
Aktueller Datensatz = das Konto.
{% set dealVal = findDealsValue("account", "won", "*", id) %}
Account: {{ account_name }}
Won deals: {{ getDealStats("account", id).won }} ({{ formatCurrency(dealVal, "€") }})
Open cases: {{ getCaseStats("account", id).open }}
Outstanding invoices: {{ getInvoiceStats("account", id).pending }}
4. Die Rechnungen eines Kontakts auflisten, gruppiert und mit Zwischensummen
Wo: in einer Kontoauszugs-E-Mail oder einem PDF.
Aktueller Datensatz = der Kontakt.
{% set invoices = findMany("invoice", "contact_id", id, "due_date", "ASC", 200) %}
{% if invoices | length == 0 %}
No invoices on file.
{% else %}
{% for inv in invoices | sort_by("due_date") %}
{{ inv.number }}, due {{ date(inv.due_date, "M j, Y") }},
{{ inv.total_incl_tax | number_format(2) }} ({{ inv.status }})
{% endfor %}
Total billed: {{ invoices | sum_by("total_incl_tax") | number_format(2) }}
{% endif %}
Beachten Sie die Absicherung gegen leere Listen und die Obergrenze von 200: beides hält die Ausgabe sauber und schnell.
5. Eine lückenlose Belegnummer erzeugen
Wo: in einer Workflow-Aktion, die ein Feld setzt (zum Beispiel um eine Referenz auf einen neuen Datensatz zu stempeln).
{% set seq = incrementAndGetSequenceNumber(
"invoice", "sequence_no", "year", now("Y")
)
%}
REF-{{ now("Y") }}-{{ padString(seq, 5, "0") }}
Erzeugt Werte wie REF-2026-00042. incrementAndGetSequenceNumber erhöht den Zähler sicher, selbst wenn zwei Datensätze im selben Augenblick angelegt werden, sodass Nummern nie kollidieren oder Lücken aufweisen; padString füllt die Nummer auf eine feste Breite auf.
6. Den Body eines ausgehenden Webhooks aufbauen
Wo: im Feld für den Request-Body einer Workflow-Webhook-Aktion.
Aktueller Datensatz = der Kontakt.
{
"external_id": "{{ id }}",
"name": {{ (first_name ~ " " ~ last_name) | json_encode }},
"email": {{ email | json_encode }},
"lifetime_value": {{ findDealsValue("contact", "won", "*", id) }},
"tags": {{ (tags | default("")) | split("|") | json_encode }}
}
Wenn Sie Textwerte in | json_encode einpacken, werden sie korrekt in Anführungszeichen gesetzt und maskiert, sodass ein Name mit einem Anführungszeichen oder Komma das JSON nicht zerstören kann.
7. Einen E-Mail-Text in eine saubere SMS umwandeln
Wo: in einem Workflow, der eine E-Mail empfängt und eine SMS-Zusammenfassung versendet.
{{ htmlToText(__data.incoming_email.html) | truncate(140, "…") }}
htmlToText entfernt die Formatierung; truncate hält den Text innerhalb einer Nachricht.
8. Ein Tag hinzufügen oder entfernen, ohne die anderen zu verlieren
Wo: in einer Workflow-Update-Aktion, die das Feld tags setzt.
(Aktueller Datensatz = der Kontakt.)
{# Add "renewal-2026", keeping existing tags #}
{{ addTag(tags | default(""), "renewal-2026") }}
{# Remove "trial", keeping the rest #}
{{ removeTag(tags | default(""), "trial") }}
Tags werden als pipe-getrennte Liste gespeichert; diese Helfer bearbeiten diese Liste sicher.
9. Eine Nachricht danach verzweigen, was eine Liste enthält
Wo: in einer beliebigen Vorlage oder einem Workflow-Feld.
{% if matchAnyTag(tags | default(""), "vip|gold") %}
You are a priority customer, your dedicated line is +1 555 0100.
{% else %}
Reach us any time at support@example.com.
{% endif %}
10. Ein Bezahlen-per-QR-Block
Wo: in einem Rechnungs-PDF oder einer E-Mail.
Scan to pay:
{{ qrCode("https://pay.example.com/invoice/" ~ id, 2, 200, 200) }}
11. JSON lesen, das aus einem anderen System eingetroffen ist
Wo: in einem Workflow, der durch einen dynamischen Endpunkt oder Webhook ausgelöst wird, siehe den Abschnitt Dynamische Endpunkte.
{% set order = __data.webhook | json_decode %}
Order {{ order.id }}, {{ order.items | length }} items,
total {{ jsonPath(order, "$.totals.grand") | number_format(2) }}
12. Eine freundliche Zeile zu „Tage seit" oder „Tage bis"
Wo: in einem beliebigen Nachrichtentext, verleiht einen menschlichen Ton statt nackter Datumsangaben.
{% set days = daysBetween(date_added, now()) %}
{% if days == 0 %}
joined us today
{% elseif days == 1 %}
joined us yesterday
{% elseif days < 30 %}
joined us {{ days }} days ago
{% else %}
joined us {{ (days / 30) | round(0) }} months ago
{% endif %}
daysBetween ist immer positiv, daher funktioniert dies sowohl für vergangene als auch für zukünftige Datumsangaben.
13. Anhand des Eingegangenen entscheiden, was gesendet wird
Wo: in einem Workflow zu einem eingehenden Ticket oder einer eingehenden Nachricht.
{% set subjectLower = subject | lower %}
{% if contains(subjectLower, "refund") or contains(subjectLower, "money back") %}
{% snippet "support_refund_reply" %}
{% elseif contains(subjectLower, "demo") %}
{% snippet "sales_demo_reply" %}
{% else %}
{% snippet "support_generic_reply" %}
{% endif %}
Snippets halten die langen Texte aus dem Workflow heraus und lassen das Support-Team sie an einer Stelle bearbeiten, ohne die Automatisierung erneut anfassen zu müssen.
14. Die untergeordneten Datensätze eines Kontakts summieren und als Schwellenwert nutzen
Wo: in einem Workflow, der entscheidet, ob ein Kontakt als VIP gilt.
{% set deals = findDeals("contact", id) %}
{% set wonDeals = deals | filter(d => d.is_won) %}
{% set lifetime = wonDeals | sum_by("amount") %}
{% if lifetime >= 50000 %}
VIP (lifetime value {{ lifetime | number_format(2) }})
{% endif %}
filter grenzt eine Liste auf die Elemente ein, die einer Bedingung entsprechen, anschließend summiert sum_by ein Feld über das, was übrig bleibt.
15. Finden-oder-überspringen: nur fortfahren, wenn ein passender Datensatz existiert
Wo: in einem Workflow, der einen bereits vorhandenen Datensatz braucht, um zu handeln.
{% set match = findOne("contact", "email", customer_email) %}
{% if match and match.id %}
Acting on contact #{{ match.id }} ({{ match.first_name }} {{ match.last_name }})
{% else %}
No contact for {{ customer_email }}, skipping.
{% endif %}
findOne gibt ein leeres Ergebnis zurück, statt einen Fehler zu werfen, wenn es keine Übereinstimmung gibt, daher ist die Absicherung {% if match and match.id %} das, was Sie prüfen.
16. Pipe-getrennte Tags in eine Aufzählungsliste verwandeln
Wo: in einer HTML-E-Mail oder einem PDF, das die Tags eines Kontakts übersichtlich darstellt.
{% set tagList = (tags | default("")) | split("|") | filter(t => t | trim) %}
{% if tagList | length > 0 %}
<ul>
{% for t in tagList | sort %}
<li>{{ t | trim }}</li>
{% endfor %}
</ul>
{% endif %}
Das Aufteilen am | und das Herausfiltern leerer Einträge fängt Datensätze ab, die zufällig benachbarte Trennzeichen oder gar keine Tags haben.
17. Einen signierten, zeitlich begrenzten öffentlichen Link erstellen
Wo: in einer E-Mail, die auf eine öffentliche Ressource verlinkt, die Sie nur für einen Tag gültig haben möchten.
{% set link = signUrl("https://example.com/orders/" ~ order.id, 24) %}
View your order: {{ link }}
signUrl gibt eine manipulationssichere URL zurück, die nach der angegebenen Anzahl von Stunden abläuft, sodass der Link selbst dann nicht ewig funktioniert, wenn ein Empfänger ihn weiterleitet.
18. Ein JWT für eine ausgehende Integration erstellen
Wo: in einem Workflow-Webhook, der ein System aufruft, das JWT-Auth verwendet.
{% set payload = {
"sub": id | cast_string,
"tenant": "acme",
"exp": dateAdd(now(), 5, "minutes")
} %}
{% set token = jwtEncode(payload, "your-shared-secret", "HS256") %}
Authorization: Bearer {{ token }}
Tragen Sie das in das Feld headers der Webhook-Aktion ein, um den ausgehenden Aufruf zu authentifizieren.
19. Einen Wert aus einer tief verschachtelten Webhook-Antwort lesen
Wo: in einem Workflow-Schritt, der sich anhand von etwas Bestimmtem in einer als {{ __data.webhook }} gespeicherten JSON-Antwort verzweigt.
{% set reply = __data.webhook | json_decode %}
{% set firstItemSku = jsonPath(reply, "$.order.items[0].sku") %}
{% set grandTotal = jsonPath(reply, "$.totals.grand") | cast_float(2) %}
First item: {{ firstItemSku ?? "(none)" }}, total: {{ grandTotal | number_format(2) }}
json_path (und die Funktion jsonPath) lässt Sie über einen Pfad in verschachtelte Daten greifen, statt viele […]-Zugriffe zu verketten.
20. Eine sichere Schleife für eine „nummerierte Liste", mit Behandlung des letzten Elements
Wo: in einem beliebigen Text, der eine saubere nummerierte Liste braucht.
{% set items = findMany("invoice", "contact_id", id, "due_date", "ASC", 50) %}
{% for inv in items %}
{{ loop.index }}. {{ inv.number }},
{{ inv.total_incl_tax | number_format(2) }}{% if not loop.last %},{% endif %}
{% endfor %}
{% if items | length == 0 %}No invoices on file.{% endif %}
loop.index nummeriert die Elemente; loop.last lässt Sie das letzte Trennzeichen sauber behandeln, sodass Sie nicht mit einem Komma am Ende enden.
Gewohnheiten, die Rezepte zuverlässig halten
- Stellen Sie immer einen Rückfallwert bereit für Felder, die leer sein könnten (
default,coalesceoder ein{% if %}). - Begrenzen und sortieren Sie jedes
findMany, über das Sie iterieren. - Summieren Sie in der Datenbank mit
findSumundfindCount, wenn Sie nur eine Zahl brauchen. - Kodieren Sie vor dem Einbetten:
json_encodefür JSON,url_encodefür URLs,escapefür HTML, damit Sonderzeichen Ihre Ausgabe nicht zerstören können. - Testen Sie die Vorschau an einem echten Datensatz, bevor Sie etwas aktivieren.
Nächste Schritte
- Funktionsreferenz: das vollständige Werkzeugset, aus dem diese Rezepte schöpfen.
- Wo es läuft & seine Grenzen: die Regeln, aus denen diese Gewohnheiten stammen.