Skip to content

Créer des recommandations de produits basées sur des règles

Apprenez à créer un moteur de recommandation basé sur des règles à partir des articles de votre catalogue.

À propos des recommandations de produits basées sur des règles

Un moteur de recommandation basé sur des règles utilise les données des utilisateurs et les informations sur les produits pour suggérer des articles pertinents aux utilisateurs dans les messages. Il utilise Liquid et les catalogues Braze ou le Contenu connecté pour personnaliser dynamiquement le contenu en fonction du comportement et des attributs de l’utilisateur.

Options du moteur de recommandation

Pour choisir le moteur de recommandation adapté à vos ressources disponibles et à vos cas d’utilisation, reportez-vous à ce tableau :

Options du moteur de recommandation
Moteur de recommandation Aucun point de donnée enregistré Solution sans code Pas de Liquid avancé Mise à jour automatique du flux de produits Généré avec l'interface Braze Pas d'hébergement de données ni de résolution des problèmes
Catalogues CSV Oui, si vous utilisez du Liquid pré-généré. Oui, si les recommandations ne sont pas mises à jour fréquemment.
API de catalogues Oui, si les recommandations sont mises à jour toutes les heures.
Contenu connecté
(Recommandations mises à jour en temps réel)
Oui, s'il est généré en dehors de Braze.
Liquid

Créer un moteur de recommandation

Créez votre moteur de recommandation en utilisant soit un catalogue, soit du Contenu connecté :

Pour créer votre moteur de recommandation à l’aide d’un catalogue :

  1. Créez un catalogue de produits.
  2. Pour chaque produit, ajoutez une liste de produits recommandés sous forme de chaîne de caractères séparée par un délimiteur (tel qu’une barre verticale |) dans une colonne nommée « product_recommendations ».
  3. Transmettez au catalogue l’ID du produit pour lequel vous souhaitez trouver des recommandations.
  4. Obtenez la valeur product_recommendations pour ce produit de catalogue et divisez-la par le délimiteur à l’aide d’un filtre Liquid split.
  5. Renvoyez un ou plusieurs de ces ID au catalogue pour collecter les autres détails du produit.

Exemple

Imaginons que vous ayez une application de produits diététiques et que vous souhaitiez créer une campagne de cartes de contenu qui envoie différentes recettes en fonction de la durée d’inscription d’un utilisateur à votre application. Tout d’abord, créez et téléchargez un catalogue à l’aide d’un fichier CSV comprenant les informations suivantes :

Champ Description
id Un nombre unique en corrélation avec le nombre de jours écoulés depuis l’inscription de l’utilisateur à votre application. Par exemple, 3 correspond à trois jours.
type La catégorie de recette, telle que comfort, fresh, et autres.
title Le titre de la carte de contenu qui sera envoyée pour chaque ID, par exemple « Préparer le déjeuner de cette semaine » ou « Taco, parlons-en ».
link Le lien vers l’article de la recette.
image_url L’image qui correspond à la recette.

Une fois le catalogue chargé dans Braze, vérifiez l’aperçu d’une série de produits du catalogue pour confirmer que les informations importées sont exactes. Les éléments peuvent apparaître dans un ordre aléatoire dans l’aperçu, mais cela n’affectera pas le résultat du moteur de recommandation.

Exemple de catalogue dans Braze.

Créez une campagne de cartes de contenu. Dans le compositeur, saisissez la logique Liquid pour déterminer quels utilisateurs doivent recevoir la campagne, ainsi que la recette et l’image à afficher. Dans ce cas d’utilisation, Braze extrait la start_date (ou date d’inscription) de l’utilisateur et la compare à la date du jour. La différence en jours détermine la carte de contenu à envoyer.

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 }}

Par exemple :

Exemple de compositeur de message issu d'une campagne de cartes de contenu.

