Explore recipe: Reporting on customer satisfaction by agent

Return to top


  • Vladimir Petrushenka

    Hi @... 

    Thanks for your comment above. 

    Using the Ticket solved - Date attribute makes CSAT very volatile. If the bad rating is given to a solved ticket in May, then CSAT is counted towards May's data. Fine. However, if we try to turn the rating around and we continue conversation into June and solve the ticket in June, then CSAT for this ticket will be now counted towards June's data and will be withdrawn from May. That means that our data for May will change retrospectively. 

    CSAT is one of our main KPIs and it makes for us so difficuilt to be consistnt in our reporting. If we carry across few bad ratings from May to June then May's CSAT will change quite significantly. Which gives us issues in reporting and sharing our data with the business internally. 

    If would have had an attribute something like 'Rating last updated - Date' then it would solve the problem for us. 
    Do you know if it's possible to create such a custom attribute? 

    Many thanks 


  • Brandon Tidd
    User Group Leader Community Moderator
    The Humblident Award - 2021

    Hey @... - 

    You might be better served by "Ticket Updated"
    I think this article speaks most directly to what you're trying to do.

    There's also some great tips in this article.

    Hope this helps!


  • Jack Rausser

    Hey Vladimir Petrushenka - did you get an answer to your question? I'm in a similar situation and am curious how best to report on CSAT when customer's responses are not within the ticket date created/closed reporting date range. Thanks!

    Brandon Tidd I attempted to open your first link but was told I don't have the required access after logging in. Do you have any documentation that could help here? Thank you for your help!

  • Vladimir Petrushenka

    hi Jack Rausser

    No, unfortunately, I did not get an answer on this and this is still an issue for us(a big one!) that we are trying to solve. I'm sure there are lots of other companies that use Explore/Zendesk who are trying to solve this problem. CSAT is one of the main KPI in Customer Service and Explore does not have metrics in place that would allow precisely report on this KPI. A time attribute something like 'Date Rating is given' - would resolve this issue, but there isn't anything like this in Explore. Frustrating.

  • Marco
    Zendesk Customer Care
    Hi Vladimir and Jack, 
    Thanks for reaching out regarding this. As you already now, in Explore, there is no date attribute for the date that it was rated. However, in looking at the prebuilt Explore dashboards, it looks like the attribute used there is "Time - Ticket solved", as the survey cannot be sent until the ticket is solved. This is the date that will most closely correlate with the date it was rated. 

    I understand and also agree that having a "Time - Ticket rated" attribute would be a good improvement to Explore. I would strongly encourage you to post that in the Explore product feedback page! The benefit to doing that is that it allows for other customers to vote or comment on it if they have similar opinions. 
  • Gareth Elsby

    Hi all,

    I found this page looking for the same solution that Vladimir is seeking. Our main problem is when multiple agents work a ticket that has a bad satisfaction rating. 

    Just using ticket assignee is no good, as the bad comment is then attributed to an agent that was trying to follow up. Using updater name +update ticket status = solved at least shows us all the agents who played a part, but having the date - ticket rated attribute would at least help us to ascertain which agent may be responsible for the bad comment.

    Vladimir Petrushenka you seem to have a good grasp of this issue as well. If you drop in a feedback post, I'll be sure to upvote it and contribute!

  • Vladimir Petrushenka

    Hi Gareth Elsby

    I think I've managed to solve this problem. But open for feedback there from anyone. 

    The following set up will only work in the 'Ticket Updates' data set. 

    What I have done there is - I've recreated the '% Satisfaction Score' pre-built metric from the 'Tickets' data set into the 'Ticket Updates' 

    Tickets data set formula: '% Satisfaction Score' = COUNT(Good satisfaction tickets)/COUNT(Rated satisfaction tickets)


    Good satisfaction tickets = IF ([Ticket satisfaction rating]="Good")
    THEN [Ticket ID]

    Rated satisfaction tickets = IF ([Ticket satisfaction rating]="Good" OR [Ticket satisfaction rating]="Bad")
    THEN [Ticket ID]

    Now we need to create an equivalent custom metric in the Ticket Updates data set. 

    The formula I came up is the following: 

    % Satisfaction Score (Ticket Updates) = COUNT(Good satisfaction tickets (Ticket Updates))/COUNT(Rated Satisfaction Tickets (Ticket Updates))


    Good satisfaction tickets (Ticket Updates) = COUNT(Good initial satisfaction ratings*)+COUNT(Bad to good satisfaction ratings*)

     * both are pre-built metrics 

    We want to count all Good rating tickets that we currently have, including Bad to Good. 

    Rated Satisfaction Tickets (Ticket Updates) = COUNT(Good initial satisfaction ratings*)+COUNT(Bad initial satisfaction ratings*)

     * both are pre-built metrics 

    We want to count all tickets that were rated, both Good and Bad. 

    The reason why we wanted to re-create the % Satisfaction Score metric in Ticket Updates data set is that Ticket Updates does have a time attribute which is called 'Update' (Year, Month, Week, Date etc). And because in this data set we can report on 'Update ID' that means that we can configure a query that will return us CSat related ticket event only. 

    If we look into a formula of any of the above pre-built metrics from Ticket Updates data set the formula will look as following: 

    IF ([Changes - Field name]="satisfaction_score"
    [Update ID]

    So it basically says we want to see only ticket updates that are only related to Satisfaction Score. 

    If we then select the 'Update' as a time attribute in our query and specify the time frame, the query will return us the updates related to Satisfaction Score event only. So in other words we will see the date when last CSat event took place (i.e. ticket rated or satisfaction rating changed (from bad to good and vice-versa)). The above formula together with the 'Update' time attribute do not take onto the account any other ticket events, i.e. ticket solved, requester updated etc. As I say, it will only return us CSat related events. 

    We used to use Ticket solved time attribute and it was a pain for us for years. Our CSat reporting was dependent on ticket status which have nothing to do with the CSat, meaning if a ticket is rated, but isn't solved it isn't counted in the report, and therefore it doesn't give a real time picture of the team's CSat score. Furthermore, if rated tickets get solved the CSat score in the report will change.

    I hope all the above makes sense. You might want to play around with the assignee/updater attributes to see if it works for you, but I hope you understand the concept. For us the assignees don't change through ticket lifecycle so this isn't a problem for us. Let me know if you have any questions on this specifically.  
    If it does work for you, and you find it useful, you have my copyright permission to use it free of charge! Hah !

  • Marco
    Zendesk Customer Care
    Hi Vladimir, this looks good and thanks for sharing. There is no native method to do this as Explore mostly looks at the present data but I understand how the Assignee name will not work in this case. Let us know if this works for you Gareth. Cheers! 
  • Trevor Piercey

    Hey team, to add to this, it's simply ridiculous that this isn't pre-built. By not having this by default, you're telling me that the product team doesn't think that EVERY SINGLE COMPANY that uses ZD doesn't want to be able to drill down into tickets, satisfaction by agent, by department etc.? Seems ridiculous that we have to build our own reports in EXPLORE. How this doesn't default in the basic reports, is shocking. Your product team really should talk to your users about what we actually need. (because it should be easy, not something we have to do ourselves). 

  • Sigmund Domingo

    I have created a similar report on a table with rows of Ticket ID, Agent Name, and Rater's Comments among other details. I was able to filter the resulting result in a dashboard by Brand, Ticket Group, and Ticket Solved Date but I could not filter the report by Organization Name properly.

    As it turns out, the Organization Name that would accurately detail each CSAT by agent is available as "Updater Organization Name". This is logical as the ticket should be rated depending on which agent updated the ticket. However, this field is only available in the "Support - Updates History" dataset and not in the "Support - Tickets" dataset. I was prepared to create a report using that dataset, however, computation for % Satisfaction Score (COUNT(Good satisfaction tickets)/COUNT(Rated satisfaction tickets)) is not available on the "Support - Updates History" dataset.

    Is it possible to include the Updater Organization Name in the "Support - Tickets" dataset?

  • Gab Guinto
    Zendesk Customer Care
    Hi Sigmund,
    If you need to report on percentage satisfaction score under the Updates history, then you may recreate the metrics in that dataset. The formula of the default Tickets dataset metrics Good satisfaction tickets and Rated satisfaction tickets uses the attribute Ticket satisfaction rating, which is also present in the Updates history dataset. You can use the same formula, and then calculate for the % satisfaction score using those two custom metrics.
  • Eduardo Castillo

    For those that could get some help from their devs, you can get the satisfaction created_at and updated_at timestamps via the API. Your devs can get the satisfaction_rating_id from the tickets endpoint or tickets incremental export endpoint.

    (Would be better if Zendesk would add this to Explore...)

    We use python:


    Hope this can help. 


Please sign in to leave a comment.

Powered by Zendesk