Auf dieser Seite: Nutzen Sie sofort umsetzbare Personalisierungsrezepte für Datumsangaben, Arrays, Zeichenfolgen, bedingte Logik und PQL-Randfälle, die Sie direkt in Ihren Adobe Journey Optimizer-Inhalt kopieren können.
Diese Seite stellt einsatzbereite Personalisierungsmuster für die häufigsten Anwendungsfälle in Journey Optimizer bereit. Alle Beispiele verwenden die Syntax des Personalisierungseditors und können direkt in E-Mail-, SMS- oder Push-Inhalte kopiert werden.
Eine vollständige Übersicht der verfügbaren Funktionen finden Sie in den Hilfsfunktionen, Datums-/Uhrzeitfunktionen, Zeichenfolgenfunktionen und Array-Funktionen.
Rezepte für Datum und Uhrzeit date-time-recipes
Rezept 1: Anzeige des aktuellen Datums in einem lesbaren Format recipe-current-date
Verwenden Sie formatDate mit getCurrentZonedDateTime(), um das heutige Datum in einem beliebigen Format wiederzugeben:
{%= formatDate(getCurrentZonedDateTime(), "MMMM dd, yyyy") %}
Ausgabe (Beispiel): April 11, 2026
Gängige Formatmuster:
"dd/MM/yyyy"11/04/2026"MM/dd/yyyy"04/11/2026"EEEE, MMMM dd"Saturday, April 11"yyyy-MM-dd"2026-04-11y in Kleinbuchstaben (Kalenderjahr) anstelle von Y (Jahr auf Wochenbasis), um unerwartete Ergebnisse an Jahresgrenzen zu vermeiden. Eine vollständige Referenz finden Sie unter Musterzeichen.Rezept 2: Countdown bis zu einem Ablauf- oder Ereignisdatum recipe-countdown
Verwenden Sie dateDiff, um die Anzahl der verbleibenden Tage bis zu einem Profildatumsattribut zu berechnen und es dann dynamisch zu rendern:
Ausgabe (Beispiel): Your reward points expire in 7 days. Use them before they're gone!
Rezept 3: x Tage vor einem dynamischen Enddatum recipe-days-before
Um ein Datum zu berechnen, das x Tage vor einem Profilattribut liegt (z. B. um Inhalt oder Betreffzeilen aufzunehmen), verwenden Sie addDays mit einem negativen Versatz:
{%= formatDate(addDays(stringToDate(profile.subscription.endDate), -7), "MMMM dd, yyyy") %}
Ausgabe (Beispiel): April 04, 2026 (7 Tage vor dem 11. April)
Um auch eine feste Uhrzeit festzulegen (z. B. 9 Uhr morgens), kombinieren Sie dies mit setHours:
{%= formatDate(setHours(addDays(stringToDate(profile.subscription.endDate), -7), 9), "dd/MM/yyyy HH:mm") %}
Rezept 4: Anzeige der aktuellen Zeit nur als HH:MM recipe-time-only
Verwenden Sie extractHours und extractMinutes, um nur den Zeitteil mit führenden Nullen für Minuten anzuzeigen:
Ausgabe (Beispiel): Your appointment is at 14:05.
Rezept 5: Unterscheidung von Wochenenden und Werktagen recipe-weekend
Verwenden Sie dayOfWeek, um Inhalte auf Basis des Tags anzupassen. Die Funktion gibt 1 (Montag) bis 7 (Sonntag) zurück. Verwenden Sie den einzelnen Operator = (PQL-Syntax, nicht ==):
dayOfWeek() dient der Anpassung des Inhalts auf Basis des Tags. Wenn Sie Profile in einer Journey abhängig vom Wochentag unterschiedlich weiterleiten möchten, verwenden Sie die integrierte Option Zeitbedingung > Wochentag in der Aktivität „Bedingung“ der Journey. Weitere InformationenRezepte für Arrays und Schleifen array-recipes
Rezept 6: Auflistung aller Elemente aus einem Profil-Array recipe-list-items
Verwenden Sie {{#each}}, um eine Iteration über ein Profil-Array vorzunehmen und jedes Element zu rendern. Dies ist ausschließlich im Personalisierungseditor (E-Mail, SMS, Push) verfügbar:
Ausgabe (Beispiel):
- Running shoes: 89€
- Water bottle: 15€
- Gym bag: 45€
{{#each}} nicht unterstützt. Verwenden Sie zum Filtern von Arrays in Bedingungen Funktionen zur Verwaltung von Sammlungen.Rezept 7: Anzeige der Top-N-Elemente aus einem Array nach Preis recipe-first-n
Verwenden Sie topN, um die Top-N-Elemente nach einem numerischen Feld zu sortieren und abzurufen. Da topN eine PQL-Funktion ist, weisen Sie sie zuerst mit {% let %} einer Variablen zu und durchlaufen Sie dann eine Schleife mit {{#each}}:
topN(profile.orders, price, 3) sortiert Bestellungen nach price in absteigender Reihenfolge und gibt die Top 3 zurück. Es werden also nicht einfach die ersten drei Elemente in der ursprünglichen Array-Reihenfolge zurückgegeben.Sie können auch head verwenden, um nur das relevanteste Element abzurufen:
{%= head(profile.purchases.recentItems).name %}
Rezept 8: Bedingtes Rendern des Inhalts nach Array-Element recipe-conditional-loop
Verwenden Sie {%#if%} in {{#each}}, um die Ausgabe nur für übereinstimmende Elemente zu rendern. Definieren Sie einen Schleifen-Alias mit as |order|, damit der PQL-Auswerter den Attributverweis in der Bedingung auflösen kann:
this.status funktioniert in Handlebars-Ausdrücken, wird aber vom PQL-Auswerter in {%#if%} nicht aufgelöst. Durch die Verwendung eines benannten Schleifen-Alias (z. B. order) wird das Attribut sowohl für den Handlebars- als auch für den PQL-Kontext verfügbar.Zeichenfolgen- und Formatierungsrezepte string-recipes
Rezept 9 – Bereinigen und Wiederverwenden einer Zeichenfolge mit replaceAll recipe-replaceall-reuse
replaceAll gibt einen neuen Wert zurück – das Original wird nicht geändert. Verwenden Sie {% let %}, um das Ergebnis zu speichern und mehrmals darauf zu verweisen, ohne den Funktionsaufruf zu wiederholen:
Ausgabe (Beispiel):
Hi John,
Your exclusive code is: WELCOME-JOHN
Rezept 10 - Einschließen eines Werts in doppelte Anführungszeichen in der JSON-Ausgabe recipe-json-quotes
Um ein Literal in einer Zeichenfolge in doppelte Anführungszeichen einzuschließen (z. B. um JSON für eine benutzerdefinierte Payload zu generieren), maskieren Sie die Anführungszeichen mit einem umgekehrten Schrägstrich (\"):
Ausgabe: { "greeting": "Hello \"John\"" }
Rezept 11 – Formatieren einer Datumskomponente in Großbuchstaben recipe-uppercase-date
Kombinieren Sie formatDate mit upperCase, um Monats- oder Tagesnamen in Großbuchstaben auszugeben:
{%= upperCase(formatDate(getCurrentZonedDateTime(), "MMMM")) %}
Ausgabe (Beispiel): APRIL
Für eine vollständige Datumszeichenfolge in Großbuchstaben:
{%= upperCase(formatDate(profile.person.birthDateTime, "EEEE MMMM dd yyyy")) %}
Ausgabe (Beispiel): WEDNESDAY JANUARY 01 2020
Rezepte für bedingte Logik conditional-recipes
Rezept 12 – IF/ELSEIF/ELSE in personalisierten Inhalten recipe-if-elseif
Verwenden Sie {%#if%}, {%else if%} und {%else%} für eine bedingte Logik mit mehreren Verzweigungen. Dieses Muster funktioniert in E-Mail-Inhalten und -Fragmenten:
Rezept 13 – Null-sichere Attributanzeige recipe-null-safe
Verwenden Sie ein bedingtes Fallback, um zu vermeiden, dass leere Werte dargestellt werden, wenn ein Profilattribut null ist oder fehlt:
Oder inline mit einem Muster im ternären Stil mit isEmpty:
Rezepte für PQL-Randfälle pql-edge-cases
Rezept 14 – Verweisen auf Attributschlüssel mit Bindestrichen recipe-hyphenated-key
Wenn der XDM-Schemafeldname Bindestriche enthält (z. B. order-total, event-type), schließen Sie ihn in einen PQL-Ausdruck mit Backticks ein, um zu verhindern, dass der Bindestrich als Subtraktionsoperator interpretiert wird:
{%= profile.events.`order-total` > 100 %}
{%= ... %}) unterstützt. Sie werden in der reinen Handlebars-Interpolation ({{...}}) nicht akzeptiert. Wenn Sie einen Feldwert mit Bindestrich direkt darstellen müssen, werten Sie ihn über einen PQL-Ausdruck aus oder speichern Sie ihn zuerst mit {% let %} in einer Variablen.Rezept 15 – Verweisen auf eine numerische Ereignis-ID in einem Kontextattribut recipe-numeric-event-id
Wenn Sie ein Journey-Kontextereignis verwenden, dessen ID eine numerische Zeichenfolge ist (z. B. 1697323153), schließen Sie die ID in Backticks ein und verwenden Sie {% let %} mit toDateTime() und formatDate():
Ausgabe (Beispiel): Your appointment: 18/03/2026 14:30
Rezept 16 - Typ-Erzwingung: Vergleichen eines Zeichenfolgenfelds mit einer Zahl recipe-type-coercion
PQL ist strikt typisiert. Wenn ein Profilfeld als Zeichenfolge gespeichert wird, Sie es jedoch numerisch vergleichen müssen, konvertieren Sie es zuerst mit stringToNumber():
{%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}
Für boolesche Felder, die als Zeichenfolgen gespeichert werden:
{%= toBool(profile.consents.email.val) = true %}
This section contains structured knowledge intended to support interpretation, retrieval, and question answering related to this topic.
For complete understanding, this information should be combined with the documentation on this page. Neither source is intended to stand alone; the page describes the feature, while this section provides additional context that helps disambiguate terminology, intent, applicability, and constraints.
- TL;DR: This page provides 16 ready-to-use copy-paste personalization recipes covering dates, arrays, strings, conditional logic, and PQL edge cases for use in Journey Optimizer email, SMS, and push content.
Intents:
- Copy ready-to-use date/time patterns (current date, countdown, offset dates, time display, weekend detection)
- Copy array and loop patterns (list items, top N items, conditional per-item rendering)
- Copy string formatting patterns (clean and reuse strings, JSON quoting, uppercase date components)
- Copy conditional logic patterns (multi-branch if/elseif/else, null-safe attribute display)
- Handle PQL edge cases (hyphenated keys, numeric event IDs, type coercion)
Glossary:
- Personalization recipe: A ready-to-use copy-paste pattern for a common personalization use case, using personalization editor syntax. (product-specific)
formatDate: A function that converts a date to a string using a specified format pattern (e.g."MMMM dd, yyyy").dateDiff: A function that computes the numeric difference between two dates.getCurrentZonedDateTime(): A function returning the current date and time in a time-zone-aware format.topN: A PQL function that sorts an array by a specified numeric field in descending order and returns the top N items. Must be assigned via{% let %}before use in a Handlebars loop.{% let %}: Handlebars variable assignment syntax for storing computed values; required when a PQL function result needs to be referenced in a subsequent Handlebars context.replaceAll: A string function that replaces all occurrences of a pattern in a string; returns a new string without modifying the original.
Guardrails:
{{#each}}is not supported in the journey condition activity; use collection management functions for array filtering in journey conditions.- Backtick escaping for hyphenated attribute keys is only supported inside PQL expressions (
{%= ... %}); backticks are not accepted in plain Handlebars interpolation ({{...}}). topNis a PQL function and must be assigned to a{% let %}variable before being used as a{{#each}}loop target.- When using a loop variable inside a
{%#if%}block, declare a named loop alias (e.g.as |order|);this.statusis not resolved by the PQL evaluator inside{%#if%}. - Use lowercase
yinformatDatepatterns for calendar year;Y(week-based year) may produce unexpected values at year-end boundaries.
Terminology:
- Canonical name: personalization recipe — variants: pattern, template, example, copy-paste pattern
- Do not confuse:
{%= ... %}(PQL expression syntax — evaluated, returns a computed value) ≠{{...}}(Handlebars interpolation — renders a variable or template expression) - Do not confuse:
{%#if%}/{%/if%}(Journey Optimizer conditional syntax, percent-curly braces) ≠{{#if}}/{{/if}}(standard Handlebars conditional syntax) - Do not confuse:
topN(array, field, n)(sorts by field descending, returns top N) ≠head(array)(returns only the first item from the array) - Do not confuse:
dayOfWeek()(used in message content to adapt display based on day) ≠ the journey Time condition “Day of the week” option (used in the journey Condition activity to route profiles differently) - Do not confuse: date format pattern
y(calendar year — correct) ≠Y(week-based year — may produce unexpected results at year boundaries)
FAQ:
- Q: What is the difference between
{%= ... %}and{{...}}in personalization? —{%= ... %}is PQL expression syntax — it is evaluated and returns a computed value (number, string, boolean).{{...}}is Handlebars interpolation — it renders a variable or template expression. Both appear in personalization content but serve different purposes. - Q: How do I use a PQL function result inside a Handlebars
{{#each}}loop? — Assign the PQL function result to a variable using{% let variableName = pqlFunction(...) %}, then use{{#each variableName}}to iterate over it. - Q: Can
{{#each}}be used in a journey condition activity? — No.{{#each}}is available only in message personalization content (email, SMS, push). For array filtering in journey conditions, use collection management functions. - Q: How do I reference a field whose name contains a hyphen? — Wrap the hyphenated key in backticks inside a PQL expression:
{%= profile.events.`order-total` > 100 %}. Backticks are not supported in plain Handlebars interpolation — use a{% let %}variable as an intermediate step if needed. - Q: Why does
topNneed{% let %}before a{{#each}}loop? —topNis a PQL function that returns a PQL list. Assigning it to a{% let %}variable makes the result available in the Handlebars context so it can be iterated with{{#each}}.