Productivity Dashboard for Devs

Zack Koppert
Initial State
Published in
6 min readOct 24, 2019

I talk all the time with other developers about productivity in a data-less sort way. “I felt really productive today!” or maybe “I don’t feel like I’ve been able to accomplish anything all week except emails!” I knew there was a way to instrument up tools to tell me how productive I was on a certain day or where all the time was going but I just never found the time to research how and set it all up.

After chatting with a friend about a product called “RescueTime” aimed at data driven analytics on how you can reclaim your time and make it more productive I reached a breakthrough. It was time I developed a system to track my productivity and I had a lead on how to get started!

Here is what I chose to use as my tools:

Here is the final product with my actual data:

Overview of how this works:

I have RescueTime logging the applications that I use on my PC. Everyday RescueTime produces a productivity report that gets picked up by Zapier and sent to Google Sheets. Google Sheets then has the data about my productivity pulse, hours spent in communication, hours spent in the “Very Productive” category, and hours spent coding. It takes the daily value as well as a calculated average value for each data type and streams that out to an Initial State data bucket. Finally, dashboard magic and viola!

Step by step breakdown of how to do the same for yourself:

Let’s start at the data generation and work our way towards the dashboard. First you will need to go to https://www.rescuetime.com/plans and start a premium trial. RescueTime will prompt you over the coming days to categorize what apps should be categorized as. For example, time spent on github.com could be set to the “Software Development” category, while time spent on nike.com could be set to the “Shopping” category. Personally, I decided to map my Slack and email usage to “Communication and Scheduling” category. Customize to your liking!

Once you have your account set up and the desktop app installed for RescueTime, you will want to go to your login to your google account and go to https://sheets.google.com. Create a Google sheet with the following column headers:

Date

Productivity Pulse

Time Coding

Time Communicating

Very Productive time

Now we can connect you data to this Google Sheet by going to https://www.rescuetime.com/integrations/zapier and selecting the “Add new rows to Google Sheets with daily RescueTime summary reports” Zap. Walk through the setup there to look like this image.

It may be beneficial to pause the tutorial here, have RescueTime running, and do a full workday before coming back to set up the dashboard so you have some data to work with.

Now you have the data being generated by RescueTime and being sent to Google Sheets. No math required to get the averages since Initial State will do that for us! Let’s connect it to Initial State!

From Google Sheets you will have data coming in tomorrow after the report is available. You can see in the image above that I have data coming in daily from RescueTime in the first 5 columns. Let’s set up the table on the lower right where we are identifying the latest entry and streaming it and some other info to Initial State.

Looking at the first column of the table, here is what it looks like expanded.

The manually entered the title “Productivity Pulse” and then next you see the value “88”. That is actually generated by the formula “=INDEX( FILTER( B:B , NOT( ISBLANK( B:B ) ) ), ROWS( FILTER( B:B , NOT( ISBLANK( B:B ) ) ) ) )” . Remember, this won’t show anything unless you have data in Column B. Feel free to put in a placeholder data point like “88” into Column B. Before we move on to the next row, we need to set up our Initial State Dashboard to receive data. Log in or create a new account at https://iot.app.initialstate.com . Then create a new stream bucket by clicking on the icon shown below.

Name your new stream bucket and click “Create”. I called mine “Productivity Dashboard”. Click on the Settings for you new Stream Bucket and there you will find your Access Key and Bucket Key. You will need these for the next step. Head back over to your Google Sheets to get ready for the next step. Remember we were working on creating the table from the image below.

Let’s focus on where I have the text “Productivity Pulse=88”. That text is generated by a function called streamData(). So in that cell I have “=streamData(G$64,G$65,$I$1)”. The first parameter G$64 represents the title, the second G$65 represents the data point I am trying to stream, and the third $I$1 represents an ON/OFF switch for actually sending the data which I have mapped to a cell containing “TRUE”. For this to actually work, we need to define the streamData() function by going to the “Tools” menu of Google Sheets and selecting “script editor”.

Your script should create a streamData() function like this. Be sure to enter in your personal values for you Initial State accessKey and bucketKey that we found in the settings Initial State page.

function streamData(signalName, value, enable) {var accessKey = ‘YOUR_ACCESS_KEY_HERE’;var bucketKey = ‘YOUR_DATA_BUCKET_HERE’;if (!signalName) {signalName = ‘?’;}if (enable) {var url = ‘https://groker.init.st/api/events?accessKey=' + accessKey + ‘&bucketKey=’ + bucketKey + ‘&’ + encodeURIComponent(signalName) + ‘=’ + encodeURIComponent(value);UrlFetchApp.fetch(url);return signalName + ‘=’ + value;}}

The next thing I decided to stream over to Initial State was an emoji to represent the category. This help my identify which number I was looking at and what it meant with a fun emoji. I manually entered in Google Sheets: the “Category Productivity Pulse” and the “:rocket:” cells. Then to stream those over I have a cell that has “=streamData(G$67,G$68,$I$1)”. That streams G$67 the title, G$68 the emoji, and $I$1 is the value TRUE.

Now just repeat the same pattern for the next 3 columns: Time Coding, Time Communicating, Very Productive Time.

Once data is coming in and you arrange your data tiles in your dashboard how you like, it could look something like this.

--

--