8 Tips for Writing a Great Startup Company Description

I spent some time at Rise Conference here in Hong Kong this week. The conference hosts a few hundred startups from all across Asia and offers each of them a booth, an opportunity to pitch, and the hope of meeting their next, investor, engineer, or growth hacker.

It was complete startup sensory overload. The talks are only 20 minutes long and as soon as you sit down at one, you are missing two others. The conference floor looks like a real incubator (in the biological sense) with rows of embryonic business plans. The only difference is that instead of dozens of dull eggs, each startup’s logo, swag, and even costumes begs for your attention.

Startup Company Descriptions Should Stand Out
Does your startup’s company description standout? Credit: http://www.bndestem.nl

And therein lies the problem. When your startup is given the exact same amount of real estate to attract attention as all the others, what can you do to cut through the noise?

Here are 8 tips for writing your startup’s company description in a way that demystifies your product or service and illuminates your customer value proposition. These guidelines are not the answer, not a tactic and not a gimmick but just simple copywriting best practices that will help you out.

You might be thinking, “Who are you to tell me what to do? I just invented a cloud-based aquaculture drone bot watch.” To that I say, 1. I’ve spent a lot of time writing for the Web where attention is extremely scarce, and 2. Because your startup’s description looks like this:

“We are HeliFlower.io. We are the first cloud-based, mobile, wearable for automated vertical closed circuit food production. You will never have to receive another push notification from your green house thermostat again thanks to our asynchronous API’s and scalable infrastructure. We are the Uber of non-brassica hydroponic vegetable production.”

Having a succinct and purposeful startup company description is crucial. It is as important as your elevator pitch, your mission statement, and a memorable brand mark. You will used it everywhere from startup conference booths, to pitches, to AngelList to Twitter. The “what” of the description explains why people should care and “how” it is written reflects your startup’s mindset including strength of focus and ambition.

Tips for Your Startup’s Description

  1. Don’t start with your startup’s name. In every case, your startup’s name is written right above your description. And it will be a long time before your startup is featured on Jeopardy.
  2. Skip “We are…” Of course you are. That’s a given. You started a business, therefore, you are.
  3. Don’t explain the pain point. Explain the solution. The people this description is meant for either recognize the pain point or see the viability in solving it. Otherwise, they don’t care about your solution.
  4. Be honest. You’re not the first and phrases like, “an advanced…,”  “the future of…,” and “a leap forward in…,” waste space without saying anything. You only get 160 characters on a Twitter account description so get to the point and stick to the point. Show people how focused you are on your product instead of meaningless distractions.
  5. Be unique. Everybody is a “global marketplace,”  “a mobile first” and “a cloud based platform” If your unique selling proposition describes a category, you won’t be around long. Articulating your differentiation is as crucial as conveying your value proposition.
  6. Hit hard with the words that embody your solution. Make it perfectly clear what your startup does and what market it serves: eg. “In store Retail Analytics” or “Drag and drop API builder.”
  7. Use your this “this for that” IF it works. Don’t be another “UBER For blah blah blah.” You need a good “this for that” and it will make it very easy for people to understand your business but if you can’t come up with one that is precise or interesting, skip it in your startup description.
  8. Don’t listen to any of this. Consider your context. These are guidelines if you need them. Different context may require different descriptions. A single bold sentence may strike intrigue and trigger a conversation. Or among industry experts, digging into the details of your solution may be appropriate.

At the end of the day there are three principles you must conform to.

  • Be unique.
  • Be consistent.
  • Be concise.

Good luck and share you description with a link in the comments!

Android NFC + the IFTTT Maker Channel to Make Your Own IoT

I geeked out recently over the Android task automation app,  Automate. The reason I got so excited was that it provided a very elegant solution for creating a custom NFC sensor for a project I’ve been working on. What I also came to find out was that Automate opened up a lot of possibilities beyond this project.

Automate can be easily extended to prototype a ton of IoT projects. This tutorial shows how your Android phone can easily connect your physical world to any cloud service with a mashup of NFC, Automate and IFTTT.

Android IoT Automation with IFTTT

Example Use Case: NFC Enabled Sustainable Clothing Care

The project I’ve been working on is about improving the quality and sustainability of personal clothing care by instrumenting clothes with NFC tags. This way a clothing owner can be more careful about how they wash their clothes and more mindful about how they wear them. I had been looking for a good way to prototype this solution and my first idea was to create unique ID QR codes for all my clothing but that was a bit cumbersome. I had thought to wire up an Arduino but that seemed like a lot of work just for a prototype. I finally realized that the best way to build this prototype was sitting right in front of me.

Android “Automate” App as the Front End

I first started looking at the NFC Tools app which seemed to fit my use case very specifically. But thanks to the Google Play Store’s suggestions, I tested a few other apps and found that Automate seemed to be the most powerful and simple to use.

All I needed to do was read a NFC tag and send the tag’s ID to a database that held more information about the garments. I could then query and visualize the data to complete the feedback loop. That is where IFTTT comes in.

IFTTT as the Middleware

IFTTT had been growing on me for several years but when they introduced the Maker Channel, I was totally sold on it. IFTTT (If This Then That) allows you to trigger actions on one Web service or IoT device with with an event from another. The Maker Channel allows you to broaden the list of services and devices to anything that is capable of sending or receiving a HTTP request. In a prototype, it allows a maker to cut out all the business of constructing and API and hosting a database. See why it’s perfect?

Google Spreadsheets as the Back End

With IFTTT, I could choose from a couple really easy-to-manage data repositories: Google Spreadsheets and Wolfram Datadrop. Google Spreadsheets is simple and can be shaped into almost anything that it needs to be. Wolfram Datadrop is a bit more complex but a lot more powerful in terms of data management, visualization, and analysis. Since its not a ton of data and for a limited time*, both will suit my purpose. IFTTT makes it easy, so I used both with the same trigger. I will show how to use Google Spreadsheets in this example.

