Take Control Over Your Support Effort

Friday, September 8, 2017 by Michael Kubitschka

Cockpt City Night Lights

Photo by Chris Leipelt on unsplash

The main goal of every product manufacturer is to sell its products. In order to sell a product on a sustainable basis, it is just as important to keep the existing customers. Over the product lifetime not only the functionality and the used technologies play an important role, but also the support of existing customers.

Customer support should not be seen as tedious task for companies in product development. On the contrary, experience gained from support is valuable customer feedback that must be integrated in the product development to constantly improve a product.

Sometimes customer support can reach a very high level. Especially in smaller teams where employees do both, product development and support, support can slow down product innovation. This is a clear sign that support efforts must be reduced, because otherwise you will not be able to grow without a loss of support quality.

What can you do to reduce support?

Use a ticket system

To manage all support requests for time cockpit we use Zendesk . Our customers send their requests to one email address (support@timecockit.com). All these mails are accepted in Zendesk and provided for further processing. This allows a structured process to assign support requests (=tickets) to our employees and Customer requests are not distributed to the mailboxes of different employees. Instead they are managed at a central location. Each support employee has access to all tickets and their message history with the customer. This simplifies holiday replacements or hand overs to other colleagues of second level support. All Tickets have a state that will change during the support process:

  • New (new untouched ticket)
  • Open (the customer is waiting for answer of the support team)
  • Pending (support is waiting for the customers answer)
  • OnHold (ticket is parked for later action)
  • Solved (support case is solved and archived)

Each ticket is automatically assigned a unique ticket number. In case of a telephone call concerning an existing ticket, it is easy to find using the search function. Of course, it’s also possible to search by any other term. That makes the ticket system also a knowledgebase for us.

Tracking support effort

Despite advanced support management tools, a steady improvement of your product is needed to reduce support. To define further actions to reduce support you should be able to answer the following questions:

  • For which customers and products do you have to do most support?
  • How much time do you spend for support per customer and product?
  • How is support effort divided among the employees (first/second/third level)?
  • What type of support is it (Hardware, Installation, User Handling, Updates)?
  • How much of it is really support? Or is it rather a matter of consulting or requirement clarification for desired extensions?

To be able to answer these questions you need to track your support efforts. Usually, this is very tedious because of many different small tasks between mailing and meetings you don’t know what you did at the end of the day.

This is exactly where we try to help support employees by providing Zendesk timesheet templates. With these we have the possibility to display the user assigned Zendesk tickets that were updated by a user on the respective day. These timesheet templates can be transferred directly into the timesheet calendar. The ticket information is automatically transferred to the timesheet’s description:

  • Ticketnumber
  • Subject
  • Name of ticket requester
  • Customername
  • Actual state of the ticket

Finally, only the project and eventually the task must be set to finish your timesheet. Through these assignments, it’s later possible to figure out your customers/projects effort.

To setup time cockpits functionality for Zendesk timesheet templates you just need to configure the following query template:

from System.Net import *
from System.IO import *
from System.Text import *
from Newtonsoft.Json import *
from System.Collections.Generic import List

