Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

To make edits to this document, click File > Make a Copy > Save an editable version to your

Google Drive.

 
Hooking Up a Business KPI Dashboard 
The Non-Technical Founder’s Guide to Getting Your Metrics All in One Place 

Read Brian Casel’s accompanying blog post: 
Building a Business KPI Dashboard 

Find this helpful? If so, I’d appreciate if you’d share the original article that this came with.
Here’s the ​link to the article​. And here’s an ​editable Tweet​ you can use.

Like everything else, there are plenty of ways you can accomplish the same thing. This is how I
chose to do it, using the tools and skillsets at my disposal. I hope you can take some of my
ideas and work them into your dashboard to view your KPIs (Key Performance Indicators) for
your business.

Table of Contents 
 
● The tools I use
● A basic starter customer list spreadsheet
● My list of KPIs that I watch
● Challenging metrics issues, solved:
○ Keeping a Real-Time Log of Customer Signups & Cancellations
○ Keep a list of currently active customers along with current total MRR
○ Track your history by month for customer count and MRR
○ Log new leads per month
○ Update leads once they purchase & calculate days to close
 
Tools I Use 
 
GeckoBoard​ - Building the dashboard

Zapier​ - Getting my apps to talk to eachother


Google Spreadsheets​ - Gathering data, doing calculations, storing history

Google Analytics​ - Traffic data

Drip​ - Email marketing automation

Stripe​ - Payment processing & customer records

Gravity Forms​ - My primary lead form where potential customers request a consultation

A Basic, Starter Customer List Spreadsheet 

Click here to access my ​Sample Starter Customer List spreadsheet​. This is a simplified version
of what I used for the first 18 months of my business. It’s a good tool to use if you’re just
starting up and building traction with a productized service business (or any type of recurring
revenue business, really).

It doesn’t require a ton of setup to get started. Simply manually input your customers info into
the ‘Customers’ tab, then the ‘Totals’ tab will show you your current customer count, MRR (total
monthly recurring revenue) and average MRR per customer.

You can build it out further with more complex calcuations and formulas, of course. But I advise
you not to get hung up on time consuming things like this that may not be the best use of your
time when you’re very early on in your business.

Once your business grows to a point where data becomes unmanageable, you can upgrade to
a more robust KPI dashboard…

My list of KPIs that I watch 

Here’s the list I shared in the article, with more descriptions about how I use each metric in my
strategic planning:

Customers:

● Number of active customers​ - I want to see this number grow up and to the right :)
● Number of new customer sign ups per month ​- A good metric to guauge how
successful one month is to the next. I can set a hard number of signups I want to
achieve per month in order to keep growth rate on track to hit my larger goals.
● Number of cancellations & customer churn rate -​ Obviously, I want to keep this
number low. Too many months in a row with this number exceeding my ideal limit tells
me I need to work on retention and figure out why customers are cancelling.
● Monthly recurring revenue (MRR) -​ This number gives me a good sense of where my
business is at financially, but doesn’t tell the whole picture. I also need to watch
expenses and profit.
● Average MRR per customer -​ It’s good to know how much a single customer is worth
per month. This also gives me a sense of whether I need to focus on getting customers
to upgrade to our higher end plans or not.
● Average customer lifetime (months) -​ How long do they stay subscribed? Longer the
better. If it’s too short, I probably have a retention problem to fix.
● Customer lifetime value -​ Tells much how much an average customer is worth over
time, which helps me understand how much I’m willing to spend to acquire a customer.

Pipeline:

● Number of leads -​ Since month-to-month growth in customers and MRR is my primary


focus, the number of leads most directly impacts this. I consider a lead to be someone
who has requested a sales consultation. For a SaaS, this could also be a free trial
signup.
● Sales close rate -​ How many of our leads convert to customers. Making improvements
to the sales process and follow up activities can help this metric, but if it’s very low, it’s
more likely a quality of leads issue.
● Avg. number of days to close a lead -​ By reducing the amount of time (and the
work/activity it takes) to take a lead to become a customer, you reduce the cost to
acquire each customer.
● Number of active leads in the past 3 months who haven't closed -​ This number tells
me how many potential customers are in our pipeline at any moment.

Traffic:

● Overall site traffic


● New visitors
● Return visitors
● Visitors to the homepage (which is our pricing and customer signup page)
● Traffic from search
● Traffic from paid ads
● Top pages viewed
● Top traffic sources

Email list:
● Subscribers
● New subscribers added
● Unsubscribes
● Subscribers who requested free samples
● Subscribers who opted in for our primary lead magnet (webinar)
● Subscribers who opted in for our secondary lead magnet (email course)

Challenging metrics issues, solved: 

In building my business KPI dashboard, I ran into several challenges along the way. Here were
the most pressing ones, and my solutions for them. These solutions aren’t perfect and they’re
always evolving. But hopefully you can use a thing or two here when hooking up your metrics.

Here’s a ​Sample Metrics Data Spreadsheet​, which is a simplfied version of the sheet I used
when building most of these.