*Wolfram Datatdrop offers free “databins” for 30 days but then you will have to pay to store data longer.

Setup: Easy Android NFC Sensor

After spending enough time with an Arduino board to get a light to blink, I found turning my phone into an NFC sensor refreshingly easy. Automate exposes a few Android API’s that make it really easy to get, not only the NFC tag’s ID but the phone’s current location, and current location’s temperature and humidity. Living in Hong Kong, these are all things that would influence the decision to wear a certain garment so I planned to collect this data.

Android NFC IFTTT Flow

  1. The Flow is initiated when it the phone reads an NFC tag.
  2. The NFC ID value is put into a dictionary named payload as value1.
  3. The phone uses its Location services to retrieve the current location and saves the latitude and longitude as the variables lat and lon.
  4. The lat and lon variables are then passed to the weather block which uses Weather Underground to get the current location’s weather. The current temperature and humidity are put into the payload dictionary as value2 and value3.
  5. The payload dictionary is converted into JSON using jsonEncode method and sent via an HTTP POST* to IFTTT
  6. Set the URL of this HTTP POST with the URL from Step 8 of the IFTTT setup below.

Android NFC Sensor Setup

Pretty simple even with a minimal level of programming knowledge.

*The reason that the payload dictionary uses the keys, value1, value2, and value3, is that, whether sent as JSON on a POST request or query string parameters on a GET request, this is the naming convention that IFTTT expects. You can then refer to them by those variable names within IFTTT.

Setup: IFTTT Maker Channel Recipe

This is very simple. All you need to do is get the URL from the whirw Channel and ensure that the data is being sent to IFTTT. Then the Google Spreadsheet will be populated with NFC reading events.

  1. Setup a new IFTTT recipe here.
  2. For “if” choose the Maker Channel.
  3. Select “Receive a Web Request” and name your event.
  4. For “that” choose Google Drive
  5. Select “Add a row to a spreadsheet.”
  6. The default setting for the Google Spreadsheet and the format for the columns is good. Just remember where you will find you data collection spreadsheet when you want to see the results.
  7. Finish the steps to create the recipe.
  8. Test your recipe here. (Make sure to set the Maker Channel URL in your Automate Flow)

IFTTT Maker Channel Setup

With that, you can track anything that you can put an NFC tag on using the Android phone you already own.

Prototype All the Things!

This becomes really interesting when you consider that the cost is so low. Instead of buying an Arduino, you can just use a cheap old Android phone that can connect to WiFi and run Automate. Chances are, a phone is more reliable than something you wire together yourself. Additionally, Android provides you with so many other input interfaces, that you can get pretty clever with the context of the activity and connectivity. The opportunities are nearly endless for this. You can make a quick and basic prototype of any crazy IoT idea you have. Happy hacking!

The Best Android Task Automation App is Automate by LlamaLab

I’ll admit, my posts have been kinda lame lately, but don’t worry, I just found something that I’m pretty excited about! (This is not a paid endorsement but it will get a bit geeky. ) Automate by LamaLab is a clean, simple, fun and free (!) way to turn your IoT imagination into reality. The app puts all your Android’’s interfaces at your disposal to create powerful automation and expressive working prototypes.

Automate by LlamaLab

Automate by LamaLab is a clean, simple, and fun way to turn your IoT imagination into reality.

I found it yesterday while looking for a good way to hack together a custom Android NFC reader. After looking at a few other options, I ended up geeking out on Automate for the rest of the day! It’s awesome! So I wanted to share a quick up and running so you can join the fun with your very own “Hello World!”

Automate Task Building Basics

In short, Automate is an Android task automator that allows you to program task logic using a very clean, drag-and-drop flowchart interface. Each sequence of events, called flows, has a starting line and are constructed by connecting together several building blocks. Automate makes it easy for non-programmers to make cool stuff happen, for programmers to make cooler stuff and with a bit of understanding of the Android OS, it seems that the possibilities are all but endless.

The blocks are where the magic happens. Each block is either an action block or a decision block. Action blocks make things happen. They trigger things like turning on the flashlight, vibration, or sending a message. Decision blocks get triggered, check one of the phone’s inputs, and depending on how they are evaluated, change the course of the flow. This could be checking whether there is any ambient light or WiFi connection or explicit controls like user Yes/No dialogs.

Ok, you get the gist. That’s enough to say “Hello World!”

Time for an Android “Hello World!”

This seriously might be the easiest the “Hello World!” I have ever seen. All that it is going to do is start the flow and cause a “toast” message to be displayed with the text “When you show deep empathy toward others, their defensive energy goes down, and positive energy replaces it. That’s when you can get more creative in solving problems.” Just kidding, it’s gonna say “Hello World!”

LlamaLab Automate Block Menu
Step 2: Select a Block
  1. Create a new Flow by tapping the + at the top of the screen.
  2. Select the Toast Show block out of the Interface sub menu or by searching for “toast.”
  3. Tap the Toast Show block on the flow diagram. Set the Message to “Hello World!” and the Duration to Long.
  4. Drag a connector from the OK of the Flow Beginning to the IN of the Toast Show block. 
  5. Tap the checkmark (√) at the top of the screen to save the Flow. In the following screen, tap the pencil to edit the name of the Flow by changing <Untitled> to something more interesting.
  6. Press Play!
LlamaLab Automate Hello World!
Step 4: Hello World!

