Un KPI personnalisé est une formule que vous écrivez une fois et que vous réutilisez partout où un KPI peut être sélectionné dans Feedier : insights, rapports, graphiques KPI, tableaux de scores et benchmarks. Il est recalculé en direct, en tenant compte des filtres et du périmètre d'équipe de la page sur laquelle il est affiché.
Où créer un KPI personnalisé
Rendez-vous dans Paramètres → Modèle de données → Formules de KPI.
Cliquez sur Ajouter une formule.
Renseignez le Nom, une Description facultative, puis la Formule.
Choisissez un Suffixe (
%,/5,min, une devise…) et un Format (0,0.0,0.00,0,0,0,00).Activez Plus bas est mieux lorsqu'une valeur plus faible est le résultat souhaité, puis définissez la Visibilité du KPI pour vos équipes.
La formule est exécutée au moment de l'enregistrement. Si elle ne peut pas être calculée, Feedier la refuse avec le message « Cette formule est invalide. »
Bonnes pratiques pour créer vos KPI
Utilisez des noms simples et intuitifs, compréhensibles au premier coup d'œil. Évitez le jargon.
Ajoutez une courte description dès que le périmètre du KPI n'est pas évident à la lecture de son nom. Toute personne lisant un rapport doit savoir ce que le chiffre recouvre.
Renseignez toujours le suffixe et le format. Un KPI sans unité est mal interprété :
%pour les pourcentages,/5pour les notes,minouhpour les durées, un symbole monétaire pour les montants. Il n'existe pas de champ préfixe : le suffixe est ajouté après la valeur.Activez Plus bas est mieux pour les KPI dont la baisse est une bonne nouvelle (taux de détracteurs, attrition, temps de réponse, effort client), afin que les tendances et les couleurs soient lues dans le bon sens partout sur la plateforme.
Préférez un KPI clair par question. Deux formules simples sont plus faciles à maintenir qu'une formule qui fait tout.
Comprendre le constructeur de formules
Un KPI personnalisé est une expression mathématique construite à partir d'une ou plusieurs fonctions Feedier. Chaque fonction peut être restreinte à l'aide de conditions.
➡️ Une condition s'écrit toujours sous la forme d'un groupe de trois valeurs :
fonction("parametre.propriete", "operateur", "valeur")Élément | Rôle | Exemple |
Fonction | La métrique que vous voulez mesurer. |
|
Paramètre + propriété | Le champ sur lequel vous filtrez, écrit avec un point : le paramètre, puis la propriété. |
|
Opérateur | La manière dont la valeur doit correspondre. Voir 3. Opérateurs ci-dessous. |
|
Valeur | Une valeur unique, ou un tableau de valeurs. |
|
Assemblés :
feedback("import.type", "=", "trustpilot")⚠️ Les guillemets droits autour du paramètre, de l'opérateur et de la valeur sont obligatoires. Seuls les booléens et les nombres placés dans un tableau peuvent s'écrire sans guillemets.
Plusieurs conditions
Répétez le groupe de trois. Les conditions sont combinées avec un ET, et le nombre total d'arguments doit toujours être un multiple de trois.
feedback("survey.id", "=", "1526", "nps.profile", "=", "promoter")Plusieurs valeurs pour une même condition
Passez un tableau. Les valeurs d'un tableau sont combinées avec un OU.
feedback("team.id", "=", ["1234", "323", "12332"])Aucune condition
Une fonction appelée sans argument renvoie la métrique sur l'ensemble du périmètre appliqué à la page.
feedback()
Chaque fonction est toujours restreinte par les filtres, la période et le périmètre d'équipe de la page sur laquelle le KPI est affiché, en plus des conditions que vous écrivez. Une formule ne peut jamais renvoyer des données qu'un utilisateur n'a pas le droit de voir.
Combiner des fonctions
Les fonctions se combinent avec +, -, *, /, ^ (puissance), % (modulo) et des parenthèses.
feedback("nps.profile", "=", "detractor") / feedback() * 100Une division par zéro renvoie 0 au lieu d'échouer. Un KPI bloqué à 0 vient souvent d'un dénominateur qui ne correspond à rien.
1. Fonctions
Toutes les fonctions disponibles dans le constructeur de formules, et ce qu'elles renvoient.
Fonction | Résultat | Unité / échelle |
| Nombre de feedbacks correspondant aux conditions. | Compte |
| Nombre de feedbacks ayant au moins une réponse correspondante. | Compte |
| Nombre d'invitations envoyées (e-mail + SMS). | Compte |
| Net Promoter Score. | −100 à 100 |
| Taux de satisfaction. | 0 à 100 |
| Score de sentiment du texte analysé. | 0 à 100 |
| Customer Effort Score. | Échelle de la question |
| Moyenne des questions de notation. | Échelle de la question |
| Moyenne des tableaux de notation. | Échelle de la question |
| Temps moyen pour compléter une enquête. | Minutes |
| Temps moyen de résolution d'un feedback. | Secondes |
| Impact financier estimé. | Devise |
| Agrégation d'un attribut numérique. | Unité de l'attribut |
| Une valeur lue depuis une API externe. | Libre |
feedback()
Nombre de feedbacks correspondant aux conditions.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
feedback() | Tous les feedbacks du périmètre courant. |
feedback("import.type", "=", "google_review") | Feedbacks importés depuis les avis Google. |
feedback("team.id", "=", "9921") | Feedbacks d'une équipe.
Feedbacks de plusieurs équipes. |
feedback("segment.id", "=", "1234") | Feedbacks appartenant à un segment. |
feedback("survey.id", "=", "1526") | Feedbacks collectés sur une source. |
feedback("question.type", "=", "nps") | Feedbacks contenant une question NPS. |
feedback("question.id", "=", "1526") | Feedbacks contenant la question 1526.
Feedbacks contenant l'une ou l'autre question. |
feedback("question.option_name", "=", "Petit déjeuner") | Feedbacks dans lesquels le choix ou la ligne de tableau « Petit déjeuner » a été répondu. |
feedback("topic.name", "=", "Frais de livraison") | Feedbacks associés au thème « Frais de livraison ». |
feedback("attribute.name", "=", "city") | Feedbacks portant l'attribut
Feedbacks dont |
feedback("nps.profile", "=", "promoter") | Feedbacks des promoteurs. |
feedback("feedback.type", "=", "completed") | Feedbacks complétés. Voir la note sur |
⚠️ push.canal et push.status ne sont pas acceptés par feedback(). Ils ne fonctionnent que dans push(). Une formule qui les utilise dans feedback() est refusée comme invalide.
response()
Nombre de feedbacks ayant au moins une réponse correspondant aux conditions.
Contrairement à feedback(), les conditions de response() sont évaluées au niveau de la réponse, ce qui donne tout son sens à l'opérateur strict == : plusieurs conditions écrites avec == doivent être satisfaites par une seule et même réponse.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
response("question.id", "=", "11111") | Feedbacks dans lesquels la question 11111 a été répondue. |
response("response.value", "=", [4, 5], | Feedbacks avec au moins une note à 4 ou 5. |
response("response.value", "==", "5", | Feedbacks où la ligne « Petit déjeuner » elle-même a été notée 5 — les deux conditions portent sur la même réponse. |
response("feedback.type", "=", "incomplete", | Feedbacks laissés incomplets dans lesquels une question texte a été répondue. |
push()
Nombre d'invitations à donner un feedback envoyées via les enquêtes Feedier (e-mails et SMS).
Accepte : push et survey uniquement. Seul l'opérateur = est supporté.
Formule | Résultat |
push() | Toutes les invitations envoyées pour les sources du périmètre. |
push("push.canal", "=", "sms") | Invitations envoyées par SMS. |
push("push.status", "=", "bounce") | Invitations ayant rebondi. |
push("push.status", "=", ["opened", "clicked"]) | Invitations ouvertes ou cliquées. |
push("push.includeFollowUps", "=", true, | Toutes les invitations, relances comprises. |
push("survey.id", "=", "1526") | Invitations envoyées pour une source. |
push() lit les données d'envoi des enquêtes Feedier. Cette fonction nécessite une connexion Feedier Survey sur votre espace de travail et renvoie 0 en son absence, ou lorsqu'aucune source Feedier Survey n'est dans le périmètre. Les invitations n'existent que pour les feedbacks collectés via les enquêtes Feedier — jamais pour les imports CSV, API, SFTP ou avis.
nps()
Net Promoter Score = % de promoteurs − % de détracteurs, calculé uniquement sur les questions NPS.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
nps() | NPS du périmètre courant. |
nps("survey.id", "=", "11") | NPS d'une source. |
nps("team.id", "=", "9921") | NPS d'une équipe. |
nps("segment.id", "=", "111") | NPS d'un segment. |
nps("import.type", "=", "csv") | NPS des feedbacks importés par CSV. |
nps("question.id", "=", "11") | NPS d'une question NPS précise. La question doit être de type |
nps("attribute.name", "=", "country:France") | NPS des feedbacks dont l'attribut |
satisfaction()
Taux de satisfaction moyen, de 0 à 100.
Le taux de satisfaction est calculé par Feedier sur chaque feedback, à partir de tous les éléments notés qu'il contient. Les questions texte exclues du taux lors du mapping d'import ne sont pas comptées.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
satisfaction() | Taux de satisfaction du périmètre courant. |
satisfaction("survey.id", "=", "11") | Taux de satisfaction d'une source. |
satisfaction("team.id", "=", "9921") | Taux de satisfaction d'une équipe. |
satisfaction("topic.name", "=", "Emballage") | Taux de satisfaction des feedbacks associés au thème « Emballage ». |
satisfaction("nps.profile", "=", "detractor") | Taux de satisfaction des détracteurs. |
sentiment()
Score de sentiment moyen du texte analysé, de 0 à 100.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
sentiment() est la fonction où la différence entre opérateurs standards et stricts compte le plus, car un feedback peut contenir plusieurs verbatims associés à des thèmes différents.
Formule | Résultat |
sentiment("topic.name", "=", "Emballage") | Sentiment des feedbacks entiers auxquels le thème « Emballage » est associé — y compris ce qu'ils disent du reste. |
sentiment("topic.name", "==", "Emballage") | Sentiment des verbatims uniquement portant le thème « Emballage ». |
sentiment("topic.name", "!=", "Emballage") | Sentiment des feedbacks auxquels le thème n'est pas associé. |
sentiment("topic.name", "!==", "Emballage") | Sentiment des feedbacks, sans compter les verbatims associés à « Emballage ». |
sentiment("question.name", "==", "Qu'avez-vous trouvé le plus difficile ?") | Sentiment de cette question précise uniquement, sur l'ensemble des feedbacks. |
ces()
Customer Effort Score moyen, calculé uniquement sur les questions de type CES.
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
ces() | CES du périmètre courant. |
ces("topic.name", "=", "Livraison") | CES des feedbacks associés au thème « Livraison ». |
ces("question.id", "=", "1526") | CES d'une question CES précise. |
ratings()
Valeur moyenne des questions de notation (questions de notation simples uniquement).
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
ratings() | Note moyenne du périmètre courant. |
ratings("question.id", "=", "1526") | Moyenne d'une question de notation. |
ratings("attribute.name", "=", "gender:female") | Note moyenne des feedbacks dont l'attribut |
ratingsTable()
Valeur moyenne des tableaux de notation (une question composée de plusieurs lignes à noter).
Accepte : attribute, feedback, import, nps, question, response, segment, survey, team, topic.
Formule | Résultat |
ratingsTable() | Moyenne de tous les tableaux de notation du périmètre. |
ratingsTable("question.option_name", "=", "Petit déjeuner") | Moyenne de la ligne « Petit déjeuner ». |
ratingsTable("question.type", "=", "nps") | Moyenne des tableaux de notation, limitée aux feedbacks contenant également une question NPS. |
time()
Temps moyen pour compléter une enquête, renvoyé en minutes.
Accepte : feedback, import, nps, question, segment, survey uniquement.
Formule | Résultat |
time() | Temps moyen de complétion du périmètre courant, en minutes. |
time("survey.id", "=", "1324") | Temps moyen de complétion de la source 1324. |
time() * 60 | La même valeur exprimée en secondes. |
resolutionTime()
Temps moyen entre la création d'un feedback et le moment où il est marqué comme résolu, renvoyé en secondes.
Accepte : feedback, import, nps, question, segment, survey uniquement.
Formule | Résultat |
resolutionTime() | Temps moyen de résolution, en secondes. |
resolutionTime() / 3600 | Temps moyen de résolution en heures. |
resolutionTime() / 86400 | Temps moyen de résolution en jours. |
resolutionTime("survey.id", "=", "1324") | Temps moyen de résolution pour une source. |
Seuls les feedbacks assignés à un responsable sont pris en compte. Les feedbacks non assignés n'entrent jamais dans la moyenne. Pensez à diviser le résultat et à renseigner le suffixe correspondant (h, j) sur le KPI.
financial()
Impact financier estimé des feedbacks du périmètre.
La valeur est calculée ainsi : (opportunites - risques) x valeur moyenne du client. Un feedback est classé en opportunité ou en risque à partir du sentiment de ses verbatims.
Accepte : financial uniquement.
Formule | Résultat |
financial() | Impact net : opportunités moins risques. |
financial("financial.type", "=", "risk") | Chiffre d'affaires à risque. La valeur est négative, puisque seul le versant risque est compté. |
financial("financial.type", "=", "opportunity") | Chiffre d'affaires d'opportunité. |
Cette fonction utilise la Valeur moyenne du client définie dans Paramètres → Équipes → Avancé. Si cette valeur n'est pas renseignée, financial() renvoie 0.
attribute_avg(), attribute_sum(), attribute_min(), attribute_max(), attribute_qty()
Agrègent les valeurs d'un attribut numérique sur les feedbacks du périmètre.
Ces cinq fonctions s'utilisent de la même manière et ne diffèrent que par l'opération : moyenne, somme, minimum, maximum et nombre de valeurs.
Accepte : aggregate_attribute (obligatoire), attribute, feedback, import, nps, response, segment, survey, team, topic. Le paramètre question n'est pas disponible ici.
Formule | Résultat |
attribute_sum("aggregate_attribute.name", "=", "order_amount") | Total de l'attribut |
attribute_avg("aggregate_attribute.name", "=", "order_amount") | Montant moyen des commandes. |
attribute_avg("aggregate_attribute.name", "=", "order_amount", | Montant moyen des commandes des détracteurs. |
attribute_max("aggregate_attribute.id", "=", "1232") | Valeur la plus élevée de l'attribut 1232. |
attribute_qty("aggregate_attribute.name", "=", "order_amount") | Nombre de feedbacks portant une valeur pour cet attribut. |
aggregate_attribute désigne l'attribut à agréger, tandis que attribute est un simple filtre. Dans attribute_avg("aggregate_attribute.name", "=", "order_amount", "attribute.name", "=", "city:Berlin"), Feedier calcule la moyenne de order_amount sur les feedbacks provenant de Berlin. L'attribut doit contenir des valeurs numériques.
url()
Appelle un point d'accès JSON externe et utilise l'une de ses valeurs dans votre KPI.
Accepte : link uniquement, avec la propriété link.link.
url("link.link", "=", "https://exemple.com/api/metric~data.value")Élément | Description |
L'URL | Doit commencer par |
Le chemin après ~ | Tout ce qui suit le |
| Remplacé par les filtres appliqués à la page, afin que votre point d'accès renvoie une valeur cohérente avec le tableau de bord. |
| Remplacés par l'identité de l'utilisateur qui consulte le KPI. |
| Remplacé par la clé d'API privée de l'espace de travail. Utile pour appeler l'API publique de Feedier elle-même. |
⚠️ La requête est envoyée avec la clé d'API privée de votre espace de travail : ne pointez url() que vers des points d'accès que vous contrôlez ou en lesquels vous avez confiance. Un point d'accès lent provoque l'expiration du délai et l'échec de toute la formule.
2. Paramètres et propriétés
Un paramètre est le champ sur lequel vous filtrez. La propriété vient après le point et indique à Feedier sous quelle forme la valeur est fournie — un identifiant, un nom, un type…
Paramètre.propriété | Valeurs acceptées | Remarques |
| Un identifiant ou un nom d'attribut, suivi si besoin de |
|
| Un identifiant ou un nom d'attribut. | Obligatoire pour les fonctions |
| Un identifiant de feedback. | — |
|
| Ne s'applique qu'aux feedbacks des enquêtes Feedier : un feedback importé depuis une autre source n'est ni complet ni incomplet, et se trouve exclu dès que vous utilisez ce paramètre. |
|
| Uniquement pour |
| La source d'où provient le feedback : | La valeur doit exister dans votre espace de travail. Il n'existe pas de valeur |
| Une URL en | Uniquement pour |
|
| Les promoteurs notent 9–10, les passifs 7–8, les détracteurs 0–6. La valeur est |
|
| Uniquement pour |
|
| Uniquement pour |
|
| Uniquement pour |
| Un identifiant de question, ou son libellé exact. | Le libellé doit correspondre exactement, accents et ponctuation compris. |
|
| Des sources anciennes peuvent encore porter les types hérités |
| L'identifiant ou le libellé d'un choix, ou d'une ligne de tableau de notation. | — |
| Une valeur, ou un tableau de valeurs : | La réponse elle-même. À combiner avec une condition |
| Un identifiant de segment. | — |
| Un identifiant de source. | — |
| Un identifiant d'équipe. | — |
| Le nom exact d'un thème. | Les thèmes proviennent de votre taxonomie d'analyse sémantique. |
Les valeurs sont vérifiées dans votre propre espace de travail au moment de l'enregistrement. Un identifiant d'équipe, un nom de thème ou un libellé de question inconnu rend toute la formule invalide, même si le reste est correct. Le plus rapide pour récupérer un identifiant est d'ouvrir la page correspondante dans Feedier et de le lire dans l'URL.
3. Opérateurs
L'opérateur se place entre le paramètre et la valeur, et détermine à quel niveau la condition est évaluée.
Opérateur | Portée | Description |
| Feedback entier 📦 | Conserve les feedbacks pour lesquels la condition est vraie au niveau du feedback. |
| Feedback entier 🚫 | Exclut les feedbacks pour lesquels la condition est vraie au niveau du feedback. |
| Élément du feedback 🎯 | Strict. La condition doit être satisfaite par un seul élément — une réponse, un verbatim, une occurrence de thème. Plusieurs conditions strictes doivent porter sur le même élément. |
| Élément du feedback 🚫 | Exclusion stricte. Retire les éléments correspondants du calcul, mais conserve le reste du feedback. |
Deux règles à retenir
Les opérateurs stricts
==et!==ne sont autorisés que sur les paramètresquestion,responseettopic. Ailleurs, la formule est refusée.===,=!et==!n'existent pas. Les quatre opérateurs ci-dessus sont les seuls valides.
L'illustration la plus parlante est sentiment() sur un thème :
Formule | Ce qui est mesuré |
sentiment("topic.name", "=", "Emballage") | Les feedbacks entiers qui mentionnent l'emballage — y compris ce qu'ils disent de tout le reste. |
sentiment("topic.name", "==", "Emballage") | Uniquement les verbatims qui parlent d'emballage. |
sentiment("topic.name", "!=", "Emballage") | Les feedbacks qui ne mentionnent jamais l'emballage. |
sentiment("topic.name", "!==", "Emballage") | Tous les feedbacks, moins ce qu'ils disent de l'emballage. |
4. Les KPI personnalisés les plus utilisés
Taux de réponse
feedback("import.type", "=", "feedier_survey") / push() * 100Suffixe %. Les deux côtés de la division doivent provenir de la même source : les invitations ne sont générées que lorsque vous envoyez une campagne d'enquête Feedier. Les feedbacks issus de tout autre import (CSV, API, SFTP, Salesforce, avis…) ne peuvent donc pas contribuer à un taux de réponse et sont exclus du numérateur.
Exemple — une source mélangeant CSV et enquête Feedier :
Feedbacks collectés : 238, dont 57 issus d'une enquête Feedier et 181 d'un CSV
Invitations envoyées : 654
Taux de réponse = 57 / 654 = 8,7 % — les 181 feedbacks CSV sont exclus
Si votre périmètre ne contient aucun feedback d'enquête Feedier, ce KPI renvoie 0. C'est le comportement attendu, pas une anomalie.
Taux de détracteurs
feedback("nps.profile", "=", "detractor")
/ (feedback("nps.profile", "=", "promoter")
+ feedback("nps.profile", "=", "passive")
+ feedback("nps.profile", "=", "detractor")) * 100Suffixe %. Activez Plus bas est mieux sur ce KPI.
Taux de promoteurs
feedback("nps.profile", "=", "promoter")
/ (feedback("nps.profile", "=", "promoter")
+ feedback("nps.profile", "=", "passive")
+ feedback("nps.profile", "=", "detractor")) * 100Taux de satisfaction sur les questions de notation (CSAT)
feedback("response.value", "=", [4, 5], "question.type", "=", "ratings")
/ feedback("question.type", "=", "ratings") * 100Suffixe %. Part des feedbacks dont la note est 4 ou 5, parmi ceux qui contiennent une question de notation.
Taux de réponse sur une note donnée
response("response.value", "=", [3, 4, 5], "question.id", "=", "123274")
/ feedback("question.id", "=", "123274") * 100Part des feedbacks provenant des avis Google
feedback("import.type", "=", "google_review") / feedback() * 100Le dénominateur est feedback() sans condition, qui couvre tout le périmètre. Il n'existe pas de type d'import "all".
Part des répondants ayant choisi une option donnée
feedback("question.option_name", "=", "Option A")
/ feedback("question.type", "=", "choices") * 100Temps moyen de résolution en heures
resolutionTime() / 3600
Suffixe h, format 0.0, Plus bas est mieux activé.
Chiffre d'affaires à risque
financial("financial.type", "=", "risk")Suffixe : votre devise. La valeur est négative, ce qui est bien ce que l'on attend sur une tuile « chiffre d'affaires à risque ».
Panier moyen des détracteurs
attribute_avg("aggregate_attribute.name", "=", "order_amount",
"nps.profile", "=", "detractor")5. Résoudre les problèmes
Symptôme | Cause | Solution |
« Cette formule est invalide. » | La formule est exécutée à l'enregistrement. La moindre erreur — syntaxe, valeur inconnue, paramètre non supporté — bloque la sauvegarde. | Vérifiez les trois points ci-dessous dans l'ordre : syntaxe, valeurs, paramètres supportés. |
Erreur de syntaxe | Un guillemet ou une virgule manquante, des parenthèses déséquilibrées, ou un nombre d'arguments qui n'est pas un multiple de trois. | Chaque condition compte exactement trois arguments : |
Valeur inconnue | Un identifiant d'équipe, un nom de thème, un libellé de question ou un type d'import qui n'existe pas dans votre espace de travail. | Copiez le libellé exact, accents compris, ou récupérez l'identifiant dans l'URL de la page correspondante dans Feedier. |
Paramètre non supporté | Le paramètre n'est pas accepté par cette fonction — par exemple | Consultez la ligne Accepte de la fonction en section 1. |
Opérateur non supporté |
| Revenez à |
Le KPI affiche 0 | Une division par zéro renvoie 0. Le périmètre peut aussi simplement ne contenir aucun feedback correspondant. | Créez temporairement le numérateur et le dénominateur comme deux KPI séparés pour identifier celui qui est vide. |
| Aucune connexion Feedier Survey sur l'espace de travail, ou aucune source Feedier Survey dans le périmètre courant. | Les invitations n'existent que pour les enquêtes Feedier. Vérifiez la source des feedbacks que vous mesurez. |
| Le point d'accès est trop lent et le délai expire, ou le chemin placé après le | Testez l'URL en dehors de Feedier, et vérifiez le chemin exact de la clé recherchée. |
La valeur semble fausse d'un facteur | Une unité n'a pas été convertie : | Divisez le résultat et renseignez le suffixe correspondant sur le KPI. |
