Criar recomendações de itens baseadas em regras
Aprenda como criar um mecanismo de recomendação baseado em regras a partir dos itens do seu catálogo.
Sobre recomendações de itens baseadas em regras
Um mecanismo de recomendação baseado em regras usa dados de usuários e informações de produtos para sugerir itens relevantes aos usuários dentro das mensagens. Ele usa Liquid e os catálogos da Braze ou Conteúdo conectado para personalizar dinamicamente o conteúdo com base no comportamento e nos atributos do usuário.

As recomendações baseadas em regras são baseadas em uma lógica fixa que você deve definir manualmente. Isso significa que suas recomendações não se ajustarão ao histórico de compras e aos gostos do usuário, a menos que você atualize a lógica.
Para criar recomendações personalizadas de IA que se ajustam automaticamente ao histórico de um usuário, confira recomendações de itens de IA.
Opções de mecanismo de recomendação
Ao decidir qual mecanismo de recomendação se adequa aos seus recursos disponíveis e casos de uso, consulte esta tabela de considerações:
| Mecanismo de recomendação | Nenhum ponto de dados registrado | Solução sem código | Sem Liquid avançado | Atualiza automaticamente o feed de produtos | Gerado com a interface da Braze | Sem hospedagem de dados ou solução de problemas |
|---|---|---|---|---|---|---|
| Catálogos CSV | ✔ | Sim, se usar Liquid pré-gerado. | ✔ | Sim, se as recomendações não forem atualizadas com frequência. | ✔ | ✔ |
| API de catálogos | ✔ | ✔ | Sim, se as recomendações forem atualizadas a cada hora. | ✔ | ✔ | |
| Conteúdo conectado | ✔ | ✔ (Recomendações atualizadas em tempo real) |
Sim, se gerado fora da Braze. | |||
| Liquid | ✔ | ✔ |
Criando um mecanismo de recomendação
Crie seu mecanismo de recomendação usando um catálogo ou Conteúdo conectado:
Para criar seu mecanismo de recomendação usando um catálogo:
- Crie um catálogo de produtos.
- Para cada produto, adicione uma lista de produtos recomendados como uma string separada por um delimitador (como um pipe
|) em uma coluna chamada “product_recommendations”. - Passe para o catálogo o ID do produto para o qual você deseja encontrar recomendações.
- Obtenha o valor
product_recommendationspara esse item de catálogo e divida-o pelo delimitador com um filtro de divisão Liquid. - Passe um ou mais desses IDs de volta para o catálogo para coletar os outros detalhes do produto.
Exemplo
Digamos que você tenha um app de alimentos saudáveis e queira criar uma Campaign de cartão de conteúdo que envie receitas diferentes com base no tempo em que o usuário se inscreveu no seu app. Primeiro, crie e faça upload de um catálogo por meio de um arquivo CSV que inclua as seguintes informações:
| Campo | Descrição |
|---|---|
| id | Um número exclusivo que se correlaciona com o número de dias desde que o usuário se inscreveu no seu app. Por exemplo, 3 corresponde a três dias. |
| type | A categoria da receita, como comfort, fresh e outras. |
| title | O título do cartão de conteúdo que será enviado para cada ID, como “Make ahead for lunch this week” ou “Let’s taco about it”. |
| link | O link para o artigo da receita. |
| image_url | A imagem que corresponde à receita. |
Depois que o catálogo for enviado para a Braze, verifique a pré-visualização de um número selecionado de itens do catálogo para confirmar se as informações foram importadas com precisão. Os itens podem ser randomizados na pré-visualização, mas isso não afetará o resultado do mecanismo de recomendação.

Crie uma Campaign de cartão de conteúdo. No criador, insira a lógica Liquid para determinar quais usuários devem receber a Campaign e qual receita e imagem devem ser exibidas. Nesse caso de uso, a Braze extrairá o start_date do usuário (ou data de inscrição) e o comparará com a data atual. A diferença em dias determinará qual cartão de conteúdo será enviado.
1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].title }}
1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].image_url }}
Por exemplo:

Na seção Comportamento ao clicar, insira a lógica Liquid para onde os usuários devem ser redirecionados quando clicarem no cartão de conteúdo em dispositivos iOS, Android e Web.
1
2
3
4
5
6
{% assign start_date = {{custom_attribute.${start_date}}} | date: "%s" %}
{% assign current_date = "now" | date: "%s" %}
{% assign diff = {{current_date}} | minus: {{start_date}} | divided_by: 86400 %}
{% assign days = {{diff}} | round %}
{% catalog_items Healthy_Recipe_Catalog_SMB {{days}} %}
{{ items[0].link }}
Por exemplo:

Acesse a guia Test e selecione Custom user em Preview message as user. Insira uma data no campo Custom attribute para pré-visualizar o cartão de conteúdo que seria enviado a um usuário que se inscreveu nessa data.