It’s so simple it hardly deserves a “Hello World!” tutorial, but this is just the beginning. By now you’ve probably noticed that there are 260 other blocks you could have used. To name a few interesting ones: Google Now voice command, Audio record, Flashlight, Take picture, Tone play, Vibrate, Video record, HTTP request, NFC tag scanned, Wi-Fi connect, Calendar event add, Google Drive upload, Notifications action, Notification hide, Notification interact, Notification posted, Notification show, Screen lock set state, Screen orientation, Toast show, Geocoding, Weather, Gmail send, SMS send, Ambient light, Ambient temperature, Device acceleration, Device orientation, Screen brightness, and Call outgoing.

Try a few out and connect them together to see how they work.

Now For Something Useful

Llama Lab Automate ExampleOk, I lied. This example is not that useful but it is simple and it does demonstrate a few features that will help in making something useful. This example shows a couple more blocks, both are decision block but one causes a dialog to show.

The first block checks the device orientation to see if the device is lying flat. If it is, it continues to the next block, if not, it starts checking the device orientation again.

In the second block, the phone checks the atmospheric pressure around the phone and stores it as the variable Llama Lab Automate DialogcurrentPressure. Since it is not checking if the atmospheric pressure is within a range, this block will all way continue through YES.

Finally, the third block displays the current atmospheric pressure in a dialog. The interesting thing here is that the message uses string interpolation to evaluate round(currentPressure) and display the current atmospheric pressure value as an integer. The dialogue user responses are meaningless here but you can see how they could be useful to program your tasks.

Nobody said it would be life changing, but you get the idea of what’s possible. Take a look at the tips below and get started!

5 Tips To Level Up the Automation Power

  1. You can use variables, functions, and expressions instead of static values for inputs by clicking the fx  button beside the input and output fields. Expressions should start with “=” eg. =lowerCase(“Hello World!”)
  2. To set variables, in the block’s Output fields enter the name you would like to give to that variable. For instance set the Dialog Input’s output variable to inputText and reference that variable as an input to other blocks.
  3. You can construct more expressive variables; dictionaries (key, value pairs) and arrays (sequences of values) which can be written to JSON files or sent across the web as HTTP POST payloads.
  4. The urlEncode() function can be used turn dictionaries in to URL query parameters. Eg. =urlEncode({yourValue : ”something”}) will be converted to &yourValue=something.
  5. To make a flow that is constantly listening for and reacting to a stimulus, connect the final OK connector to the IN of the block following the Flow beginning block.

Ok, go nuts! And let me know in the comments if you make anything cool!

First, Learn The Language

The following is an adaptation of the speech I gave at Hong Kong Toastmasters International speech competition. Thought is was interesting so I decided to post it.

Do you remember your first day of school? How about your first time away from you parents or your first time out of the country. Do you remember your first day at a new job or the first day of being a parent. Do you remember how anxious you felt about the unfamiliarity?

We’ve all been in situations like this and looked out at an uncertain future and not known where to start. I’ve found myself in situations like this a lot. It’s almost like I have crazy desire to put myself in these situations.

I’ve found that all of these types of challenges have a one thing in common: you will have to navigate new communities. And despite the difficulty of theses challenges it is possible to become fluent in a community if you can learn the language of that community.

Learning the language of the community makes everything possible. It allows you to understand the community, learn from the community, and express yourself as part of the community.  So if there is one thing that you must do to become fluent in any new community, you must first, learn the language.

When I say “language”, I don’t just mean spoken and written language like Japanese and Spanish. But don’t get me wrong, sometimes learning the spoken language is enough to be prosperous. For example,Gung Hei Fat Choi!”  But by language, I mean everything that we as humans do to understand and express complex ideas and relationships.

The Chinese New Year tradition of red packets in exchange for greeting "Kung Hie Fat Choi"
The Chinese New Year tradition of red packets in exchange for greeting “Kung Hie Fat Choi”

Learning a programming language is a perfect example and works on a couple levels. I remember my first days of learning Javascript. The first script I ever wrote was called biscuits.js. The script was how I imagined the instructions to making Spelt Biscuits would look if they were written JavaScript. The script would have caused a ReferenceError on line 1 but this made me hungry for more.

At the time, I was eating a lot of biscuits because they were in my budget as a very junior employee and the prep time to bake time ratio allowed me a lot of time to practice actually learning the JavaScript language. I was infatuated with the process. I think it was the first time I had ever fallen in love.

Learning the language presented a challenged I had never experienced and introduced a foreign community who I would otherwise have no access to. This was a phenomena that I had experienced before; tacitly, as a kid dropped into a Spanish-speaking kindergarten class in a Catholic school in Puerto Rico, and disorientedly, as a kid traveling around the world in the two preceding years. But this was the first instance, so many years since my first experience, that I began to understand the meaning of language.

In Puerto Rico, Kindergartners graduate from their class. Here is me on that day in a class that had more girls than boys.
In Puerto Rico, Kindergartners graduate from their class. Here is me on that day in a class that had more girls than boys.

I gradually began to pick out words that I could understand from the conversations of engineers at work. Without asking stupid questions, I could stand closer to the conversation. Within a year, I was sitting in the middle of a crowded hall filled with harry and smelly JavaScript Enthusiasts listening to a conversation about l’art pour l’artof reverse engineering the YouTube JavaScript API. I even worked up the courage to pose a question in front of the audience. To my surprise, nobody laughed. And two participants provided lively, passionate answers to validate my question. Only a year prior, this was a community of people that spoke my language and I didn’t even know how to speak it.

There are also elements of every community that you cannot understand without learning from community members.

I remember when first moved to Hong Kong to join a sourcing company. Not only did I not understand the Cantonese language around me, but I didn’t understand the language of sourcing. Product jargon and endless acronyms, it was like two foreign languages as the same time!

