Skip to main content

Custom KPI

Julien Chil avatar
Written by Julien Chil
Updated this week

The Value of Feedier KPIs

Our KPIs are designed to provide:

  1. Live Data – Stay updated with real-time performance tracking.

  2. Clear Insights – Gain actionable insights at a glance.

  3. Easy Scoping – Quickly focus on what matters without unnecessary complexity.

Locations of KPIs:

  • Create custom KPIs: Settings → KPI Formula

  • View your KPIs: Dashboard, Report → KPI

Manage your KPIs in a dedicated settings page (only accessible by admins and editors).


Pre Built KPI’s

  • NPS (Net Promoter Score) →The formula is: % Promoters - % Detractors.

  • Satisfaction Ratio → How we measure Satisfaction Ratio.

  • CES (Customer Effort Score) → Average score of all CES question type answers.

  • Number of Feedback → Count of feedbacks.

  • Attribute Values QTY → Amount of attribute values for a given attribute



Creating a Custom KPI

The benefit of adding a manual KPI is you have further flexibility of what type of metric you’d like to track. You can use percentages, decimal places, and other words like minutes or seconds.

  1. Navigate to the KPI Formula tab of the Settings page,

  2. Click on the + Add Formula button next to the search bar. This opens the Create KPI Formula Modal.

  3. On the Create KPI Formula Modal

    1. Give a name to your KPI

    2. Give it a concise description

    3. Start building your custom formula.

    4. Add a suffix
      Example: "$"

    5. Choose a formatting type for the show value

  4. Click Save and see your KPI be added to the table


KPI best practices

You want to build KPIs that are relevant to the goals of your team or organisation.


Creating KPIs

  1. Ensure KPIs have simple, intuitive names that are easy to understand at a glance. Avoid jargon.

  2. Add brief descriptions for KPIs that require additional clarification. This ensures everyone understands the data's purpose and scope.

  3. Incorporate appropriate suffixes or units, such as /5 for ratings, % for percentages, or $ for monetary values.


Using KPIs Effectively

When adding KPIs to reports, focus on selecting only the most relevant ones to avoid cluttering dashboards with unnecessary data. Ensure that the selected KPIs align with the overall goals of the report and the needs of the intended audience.


Tips for Success

To ensure KPIs remain valuable, conduct regular reviews to confirm they are still relevant. Standardize naming, formatting, and metric definitions across all reports to make them familiar and consistent. Collaborate with stakeholders and reviewers to ensure the KPIs align with their expectations and provide the insights they need.

With our KPI formula builder, you can create customized metrics using an intuitive logic structure. This guide will explain the key components and syntax to help you effectively build formulas for your specific needs.


Understanding the Formula Builder

The formula builder lets you create custom KPIs using three main components:

  1. Functions: Define the metric you want to measure.
    Example: feedback()

  2. Parameters: Narrow the scope of the metric.
    Example: "import.type", "=", "trustpilot"

  3. Properties: Specify detailed attributes using dot notation.
    Example: "import.type", "=", "trustpilot"


Combine all of them to reach a formula:

function("paramerter_name.property", "=", "parameter_value")


You can then use common mathematical logic to build more complex formulas :

(feedback("import.type", "=", "google") / feedback("import.type", "=", "all")) * 100 


Please note, adding " " around each value is mandatory for the formula to work.



Functions

Function

Parameters

Custom Formula examples

feedback()

count of feedbacks

import.type







team.id













segment.id

















survey.id








question.type







question.id








question.name








question.option_id








question.option_name










topic.name








attribute.id







attribute.name











feedback.id








feedback.type








push.canal








push.status





nps.profile=("promoter", "detractor" or "neutral")

feedback("import.type", "=", "google_review")


Count of feedback imported from Google Reviews.


feedback("team.id", "=", "9921")


Count of feedback that matches a single team


feedback("team.id", "=", ["1234", "323", "12332"])


Count of feedback that matches multiple teams



feedback("segment.id","=","1234")


Count of feedback that matches a single segment



