# Usando templates Liquid

Os templates Liquid ampliam significativamente as capacidades de personalização do Pushwoosh, implementando uma lógica sofisticada além do uso regular de [Conteúdo Dinâmico](/pt/developer/guides/personalization/dynamic-content/).

A personalização de mensagens no Pushwoosh é baseada em [Tags (dados do usuário)](/pt/developer/guides/audience-and-segmentation/tags/). O Pushwoosh oferece uma variedade de [Tags padrão](/pt/developer/guides/audience-and-segmentation/tags/#default-tags) e [Tags personalizadas](/pt/developer/guides/audience-and-segmentation/tags/#custom-tags). Usando-as, você pode especificar o nome do usuário, cidade, histórico de compras, etc., para enviar uma mensagem mais personalizada, por exemplo: Olá `{Primeiro_nome}`, obrigado por pedir `{item}`.

Os templates Liquid adicionam mais lógica ao conteúdo dinâmico. Por exemplo, se a tag de assinatura de um usuário contiver "gratuito", você pode enviar a ele uma mensagem: “Aproveite seu desconto de 10%.”

Modificar o conteúdo da mensagem de acordo com os IDs, comportamentos e preferências dos usuários é a maneira mais eficiente de aumentar a relevância e obter resultados mais impressionantes de suas campanhas de marketing.

## Sintaxe

Os templates de conteúdo baseados no [Liquid da Shopify](https://shopify.github.io/liquid/) usam uma combinação de [**tags**](/pt/developer/guides/personalization/liquid-templates/#tags), [**objetos**](/pt/developer/guides/personalization/liquid-templates/#objects) e [**filtros**](/pt/developer/guides/personalization/liquid-templates/#filters) para carregar conteúdo dinâmico. Os templates de conteúdo permitem que você acesse certas variáveis de dentro de um template e exiba seus dados sem precisar saber nada sobre os dados em si.

<Aside type="note">
Para saber mais sobre a sintaxe, consulte a [documentação do Liquid](https://shopify.github.io/liquid/basics/introduction/).
</Aside>

### Objetos

`objetos` definem o conteúdo que será exibido para um usuário. `objetos` devem ser colocados entre chaves duplas: `{{ }}`

Por exemplo, ao personalizar uma mensagem, envie `{{Nome}}` em seu corpo para adicionar os nomes dos usuários ao conteúdo da mensagem. O nome do usuário (valor da tag Nome) substituirá o objeto Liquid em uma mensagem que o usuário verá.

<Tabs>
  <TabItem label="Entrada">

```

Olá {{Name}}! Que bom que você voltou!

```

  </TabItem>

  <TabItem label="Saída">
    Olá Anna! Que bom que você voltou!
  </TabItem>
</Tabs>


### Tags

`tags` criam a lógica e o fluxo de controle para os templates. Os delimitadores de chave e porcentagem `{%` e `%}` e o texto que eles envolvem não produzem nenhuma saída visível quando o template é renderizado. Isso permite que você atribua variáveis e crie condições ou loops sem mostrar nenhuma lógica do Liquid para o usuário.

Por exemplo, usando a tag `if`, você pode variar o idioma da mensagem com base no idioma definido no dispositivo do usuário:

<Tabs>
  <TabItem label="Entrada">

```liquid
{% if Language == 'fr' %}
Salut!
{% else %}
Hello!
{% endif %}
````

  </TabItem>

  <TabItem label="Saída (fr)">
    Salut!
  </TabItem>

  <TabItem label="Saída (es)">
    Hello!
  </TabItem>
</Tabs>

### Operadores de tags

<table data-header-hidden><thead><tr><th width="189.5" align="center">Operador</th><th>Descrição</th></tr></thead><tbody><tr><td align="center"><code>==</code></td><td>igual a</td></tr><tr><td align="center"><code>!=</code></td><td>diferente de</td></tr><tr><td align="center"><code>></code></td><td>maior que</td></tr><tr><td align="center"><code>&#x3C;</code></td><td>menor que</td></tr><tr><td align="center"><code>>=</code></td><td>maior ou igual a</td></tr><tr><td align="center"><code>&#x3C;=</code></td><td>menor ou igual a</td></tr><tr><td align="center"><code>or</code></td><td>ou lógico</td></tr><tr><td align="center"><code>and</code></td><td>e lógico</td></tr><tr><td align="center"><code>contains</code></td><td>verifica a presença de uma substring dentro de uma string ou array de strings</td></tr></tbody></table>

<Aside type="note">
Em tags com mais de um operador `and` ou `or`, os operadores são verificados em ordem _da direita para a esquerda_. Você não pode alterar a ordem das operações usando parênteses — parênteses são caracteres inválidos no Liquid e impedirão que suas tags funcionem.
</Aside>

### Filtros

`filtros` modificam a saída de um objeto ou variável Liquid. Eles são usados dentro de chaves duplas `{{ }}` e na atribuição de variáveis, e são separados por um caractere de pipe `|`. Vários filtros podem ser usados em uma única saída e são aplicados da esquerda para a direita.


<Tabs>
<TabItem label="Entrada">

```

{{ Name | capitalize | prepend:"Hello " }}

```

</TabItem>

<TabItem label="Saída">

Hello Anna

</TabItem>
</Tabs>

## Usando templates Liquid em mensagens enviadas via API

Use a sintaxe Liquid em suas solicitações [`createMessage`](/pt/developer/api-reference/messages-api/#createmessage) para implementar os templates Liquid. Os templates estão disponíveis para o parâmetro "content" da solicitação `createMessage`, bem como para qualquer outro parâmetro que suporte Conteúdo Dinâmico, em particular, os parâmetros específicos da plataforma "title", "subtitle" e "image".

Ao usar templates de conteúdo, você pode especificar os dados em suas solicitações de API (passando o parâmetro "template_bindings") ou obter os dados dos valores de Tag armazenados nos dispositivos dos usuários (não usando o parâmetro "template_bindings"). Dessa forma, você pode criar campanhas de push baseadas no usuário contendo conteúdo extremamente relevante.

<Aside type="note">
Por favor, note que, ao contrário do Conteúdo Dinâmico, as variáveis nos templates devem ser colocadas entre chaves duplas da seguinte forma: `{{myVariable}}`.
</Aside>

Para definir a lógica do template usando Tags com espaços em seus nomes, use a seguinte técnica:

**Exemplo**

```
{% capture my_tag %}{{My Tag}}{% endcapture %}
{% if my_tag == 'value' %}
Conteúdo a ser enviado neste caso
{% else %}
Conteúdo a ser enviado caso contrário
{% endif %}
```
## Casos de uso de templates Liquid

Aqui você encontrará vários casos de uso em que os templates Liquid são úteis.

### Push multilíngue

Os templates Liquid tornam possível especificar definitivamente em que idioma os usuários devem receber suas mensagens de push. Veja o exemplo simples da solicitação de API e a mensagem recebida dependendo dos `template bindings` usados na solicitação.


<Tabs>
<TabItem label="Entrada Liquid">

```

{% if Language == 'es' %}
¡Hola!
{% else %}
Hello!
{% endif %}

````

</TabItem>

<TabItem label="Solicitação de API">

```javascript
{
  "request": {
    "application": "XXXXX-XXXXX", // Código do aplicativo Pushwoosh
    "auth": "yxoPUlw.....IyEX4H", // Token de acesso à API do Painel de Controle Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
       "content": "{% raw %}
{% if language == 'es' %}¡Hola!{% else %}hello!{% endif %}
{% endraw %}",
        "template_bindings": { // opcional. Quando nenhum template_bindings é passado em uma solicitação, os valores de Tag do dispositivo são usados.
         "language" : "es"
        }
      }
    ]
  }
}
````

</TabItem>

<TabItem label="Saída">

**O idioma é 'es'**:
¡Hola!

**O idioma é 'en'**:
Hello!

</TabItem>
</Tabs>


### Lembrete de upgrade de assinatura

Incentive seus clientes a atualizarem sua assinatura com base no plano atual.

<Tabs>
  <TabItem label="Entrada Liquid">

```

{% if Subscription == 'Basic' %}
    Atualize para o Silver para obter mais recursos do produto e suporte 24/7.
{% elsif Subscription == 'Silver' %}
    Atualize para o Gold para suporte prioritário e recursos avançados.
{% else %}
    Entre em contato com seu gerente para renovar sua assinatura.
{% endif %}

````

</TabItem>

<TabItem label="Solicitação de API">

```json
{
  "request": {
    "application": "XXXXX-XXXXX", // Código do aplicativo Pushwoosh
    "auth": "yxoPUlw.....IyEX4H", // Token de acesso à API do Painel de Controle Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
       "content": "{% raw %}
{% if Subscription == 'Basic' %}Atualize para o Silver para obter mais recursos do produto e suporte 24/7.{% elsif Subscription == 'Silver' %}Atualize para o Gold para suporte prioritário e recursos avançados.{% else %}Entre em contato com seu gerente para renovar sua assinatura. {% endif %}
{% endraw %}",
        "template_bindings": { // opcional. Quando nenhum template_bindings é passado em uma solicitação, os valores de Tag do dispositivo são usados.
         "language" : "es"
        }
      }
    ]
  }
}
````

  </TabItem>

  <TabItem label="Saída">

**Para usuários com plano de assinatura Básico:**
Atualize para o Silver para obter mais recursos do produto e suporte 24/7.

**Para usuários com plano de assinatura Silver:**
Atualize para o Gold para suporte prioritário e recursos avançados.

**Para usuários com outros planos:**
Entre em contato com seu gerente para renovar sua assinatura.

  </TabItem>
</Tabs>


### Tags de lista

Os templates de conteúdo são bastante úteis para lidar com Tags do tipo Lista.

#### Tamanho da variável

Um dos possíveis casos de uso é entregar conteúdo diferente dependendo do número de valores que a Tag contém. Por exemplo, você pode fornecer descontos diferentes para clientes com comportamentos diferentes. Digamos que o cliente tenha alguns itens em sua WishList — incentive-os a comprar com o desconto mais adequado com base em quantos produtos eles vão comprar!


<Tabs>
<TabItem label="Entrada Liquid">

```

{% if WishList.size >= 3 %}
Obtenha 20% de desconto na sua próxima compra!
{% elsif WishList.size == 2 %}
Obtenha 10% de desconto na sua próxima compra!
{% else %}
Ei, dê uma olhada nos novos casacos!
{% endif %}

````

</TabItem>

<TabItem label="Solicitação de API">

```javascript
{
  "request": {
    "application": "XXXXX-XXXXX", // Código do aplicativo Pushwoosh
    "auth": "yxoPUlw.....IyEX4H", // Token de acesso à API do Painel de Controle Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
       "content": "{% raw %}
{% if WishList.size >= 3 %}Obtenha 20% de desconto na sua próxima compra!{% elsif WishList.size == 2 %}Obtenha 10% de desconto na sua próxima compra!{% else %}Ei, dê uma olhada nos novos casacos!{% endif %}
{% endraw %}",
        "template_bindings": {
         "WishList" : ["Skinny Low Ankle Jeans", "Linen Trenchcoat", "High Waisted Denim Skirt", "Strappy Tiered Maxi Dress"]
        }
      }
    ]
  }
}
````

</TabItem>

<TabItem label="Tamanho da WishList ≥ 3">

<img src="/personalization-liquid-templates-1.webp" alt="Visualização de e-mail com tamanho da lista de desejos maior ou igual a 3" width="200"/>

</TabItem>

<TabItem label="Tamanho da WishList = 2">

<img src="/personalization-liquid-templates-2.webp" alt="Visualização de e-mail com tamanho da lista de desejos igual a 2" width="200"/>

</TabItem>
</Tabs>

#### A variável contém

Outro caso que você pode precisar cobrir é lidar com os valores das Tags de Lista e entregar o conteúdo mais relevante com base nos valores que a Tag contém.

<Tabs>
<TabItem label="Entrada Liquid">

```

{% if WishList contains 'Skinny Low Ankle Jeans' %}
Obtenha 20% de desconto nos produtos da sua lista de desejos!
{% else %}
Ei, dê uma olhada nos novíssimos Skinny Low Ankle Jeans!
{% endif %}

````

</TabItem>

<TabItem label="Solicitação de API">

```javascript
{
  "request": {
    "application": "C90C0-0E786",
    "auth": "yxoPUlw.....IyEX4H", // Token de acesso à API do Painel de Controle Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
       "content": "{% raw %}
{% if WishList contains 'Skinny Low Ankle Jeans' %}Obtenha 20% de desconto na sua próxima compra!{% else %}Ei, dê uma olhada nos novíssimos Skinny Low Ankle Jeans!{% endif %}
{% endraw %}",
        "template_bindings": {
         "WishList" : ["Skinny Low Ankle Jeans", "Linen Trenchcoat", "High Waisted Denim Skirt", "Strappy Tiered Maxi Dress"]
        }
      }
    ]
  }
}
````

</TabItem>

<TabItem label="A variável contém dados">

<img src="/personalization-liquid-templates-3.webp" alt="Template personalizado com dados" width="200"/>

</TabItem>

<TabItem label="A variável não contém dados">

<img src="/personalization-liquid-templates-4.webp" alt="Visualização de fallback quando os dados estão ausentes" width="200"/>

</TabItem>
</Tabs>


### Plurais

Usando os templates de conteúdo, você pode ajustar o conteúdo da mensagem de acordo com o comportamento dos usuários. Por exemplo, você pode modificar o texto da mensagem para conter palavras no plural caso a Tag de Lista contenha mais de um valor.


<Tabs>
<TabItem label="Entrada Liquid">

```
    Obtenha 20% de desconto no item
{% if WishList.size > 1 %}
    s da sua WishList!
{% else %}
    da sua Wishlist!
{% endif %}

````

</TabItem>

<TabItem label="Solicitação de API">

```javascript
{
  "request": {
    "application": "C90C0-0E786",
    "auth": "yxoPUlw.....IyEX4H", // Token de acesso à API do Painel de Controle Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
       "content": "Obtenha 20% de desconto no item{% raw %}
{% if WishList.size > 1 %}s da sua WishList!{% else %} da sua Wishlist!{% endif %}
{% endraw %}",
        "template_bindings": { // opcional. Quando nenhum template_bindings é passado em uma solicitação, os valores de Tag do dispositivo são usados.
         "WishList" : ["Skinny Low Ankle Jeans", "Linen Trenchcoat", "High Waisted Denim Skirt", "Strappy Tiered Maxi Dress"]
        }
      }
    ]
  }
}
````

</TabItem>

<TabItem label="Plural">

<img src="/personalization-liquid-templates-5.webp" alt="Exemplo de template na forma plural" width="200"/>

</TabItem>

<TabItem label="Singular">

<img src="/personalization-liquid-templates-6.webp" alt="Exemplo de template na forma singular" width="200"/>

</TabItem>
</Tabs>

### Fuso horário

O template para fusos horários converte a data e a hora de acordo com o fuso horário especificado.

<Tabs>
<TabItem label="Entrada Liquid">
```
{{ MyDate | timezone: MyTimezone | date: \"%Y-%m-%d %H:%M\" }}
```
</TabItem>

<TabItem label="Solicitação de API">
```javascript title="Exemplo"
{
  "request" : {
    "auth" : "3H9bk8w3.....Acge2RbupTB", // Token de acesso à API do Painel de Controle Pushwoosh
    "application" : "XXXXX-XXXXX", // Código do aplicativo Pushwoosh
    "notifications" : [ // parâmetros da mensagem de push
      {
        "content": "Data Atual: {{ MyDate | timezone: MyTimezone | date: \"%Y-%m-%d %H:%M\" }}",
        "template_bindings": { // opcional. Quando nenhum template_bindings é passado em uma solicitação, os valores de Tag do dispositivo são usados.
         "MyDate" : "2019-07-23 15:00",
         "MyTimezone" : "Asia/Dubai"
        }
      }
    ]
  }
}
```
</TabItem>
<TabItem label="Saída"> <img src="/personalization-liquid-templates-7.webp" alt="Saída de data personalizada em notificação de push" width="200"/>
</TabItem>
</Tabs>


## Conteúdo conectado

O conteúdo conectado é um recurso nos templates Liquid que permite recuperar e usar dinamicamente dados de uma fonte externa, como um serviço web, diretamente em suas mensagens de e-mail ou notificação de push. Esse recurso permite a personalização em tempo real, buscando dados JSON de uma URL especificada e salvando-os em uma variável que pode ser utilizada em seu conteúdo.

#### Principais casos de uso

- **Recomendações de produtos**: Exiba listas de produtos personalizadas e adaptadas a cada usuário.

- **Códigos promocionais**: Insira códigos promocionais exclusivos gerados por um serviço de backend.

#### Pré-requisitos

* Para usar o Conteúdo Conectado, você deve ter seu próprio serviço de backend que gera e fornece os dados necessários (por exemplo, códigos promocionais, recomendações de produtos) com base no **User ID, HWID ou tags personalizadas**. O Pushwoosh então busca esses dados antes de enviar uma mensagem.

### Guia de implementação passo a passo


#### Passo 1. Configure o serviço de backend

O serviço de backend deve:

* Aceitar uma solicitação contendo parâmetros específicos do usuário (por exemplo, `userId`). O Conteúdo Conectado suporta `UserID`, `HWID` ou qualquer tag personalizada que você tenha configurado em seu projeto.
* Retornar uma resposta JSON com os dados necessários. Este conteúdo pode então ser inserido dinamicamente nas mensagens.

<Aside type="note" title="Como funciona">

O serviço de backend atua como um provedor de dados, respondendo a solicitações HTTP com informações específicas do usuário.

1. O Pushwoosh envia uma solicitação ao seu backend, passando identificadores específicos do usuário como parâmetros de consulta.
2. Seu backend processa a solicitação e recupera os dados solicitados.
3. Seu backend retorna uma resposta JSON.
4. Antes de enviar uma mensagem, o Pushwoosh busca a resposta JSON do serviço de backend e usa os valores retornados (por exemplo, o `code`) no conteúdo da mensagem dinamicamente.

**Exemplo de resposta**

```
{ "code": "OFERTAESPECIALPARAUSUARIO12345" }
```
</Aside>



#### Passo 2. Crie uma predefinição com Conteúdo Conectado no Pushwoosh

1. No [editor de conteúdo de Push](/pt/product/content/push-presets/) ou [E-mail](/pt/product/content/email-content/drag-and-drop-email-editor/), insira a sintaxe do Conteúdo Conectado no campo da mensagem.

**Exemplo**

```
{% connected_content http://your-backend-url.com?userId={{ ${userid} }} :save result %}
```
**Detalhamento da sintaxe**
|  |  |
| ----- | ----- |
| `connected_content` | Busca dados JSON da URL de backend especificada. |
|    `http://your-backend-url.com` | O endpoint do backend que retorna os dados necessários em formato JSON. |
| `userId={{ ${userid} }}` | Um parâmetro de consulta dinâmico que passa o ID do usuário para o backend. |
| `:save result` | Armazena a resposta JSON buscada na variável `result` para uso em templates Liquid. |

![Insira a sintaxe do Conteúdo Conectado](/connectedcontent.webp)

**Autenticação (opcional)**

Se o seu serviço de backend exigir autenticação, você pode incluir uma chave de API ou token na solicitação do Conteúdo Conectado para garantir o acesso seguro.

```
{% connected_content http://your-backend-url.com?userId={{ ${userid} }}&auth=SUA_CHAVE_DE_API :save result %}
```

Você também pode enviar dados de autenticação (ou quaisquer outros) como cabeçalhos HTTP usando o parâmetro opcional `:headers` — um objeto JSON de nomes e valores de cabeçalho.

```
{% connected_content http://your-backend-url.com?userId={{ ${userid} }} :headers {"Authorization": "Bearer SEU_TOKEN", "X-Api-Key": "SUA_CHAVE_DE_API"} :save result %}
```
|  |  |
| ----- | ----- |
| `:headers {...}` | Um objeto JSON de cabeçalhos HTTP enviados com a solicitação, por exemplo, `Authorization: Bearer <token>`. |

<Aside type="caution" title="Apenas valores estáticos">
As variáveis de personalização `${}` funcionam apenas dentro da URL. Os valores dentro de `:headers` são estáticos e não são interpolados.
</Aside>

**Usando tags no Conteúdo Conectado**

Para incluir tags personalizadas, insira-as como parâmetros de consulta na solicitação de **Conteúdo Conectado** (`{{ nome_da_tag }}`).

```
{% connected_content http://your-backend-url.com?userId={{ ${userid} }}{{ Language }} :save result %}
```

2. Em seguida, adicione o texto da mensagem incorporando os **dados recuperados**, assim:

```

Ei, {{userid}}, pegue seu código promocional pessoal - {{result.code}}
```

![Adicione o texto da mensagem com os **dados recuperados**](/connectedcontent-1.webp)

3. Após finalizar o conteúdo da mensagem e configurar as definições da predefinição, salve-a para reutilização em campanhas.

<video src="/connectedcontent-2.webm" title="Envie uma mensagem com conteúdo conectado" autoplay loop muted playsinline />

#### Passo 3. Envie uma mensagem usando a predefinição configurada

Envie uma mensagem com esta predefinição usando o formulário de [push único](/pt/product/messaging-channels/push-notifications/send-push-notifications/one-time-push/#how-to-send-a-push-notification-using-the-one-time-push-form) ou [e-mail](/pt/product/messaging-channels/emails/send-email/#how-to-send-a-one-time-email) ou uma [jornada do cliente](/pt/product/customer-journey/pushwoosh-journey-overview/).

<Aside type="caution" title="Importante">
Se o serviço retornar um status diferente de HTTP 200 OK, o e-mail ou a notificação de push não será enviado. Isso garante que sua comunicação só seja enviada se os dados necessários forem recuperados com sucesso.
</Aside>