If you’ve have ever seen a quality assurance flow chart, business unit org charts or a production tracking spreadsheets, you would know what I mean. If you printed on paper, they would cover the entire floor of my 400 sq. foot Hong Kong apartment! And they are filled with product images, Dates, Symbols, Colors, Abbreviations and Codes and very few written words. These documents are a representation of the language that was created just for sourcing and can only be decoded by people within this community.

An epic flowchart. A whole other language.
An epic flowchart. A whole other language.

In my first week I sat in on IT workshop and though the meeting was in English, I could barely understand half of it. But over the past year I have had the opportunity to work on four projects with people who use this language in their daily work. And I remember by my third project I was actually giving the definition of “DV Sample” to my coworker. This was a big moment for me. But the moment that I was most proud of was when I made a joke in the language of sourcing and people actually laughed!

That is when you know you have made it. When you have gained fluency in a community, you can express yourself in a way that community understands and empathizes with you.

It’s been just over a year in sourcing and I am not saying that I am fluent in Javascript or sourcing just yet, but most of the time I can understand what is going on and can get my point across.

Like starting school, or leaving my home for the first time, it was difficult at first, but thanks to a  concerted effort to learn and practice the language, it has progressed very well. So next time you face the challenge of starting fresh and have to navigate a new community, I encourage you to first, learn the language.


Google Analytics to Google Spreadsheets is Data to Insights

When you reach the limits of Google Analytics custom reports and you still need more, Google Spreadsheets and the Google Analytics Add-On can take you past sampling, data consistency and dimension challenges.

This post is all about the Google Analytics + Google Spreadsheets workflow. It is an end-to-end example of how you can extract more value out of your Google Analytics data when you work with it in its raw(ish) form in Google Spreadsheets.

Blog Post Traffic Growth and Decay with Age

The end goal is to look at how blog post traffic grows or decays with time and ultimately Forecast Organic Traffic to Blog Posts (coming soon).  But this post sets the foundation for that by showing how the data is extracted, cleaned and organized using a pivot table in order to get there.

There is also a bit of feature engineering to make the analysis possible. To do this we will extract date that the post was posted from the URL and effectively turn the “Date Posted ” and “Post Age”  into custom dimensions of each page. But enough setup. Let’s start.

This posts assumes a few minor things but hopefully will be easy to follow otherwise:

  • Google Spreadsheets Google Analytics Add-On already plugged in
  • Basic familiarity with Regular Expressions aka. RegEx (helpful but not necessary)
  • Basic familiarity with Pivot Tables in Google Spreadsheets
  • Blog URLs with dates as subdirectories eg “/2015/08” (or collect post date as Custom Dimension)

Creating Your Custom Report

Once you have the Google Analytics Add-On up and running this is actually pretty simple. It just takes a bit of trial and error to ensure that you’ve queried exactly what you want. From the Report Configuration tab, most of the time there are only a few, but very important, fields that you will need to worry about: Date Ranges, Dimensions, Metrics,  and Filters.

Google Analytics Add-On Report Configuration
The purpose of this is to look at sessions by blog post URLs by month, over the entire history of the site

I chose the Last N Days because I know that is roughly the age of my site and a date range that is too broad is ok. I chose sessions because this relates to how many people will land on a given landing page in a given month of a given year. So that is all pretty straight forward.

Filters can get a bit tricky. A good practice for setting up filters is to first build them using the Google Analytics Query Explorer. That will enable you to rapidly test your queries before you are ready to enter them into your spreadsheet.

There are several filter operators that you can use but I kept this one fairly simple. It consists of three components (separated by semicolons):

ga:medium==organic;Only organic traffic ( == means equals)
ga:landingPagePath=@20;Only landing page URLs that contain 20  (@= means contains)
ga:landingPagePath!@?Only landing page URLs that do not contain a query string because that’s mostly garbage. (!@ means does not contain)

I used ga:landingPagePath rather than page title because that can be less consistent than URLs. They are more likely to change and will sometimes show as your 404 page title. Blog post URL’s are a more consistent unique identifier for a post but it is important to note that sometimes people will change blog posts URLs. We will deal with that later.

Cleaning the Data for Consistency

Even with good data collection practices, cleaning the data is extremely important for accurate analysis. In my case, I had changed a couple blog post URLs over time and had to manually omit a few that my query’s filter did not catch. In this case, data cleansing becomes very important for two reasons: 1. Posts that are not combined by their unique and consistent URL will show as two separate posts in the pivot table which will skew summary statistics and 2. Posts that are not real URLs with a small number of sessions will really skew summary statistics. Consistency is key for Pivot Tables.

So in this case, for small exceptions, I just deleted the rows. For more common exceptions, I used the REGEXREPLACE function. This is a powerful tool for data cleansing and unique to Google Spreadsheets. It allows you to select a part of a string that matches a RegEx pattern and replace with with whatever you might want. In this case, I just searched what I wanted to remove and replaced it with an empty string. eg.

I used this to remove ”/blog” from the URLs that were used before I transitioned from Squarespace to WordPress and date numbers because some had been changed when the post was updated.

Extracting Blog Post Posting Dates

Extracting the date that the post was posted is actually pretty simple. Again, I used another RegEx function, REGEXEXTRACT to do it:

The RegEx pattern finds any four digits then a slash and any one or two digits. Then the extracted string is split into two cells by the slash. This yields the year in one column and the month in the next. I combined the month and year of the post date and the month and the year of the Google Analytics date into Date objects so that I could use the DATEDIFF function to calculate the age of the blog post as a dimension of the post. Maybe this is too much gory detail but hopefully it’s useful to somebody.

Finally, we end up with is something that looks like this. This allows for pivoting the data about each post by each month of age.

Google Analytics Add-On Report Breakdown

Step 4: Pivot Tables FTW!

