Nesta página: encontre receitas de personalização prontas para uso para datas, matrizes, cadeias de caracteres, lógica condicional e casos de borda do PQL que você pode copiar diretamente para o conteúdo do Adobe Journey Optimizer.
Esta página fornece padrões de personalização prontos para uso para os casos de uso mais comuns no Adobe Journey Optimizer. Todos os exemplos usam a sintaxe do editor de personalização e podem ser copiados diretamente para o conteúdo de email, SMS ou push.
Para obter uma referência completa das funções disponíveis, consulte Funções auxiliares, Funções de data/hora, Funções de cadeia de caracteres e Funções de matriz.
Receitas de data e hora date-time-recipes
Receita 1 — Exibir a data atual em um formato legível recipe-current-date
Use formatDate com getCurrentZonedDateTime() para renderizar a data de hoje em qualquer formato:
{%= formatDate(getCurrentZonedDateTime(), "MMMM dd, yyyy") %}
Saída (exemplo): April 11, 2026
Padrões comuns de formato:
"dd/MM/yyyy"11/04/2026"MM/dd/yyyy"04/11/2026"EEEE, MMMM dd"Saturday, April 11"yyyy-MM-dd"2026-04-11y (ano civil) em vez de Y (ano baseado em semana) para evitar resultados inesperados nos limites do ano. Consulte caracteres padrão para obter a referência completa.Receita 2 — Contagem regressiva para uma data de expiração ou de evento recipe-countdown
Use dateDiff para calcular o número de dias restantes até um atributo de data de perfil e, em seguida, renderizá-lo dinamicamente:
Saída (exemplo): Your reward points expire in 7 days. Use them before they're gone!
Receita 3 — X dias antes de uma data final dinâmica recipe-days-before
Para calcular uma data X dias antes de um atributo de perfil (por exemplo, para referência em conteúdo ou linhas de assunto), use addDays com um deslocamento negativo:
{%= formatDate(addDays(stringToDate(profile.subscription.endDate), -7), "MMMM dd, yyyy") %}
Saída (exemplo): April 04, 2026 (7 dias antes de 11 de abril)
Para também definir uma hora fixa do dia (por exemplo, 9h), combine com setHours:
{%= formatDate(setHours(addDays(stringToDate(profile.subscription.endDate), -7), 9), "dd/MM/yyyy HH:mm") %}
Fórmula 4 — Exibir a hora atual somente como HH:MM recipe-time-only
Use extractHours e extractMinutes para mostrar apenas a parte de tempo, com uma proteção zero à esquerda por minutos:
Saída (exemplo): Your appointment is at 14:05.
Fórmula 5 — Detectar fim de semana vs. dia da semana recipe-weekend
Use dayOfWeek para adaptar o conteúdo com base no dia. A função retorna 1 (segunda-feira) a 7 (domingo). Usar o operador único = (sintaxe PQL, não ==):
dayOfWeek() é para adaptar o conteúdo com base no dia. Para perfis de roteamento diferentes em uma jornada com base no dia da semana, use a opção incorporada Condição de tempo → Dia da semana na atividade Condição de jornada. Saiba maisReceitas de matriz e loop array-recipes
Fórmula 6 — Listar todos os itens de uma matriz de perfis recipe-list-items
Use {{#each}} para iterar sobre uma matriz de perfil e renderizar cada item. Isso está disponível somente no editor de personalização (email, SMS, push):
Saída (exemplo):
- Running shoes: 89€
- Water bottle: 15€
- Gym bag: 45€
{{#each}} na atividade de condição de jornada. Para filtragem de matriz em condições, use funções de gerenciamento de coleção.Receita 7 — Mostrar os N itens principais de uma matriz por preço recipe-first-n
Use topN para classificar e recuperar os N itens principais por um campo numérico. Como topN é uma função PQL, atribua-a a uma variável primeiro com {% let %} e, em seguida, execute um loop com {{#each}}:
topN(profile.orders, price, 3) classifica os pedidos por price em ordem decrescente e retorna os 3 primeiros — não retorna simplesmente os 3 primeiros itens na ordem original da matriz.Ou use head para obter apenas o único item superior:
{%= head(profile.purchases.recentItems).name %}
Fórmula 8 — Renderizar conteúdo condicionalmente por item da matriz recipe-conditional-loop
Use {%#if%} dentro de {{#each}} para renderizar a saída somente para itens correspondentes. Defina um alias de loop com as |order| para que o avaliador do PQL possa resolver a referência de atributo na condição:
this.status funciona em expressões Handlebars, mas não foi resolvido pelo avaliador do PQL dentro de {%#if%}. Usar um alias de loop nomeado (por exemplo, order) torna o atributo disponível para os contextos Handlebars e PQL.Cadeia de caracteres e receitas de formatação string-recipes
Receita 9 — Limpar uma string com replaceAll e reutilizá-la recipe-replaceall-reuse
replaceAll retorna um novo valor — ele não modifica o original. Use {% let %} para armazenar o resultado e referenciá-lo várias vezes sem repetir a chamada de função:
Saída (exemplo):
Hi John,
Your exclusive code is: WELCOME-JOHN
Receita 10 — Aspas duplas em um valor na saída JSON recipe-json-quotes
Para incluir aspas duplas literais em uma cadeia de caracteres (por exemplo, gerando JSON para uma carga personalizada), use uma barra invertida (\") para escapará-la:
Saída: { "greeting": "Hello \"John\"" }
Fórmula 11 — Formatar um componente de data em maiúsculas recipe-uppercase-date
Combine formatDate com upperCase para renderizar os nomes de mês ou dia em maiúsculas:
{%= upperCase(formatDate(getCurrentZonedDateTime(), "MMMM")) %}
Saída (exemplo): APRIL
Para uma string de data em maiúsculas completa:
{%= upperCase(formatDate(profile.person.birthDateTime, "EEEE MMMM dd yyyy")) %}
Saída (exemplo): WEDNESDAY JANUARY 01 2020
Receitas de lógica condicional conditional-recipes
Receita 12 — IF/ELSEIF/ELSE no conteúdo personalizado recipe-if-elseif
Use {%#if%}, {%else if%} e {%else%} para lógica condicional de várias ramificações. Esse padrão funciona em conteúdo e fragmentos de email:
Receita 13 — Exibição de atributo seguro nulo recipe-null-safe
Use um fallback condicional para evitar a renderização de valores vazios quando um atributo de perfil for nulo ou estiver ausente:
Ou incorporado com um padrão de estilo ternário usando isEmpty:
receitas de caso de borda do PQL pql-edge-cases
Fórmula 14 — Fazer referência a uma chave de atributo hifenizada recipe-hyphenated-key
Se o nome do campo de esquema XDM contiver hifens (por exemplo, order-total, event-type), coloque-o entre acentos graves dentro de uma expressão PQL para impedir que o hífen seja interpretado como um operador de subtração:
{%= profile.events.`order-total` > 100 %}
{%= ... %}). Eles não são aceitos na interpolação ({{...}}) de Handlebars simples. Se você precisar renderizar um valor de campo hifenizado diretamente, avalie-o por meio de uma expressão PQL ou armazene-o em uma variável usando {% let %} primeiro.Receita 15 — Fazer referência a uma ID de evento numérica em um atributo de contexto recipe-numeric-event-id
Ao usar um evento de contexto de jornada cuja ID é uma sequência numérica (por exemplo, 1697323153), coloque a ID entre acentos graves e use {% let %} com toDateTime() e formatDate():
Saída (exemplo): Your appointment: 18/03/2026 14:30
Fórmula 16 — Coerção de tipo: comparar um campo de string com um número recipe-type-coercion
O PQL é altamente digitado. Quando um campo de perfil é armazenado como uma cadeia de caracteres, mas você precisa compará-lo numericamente, converta-o primeiro com stringToNumber():
{%= stringToNumber(profile.loyalty.pointsBalance) > 500 %}
Para campos booleanos armazenados como strings:
{%= 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}}.