Para criar seu mecanismo de recomendação usando Conteúdo conectado, primeiro crie um novo endpoint usando um dos seguintes métodos:
| Opção | Descrição |
|---|---|
| Converter uma planilha | Converta uma planilha em um endpoint de API JSON usando um serviço como o SheetDP e anote a URL da API que isso gera. |
| Criar um endpoint personalizado | Construa, hospede e mantenha um endpoint personalizado feito internamente. |
| Usar um mecanismo de terceiros | Use um mecanismo de recomendação de terceiros, como um dos nossos parceiros Alloy, incluindo Amazon Personalise, Certona, Dynamic Yield e outros. |
Em seguida, use Liquid na sua mensagem para chamar seu endpoint, combinar um valor de atributo personalizado com o perfil de um usuário e obter a recomendação correspondente.
1
2
3
4
5
6
7
8
{% connected_content YOUR_API_URL :save items %}
{% assign recommended_item_ids_from_user_profile = custom_attribute.${RECOMMENDED_ITEM_IDS} | split: ';' %}
{% for item_id in recommended_item_ids_from_user_profile %}
{% assign recommended_item = items | where: "ITEM_ID", ITEM_ID | first %}
recommended_item.item_name
{% endfor %}
Substitua o seguinte:
| Atributo | Substituição |
|---|---|
YOUR_API_URL |
Substitua pela URL real da sua API. |
RECOMMENDED_ITEM_IDS |
Substitua pelo nome real do seu atributo personalizado que contém os IDs dos itens recomendados. Espera-se que esse atributo seja uma string de IDs separados por ponto e vírgula. |
ITEM_ID |
Substitua pelo nome real do atributo na resposta da sua API que corresponde ao ID do item. |

Este é um exemplo básico e talvez você precise modificá-lo ainda mais com base nas suas necessidades específicas e na estrutura de dados. Para obter orientações mais detalhadas, consulte a documentação do Liquid ou fale com um desenvolvedor.
Exemplo
Digamos que você queira obter recomendações de restaurantes do banco de dados do Zomato Restaurants e salvar o resultado como uma variável local chamada restaurants. Você pode fazer a seguinte chamada de Conteúdo conectado:
1
2
3
4
{% connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:“USER_KEY”} :save restaurants %}
{{city_food.restaurants[0]}}
Em seguida, digamos que você queira obter recomendações de restaurantes com base na cidade e no tipo de comida de um usuário. Isso pode ser feito inserindo dinamicamente os atributos personalizados da cidade e do tipo de alimento do usuário no início da chamada e atribuindo o valor de restaurants à variável city_food.restaurants.
A chamada de Conteúdo conectado ficaria assim:
1
2
3
4
5
6
7
8
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}
{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:“USER_KEY”} :save restaurants %}
{% assign restaurants = city_food.restaurants %}
{{city_food.restaurants[0]}}
Se quiser personalizar a resposta para recuperar apenas o nome e a classificação do restaurante, você pode adicionar filtros ao final da chamada, da seguinte forma:
1
2
3
4
5
6
7
8
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}
{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:”USER_KEY”} :save restaurants %}
{% assign restaurants = city_food.restaurants %}
{{city_food.restaurants[0].restaurant.name}}
{{city_food.restaurants[0].restaurant.user_rating.rating_text}}
Por fim, digamos que você queira agrupar as recomendações de restaurantes por classificação. Faça o seguinte:
- Use
assignpara criar arrays em branco para categorias de classificação de “excellent”, “very good” e “good”. - Adicione um loop
forque examine a classificação de cada restaurante da lista.- Se uma classificação for “Excellent”, acrescente o nome do restaurante à string
excellent_restaurantse, em seguida, adicione um caractere * no final para separar cada nome de restaurante. - Se uma classificação for “Very Good”, acrescente o nome do restaurante à string
very_good_restaurantse, em seguida, adicione um caractere * no final. - Se uma classificação for “Good”, acrescente o nome do restaurante à string
good_restaurantse, em seguida, adicione um caractere * no final.
- Se uma classificação for “Excellent”, acrescente o nome do restaurante à string
- Limite o número de recomendações de restaurantes retornadas a quatro por categoria.
Esta é a aparência da chamada final:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{% assign city_id = {{custom_attribute.${city_id} | default: ‘306’}} %}
{% assign food_type = {{custom_attribute.${food_type} | default: ‘471’}} %}
{%- connected_content https://developers.zomato.com/api/v2.1/search?entity_id={{city_id}}&entity_type=city&count=20&cuisines={{food_type}}&sort=rating:headers{“user-key”:”USER_KEY”} :save restaurants %}
{% assign restaurants = city_food.restaurants %}
{% assign excellent_restaurants = “” %}
{% assign very_good_resturants = “” %}
{% assign good_restaurants = “” %}
{% for list in restaurants %}
{% if {{list.restaurant.user_rating.rating_text}} == `Excellent` %}
{% assign excellent_restaurants = excellent_restaurants | append: list.restaurant.name | append: `*` %}
{% elsif {{list.restaurant.user_rating.rating_text}} == `Very Good` %}
{% assign very_good_restaurants = very_good_restaurants | append: list.restaurant.name | append: `*` %}
{% elsif {{list.restaurant.user_rating.rating_text}} == `Good` %}
{% assign good_restaurants = good_restaurants | append: list.restaurant.name | append: `*` %}
{% endif %}
{% endfor %}
{% assign excellent_array = excellent_restaurants | split: `*` %}
{% assign very_good_array = very_good_restaurants | split: `*` %}
{% assign good_array = good_restaurants | split: `*` %}
Excellent places
{% for list in excellent_array %}
{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}
Very good places
{% for list in very_good_array %}
{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}
Good places
{% for list in good_array %}
{{list}}
{% assign total_count = total_count | plus:1 %}
{% if total_count >= 4 %}
{% break %}
{% endif %}
{% endfor %}
Veja na captura de tela abaixo um exemplo de como a resposta é exibida no dispositivo de um usuário.