Finally, all this work pays off. The result is one table of blog post URLs by Age and one table of URLs by summary statistics.

Google Analytics data pivot table

The blog post age table allows me to see if the posts show a natural growth or decay of traffic over time. The big purpose of the the table is to create the chart below that basically shows that growth and decay dont look that consistent. But this is an important finding which helps frame thinking about modeling blog traffic in 2016.

The summary statistic pivot table will be used for forecasting 2016 traffic. This just happens to be the topic of my next post in which the tables are used to answer 1. What is the likelihood of reaching 25,000 sessions in 2016 if things stay the same?  and 2. What needs to change in order to reach 25,000 sessions in 2016?

So in summary, so far, this post has proven a few things:

  1. If you work with Google Analytics and don’t know RegEx, go learn! Its an incredibly useful tool.
  2. My blog posts do not demonstrate consistent growth or decay
  3. I might just be as big of a nerd as my girlfriend thinks I am.

Hope it might be useful in thinking about similar problems or maybe even creating new ones!

How To Add Multiple Columns to Google Spreadsheets

I recently ran into this problem when I was looking at someones Adwords account and wanted to get an idea about all the unique keywords that they were using.  I used the following formula to get an array of all unique keywords:

But then I encountered a problem:

Google Spreadsheets #REF! Error

Error Result was not automatically expanded, please insert more columns ([number-of-columns]).”

Soon, I found that the current best option is to highlight and copy a number of columns and insert the copied columns over and over until there are enough columns. It seemed there should be a better way. After all, you can add an arbitrary number of rows to a spreadsheet. So just like the script to delete multiple sheets, I made the simple functionality.

The script looks like this:

Using the Script

  1. Open the Google Spreadsheet Script Editor from the menu: Tools > Script Editor…
  2. Copy and paste the script into a new script file and save: File > Save
  3. Refresh the Google Spreadsheet window.
  4. Once the pages has refreshed, there should be a new menu called “Sheet Expander”
  5. Go to: Sheet Expander > Add Columns, and enter the number of columns you would like to add.

Note: Google Spreadsheets claims to impose a maximum limit on columns within a spreadsheet. They say it is 256 but it seems like it is possible to add many more. Perhaps this depends on number of rows in the spreadsheet.

Hope this saves you some time.

QR Codes as the Interface: A Scan-to-Vote App Using IFTTT and Google Sheets

In Defence of QR Codes

If QR codes aren’t being used effectively, it is more the fault of the publisher than the technology. The technology, despite its looks, is quite elegant and offers a lot of opportunity. However, there are some pretty significant barriers to adoption and use. So the burden is upon the publisher to use QR codes in the right context and provide a compelling reason to scan.

Mona Lisa QR Code

Some contexts are better than others. As this discussion illustrates, places where written language is not based on Basic Latin characters, like much of Asia, QR codes can be used to help users avoid quite a lot of mobile typing. The beauty of QR codes, a type of character encoding in their own right, is that they are universal. They are like high fidelity emotions; a lot of meaning packed into a small print expression. This universal characteristic is why I decided to use both together in the example below.

From a pure technological standpoint, QR codes offer quite a lot. They store up to several paragraphs of text or complete contact information, they can uniquely ID physical objects like NFC, and they can also trigger phones to send SMS messages, download apps and open web pages. (No wonder marketers are so eager to use them.)

The trigger to open webpages is a useful feature but publishers’ use of this trigger have fallen short of its potential. A smartphone’s web browser is much more than just a content browser. It is a interface to the blossoming world of Web 2.0 Web services. This is the unrealized potential of QR codes.

QR Codes as Application Interfaces

The technology, on the surface, is simple, it’s utility is elegant, and it’s recognition is universal. It is, in essence, just a medium but its capabilities are broad. We just have to think within the right application.

The Web is your Application

Most of us use our mobile Web browsers to request documents from Web servers (most often HTML web pages) or interact with Web apps. And that is traditionally what QR codes have been used for. But if we think of a mobile web browser beyond just a medium for viewing documents and more a means of sending HTTP requests, there is a lot of World Wide Web territory that opens up.

Beneath the document-based surface of the Web, there is a lot happening. There is a lot of data being passed around from place to place. Most often this happens as data is requested and sent from an API to dynamically update a web page (think of your favorite travel booking site) or connect one website or service to another (think of Twitter streams on web pages).

See what Web Services are available via IFTTT

These API’s are, very often, available to authenticated users of the service or even the public. There are API’s for updating the price of items on eBay, posting to Facebook, getting the current weather conditions, or getting the structured data from your favorite Reddit page. And all of these API’s and many more, are RESTful, meaning that sending a request to a specifically structured URL will return some structure data or tell a service to do something for you. This is where mobile web browsers come in.

The QR Code is your Interface

So all we have to do to make a web service do something is send a request to a URL. And all we need to trigger a request to a URL is scan a QR code that contains that URL. This means that scanning QR codes becomes a physical interface to the power and connectedness of the digital world. It is now the same as pressing buttons to control the Web!

Cat Button

The question is now, what would you want this button to do? Depending on what you can connect to, this could be everything from light switch, a messaging service, an alert system, a doorbell, some kind of Kanban system … or a voting system.

Why not Mobile Apps or IoT Hardware?

If you’ve gotten this far and you’ve done more than just scanned for cat Gifs, you are probably asking, “Why not use a Mobile App or IoT hardware where you can literally use a button as a trigger?”

The answer is cost and ease. Their is a huge cost to DIY mobile applications and connected devices. Using QR codes is as simple as generating the codes and printing the papers. Again, the context must be considered. QR codes as triggers are probably best used where use is passive and takes place over a short timespan making investment in an app or hardware infeasible.