feedback("segment.id","="," ["1234", "323", "12332"])


Count of feedback that matches multiple segments



feedback("survey.id", "=", "1526")


Count of feedback that matches a single survey




feedback("question.type", "=", "nps")


Count of feedback that includes NPS questions.



feedback("question.id", "=", "1526")


Count of feedback that are having the question 1526



feedback("question.name", "=", "Tell us more")


Count of feedback that matches a question by name



feedback("question.option_id", "=", "1234")


Count of feedback that matches a choice or rating table option



feedback("question.option_name", "=", "experience")


Count of feedback that matches the label of a choice or rating table option



feedback("topic.name", "=", "shipping cost")


Count of feedback that matches a specific topic name



feedback("attribute.id", "=", "1232:male")


Count of feedback that matches the value ‘male’ by id


feedback("attribute.name", "=", "city")


feedback("attribute.name", "=", "city:Berlin")


Count of feedback that matches a specific attribute by name or with a value


feedback("feedback.id", "=", "2312")


Count of feedback that matches a specific feedback by id



feedback("feedback.type", "=", "completed")


Count of feedback that has either been complete or incomplete.



feedback("push.canal", "=", "sms")


Count of feedback that matches whether feedback pushes were email or sms


feedback("push.status", "=", ["clicked", "opened"])


Count of feedback that matches the status of pushes


feedback()/push()


Count of response rate that matches the status of pushes


(feedback("response.value","=",[4,5],"question.type","=","slider")/feedback("question.type","=","slider"))*100


Average CSAT for all rating questions


feedback("question.option_name","=","a")/feedback("question.type","=","select")*100


Percentage of those that answered 'a' for all choice questions

push()

Count of sent emails and SMS

push.canal


push.status


push.includeFollowUps

push("push.status", "=", "bounced")


Count of pushes that matches the status of push


push("push.includeFollowUps","=",true,"push.status","=",["scheduled","requested"])


Count of ALL pushes including followups

nps()

Net Promoter Score

import.type


team.id


segment.id


survey.id


question.type=nps


question.name=name of an nps question


question.id(if it has a nps question)


feedback.type(if it has a nps question)


nps.profile=("promoter", "detractor" or "neutral")

nps("segment.id", "=", "987")


NPS score based on this particular segment of feedback

sentiment()

Sentiment score average

import.type


team.id


segment.id


survey.id


topic.name


question.type=textarea


question.name=name of a Text item


question.id(if it has a Text item)


feedback.type(if it has a Text item)


nps.profile=("promoter", "detractor" or "neutral")

sentiment("topic.name", "=", "Packaging")


Sentiment score of the entire feedbacks having the topic “Packaging” attached


sentiment("topic.name", "==", "Packaging")


Sentiment score of the text item within feedbacks having the topic “Packaging“ attached


sentiment("topic.name", "!=", "Packaging")


Sentiment score of feedbacks not having the topic “Packaging” attached



sentiment("topic.name", "!==", "Packaging")


Sentiment score of the feedbacks without counting the sentiment of verbatims having the topic Packaging attached



sentiment("question.name", "=", "What did you find most challenging?")


Sentiment score of the entire feedbacks having the question"What did you find most challenging?"


sentiment("question.name", "==", "What did you find most challenging?")


Sentiment score of the specific question What did you find most challenging?" in all feedbacks


sentiment("question.name", "!=", "What did you find most challenging?")


Sentiment score of the entire feedbacks not having the question"What did you find most challenging?"


sentiment("question.name", "!==", "What did you find most challenging?").


Sentiment score of the entire feedbacks without counting the sentiment of the question "What did you find most challenging?"

satisfaction()

Satisfaction ratio

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.id


question.type


feedback.type


nps.profile=("promoter", "detractor" or "neutral")

satisfaction("survey.id", "=", "7362")

Satisfaction Ratio of feedback based on this particular survey


satisfaction("topic.name", "=", "Packaging")

Satisfaction score of feedbacks having the topic “Packaging” attached


satisfaction("topic.name", "!=", "Packaging")

Satisfaction score of feedbacks not having the topic “Packaging” attached


satisfaction("question.type","=","ratingsTable")

Satisfaction Ratio of feedback having at least one rating question answered


satisfaction("question.type","!=","ratingsTable")

Satisfaction Ratio of feedback not having a single rating question answered

ces()

Customer Effort Score

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.type=ces


question.name=name of a ces question


question.id(if it has a CES question)


feedback.type(if it has a CES question)


nps.profile=("promoter", "detractor" or "neutral")

ces("topic.name", "=", "delivery")

Customer effort score based on this particular topic

ratings()

single rating questions only

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.type=slider


question.name=name of a Ratings question


question.id(if it has a Ratings question)


feedback.type(if it has a Ratings question)


nps.profile=("promoter", "detractor" or "neutral")

ratings("attribute.name", "=", "gender:female")

Average rating score based on those that have an attribute name collected that corresponds to ‘gender’ and is female


ratings("question.name", "=", "How would you rate us ?")

Average rating score of feedbacks the question "How would you rate us ?"


ratings("question.name", "==", "How would you rate us ?")

Average rating score of the specific question "How would you rate us ?" within all feedbacks


ratings("question.id", "!=", "1111 ?")

Average rating score of feedbacks not having the specific question 1111


ratings("question.id", "!==", "1111 ?")

Average rating score of feedbacks without counting the rating of question id 1111

ratingsTable()

multiple rating question options

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.type=ratingsTable


question.name=name of a ratingsTable question


question.id(if it has a Ratings Table question)


feedback.type(if it has a Ratings Table question)


nps.profile=("promoter", "detractor" or "neutral")

ratingsTable(“question.type", "=", "nps")

Average rating table score based on feedback that also has collected nps

url()*

Create a new custom API call that returns the value located with Dot Notation Value.

*This is a special case where only a link can be added to this function

"url.{dot-notation-value}"

url("link.link", "=", "http://google.com")
This would pick up a data point linked to the url chosen

volume()

count of a given parameter

survey.id(count of questions)


question.type(count of question type)


attribute.id(count of attribute values)


attribute.name(count of attribute values)


nps.profile=("promoter", "detractor" or "neutral")

volume("attribute.name", "=", "country:Poland")

Total count of times the attribute country = Poland was recorded on the platform


response()

selection of certain responses to a question

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.id


feedback.type


questions.type=ratings


questions.name=

response.value


nps.profile=("promoter", "detractor" or "neutral")

response("feedback.type", "=", "incomplete","question.type","=","textarea")

Count of text answers where the feedback was not fully complete

response("question.id", "==", "11111")
Only answers specifically related to question 11111

time()

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.id


feedback.type


questions.type=ratings


questions.name=

response.value


nps.profile=("promoter", "detractor" or "neutral")

time("survey.id", "=", "1324")

Total time it takes to complete survey with id 1324

financial()

financial.type

financial("financial.type", "=", "risk")

financial count of revenue at risk

resolutionTime()

import.type


team.id


segment.id


survey.id


topic.name


attribute.id


attribute.name


question.id


feedback.type


questions.type=ratings


questions.name=

response.value


nps.profile=("promoter", "detractor" or "neutral")

resolutionTime("survey.id", "=", "1324")

Total time it takes to resolve feedbacks from the feedback creation date to the status is “resolved” for survey with id 1324

The resolutionTime is in seconds make sure to adapt it to your needs:

  • Hours: resolutionTime()/3600

  • Days: resolutionTime()/86400

Don’t forget you can stack multiple parameters together, for example, if you wanted to find total feedback of google reviews that had completed feedback you would do: feedback("import.type","=", "google_review", "feedback.type", "=", "completed")


Note that new operators are available : == & !== to target specific Feedback item scope.





Properties

Our properties come after a dot and allow users to further define which type of parameters value they want to add

Property

Description

Variables

.name

the value of the parameter will be a name

-

.type

the value of the parameter will be a type

-

.id

the value of the parameter will be an id number

-

.{url)

Only available for the url function

-

import.type

used to link with an import method.

survey
chat
review
google_review
document
email
trustpilot
easiware
amazon_reviews
glassdoor
homeviews
google_reviews_competitor

question.type

the type of question you want to select

nps
textarea
slider (aka ratings)
RatingsTable
ces
select (aka choice)
switch

feedback.type

whether the feedback was completely finished or left incomplete.

completed

incomplete

push.canal

whether the call for feedback was an email or sms

email
sms

push.status

what the status of the push is that you’d like to track

scheduled
opened
delivered
clicked
bounced
dropped

nps.profile

the profile of the feedback

promoter

detractor

neutral

financial.type

the type of financial impact the feedback has depending if it’s positive or negative.

risk

opportunity



Did this answer your question?