Dans la section On click behavior, saisissez la logique Liquid pour déterminer où les utilisateurs doivent être redirigés lorsqu’ils cliquent sur la carte de contenu sur les appareils iOS, Android et 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 }}

Par exemple :

Exemple de bloc de comportement au clic dans le compositeur.

Accédez à l’onglet Test et sélectionnez Custom user sous Preview message as user. Saisissez une date dans le champ Custom attribute pour prévisualiser la carte de contenu qui serait envoyée à un utilisateur s’étant inscrit à cette date.

Un exemple d'attribut personnalisé nommé « start_date ».

Pour créer votre moteur de recommandation à l’aide du Contenu connecté, commencez par créer un nouvel endpoint à l’aide de l’une des méthodes suivantes :

Option Description
Convertir une feuille de calcul Convertissez une feuille de calcul en un endpoint API JSON en utilisant un service comme SheetDP, et prenez note de l’URL API ainsi générée.
Créer un endpoint personnalisé Créez, hébergez et maintenez un endpoint interne personnalisé.
Utiliser un moteur tiers Utilisez un moteur de recommandation tiers, tel que l’un de nos partenaires Alloy, notamment Amazon Personalise, Certona, Dynamic Yield, et d’autres.

Ensuite, utilisez Liquid dans votre message pour appeler votre endpoint, faire correspondre une valeur d’attribut personnalisé avec le profil d’un utilisateur et obtenir la recommandation correspondante.

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 %}

Remplacez les éléments suivants :

Attribut Remplacement
YOUR_API_URL Remplacez par l’URL réelle de votre API.
RECOMMENDED_ITEM_IDS Remplacez par le nom réel de votre attribut personnalisé qui contient les ID des éléments recommandés. Cet attribut est censé être une chaîne de caractères d’ID séparés par des points-virgules.
ITEM_ID Remplacez par le nom réel de l’attribut dans votre réponse API qui correspond à l’ID de l’élément.

Exemple

Supposons que vous souhaitiez extraire des recommandations de restaurants de la base de données Zomato Restaurants et enregistrer le résultat dans une variable locale appelée restaurants. Vous pouvez effectuer l’appel de Contenu connecté suivant :

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]}}

Supposons ensuite que vous souhaitiez obtenir des recommandations de restaurants en fonction de la ville et du type de cuisine de l’utilisateur. Vous pouvez le faire en insérant dynamiquement les attributs personnalisés pour la ville et le type de cuisine de l’utilisateur au début de l’appel, puis en affectant la valeur de restaurants à la variable city_food.restaurants.

L’appel de Contenu connecté se présente comme suit :

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]}}

Si vous souhaitez adapter la réponse pour ne récupérer que le nom et la note du restaurant, vous pouvez ajouter des filtres à la fin de l’appel, comme suit :

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}}

Enfin, supposons que vous souhaitiez regrouper les recommandations de restaurants en fonction de leur note. Procédez comme suit :

  1. Utilisez assign afin de créer des tableaux vides pour les catégories de notation « excellent », « très bon » et « bon ».
  2. Ajoutez une boucle for qui examine la note de chaque restaurant de la liste.
    • Si une note est « Excellent », ajoutez le nom du restaurant à la chaîne de caractères excellent_restaurants, puis ajoutez un caractère * à la fin pour séparer chaque nom de restaurant.
    • Si la note est « Very Good », ajoutez le nom du restaurant à la chaîne de caractères very_good_restaurants, puis ajoutez un caractère * à la fin.
    • Si la note est « Good », ajoutez le nom du restaurant à la chaîne de caractères good_restaurants, puis ajoutez un caractère * à la fin.
  3. Limitez le nombre de recommandations de restaurants renvoyées à quatre par catégorie.

Voici à quoi ressemble l’appel 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 %}

Consultez la capture d’écran ci-dessous pour un exemple d’affichage de la réponse sur l’appareil d’un utilisateur.

Rendu d'une liste de restaurants générée par l'appel final de l'exemple.

New Stuff!