Also persuading the download and use of mobile apps is a massive barrier. The same could be said for QR code scanner apps but for most applications, QR code scanner apps are more universal than any application that would offer the same functionality. Additionally, in places where QR codes have a stronger value proposition, like Asia, (see above) QR code scanners will be found in apps that are already commonly used, like WeChat.

Uniquely QR Codes

There is also an interesting combination of properties of QR codes that can make or break them as triggers. If the publisher uses QR codes with intention, these properties can become a features of the technology rather than a weakness.

  • Contextual – Users have to be in the same physical location of the QR code to receive or send the data that the QR contains. In a way, the location of the QR code acts as an implicit authentication. If and only if users are nearby can they scan the QR code.
    • Inherent barrier to use – This one is difficult to view as a feature but the barrier could serve as proof of motivation. This barrier can allow us to infer some things about their user and/or the strength of their motivation. Digital fluency, to some degree, is required. There is also a measure of curiosity and/or motivation that is needed.
  • Visual – You know them when you see them and they are their own call to action. They are the same as putting a big link on a page that says “Click Here!”
  • Coded – Again, they hold more information or instructions than one could ever hope to print in the same space and have it make sense. They also allow for long, dynamic URLs or if you so choose, intentional misdirection.
  • Can hold and send information about their context – Depending on how dynamic the publisher chooses to be in creating QR codes, the codes could contain an element of mass customization. The QR code’s URL could send the destination URL (web page or web service) information about the context of the QR code. This could allow the receiver of the Web request a customized response or action in the same way that a search query on your favorite ecommerce site provides customized information on the following page.
  • Duplication – Ok, it’s really hard to see how this could be anything but a weakness. It is somewhat difficult to ensure that a URL is not requested twice, either by scanning a code twice or browser refresh.

Motivating this Example

The intent is to demonstrate two things: dynamically generated QR codes that hold contextual data and web requests to a web service rather than a web page. To do this, I decided to create a QR code ballot where votes are tallied in a cloud service.

There have been other applications of QR codes for voting. In most of these, the QR code provides a link to an online form (hopefully mobile-friendly) where voters can enter their responses. Unlike these applications, in this version, scanning the QR code is the actual act of voting. This infrastructureless mashplication is also free and a MVP of what could be done.

Building a Prototype

For a test case, I used a project that has been happening in my neighborhood for a couple years called HK Walls. This project pairs wall donors to artists from around the world to create awesome public art. At the moment, each of these walls, has nothing to signify that it is part of the project or the project itself.

The HK Walls project does fit perfectly into this voting idea because it is location-based and inherently mobile (it has its own hashtag). It is also clearly visual and lends itself to normative voting. Art is either the perfect or the worst use case for this but this is just a test. There are plenty of other applications for this if you use your imagination.

To build the prototype, very little is needed; just Google Spreadsheets, IFTTT, a B/W printer and some spare time.

Step 1: IFTTT Recipe Setup

This step provides the base URL for the IFTTT Maker channel. It even creates the spreadsheets for all future steps. See my recipe.

IFTTT Recipe: QR Code Scan to Vote connects maker to google-drive

Step 2: Dynamically Generate Lots of QR Codes

I used Google Spreadsheets and Google Charts’ QR code API to generate the QR codes. Each QR code was dynamically generated by using Google Charts’ QR code API to encode a combination of an IFTTT Maker Channel URL, the location of the HK Wall and the variant emoji. The result was 88 QR codes with different contextual (location) and normative (emoji) information.

Voting With QR Codes

The normative emojis are placed above each location’s row of emojis so that they can be cut out with the set of QR codes. After finishishing step 3, I added a column of QR codes that would send scanners back to the chart.

See the Google Spreadsheet QR Code Generator for Voting

Step 3: Setup and Publish the Results Chart

The fifth column of QR codes holds a QR code that links scanners to the aggregate results of the poll (average rating values for each wall). This is a simple chart based on a pivot table of average scores. The chart was also published so it could have its own URL for scanning.

The Google Chart URL shows this on a mobile browser:

Step 4: Print the QR Codes and Rock the Vote!

If I were to do this in real life, I would print these all out and paste them up on the walls. But it is not my place to facilitate judging of free public artwork. That seems to oppose the spirit of the project. I encourage you to though to use this for your own Democracy!

Use Your Imagination

I had to see this was possible. I had to know that QR Codes could control the connected web. I had to see that it could scale with minimal technical know-how.

I am satisfied with the result, I think there is some testing to do, (I am still thinking of ways to gather some actual data of QR code use in Hong Kong.) and there are many applications yet to explore. I hope that this might motivate your curiosity to find what’s left to find.

Fundamentals of Project Planning and Management Course Review

This class is great for anyone who has been involved in a project and thought, “there must be a better way.”

Course provided by:

Coursera | University of Virginia, Darden School of Business

Is Slack Messenger Right for My Team? Analytics and Answers

From AOL Instant Messenger to WeChat stickers, digital communication has always fascinated me. From the beginning, there has always been so much we don’t understand about digital communication. It’s kind of like GMO; we just started using it without considering the implications.

We are continually learning how to use the the digital medium to achieve our communication goals. And meanwhile, our digital communication tools are ever evolving to better suit our needs. A prime example of this is the team messaging app, Slack.


Slack has adapted well and I would argue that it has dominated its ecosystem. There are a few reasons why I believe that it’s earned its position:

  1. It’s easy.
  2. It’s flexible.
  3. It’s not too flexible.

As a tool, Slack is malleable enough to form-fit your communication theories and practices and it does little to dictate them. This means that its utility and its effect are less a factor of the tool and more a factor of the our ability to shape its use.