def getTimesheets(templateQueryContext):
	user = Context.SelectSingleWithParams({
		"Query": "From U In UserDetail Where U.UserDetailUuid = @UserDetailUuid Select U",
		"@UserDetailUuid": templateQueryContext.UserDetailUuid
	# --- setup zendesk settings ---
	serverURL = "https://yourZendeskURL/api/v2/search.json?query=type:ticket+updated:" + templateQueryContext.BeginTime.ToString("yyyy-MM-dd") + "+assignee:'" + user.Firstname + " " + user.Lastname + "'"
	userName = "yourUserName"
	token = "yourZendeskToken"
	# --- setup zendesk settings ---
	credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(userName + "/token:"+ token));
	modelEntity = ModelEntity({ "Name": "Result" })
	modelEntity.Properties.Add(TextProperty({ "Name": "Description" }))
	modelEntity.Properties.Add(TextProperty({ "Name": "ResultTitle" }))
	modelEntity.Properties.Add(TextProperty({ "Name": "ResultSortOrder" }))
	request = HttpWebRequest.Create(serverURL)
	request.Headers.Add("Authorization", "Basic " + credentials);
	request.ContentLength = 0
	request.Method = "GET"
	request.ContentType = "application/json"
	request.PreAuthenticate = True
	response = request.GetResponse()
	streamReader = StreamReader(response.GetResponseStream())
	result = List[EntityObject]()
	counter = 0
	jsonReader = JsonTextReader(streamReader)
	id = ""
	name = ""
	subject = ""
	status = ""
	returnLevel = 0
	objectInProgress = False
	while jsonReader.Read():
		if jsonReader.TokenType == JsonToken.StartObject:
			if not objectInProgress:
				objectInProgress = True
				returnLevel = counter
				entity = modelEntity.CreateEntityObject()
				entity.Description = ""
				id = ""
				name = ""
				subject = ""
				status = ""
			counter = counter + 1
		elif jsonReader.TokenType == JsonToken.EndObject:
			counter = counter - 1
			if counter == returnLevel:
				objectInProgress = False
				entity.Description = "#" + id + ": " + subject + " (" + name + ", " + status + ")"
				entity.ResultTitle = entity.Description
				entity.ResultSortOrder = entity.Description
		elif jsonReader.TokenType == JsonToken.PropertyName:
			token = jsonReader.Value.ToString()
			if token == "id" and counter == 1:
				if jsonReader.Value != None:
					id = jsonReader.Value.ToString()
			elif token == "name":
				if jsonReader.Value != None and jsonReader.Value.ToString() != "time cockpit":
					name = jsonReader.Value.ToString()
			elif token == "subject":
				if jsonReader.Value != None:
					subject = jsonReader.Value.ToString()
			elif token == "status":
				if jsonReader.Value != None:
					status = jsonReader.Value.ToString()
				if jsonReader.TokenType == JsonToken.StartObject:
					counter = counter + 1
				elif jsonReader.TokenType == JsonToken.StartObject:
					counter = counter - 1
	templateQueryContext.Templates = result
To connect time cockpit with your own Zendesk account you just need to set the fields (serverURL, userName and token) in the section “setup zendesk settings”. The token must be created in your Zendesk settings in the section API. Thereby also the settings „Password Access“ and „Token Access“ must be activated.

When the query template has been successfully created and the settings have been made in your Zendesk account, the timesheet templates can be used in the Full Client. To be able to use the timesheet templates in the WebClient, the query template script file must be signed by us because of security reasons. This ensures that only code reviewed by us is executed on the server.

Zendesk Timesheet Template

When using this functionality, you know on which day you worked on which Zendesk ticket but you don’t know how much time you spent on the different tickets. To figure out the exact times we provide different signal trackers. A general introduction to time cockpit’s signal trackers can be found on our website at http://www.timecockpit.com/tour/activity-tracking. One of the signal trackers collects the window titles of your active windows you are working in. During your daily work in Zendesk these window titles will be captured. Per default Zendesks window title just contains the ticket number. Additional information like the ticket subject or the name of the customer who requested the ticket cannot be tracked.

To enable this, we recommend to use the Userscript Manager called Tampermonkey with our created Zendesk user script to extend the window title with the missing information. Tampermonkey is a free browser extension and available for the web browsers Chrome, Microsoft Edge, Safari, Opera Next und Firefox. After you have installed the Tampermonkey extension you only need to install our Zendesk user script using the following link https://greasyfork.org/en/scripts/2126-zendesk-window-title.

After the installation and a reload of your Zendesk window the window title should contain the ticket number, the ticket subject, customer name and the name of the ticket requester. You don’t need to worry about script updates because Tampermonkey updates the script itself if we provide a new version. From now on, time cockpit’s signal tracker is able to collect this information and provide it for your time tracking work.

comments powered by Disqus