Funktionsreferenz
Zuletzt aktualisiert 23 May 2026

Funktionen werden mit ihrem Namen und Klammern aufgerufen: {{ functionName(arg1, arg2) }}. Argumente, die mit = value angezeigt werden, sind optional und haben diesen Standardwert.
1. Datensätze nachschlagen
Diese Funktionen lesen Daten aus Ihrem gesamten Flexie-Konto, sodass ein Template verknüpfte Informationen anzeigen kann: die Rechnungen eines Kontakts, die Kontakte einer Firma, Summen, Anzahlen.
| Funktion | Was sie tut | Beispiel |
|---|---|---|
findOne(type, field, value, …) |
Ruft einen einzelnen Datensatz ab, der allen angegebenen Feld/Wert-Paaren entspricht (mit UND verknüpft). Liefert ein leeres Ergebnis, wenn keiner gefunden wird. | {{ findOne("lead", "email", "john@example.com") }} |
findMany(type, field, value, orderBy='id', dir='ASC', limit=1000) |
Ruft viele Datensätze ab, die einem Feld entsprechen, optional sortiert und begrenzt. | {{ findMany("invoice", "status", "finalized", "date_added", "DESC", 50) }} |
findCount(type, field, value, …) |
Zählt Datensätze, die allen Feld/Wert-Paaren entsprechen. | {{ findCount("deal", "stage_id", 5, "owner_id", 3) }} |
findSum(type, column, field, value, …) |
Summiert eine numerische Spalte über alle passenden Datensätze. | {{ findSum("invoice", "total_incl_tax", "contact_id", 42, "status", "finalized") }} |
findMin(type, column, field, value, …) |
Kleinster Wert einer Spalte über alle passenden Datensätze. | {{ findMin("deal", "amount", "stage_id", 5) }} |
findMax(type, column, field, value, …) |
Größter Wert einer Spalte über alle passenden Datensätze. | {{ findMax("deal", "amount", "is_won", 1) }} |
findByPhoneNumber(type, phoneField, number) |
Findet einen Datensatz anhand einer Telefonnummer in einem bestimmten Feld. | {{ findByPhoneNumber("contact", "phone", "+155501234") }} |
getSmartListRecords(type, listAlias) |
Alle Datensätze, die zu einer gespeicherten Smart List gehören. | {{ getSmartListRecords("lead", "high_value") }} |
getOrganization(idOrVat) |
Schlägt eine Organisation anhand ihrer ID oder USt-IdNr. nach. | {{ getOrganization("DE123456789") }} |
getUserById(userId) |
Ruft einen Nutzer ab (Name, E-Mail, Telefon, Profilbild usw.). | {{ getUserById(5).full_name }} |
getAccountContacts(accountId) |
Alle Kontakte, die mit einer Firma verknüpft sind. | {{ getAccountContacts(42) }} |
findDeals(type, entityId) |
Alle Deals, die mit einem Kontakt, einer Firma oder einem Lead verknüpft sind. | {{ findDeals("contact", 42) }} |
findCases(type, entityId) |
Alle Tickets, die mit einem Datensatz verknüpft sind. | {{ findCases("account", 10) }} |
findDealsValue(type, stage='*', pipeline='*', entityId) |
Gesamter Deal-Wert für einen Datensatz, optional gefiltert nach Stufe (pending/won/lost/*) und Pipeline. |
{{ findDealsValue("contact", "won", "*", 42) }} |
Ergebnisgrenzen. Lookups, die viele Zeilen zurückgeben können, sind auf 1.000 Ergebnisse begrenzt, damit Templates schnell bleiben. Filtern und sortieren Sie eng, statt alles abzurufen.
Fertige Statistiken
Diese liefern in einem einzigen Aufruf ein kleines Bündel an Kennzahlen, praktisch für Kundenübersichten.
| Funktion | Liefert |
|---|---|
getDealStats(type, entityId) |
total, active, won, lost |
getInvoiceStats(type, entityId) |
invoice_total, credit_memo_total, draft, sent, canceled, won, finalized, pending, active |
getCaseStats(type, entityId) |
total, open, pending, solved, closed |
In einem Template im Firmen-Kontext wird die eigene id der Firma auf der obersten Ebene gelesen:
This account has {{ getDealStats("account", id).won }} won deals
worth {{ findDealsValue("account", "won", "*", id) | number_format(2) }}.
Fortgeschritten: direkte Abfragen
Für Administratoren und Power-User, die Daten benötigen, die die obigen Helfer nicht abdecken:
| Funktion | Was sie tut |
|---|---|
query(sql) |
Führt eine schreibgeschützte Datenabfrage aus und gibt die Zeilen zurück. Nur Abrufen ist erlaubt (nur SELECT und WITH, kein INSERT, UPDATE, DELETE, DROP und kein SELECT *). Die Ergebnisse sind auf 1.000 Zeilen begrenzt. Liefert die Zeilen oder {"error": "…"}, wenn die Abfrage abgelehnt wird. |
{% set rows = query("SELECT id, email FROM leads WHERE status = 1 LIMIT 10") %}
Matching leads: {{ rows | length }}
2. Zahlen und Mathematik
| Funktion | Was sie tut | Beispiel → Ergebnis |
|---|---|---|
add(a, b, …) |
Addiert alle Argumente. | {{ add(10, 5, 3) }} → 18 |
subtract(a, b) |
a minus b. | {{ subtract(100, 30) }} → 70 |
multiply(a, b, …) |
Multipliziert alle Argumente. | {{ multiply(5, 4, 2) }} → 40 |
divide(a, b) |
a geteilt durch b (leer bei Division durch null). | {{ divide(100, 4) }} → 25 |
round(n, places=0, mode="ROUND_HALF_UP") |
Rundet auf eine Anzahl von Nachkommastellen. | {{ round(3.14159, 2) }} → 3.14 |
squareRoot(n) |
Quadratwurzel. | {{ squareRoot(16) }} → 4 |
cubeRoot(n) |
Kubikwurzel. | {{ cubeRoot(27) }} → 3 |
max(a, b, …) |
Größter der angegebenen Werte (funktioniert auch mit einer Liste). | {{ max(1, 3, 2) }} → 3 |
min(a, b, …) |
Kleinster der angegebenen Werte (funktioniert auch mit einer Liste). | {{ min(1, 3, 2) }} → 1 |
random(…) |
Ein zufälliger Wert: random() (eine Zahl), random(5) (0 bis 5), random(["a","b"]) (ein zufälliges Element), random("ABC") (ein zufälliges Zeichen). |
{{ random(["a","b","c"]) }} |
range(from, to, step=1) |
Eine Zahlenfolge, praktisch in einer Schleife. | {% for i in range(1, 5) %}…{% endfor %} |
numberFormat(n, decimals=0, style="none", round="ROUND_HALF_EVEN") |
Formatiert mit Tausendertrennung. style ist ",|." (1,234.56), ".|," (1.234,56) oder none. |
{{ numberFormat(1234.5678, 2, ",|.") }} → 1,234.57 |
reverseFormattedNumber(text, style=",|.") |
Wandelt einen formatierten String zurück in eine Zahl, mit der Sie rechnen können. | {{ reverseFormattedNumber("1.234,56", ".|,") }} → 1234.56 |
formatCurrency(amount, symbol="$", decimals=2, style=",|.", position="before") |
Formatiert einen Geldbetrag mit einem Währungssymbol. | {{ formatCurrency(1234.5, "€", 2, ".|,", "after") }} → 1.234,50€ |
Warum
reverseFormattedNumberwichtig ist. Sobald eine Zahl Tausendertrennzeichen hat, ist sie Text und keine Zahl mehr:"1,200" + 50verhält sich nicht wie erwartet. Wandeln Sie sie zuerst zurück, rechnen Sie, und formatieren Sie dann das Ergebnis.
Für Summen über eine Liste von Datensätzen (sumField, avgField, minField, maxField) siehe Filter & Sammlungen.
3. Datum und Uhrzeit
| Funktion | Was sie tut | Beispiel |
|---|---|---|
now(format="Y-m-d H:i:s", tz="UTC") |
Das aktuelle Datum und die aktuelle Uhrzeit. | {{ now("Y-m-d") }} |
date(value, format="Y-m-d H:i:s", toTz="UTC", fromTz="UTC") |
Formatiert ein Datum neu und konvertiert optional seine Zeitzone. | {{ date(date_added, "M j, Y") }} |
dateAdd(date, amount, unit="days", format="Y-m-d H:i:s") |
Addiert Zeit zu einem Datum. Einheiten: years, months, weeks, days, hours, minutes, seconds. | {{ dateAdd(due_date, 30, "days") }} |
dateSubtract(date, amount, unit="days", format=…) |
Subtrahiert Zeit von einem Datum. | {{ dateSubtract(now(), 1, "months") }} |
dateDiff(date1, date2, unit="days") |
Vorzeichenbehaftete Differenz zwischen zwei Daten. | {{ dateDiff(date_added, now()) }} |
daysBetween(date1, date2) |
Ganze Tage zwischen zwei Daten (immer positiv). | {{ daysBetween(due_date, now()) }} |
Formatcodes sind die gängigen Datumsbestandteile: Y vierstelliges Jahr, m Monatszahl, d Tag, H Stunde (24h), i Minuten, s Sekunden, M kurzer Monatsname, j Tag ohne führende Null, l Wochentagsname. Beispiel: "l, j M Y" → Tuesday, 3 Jun 2025.
{# Current record = the invoice #}
{% if daysBetween(due_date, now()) > 0 and status != "paid" %}
This invoice is {{ daysBetween(due_date, now()) }} days overdue.
{% endif %}
4. Mit Text arbeiten
| Funktion | Was sie tut | Beispiel → Ergebnis |
|---|---|---|
truncate(text, length=100, suffix="…") |
Kürzt Text und fügt ein Suffix an. | {{ truncate(subject, 30) }} |
padString(value, length, char=" ", side="left") |
Füllt auf eine feste Breite auf. | {{ padString(42, 6, "0") }} → 000042 |
startsWith(text, prefix) |
Wahr, wenn der Text mit dem Präfix beginnt. | {{ startsWith(phone, "+44") }} |
endsWith(text, suffix) |
Wahr, wenn der Text mit dem Suffix endet. | {{ endsWith(file, ".pdf") }} |
wordCount(text) |
Anzahl der Wörter. | {{ wordCount(note.body) }} |
toAlphanumeric(text) |
Entfernt alles außer Buchstaben und Zahlen. | {{ toAlphanumeric("AB-12/3") }} → AB123 |
htmlToText(html) |
Wandelt HTML in sauberen Klartext um (ideal, um einen E-Mail-Text in eine SMS zu verwandeln). | {{ htmlToText(email.html) }} |
findAndReplace(html, start, end, replacement) |
Ersetzt alles, was zwischen zwei Markierungen steht. | {{ findAndReplace(body, "<!--A-->", "<!--B-->", newPart) }} |
urlEncode(text) |
Macht Text sicher zum Einfügen in eine URL. | {{ urlEncode(email) }} |
md5(text) |
Ein MD5-Fingerabdruck des Textes. | {{ md5(email) }} |
base64encode(text) / base64decode(text) |
Kodiert oder dekodiert Text in base64. | {{ base64encode(payload) }} |
Für musterbasiertes Suchen und Ersetzen sowie das Erzeugen von Slugs siehe die Filter regex_replace und slugify in Filter & Sammlungen.
Dinge aus Text herausziehen
| Funktion | Was sie tut |
|---|---|
verifyEmail(text) |
1, wenn es wie eine gültige E-Mail-Adresse aussieht, sonst 0. |
extractEmails(text) |
Alle E-Mail-Adressen, die in einem Textblock gefunden werden. |
extractPhoneNumbers(text) |
Alle Telefonnummern, die im Text gefunden werden. |
extractWebsiteLinks(text) |
Alle Weblinks, die im Text gefunden werden. |
{% set found = extractEmails(email.text) %}
{% if found | length > 0 %}Reply-to candidate: {{ found[0] }}{% endif %}
5. Tags
Flexie speichert Tags als einen einzigen, durch Pipe getrennten String (vip|renewal). Diese Helfer machen die Arbeit damit sicher.
| Funktion | Was sie tut | Beispiel → Ergebnis |
|---|---|---|
addTag(tags, newTag) |
Hängt ein Tag an. | {{ addTag("red|blue", "green") }} → red|blue|green |
removeTag(tags, tag) |
Entfernt ein Tag (Groß-/Kleinschreibung wird ignoriert). | {{ removeTag("red|blue", "BLUE") }} → red |
matchAnyTag(tagsA, tagsB) |
1, wenn die beiden Mengen mindestens ein Tag gemeinsam haben. |
{{ matchAnyTag(tags, "vip|gold") }} |
matchAllTags(tagsA, tagsB) |
1, wenn die beiden Mengen identisch sind. |
{{ matchAllTags(tags, "vip|gold") }} |
6. JSON und strukturierte Daten
Wenn ein Wert JSON enthält (zum Beispiel Daten, die von einem anderen System empfangen wurden), verwandeln diese ihn in etwas Lesbares.
| Funktion | Was sie tut |
|---|---|
jsonDecode(text, associative=true) |
Wandelt einen JSON-String in Daten um, die Sie mit Punkten oder Klammern lesen können. |
jsonPath(data, expression) |
Zieht einen verschachtelten Wert über einen Pfad wie $.order.items[0].sku heraus. |
isCollection(value) |
Wahr, wenn der Wert eine Liste oder ein Array ist. |
{% set order = jsonDecode(__data.webhook_body) %}
First item: {{ jsonPath(order, "$.items[0].name") }}
Es gibt auch eine Filter-Form json_decode und json_path, siehe Filter & Sammlungen.
7. Eindeutige Werte und Sequenznummern
| Funktion | Was sie tut |
|---|---|
uuid() |
Ein zufälliger, global eindeutiger Bezeichner. |
uniqueId() |
Eine kürzere eindeutige ID. |
incrementAndGetSequenceNumber(type, field, matchField, matchValue) |
Erhöht eine Zählerspalte sicher um eins und gibt den neuen Wert zurück, der zuverlässige Weg, um lückenlose Rechnungs- oder Auftragsnummern zu erzeugen, selbst unter Last. |
Invoice no. {{ incrementAndGetSequenceNumber("invoice", "sequence_no", "year", "2026") }}
8. Links, Anhänge und QR-Codes
| Funktion | Was sie tut |
|---|---|
getAttachments(type, id, name="*", firstOnly=false) |
Anhangdetails für einen Datensatz (optional nach Dateiname gefiltert). |
getAttachmentsPath(type, id, name="*", firstOnly=true) |
Direkte Download-URLs für Anhänge. |
addAttachments(type, id, name="*", …) |
Fertige HTML-Links zu Anhängen. |
getFormAttachments(payload) |
Anhänge aus einer Formularübermittlung. |
publicAttachmentLink(type, id, userId=null) |
Ein sicherer öffentlicher Link zu einem Anhang, der kein Login benötigt. |
qrCode(text, border=0, width=140, height=140, bg="#FFFFFF", fg="#333333") |
Ein QR-Code-Bild (SVG) für beliebigen Text oder eine URL. |
Scan to pay: {{ qrCode("https://pay.example.com/invoice/" ~ id, 2, 200, 200) }}
9. Sicherheitshelfer (fortgeschritten)
Zum Erstellen authentifizierter Links und signierter Payloads bei der Integration mit anderen Systemen. Dies sind Werkzeuge auf Administratorebene.
| Funktion | Was sie tut |
|---|---|
encrypt(text) / decrypt(text) |
Verschlüsselt oder entschlüsselt mit dem geheimen Schlüssel Ihres Kontos. |
signUrl(url, expiryHours) |
Erzeugt einen manipulationssicheren, zeitlich begrenzten Link. |
hashHmac(algorithm, data, secret) |
Eine HMAC-Signatur (z. B. sha256) zum Verifizieren von Payloads. |
jwtEncode(payload, key, alg="HS256") / jwtDecode(token, secret) |
Erstellt oder liest einen JSON Web Token. |
10. Hilfsfunktionen
| Funktion | Was sie tut |
|---|---|
coalesce(a, b, c, …) |
Der erste Wert, der nicht leer ist, ein sauberer Weg, um Fallbacks bereitzustellen. |
contains(haystack, needle) |
Wahr, wenn ein Text einen Teilstring enthält oder eine Liste einen Wert enthält. |
getQueryString(name) |
Liest einen Wert aus dem Query-String der aktuellen URL. |
memoryGet(key) |
Liest einen Wert aus dem kurzlebigen, geteilten Speicher (an anderer Stelle durch die Aktion „Memory Set" eines Workflows gesetzt). Hier nur lesend. |
getAiChatHistory(key="") |
Ruft den gespeicherten Verlauf einer KI-Konversation ab. |
dump(value) |
Gibt den vollständigen Inhalt eines Werts aus, nur zum Debuggen eines Templates. |
Hello {{ coalesce(first_name, "there") }}!
Es gibt außerdem einige spezialisierte Funktionen für die fiskalische oder regulatorische Signatur von Dokumenten und für das Streamen externer Datendateien. Diese werden von Administratoren für bestimmte Integrationen konfiguriert und liegen außerhalb der täglichen Nutzung.
Nächste Schritte
- Filter & Sammlungen: Werte mit
| filterstransformieren und über Listen von Datensätzen hinweg arbeiten. - Rezepte: diese Funktionen zu echten Lösungen kombiniert.