Note:​ These solutions are somewhat technical, involve spreadsheet formulas, scripts, and
multi-step Zapier zaps. My notes below are intended to point you in the right direction and give
you basic examples of how I came to my solutions. I will not be able to provide support,
modifications, or troubleshooting advice on this. You’ll need to do what I did: Lots of trial and
error :)

Keeping a Real-Time Log of Customer Signups & Cancellations

Tracking Goals:

● I want to see how many new signups I have this month so far.
● I want to see how many cancellations happened this month so far.

Solution:

1. (Zapier)​ Create a Zaps for every time new customer subscription is created and
cancelled in Stripe
2. (Zapier)​ Add the new customer’s info to a new row in the ‘Signups_Log’ sheet
3. (Zapier)​ Add the new customer’s info to a new row in the ‘Active_Customers’ sheet
4. (Google Spreadsheet)​ Use the ‘Current_Stats’ sheet to calculate the number of
customers who signed up during the current month.
5. (GeckoBoard)​ Connect the current stats numbers to spaces in the GeckoBoard.
Keep a list of currently active customers along with current total MRR

Tracking Goals:

● Keep this list updated ​automatically​, including when new customers sign up as well as
when customers cancel.

Solution for updating your Active Customers list when a new customer is added:

1. (Zapier)​ Create a Zap for every time a customer subscription is created (use the same
one as noted above).
2. (Zapier)​ When a customer’s subscription is created, add their info to the
‘Active_Customers’ sheet.
3. (Google Spreadsheet)​ The ‘Active_Customers’ spreadsheet should have formulas at
the top to calculate:
○ Total number of active customers listed
○ Total MRR
4. (Google Spreadsheet)​ Port those totals to the ‘Current_Stats’ spreadsheet
5. (GeckoBoard)​ Connect your current stats numbers to spaces in the GeckoBoard

Solution for updating your Active Customers list when a customer cancels:

1. (Zapier)​ Create a Zap for every time a customer subscription is cancelled.


2. (Zapier)​ Lookup and update the row in your ‘Active_Customers’ list that contains the
email address matched to the person who cancelled.
3. (Zapier)​ Update the values in that row and replace them with “-”, which wipes out their
data, causing this customer’s record and MRR to be subtracted from the totals.

Track your history by month for customer count and MRR

Tracking Goals:

● On the 1st of every month, I want to record a “snapshot” of the current active customer
count and MRR.
● Show a graph in my dashboard charting my customer count and MRR growth over time.

Solution:

1. (Google Spreadsheet)​ Create a sheet called ‘Monthly_Totals’ with the following column
headings:
○ “Label” - The label you’ll want to see on the values in the Y axis of your graph. I
use “MM/YY” for my labels in this column.
○ “Total Customers at End of this Month”
○ “Total MRR at End of this Month”
2. (Google Spreadsheet)​ Make sure you’re calculating your total customer count and
MRR stats in real time and storing those in your ‘Current_Stats’ sheet. See above for
how I did this.
3. (Google Spreadsheet)​ When viewing your data spreadsheet, click Tools > Script Editor.
This will open Google Apps Script editor, with a blank script that is attached to your
current spreadsheet. You’re going to establish a script that will automatically copy 2
values from your ‘Current_Stats’ sheet and paste them in the next available row in the
list in your ‘Monthly_Totals’ sheet.
4. (Google Apps Script)​ Delete whatever is currently in the Script area. Copy/paste the
script I provided below into your Script area.
5. (Google Apps Script)​ Update the following variables at the top of your script:
○ The exact column header names of the columns where you’re pulling data values
from.
○ The exact column header names of the columns where you want to log those
values every time this script runs.
6. (Google Apps Script)​ Click “Run” and run the top-most function. This should instantly
run the copy / “paste” action from your source sheet to your destination sheet. It should
automatically “paste” your 2 values in 2 two columns you specificied, in the first open cell
(the script will work it’s way down the column to find the first cell that is either 0 or blank,
you’ll want to make sure all cells above the one where you want the number to be
entered have some content and are not 0).
7. (Google Spreadsheet)​ Manually fill the values in your 2 destination columns through all
of the months up until last month’s, so that the current month’s row is the first “open” cell
in those columns.
8. (Google Apps Script)​ Edit > All Your Triggers > click “Add new trigger” > Set this
function to run every month on the 1st of the month. Since your spreadsheet has a new
row for each month, the script will automatically record the values for every month going
forward.
9. (GeckoBoard)​ Connect your Monthly_Totals sheet to spaces in your GeckoBoard. Use
line or bar graphs to chart them over time.

Google Apps Script: ​Copy 2 values from one sheet, log them in another sheet

