Rezepte

Zuletzt aktualisiert 23 May 2026

Eine Sammlung von Flexie-Scripting-Snippets, eine Zeile zu einer überfälligen Rechnung, ein Tag-Umschalter, ein QR-Zahlungsblock
NACHRICHTEN Begrüßungen, Antworten, SMS, QR-Codes coalesce(first_name, …) htmlToText | truncate qrCode("https://…") ABRECHNUNG Rechnungspositionen, Nummerierung, Summen daysBetween(due_date, …) incrementAndGet…(…) invoices | sum_by(…) INTEGRATIONEN Webhooks, JWT, JSON-Parsing field | json_encode jwtEncode(payload, …) jsonPath(reply, "$…")

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.

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, coalesce oder ein {% if %}).
  • Begrenzen und sortieren Sie jedes findMany, über das Sie iterieren.
  • Summieren Sie in der Datenbank mit findSum und findCount, wenn Sie nur eine Zahl brauchen.
  • Kodieren Sie vor dem Einbetten: json_encode für JSON, url_encode für URLs, escape fü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