Skip to content

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.

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:

Opções de mecanismo de recomendação
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:

  1. Crie um catálogo de produtos.
  2. 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”.
  3. Passe para o catálogo o ID do produto para o qual você deseja encontrar recomendações.
  4. Obtenha o valor product_recommendations para esse item de catálogo e divida-o pelo delimitador com um filtro de divisão Liquid.
  5. 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.

Exemplo de catálogo na Braze.

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
7
8
9
10
{% 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}} %}
{% if items[0].title != blank %}
{{ items[0].body }}
{% else %}
{% abort_message('no card for today') %}
{% endif %}
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:

Um exemplo de criador de mensagem de uma Campaign de cartão de conteúdo.

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:

Um exemplo de bloco de comportamento ao clicar no criador.

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.

Um exemplo de atributo personalizado chamado "start_date".

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.

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:

  1. Use assign para criar arrays em branco para categorias de classificação de “excellent”, “very good” e “good”.
  2. Adicione um loop for que examine a classificação de cada restaurante da lista.
    • Se uma classificação for “Excellent”, acrescente o nome do restaurante à string excellent_restaurants e, 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_restaurants e, em seguida, adicione um caractere * no final.
    • Se uma classificação for “Good”, acrescente o nome do restaurante à string good_restaurants e, em seguida, adicione um caractere * no final.
  3. 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.

Renderização de uma lista de restaurantes gerada pela chamada final de exemplo.

New Stuff!