Receitas de personalização personalization-recipes

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.

TIP
Antes de copiar os exemplos, analise as práticas recomendadas da Personalization para evitar os erros de sintaxe mais comuns.

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:

Padrão
Exemplo de saída
"dd/MM/yyyy"
11/04/2026
"MM/dd/yyyy"
04/11/2026
"EEEE, MMMM dd"
Saturday, April 11
"yyyy-MM-dd"
2026-04-11
NOTE
Use letras minúsculas y (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:

{% let daysLeft = dateDiff(getCurrentZonedDateTime(), stringToDate(profile.loyalty.expiryDate)) %}
{%#if daysLeft > 0%}
Your reward points expire in {{daysLeft}} day{%#if daysLeft > 1%}s{%/if%}. Use them before they're gone!
{%else%}
Your reward points have expired.
{%/if%}

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:

{% let h = extractHours(getCurrentZonedDateTime()) %}
{% let m = extractMinutes(getCurrentZonedDateTime()) %}
Your appointment is at {{h}}:{%#if m < 10%}0{%/if%}{{m}}.

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 ==):

{%#if dayOfWeek(getCurrentZonedDateTime()) = 6 or dayOfWeek(getCurrentZonedDateTime()) = 7%}
We're closed on weekends — our team will follow up on the next business day.
{%else%}
Our team will get back to you within 24 hours.
{%/if%}
NOTE
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 mais

Receitas 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):

{{#each profile.purchases.recentItems}}
  - {{this.name}}: {{this.price}}&euro;
{{/each}}

Saída (exemplo):

- Running shoes: 89&euro;
- Water bottle: 15&euro;
- Gym bag: 45&euro;
NOTE
Não há suporte para {{#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}}:

{% let topOrders = topN(profile.orders, price, 3) %}
{{#each topOrders}}
  {{this.name}} — {{this.price}}&euro;
{{/each}}
NOTE
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:

{{#each profile.orders as |order|}}
  {%#if order.status = "pending"%}
  Order {{order.id}} is pending — we'll notify you when it ships.
  {%/if%}
{{/each}}
NOTE
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:

{% let cleanName = replaceAll(profile.person.name.firstName, "[^a-zA-Z]", "") %}
Hi {{cleanName}},
Your exclusive code is: WELCOME-{%= upperCase(cleanName) %}

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:

{ "greeting": "Hello \"{{profile.person.name.firstName}}\"" }

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:

{%#if profile.loyalty.tier = "gold"%}
As a Gold member, enjoy free shipping on all orders.
{%else if profile.loyalty.tier = "silver"%}
As a Silver member, enjoy free shipping on orders over &euro;50.
{%else%}
Join our loyalty program to unlock exclusive benefits.
{%/if%}

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:

{%#if profile.person.name.firstName%}
Hi {{profile.person.name.firstName}},
{%else%}
Hi there,
{%/if%}

Ou incorporado com um padrão de estilo ternário usando isEmpty:

Hi {%#if isEmpty(profile.person.name.firstName)%}valued customer{%else%}{{profile.person.name.firstName}}{%/if%},

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 %}
NOTE
Os acentos graves só têm suporte em expressões PQL ({%= ... %}). 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():

{% let appointmentDate = formatDate(toDateTime(context.journey.events.`1697323153`.timestamp), "dd/MM/yyyy HH:mm") %}
Your appointment: {{appointmentDate}}

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 %}
AI Knowledge Reference

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 ({{...}}).
  • topN is 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.status is not resolved by the PQL evaluator inside {%#if%}.
  • Use lowercase y in formatDate patterns 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 topN need {% let %} before a {{#each}} loop? — topN is 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}}.
recommendation-more-help
journey-optimizer-help