So when the question was posed, “How well does Slack fit our needs as a team?” I have to admit I wasn’t sure. Days later, in my head, I answered the question with two more questions:

How well have we adapted the tool to us?

How well have we adapted to the tool?

The questions felt somewhat intangible but I had to start somewhere and me being me, I asked the data. I’ll admit I haven’t gotten to the heart of the questions… yet. But I did start to scratch the surface. So let’s step back from the philosophy for a minute, walk through the story, and start answering some questions.

So yeah, we tried Slack… Six months ago

A recently formed, fast moving and quickly growing team, we believed that we could determine own our ways of working. In the beginning, we set some ground rules about channel creation and, believe it or not, meme use (hence the #wtf channel). And that was about it. We promised ourselves that we would review the tool and its use. Then we went for it.

A while later, as I mentioned, a manager pointed out that we had never reviewed our team’s use of Slack. It seemed fine but the questions started to crop up in my head. Me being me, I had a to ask the data.

This all happened about the time that I started to play with Pandas. I didn’t answer the questions but I did get frustrated. Then I read Python for Data Analysis, pulled the data out of the Slack API (which only provides data about channels) and went a bit crazy with an iPython notebook.

To answer my theoretical questions, here are the first questions I had, a few that I didn’t and their answers.

How is Slack holding up over time?

Stacked Time Series
Don’t judge me. This was my first go with matplotlib.

This stacked time series shows the number of post per channel (shown in arbitrary and unfortunately non-unique colors) per week. The top outline of the figure shows the total number of messages for each week. The strata represent different channels and the height of each stratum represent the volume of messages during a given week.

It appears that there is a bit of a downward trend the overall number of messages per week. A linear regression supports that. The regression line indicates that there is a trend of about two fewer messages than the week before.

Linear Regression

If you ask why there appears to be a downward trend in total use over time, I think there a few ways to look at it. First, the stacked time series shows that high volume weeks are generally a result of one or two channels having big weeks rather than a slowing of use overall. This makes sense if you consider how we use channels.

We have channels for general topics and channels for projects. And projects being projects, they all have a given timeframe and endpoint. This would explain the “flare ups” in different channels from time to time. It would also explain why those same channels come to an end.

One way to capture the difference between short lived project channels and consistent topic channels is with a box plot. Box plots represent the distribution of total messages per week for each channel by showing the high and low week totals for a channel and describe the range (Interquartile Range) that weekly message totals commonly fall into.

Slack Analytics Channels Box Plot
Each box plot represents a Slack channel. The Y axis scales to the number of messages in that chanel

For a specific example, the channel on the far left (the first channel created, named #generalofficestuff) has had a relatively high maximum number of messages in a week, a minimum around 1 or 2 (maybe a vacation week) and 50% of all weeks in the last six months fall within about 7 and 28 messages with an average of 10 messages per week.

On the other hand, channels on the right side of the chart, more recently created and generally project-specific channels, describe the “flare ups” that can be seen in the stacked time series chart above. If you wanted to look deeper, you could make a histogram of the distribution of week totals per channel. But that is a different question and, for my purposes, well enough described with the box plot. 

So… how is Slack holding up over time?!

The simple answer is, use is declining. Simple linear regression shows this. The more detailed answer is, it depends. As the stacked time series and box plots suggest, in our case, use over time is better understood as a factor of the occurrence of projects that lend themselves especially well to Slack channels. I know what you’re saying, “I could have told you that without looking at any charts!” But at least this way nobody is arguing.

Projects… What about People?

Another way to look at this questions is not by the “what”, but by the “who.” Projects, and their project channels are basically composed of two components, a goal/topic and a group of people that are working toward that goal. So far we have only looked into the goal but this leaves the question, “are the people a bigger factor in the sustainability of a channel than the topic.

I looked at this question many ways but finally, I think I found one visual that explains as much as one can. This heat map shows the volume of messages in each channel per person. It offers a view into why some channels might see more action than others and it also suggests how project/channel members, and the synergy between them, might affect a channel’s use.

Slack Analyttics Hierarchical Clustering Heatmap
Volume of messages is represented by shade with Users (user_id) are on the Y axis and channels are on the X axis. Hierarchical clustering uses Euclidian distance to find similarities.

What I think is most interesting in this visualization is that is shows the associations between people based on the amount of involvement (posts) in a channel. The visual indicates that perhaps, use is as much a factor of people as the channel’s project or topic, or time.

There are, of course, other factors. We cannot factor out the possibility of communication moving into direct messages or private groups. But again, that is another question and beyond the bounds of this investigation.

So what?

So we got a glimpse at the big picture and gained a pretty good understanding of the root cause of what motivated the question. This is my favorite part. We get to sit back, relax, and generate a few new hypotheses until we run into a new question that we can’t avoid.

What I think is coolest about the findings is that it suggest a few more hypotheses about what communication media our team’s communication occasionally moves to and what media it competes with. Now these investigations start to broach the fundamental questions that we started with!

There are a few things at play here. And the following are just some guesses. It could be that email dominates some projects or project phases because we are interacting with outside partners (people) who, for whatever reason, cannot or will not use Slack. Sorry Slack. It could also be that, due to the real world that we live in, communication is either happening over chat apps like WeChat or WhatsApp.

In either case, we return to the idea of people adapting to tools that are adapting to people. The use of digital communication tools reflects the people who use them and each person’s use reflects the structure and offerings of the tool.

And what’s next?

Hopefully, if you read this you have more questions about this reality and I might (probably) go on to try to answer a few more. I think there are a few interesting ways to look at people are norming with Slack.

Maybe, you are interested in how all this Pandas/matplotlib stuff works because I am too. So I think it will be fun to post the iPython notebook and show how it all works.

Otherwise, it will be interesting to watch how this tool and this team continue to evolve.

Top 3 Resources to Learn Digital Marketing Technical Skills | $10k Tech Skills 4/4

This is part one of four in the $10k Technical Skills for Digital Marketing series. You’ve gone a long way, Keep it up!

Getting Started and the Learning Mindset

Being a technical marketer is as much about using technologies as it is about learning and adapting to new ones. The learning mindset may not get its own bullet point on a resume (even though it probably should) but its value increases with the rate of new technology. Lucky for you and me, the learning mindset has nothing to do with education or intelligence – it is solely about determination.

Determination is tested the most in the beginning when you don’t know where to start. There are tons of resources for learning Web and programming technologies but there are far fewer resources geared to learning these technologies for digital marketing. The corpus of technical marketing resources is mostly comprised of blogs, API documentation, open source code repositories and forums. Your search skills will be tested.

I have chased down plenty of rabbit holes and run into many dead ends. From all this confusion I have found a pretty familiar flow of how different types of resources are used. The rest of this post is about how these different resources are used in the ideation, development and execution of technical marketing tactics.

Ideas generally come from one of two places: a problem that needs a solution or the blogs of other creative digital marketing geeks. From there, the idea will generally have to be tailored to a specific use case.

Ideas + API Docs + Code = Execution

Part of applying a good idea to your problem is determining if this idea can be executed. For this, I often turn to API documentation. Whether it is the DOM API or a REST API for a marketing technology, this is the place to find out what the digital medium capable of.

Screen Shot 2015-06-29 at 10.21.07 PMAPI docs describe what the API allows a “client” (a.k.a. a program on your behalf) to do and how the API can be manipulated to do it. Sometimes reading API docs can even broaden ideas by introducing the full set of the API’s capabilities!

API documentation is typically structured in one of two ways, the REST API way or the code library/Software Development Kit (SDK) way. REST API’s docs generally need to describe what resources (structured data) or methods (things the API can do) the API offers. They also need to communicate how these resources can be obtained. These docs usually offer a description of the resource, the location of the resource (URL) and a sample resource representation in code.

A great example of a REST API is Optimizely’s REST API.

Libraries/SDK’s generally describe the “public” methods (methods that are for users of the library not internal workings of the library) that the API offers. These docs communicate what each method does, how the method is called/used and what the options are for using the method. Code samples are usually included to show these details.

Good API documentation that you are likely to come into contact with are Mozilla’s Browser API, jQuery’s API and Google’s various code library’s’ APIs.

GitHub: The Best Thing Ever

When its time to begin developing an idea, a great way to start is to look for code that either accomplishes what you want or gets you the first 80% of the way, Hello GitHub! If you don’t already know about GitHub you better learn quick. It is public code-sharing repository and version control system where you can find code on just about anything! It has enabled almost every great open source project and is one site that truly represents what is great about the Web. It is a great place to start from when launching your solution development.

This is the code you are looking for.

Many web searches will lead to GitHub by default but GitHub also offers excellent advanced search functionality. If you can’t find the code you are looking for there, it may be a rare occasion that the code has either not been written or not been shared yet. When you find a repository that looks like what you are looking for, there are a few things you need to know to make sense of what you have found: 1. A repository represents a file directory and each file in the directory can be viewed separately. 2. The readme.md (markdown file format) generally offers a description of what the code repository has to offer and how it is used. 3. There are metrics associated with the repository that are generally an indication of the popularity and overall use of the repository. (More popular generally means more stable/trustworthy code)

StackOverflow: The Duct Tape of the Internet

When your brilliant idea looks executable and code is on the screen, there is still a way to go to complete you technical solution. You will probably find some rough edges and interfaces that don’t connect the way you want them. When these bumps in the road arise, the best place to go for quick problem-specific answers is StackOverflow. This site has solved more problems than duct tape, bubble gum and elbow grease combined. And like GitHub, StackOverflow is another “best of the Web” site in my opinion.stackoverflow-logo-1-624x195StackOverflow is question answer forum site for programming questions. It rewards its users for asking great questions and providing great questions. This, in turn, increases the knowledge of everyone. Another benefit of the forum format is that many questions will receive several legitimate solution, so the likelihood that you find a solution that meets your needs is far more likely than not.

To use StackOverflow, you will generally start with a search. Googling: [error message] [programing language or application] will often land you on a StackOverflow page. But because the site is full of natural language question and answer, Googling a specific question will also turn up solid results from the site. In the beginning, if you are unable to find what you are looking for through Google searches, use StackOverflow’s excellent advanced search functionality there is a lot in there. In my experience, as Google starts to recognize that I have favored StackOverflow search results, I find that they are provided more often.

Finding answers on StackOverflow can be daunting at first but you just have to know what you are looking for. The /questions/ pages all have the same format which you will get familiar with.

The heading is the question or problem description that was originally submitted and directly below that is a detailed description of the problem. Below that are the responses. Users rate questions and responses based on their quality and how helpful they are. Scores reflect their popularity and generally reflect best practices. But note that if you don’t love the first answer, keep looking at answers below because you might find an answer that points you in the right direction. Also pay attention the date of the question and make sure that both the question and answer are both still relevant to your use case.

Finally, I have to mention Quora; part because the amateur philosopher in me loves is but also because it is great for asking higher-level questions. This is a great place to hear from seasoned pros and is a perfect place to discuss philosophical matters like if one approach is better than another. Google forums, Google+ groups and Meetups are also a good place to interact with people who are solving the same technical problems as you.

With all these resources, it comes down to a matter of time and determination. Never give up if a solution seems too difficult. Keep searching and keep learning. Learning the technical stuff is all about momentum.

Read the rest of the $10k Technical Skills for Digital Marketing or…


For more digital geekiness, get the updates!