Note: I didn’t code this myself. I hired someone to create the script to my specifications. I’m
certain that it’s not the most optimized, scalable version possible, but it works and I’ve been able
to adapt it in various ways. My developer’s comments in the code should help.
//SpreadsheetApp.getActiveSpreadsheet() //this automatically fetch the spreadsheet to which
this sript is attached.
var sourceNameHeader = "Client Email"; //Put header of the column from which the total
customer number values is to be picked up
var sourceMRRHeader = "MRR"; //Put header of the column from which the total MRR values is
to be picked up
var sourceSheetName = "Active_Customers";//Put name of source sheet here - sheet from which
values is to be picked up
var destinationSheetName = "Monthly_Totals";//Put name of destination sheet here - sheet
from which values is to be dropped down
var destinationNameHeader = "Total customers at end of month"; //Put header of the column
from which the total customer number values is to be dropped down
var destinationMRRHeader = "MRR at end of month"; //Put header of the column from which the
total MRR values is to be dropped down

function recordcustomervalues()
{

var name = fetchValue(sourceNameHeader);//fetching total customer value


var MRR = fetchValue(sourceMRRHeader);//fetching total MRR value

var sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destinationSheetName);//fetching sheet
where value to be dropped down

var totalRows = sheet.getLastRow();//fetching total number of rows so that when we fetch


values we get all values from all rows

var nameDestinationColumn = fetchPosition(destinationNameHeader);//fetching column number


where total customer value is to be put in based on it's header
var MRRDestinationColumn = fetchPosition(destinationMRRHeader);//fetching column number
where total MRR value is to be put in based on it's header

var nameDestinationColumnValues =
sheet.getRange(2,nameDestinationColumn,totalRows-1,1).getValues();//fetching all data of
total customer column to decide where the total customer value is to be put in : at first
empty cell
var MRRDestinationColumnValues =
sheet.getRange(2,MRRDestinationColumn,totalRows-1,1).getValues();//fetching all data of
total MRR values column to decide where the total MRR value is to be put in : at first empty
cell

var i;
for(i=2;;i++)
{
if(nameDestinationColumnValues[i-2][0]=="")//checking if cell is empty
{
sheet.getRange(i,nameDestinationColumn).setValue(name);//put value and leave it:break
out because once the value is put in there is no need to keep on processing
break;
}
}

for(i=2;;i++)
{
if(MRRDestinationColumnValues[i-2][0]=="")//checking if cell is empty
{
sheet.getRange(i,MRRDestinationColumn).setValue(MRR);//put value and leave it:break
out because once the value is put in there is no need to keep on processing
break;
}
}
}

function fetchValue(query)
{
var sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sourceSheetName);//fetching source
sheet
var lastColumn = sheet.getLastColumn(),i;//fetching total number of columns so as to know
to search till where
var headers = sheet.getRange(1,1,1,lastColumn).getValues();//fetching all headers
for(i=0;i<lastColumn;i++)//looping through all headers
{
if(headers[0][i]==query)//if header is same as queried one
return sheet.getRange(2,i+1).getValue();//then return the value just below header ::
(row,column)
}
}

function fetchPosition(query)
{
var sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destinationSheetName);//fetching
destination sheet
var lastColumn = sheet.getLastColumn(),i;//fetching total number of columns so as to know
to search till where
var headers = sheet.getRange(1,1,1,lastColumn).getValues();//fetching all headers
for(i=0;i<lastColumn;i++)//looping through all headers
{
if(headers[0][i]==query)//if header is same as queried one
return i+1;//then return that column position : it's starting from 0 so actual value
is +1 of that.
}
}

Logging new leads per month

Tracking Goals:

● Track how many new leads we’ve had in the current month so far
● Track history of leads per month and chart this over time

Solution:

1. (Google Spreadsheet) ​Create a separate Google Spreadsheet to track your Leads


data.
2. (Google Spreadsheet) ​Structure it much the same way as your Customers data
spreadsheet:
○ Sheet 1: Monthly_Totals
○ Sheet 2: Current_Stats
○ Sheet 3: Leads_Log
3. (Zapier)​ Trigger a Zap when someone becomes a lead (in my case, it’s when someone
fills out the Gravity Form on my homepage to request a consultation). This Zap should
log every new lead’s information in your Leads_Log sheet.
○ Fill in the following columns:
■ Email
■ Name (optional)
■ Company (optional)
■ Date they became a lead
○ The following columns exist, but are not filled in at the time a lead is entered:
■ Date closed
■ Days to close

Update leads once they purchase & calculate days to close

4. (Zapier) ​In your Zap that fires when a new customer signs up, add 2 steps:
○ Lookup spreadsheet row to find the row in your Leads_Log that matches this new
customer’s email address.
○ Update this row. Input today’s date as the date they closed. And using the Zap,
input a formula into the “Days to close” cell: =E#-D#
■ This assumes that your ‘Date became a lead’ is column D
■ This assumes that your ‘Date closed’ is column E
■ In Zapier, replace # with a dynamic tag that outputs the row number that
you’re updating.
○ See a screenshot​ of these 2 steps in my Zap for this.
5. (GeckoBoard)​ Connect your Monthly_Totals sheet to spaces in your GeckoBoard. Use
line or bar graphs to chart them over time.

Find this helpful? If so, I’d appreciate if you’d share the original article that this came with.
Here’s the ​link to the article​. And here’s an ​editable Tweet​ you can use.
 

You might also like