Visualize activity at your next event, with lasers. Lasers!

A little while back we sat down with the good people over at Particle and figured out a way we could show off how to use Keen IO and Particle at an inperson event called DevGuild. Particle has some seriously cool hardware and software tools for prototyping, scaling, and manage IoT products.

We ended up deciding to put some trip wires around the room that were connected to WiFi via a Particle board. When it was tripped it sent an event to Keen with a unique id for the laser that was tripped.

laser pic

Here was the code we wrote to get the laser working with Particle:

int laser = 0;
unsigned int lastPublish = 0;
bool lastState = false;

void setup() {
    pinMode(A0, INPUT_PULLDOWN);
    pinMode(D7, OUTPUT);

void loop() {
    int val = analogRead(A0);
    unsigned int now = millis();
    unsigned int elapsed = now - lastPublish;

    bool broken = val < 4000;
    if (broken == lastState) {

    digitalWrite(D7, (broken) ? HIGH : LOW);

    if (elapsed >= 1000) {
        String topic = ((broken) ? "laser/alarm" :  "laser/reset");
        String message = String(val);
        Particle.publish(topic, message);
        lastState = broken;
        lastPublish = millis();

Once we had the laser working we configured a Particle webhook to post to a Keen IO endpoint.

Then events started rolling in!

The next thing we had to do was make some sense out of the data, so we made a real time interactive visualization. We used SVG to make a very rough view of the rooms layout, which happened to just be a rectangle, and then popped two dot’s connected by a line on the page when a new new laser ID showed up in Keen. Once the dots are on the page you can move them around and place them where they phycicall are in the room.

The last step was to have the line blink to represent the laser getting tripped, in real time. We also added a fun little feature where, if a trip laser is getting a ton of activity, the line gets bigger to represent heavy traffic in that area of the venue.

viz pic

We used Firebase for persistence, Node + ReactJS for the interface, and Keen IO for the rest. Here’s the app code:

var React = require('react'),
    Keen = require('keen-js');


var config = require('../config');

// Configure Firebase
var firebaseRef = new Firebase(config['firebase']);

// Configure Keen
var client = new Keen(config['keen']);
var gates = new Keen.Query('count', {
  eventCollection: 'lasers',
  groupBy: 'coreid',
  timeframe: 'this_1_minute'
var totals = new Keen.Query('count', {
  eventCollection: 'lasers',
  groupBy: 'coreid'

var Gate = React.createClass({

  getInitialState: function(){
    var rando = Math.round(Math.random()*300) + 50;
    return {
      a: {
        active: false,
        radius: 15,
        x: rando,
        y: rando - 50
      b: {
        active: false,
        radius: 15,
        x: rando,
        y: rando + 50
      stroke: '#808080',
      strokeWidth: 5

  handleMove: function(i, e){
    var state = this.state[i];
    if (! return;
    state.x = this.props.trace[0];
    state.y = this.props.trace[1];
    firebaseRef.child('/gates/' +;
  handleDown: function(i,e){
    var state = this.state[i]; = true;
    state.radius = 25;
    firebaseRef.child('/gates/' +;
  handleUp: function(i,e){
    var state = this.state[i]; = false;
    state.radius = 15;
    firebaseRef.child('/gates/' +;

  tick: function(){
    var self = this;
    var diff = self.props.weight - self.state.weight;
    console.log(diff > 0,;
    var interval = setInterval(function(){
      if (diff > 0) {
          weight: self.state.weight ? 0 : self.props.weight,
      else {
        if (!self.state.weight) {
            weight: self.props.weight
    }, 500);

  componentDidMount: function(){
    setInterval(this.tick, 1000);

  render: function(){

      {'ID: ' +}
      {'Total: ' +}


var Stage = React.createClass({

  getDefaultProps: function(){
    return {
      gates: []

  getInitialState: function() {
    return {
      ix: 100,
      iy: 100,
      height: window.innerHeight,
      width: window.innerWidth,
      position: {
        x: window.innerWidth / 2,
        y: window.innerHeight / 2

  getKeenResults: function(){[gates, totals], function(err, res){
      res[0].result.forEach(function(record, i){
        var id = record.coreid;
        if (id) {
          firebaseRef.child('/gates/' + id).update({
            id: id,
            weight: record.result,
            total: res[1].result[i].result

  componentDidMount: function() {
    var self = this;

    setInterval(this.getKeenResults, 1000 * 5);

    firebaseRef.child('/gates').on('child_added', function(data){

    firebaseRef.child('/gates').on('child_changed', function(data){
      self.props.gates.forEach(function(gate, i){
        if ( === data.key()) {
          self.props.gates[i] = data.val();

    firebaseRef.child('/gates').on('child_removed', function(data){
      self.props.gates.forEach(function(gate, i){
        if ( === data.key()) {
          self.props.gates.splice(i, 1);

    window.addEventListener('resize', this.handleResize);
    document.addEventListener('touchmove', this.preventBehavior, false);

  handleResize: function(){
      'height': window.innerHeight,
      'width': window.innerWidth

  preventBehavior: function(e){

  handleMove: function(e){
    var touch = (e.touches) ? e.touches[0] : false;
      ix: touch ? touch.pageX : e.clientX,
      iy: touch ? touch.pageY : e.clientY

  render: function(){
    var gates =, index){
      // console.log(gate);
    }, this);





React.render( , document.getElementById('stage') );

module.exports = Stage;

The config.json file has the Keen API keys and the address of our Firebase app.

The index file puts our page on the internet and has is a div placeholder with an id of ‘stage’ and all the things are injected:

<!DOCTYPE html>

  <style scoped="scoped">
    body { margin: 0; }
    svg circle { cursor: move; }
  </style><div id="stage"></div>
  <script src=""></script><script src="./app/index.js"></script>

The result was a very fun interactive visual that people really seemed to enjoy. + we got to talk about lasers, double win!

laser pic

Check it out and hookup your next event and/or let us know what you come up with! Big ups to Dustin and Zach for coloborating on this with me. High-Five

laser gif

Justin Johnson

community guy, hacker, music nut. i like to help people build stuff.

How to Customize the Open Source Explorer - Video Tutorial

Just over a month ago, we released the Open Source Data Explorer - the point and click query interface that sits on top of our collection and analysis API. Last week, our lead engineer on the project, Eric Anderson, walked us through a demo of how to fork, customize and embed Open Source Data Explorer anywhere, making it your own!

Visualize Data with the Open Source Explorer from Keen IO on Vimeo.

Eric also goes into some of the tools he used to build the Open Source Data Explorer. If you’re curious about open source data and analysis tools, this is for you!

Why customize it?

You might want to offer the Data Explorer to your users. You also might want to have the data explorer usable by your teammates without having to log-in to Keen IO. One of our customers, Bluecore has embedded the data explorer right inside of their internal dashboard so all teams have easy ability to answer questions and run queries whenever they need to!


Check out the repo for the open source data explorer or send some of your own data and start playing around with it on Keen first! Happy Exploring!

Sarah-Jane Morris

Community and Awareness

Analytics, Startups and Laughs at Keen HQ

San Francisco is a pretty splendid town. Say what you will about the tech industry, we’re nestled in a hub of creative and brilliant minds. We were thrilled and privileged to bring some of these minds together last night at Keen HQ in downtown SF to talk about building analytics solutions from the ground up. 


Our speakers included:

Michael Greer, Co-founder at Tapp TV and previous CTO of The Onion

Samson Hu, formerly of 500px and currently Data Engineer at Wish

Kate Heddleston, software engineer, formerly of Runscope.

Michael Greer, former CTO of The Onion, brought the laughs with his funny approach to our sometimes humorless analytics initiatives. Here are his slides:

Funny Analytics

Samson Hu spoke about building out analytics-driven cultures at startups. Here are his slides:

Building Analytics in Start-ups

Kate Heddleston walked through how she chose to integrate Keen to help Runscope track key metrics for their API testing tools. Here are her slides:

Building Metrics In-House using Keen IO

A big thanks goes out to all our speakers and the great audience that came out for last night’s talks!

Get started with Keen today to start experimenting with some of the tools from last night’s talk, and stay informed of future events! 

Sarah-Jane Morris

Community and Awareness

7 tips to transform a stale town hall into a productive work session

What’s wrong with this meeting?

You are likely familiar with the large-scale all-hands or town hall meetings where a large number of people gather. These are often communication “pushes” to provide information or Q&A, but they are not serious work sessions. At worst they are quite boring. And even at their best, it is simply too difficult to have a productive conversation with 50 people, so very little ideating, solutioning, or action planning takes place.

Before joining Keen’s PeopleDev team, I worked as an Organization Development/Change Management consultant. This term does not refer to integrating new updates or features into software, but rather supporting humans during major periods of change within organizations. Restructures, new systems, new ways of working. Basically, the change management consultant’s job is to ensure that the people being asked to adopt these new ways of being actually do so, and ideally, quickly.

I found that one of the most common complaints during periods of major transformation or attempts to scale culture is the slow pace of change. Brilliant new processes, technologies, or organization structures can be designed relatively quickly, but the speed at which people are able to adopt them can be comparatively very slow.  

Disrupting the town hall

At Keen we’re always testing, tweaking, and evolving our organizational structure to best suit the needs of the people and the business. As we’ve evolved, we’ve found it’s important to keep everyone aligned on key areas of focus, while simultaneously creating a space for new ideas to emerge.

We tried the traditional town hall, collected feedback, and found it wasn’t really giving people space to contribute ideas and devise solutions to address the true needs of the organization. And yet we knew there were issues within the organization that needed to be addressed.

Instead of holding yet another town hall to identify problems, followed by a series of siloed meetings to try and address them, we decided to host an interactive company-wide working session called the “World Cafe.”

But how do you hold an effective working session with 45 people, you ask? Fabulous question!

The first thing we (the Keen PeopleDev team) did was identify the areas for discussion that would have the greatest impact. We sat down with every employee to collect their input across three topics:

  • What is not working at Keen?
  • What is working well?
  • What do you need right now to do your job better?

After we gathered everyone’s input, we sorted the data into distinct themes to address.

The work session

On the day of the work session, the company gathered in groups of seven across six tables. Jen and I presented the five themes that would be the focus of discussion.

The themes included:

  • What to do about too many cooks in the kitchen
  • Desired leadership behaviors
  • Role clarity and accountability
  • How to boost morale and positivity
  • Priorities in executing product strategy
  • Mystery topic (whatever was fresh on people’s minds could emerge)

Each table was assigned one of the themes, with an outside facilitator stationed at it. There was a paper tablecloth and markers available for people to ideate possible solutions to address the problem described in the theme.

Discussions were limited to 20 minutes (hence the facilitators to keep people focused) and participants were allowed to rotate three times, meaning each participant ultimately had a chance to discuss three of the six themes.

At the end of the hour, a “harvest” was conducted from each of the six tables to create a long list of all the ideas that had been discussed to address each theme. Participants were given stickers to choose the solutions they thought would have the greatest impact on Keen. Once the top ideas/solutions were identified, action planning was conducted on the spot to identify owners, establish clarity around what they would be accountable for, and deadlines.

In less that three hours we had a long list of ideas, decisions, and action plans. Everyone was in alignment and public commitments to action had been made. There would be no need for re-explanations, additional meetings, or approvals.  

Results and feedback

Some of the new programs that came out of the World Cafe include:

  • Accountabilla-buddy: someone outside of your team to help you stay accountable to your goals
  • Team office hours: to reduce constant questioning and requests of different teams
  • Skills inventory: so people can identify experts in different programming languages across the business
  • Remote on-site: for Keenies not based in San Francisco
  • Bike shed reduction program: explicit agreement that you do not need to follow every Slack channel or be constantly up-to-date on all information within the company

In addition to accelerated decision-making and alignment, participants reported a wide range of additional unexpected benefits from the process itself. These included feeling empowered, valued, engaged, connected, heard, inspired, and energized. Here’s some example feedback from the event:

“My voice mattered. I got to hear what other people felt about sensitive topics and felt a sense of relief and validation.”

“Something that had been eating at me – when I heard others had similar feelings, I felt so much more connected to the group and it helped to talk about things that are typically very difficult to talk about.”

“We came out with a list of action items, but even more so, the connections that occurred and speaking directly about things that are not working was likely the most important learning.”

Top 7 tips for holding your own World Cafe

If you’re interested in trying this at your organization, here are the top 7 factors that contributed to the success of the event:

  1. Try to get the everyone in the room, or at least ensure equal stakeholder representation from each department.

  2. Have color markers and butcher paper handy at each table so people can take notes and build off of what was discussed in previous rotations.

  3. Have outside (preferably World Cafe or Organization Development trained) facilitators at each table so everyone in your company can participate.

  4. Identify the topics that matter before the session. It’s best to collect this data anonymously so people can surface what they might be scared to bring up in a typical all-hands Q&A.

  5. Coach company leaders to wait to speak at their tables so everyone isn’t waiting to see what they say about a topic before speaking.

  6. Open the session with a statement that we are going to talk about the things we all know are happening but are not being discussed. Giving permission to name elephants in the room will help make the most of your meeting time.

  7. Remember that a huge part of the value is the experience itself. The practice of open discussion of tough topics creates communication pathways for feedback loops….an essential habit of learning organizations and key enabler of organization agility!

If you’d like to discuss this event further or want more tips on how to do this at your company, feel free to reach out to me at Or if you’d like to share your ideas or experiences with different organization improvement exercises, please leave a comment below or tweet me your ideas @redesignod.

Lisa Nielsen

People developer, behavioral science enthusiast and baking diva.

Announcing Keen Pro -  fast, flexible embedded analytics

We’re super excited to announce Keen Pro, a brand new set of features that makes it easier than ever to provide fast analytics to your teams or share customer-facing analytics with your users.

What’s new?

  • Dashboard Caching: Load dashboards within sub-seconds every time, even if you have billions of events, multiple queries, or thousands of concurrent users looking at metrics.
  • Raw Data Stream: Pipe your data to AWS for ultimate flexibility: run SQL queries, custom MapReduce jobs, and more. And permanently backup your data in real time to a system you control.
  • Account Provisioning API: Programmatically create Keen projects and manage users to deliver white-label analytics at any scale.
  • Dedicated Data Engineer - Get expert assistance on metrics selection, data modeling, implementation, and ongoing optimization, with a single point of contact who knows the ins and outs of your business.

Why now?

Over the past three years at Keen, we’ve focused on building the most flexible API for data collection, analysis, and visualization. During that time, we’ve seen all the use cases that have emerged, and here’s what we noticed. Tons of you are using Keen not only to share data with your teams, but also to build analytics right into your products so you can display personalized data to your customers. Check out this cool dashboard from Bluecore:

Bluecore uses Keen to provide critical marketing analytics to e-commerce companies

Of course, if you’re serving up analytics as a core product feature, you want to be able to create new data projects automatically, show customers personalized data, and display results fast. We built Keen Pro to make it easy and quick to deliver customer-facing analytics, so you can stay focused on building your core product and wowing your customers.

We’re incredibly excited about the possibilities this opens up for our users. If you’d like to learn more about Keen Pro, feel free to reach out to us anytime or ping us on Slack. We’d love to hear from you!

Learn More

Alexa Meyer

Brand and UX thinker. Cheese chaser. Learner.

Hello, Community.

Hi! My name is Tim Falls, and I’m the author of this blog post. I’m writing this to introduce myself to you, the reader of this blog post ;) But, not only do I want to introduce me; I want to introduce we.

We are the community team at Keen IO. We are Justin (aka, JJ, elof), Sarah Jane (aka, SJ), Taylor (aka, ATX’s best), and Tim (aka, a guy who just referred to himself in the third person.)

But enough about us; this is actually about you! “You” are our readers and followers, our customers and partners, our investors and advisors and mentors and inspirations, our family and friends, our people – our community.

"you're our people"

Our team exists because our community exists; we’re extremely grateful for that fortunate reality.

Community Roots

Justin was the first to be hired at Keen IO with an explicit focus on community-building, joining as the seventh employee and with the title of Developer Evangelist (or was it dev advocate? oh well, tomayto/tomahto.) When he arrived, community was already baked into Keen’s core.

Our founders and earliest employees depended on support from the people around them each time they collectively cleared a hurdle or broke through the ribbons of the company’s initial milestones. Being the thoughtfully reflective bunch they are, they recognized that the symbiotic relationships they’d forged with the humans around them in fact represented the Keen community in it’s infancy; and they realized that Keen’s success was virtually impossible without the contributions of that community.

Today, each and every employee at Keen – whether they spend most of their time writing code or writing website copy or writing the paychecks – can recognize and appreciate the powerful, positive impact that our community has on the company, and vice versa. That’s because everyone has had the pleasure of engaging with our community members and experiencing first hand the magical good vibes that abound in the presence of you all. And in so doing, each individual has detected, with her very own senses, that our community is not just a bunch of people outside our company that like us and/or use our product; it’s not only the smaller number of people who build/support/sell that product; our community is all of those people (and many more) together as one living, breathing, thriving organism.

good vibes

And we won’t stop

The four of us on the Keen community team have the humbling responsibility of ensuring that our recognition and appreciation for the value of community never dwindle. We get to focus our daily efforts toward supporting and enabling the community around our people, product, and brand. We dedicate our time and creative bandwidth to crafting the most inclusive, valuable, and uplifting place possible for the humans who choose to join in and help make our community what it is today and what it will be tomorrow.

Obviously, we constantly think about this responsibility and continually ask ourselves:

“What can we do to make our community a happy place?”

Sometimes a “zoom out” is helpful in effectively answering this question. In light of my one year anniversary of employment at Keen (Sept 8), I recently un-zoomed to the max. My findings were strikingly obvious…and equally important:

We can forge stronger relationships, by getting to know our fellow community members even better and by making a concerted effort to help you get acquainted with us - as people and professionals.

The first step toward doing just that is, well, this!

We want you to feel more than welcome in this community, and one of the best ways to feel at home is to be in the presence of friendly faces.

We're emojis! Justin, SJ, Taylor, Tim

Of course, as I alluded to earlier, you can consider everyone at Keen your go-to person for whatever your needs may be, because we all community. But, it’s good to know who is consciously focusing on you at all times, and that’s this little group of people =)

If you haven’t already given one of us a high-five, then we should fix that ASAP. In fact, an internet high-five is just a few clicks away, so we’ll wait here while you do that… If our relationship has moved beyond high-five-land, cruised through hug-ville, and is already at the serious level of direct messages in Slack, then thanks for being here - we <3 you, too!

Regardless of our current relationship status, we want to take this opportunity to share more of our “personal” details, in hopes that it will help you better understand us as a group of people, why we fervently strive for your happiness, and what you can expect from us.

Under the hood

At Keen, our organizational and operational structure is defined by a document that has been created through the collective efforts of all employees. We call this document the Keen Operating System, and it exists as a Github repo (it’s private now, but we’re considering opening it up to the world if/when it’d be valuable.) Anyone at Keen can contribute to this document (via pull request) at their discretion, and thus everyone is empowered to have meaningful influence on the operational model in which they work.

Reason for being

One section of the document lists and describes the various teams at Keen. Each team is responsible for creating their own page so that everyone in the company understands their mission, strategy, roles, responsibilities, etc. Community is one of those teams, and we’ve copied our team page into a public repo, so you can see for yourself how we represent ourselves to our fellow Keenies. We hope that, in sharing this, we facilitate your deeper understanding of how other teams at Keen see the Community team and how we think about working with you.

Measuring success

Like all business units, we place an importance on measuring our team’s performance. Indeed, community-building can be a tricky thing to gauge – but, even more certainly, it’s not impossible. A lot of our performance tracking comes in the form of intuition - i.e., “ya just know it’s working.” This is a really human thing, and we’re all humans interacting with each other, and those interactions are filled with signals that only our brains and spirits can interpret. So, thanks for sending the vibes - we’re picking up what you’re putting down!

But, also with all business units, “the feels” only go so far in determining whether or not an investment of resources is returning tangible, meaningful benefits to the company.

So, how do we start to quantify the impact of our efforts?

Well, quite frankly we’re still figuring that out. And guess what - we’d love your help! We’ve started to develop our practices in the open, and we’re inviting anyone/everyone to collaborate with us. If you’re a community member, or if you’re building a community of your own, or if you’re just an interested person with a perspective to share, please join the conversation. Beyond serving as a mechanism for receiving your input, we extend this invitation in hopes that it helps to further familiarize community members with our team’s activities, values, and approach to our work.

See you out there!

I hope this rather long-winded introduction to “we” is helpful for you, or at least it was vaguley entertaining. It’s been fun for me, and I’m sooooo glad to finally get a post onto this here weblog, which I’ve admired since way before I joined the Keen family.

If you fancy the chance to reciprocate the sentiment, please get in touch with us through any number of communication channels (see ALL THE THINGS listed on our community page), or just leave a comment below. We’d love to learn about who you are, what you’re working on, why you do what you do, and how we can help you achieve your loftiest goals.

Ta Ta For Now!

Emoji provided free by Emoji One

Tim Falls

community crafter and scarf enthusiast

Keen Status Page: For when you need data about your data about your customers’ data

About a week ago, I decided to update our status page again. Our previous version of the status page appeared to have slowly evolved into what looked like an EKG monitor. For our query durations it displayed frighteningly high peaks and sudden downward shifts. And yet, during these periods of seemingly abnormal behavior, we did not update our status page with any mention that our system was behaving abnormally. The reason: our status page was viciously lying misrepresenting data.

Our internal dashboards were displaying happy pictures while the status page displayed doom and gloom. I fixed this discrepancy, but in the interest of transparency and honesty, I’d like to discuss the changes I made to these figures and the motivations behind them.

There is a new display for extractions:

Help! I am alt-text hiding in this blog. Someone please help me before they---

Extractions are requests for raw data stored with Keen IO. I am avoiding referring to them as queries because they have very different performance characteristics from queries such as counts or averages. Queries, as I am defining them, are answers to questions such as “How many customers made a purchase last month?” or “What was the average shipping cost of all purchases ordered from Canada during the month of July?” By contrast, extractions really only answer the question “Would you be so kind as to give me all of my data from the last week?”

Extractions will typically take longer to complete for a number of reasons and rarely relate to how long queries are performing at a given time. Thus, I created a separate display for them. This is displaying a line of samples of the median time to complete extractions. The upper-right hand corner displays an average (mean) of those samples over the past 24 hours. The extraction graph will typically be spiky because the usage pattern for extractions is different from queries. When someone wants a group of data, they typically request a lot of data at once in a burst and then cease asking for data.

The other big change was to the display labelled “Query Duration”, which has been renamed “Median Query Duration” and a number of changes have been made to the data that feeds it.

Another graph, yay!

The first change was to remove the durations of failed queries. Queries can fail for a number of reasons. These failed queries have a strong tendency to have long reported durations. This drags up the graph to report higher query durations for the average case. I do not feel this is very helpful to those visiting the status page. My reasoning is that people with incorrectly configured setups do not represent the general users that are visiting the status page. For those users that are encountering errors, a status page that looks very healthy will help them recognize they are having an atypical experience and will then reach out to us or the community to get their issue resolved.

The second change to this display was to move the extractions out from the graph. Before, users running large extractions were shifting this curve upward, when in fact other queries were not impacted at all.

The final change is the most minor, and that was to switch from using a mean-based average to a median-based average. This change keeps extremely fast as well as extremely slow queries from influencing the graph as much. I believe the typical user’s situation as represented by a median is more relevant to viewers of our status page.

I hope this explanation is useful and, more importantly, I hope the new status page gives you more helpful information about the state of Keen IO’s systems.

(The following cat played only a minor role in writing this post.)

Cute or evil, you decide.

Devin Ekins

Engineer. Tells lame jokes. Only sometimes wears a cape.

Introducing Open Source Data Explorer

Empowering teams to answer their own questions with data

We’re extremely excited to announce the new Open Source Data Explorer, a point-and-click query interface to analyze and visualize your event data.

We believe everyone should be able to use data to make decisions. The Data Explorer makes the power and flexibility of our analytics API more accessible. Now that the Explorer is open source, developers can embed it anywhere - making it easier to build analytics tools for your teams or add value for your customers by incorporating white-labeled analytics directly within your product.

What can I do with the Data Explorer?

The Data Explorer interacts directly with event data stored in Keen IO. It’s an extremely simple and intuitive query interface built to explore event data. All of the analysis functions are built in. Even better, your teams and your customers do not need to know complex query language like SQL to run their analysis. Here’s how you might use the open source Data Explorer:

  • Empower your teams - Quickly empower teams with a tool to easily answer their own questions with data
  • Improve your product - If you’re a SaaS company using Keen to power customer-facing dashboards, you can give your customers another tool to explore the data that matters to them.
  • Build something new - Build a completely new analytics product - Want to build an analytics panel just for product managers? Or your own version of Google Analytics? Data Explorer lowers the barrier for you to do so.

Key features

The Explorer has all the functionality of an analysis tool built in and ready to go. Your teams and customers can intuitively build queries, create charts, and extract data within seconds.

Query building

  • Choose your collection - signups, downloads, pageviews - whatever collection of data you need
  • Choose your analysis type - count, count unique, sum, min, max, average, select unique, percentile, median
  • Ask deep questions by running a group by on any property
  • Build a filter for your query, using the event type as a base for your filter - choose from string, number, null, list, Boolean, or date/time
  • Try out the geo-filter, which enables you to to filter events by latitude/longitude
  • Pick a date and time range for your query using our calendar selector

Visualize the results

  • Toggle between different visualizations of your data, choosing from chart types including area, line, table, or pie. You can also view your results in a metric or JSON format.
  • Embed the charts anywhere by viewing the source code and pasting it anywhere
  • Save your favorite queries, so you can come back and access them again and again
  • Extract your events - view the raw data by sending a full extraction to your email

Why now?

We built Keen IO to solve the increasingly difficult challenge of event data collection, storage, and analysis at scale. We aim to make it easy to not only analyze data via API, but also to expose data to your teams and customers who need it.

Our first couple years at Keen, we focused primarily on building the analytics API and backend tools. While that remains our top priority, we now have a team of engineers focused on building out our front-end and visualization offerings, and Explorer is one of our open source product releases. We’re excited about growing this team to better serve your needs.

We’re so grateful for all of the feedback we’ve received from our developer community along the way. If you have any feedback or questions, please send us an email or ping us on Slack!

Ready to explore your own data? Create a free Keen IO account, check out the sample demo or fork the project on Github.

Happy Exploring!

Justin Johnson

community guy, hacker, music nut. i like to help people build stuff.

How to Give and Receive Effective Feedback

The most valuable lesson I learned in grad school was not a theory, problem-solving technique, or research method. It was learning how others perceived me.

For most of my life I’d had a fear of taking up too much space. In the classroom or workplace I was careful not to speak up too often, lest I be perceived as attention-seeking, egocentric, or dominating. My reticence to speak was built on a series of assumptions I thought of as simple truths.

That changed during a class called Group Dynamics, known in some circles as “Touchy-Feely,” in which much of the curriculum involved giving one another feedback and sharing our perceptions. I was shocked to discover that my peers did not find me space-consuming as I feared, but rather too quiet, wishing that I would speak up more often to share my thoughts. They encouraged me to take up even more space in the room. It was life-changing.

Finding my voice in group situations enabled an entirely new career path of consulting, facilitation, and leadership that I was surprised to discover suits me quite well.

It surprised me that rather than going deeper within, under the banner of self-improvement (as I had previously done via introspection, journaling, therapy, meditation, etc.), this catalyzing learning was only possible by perceiving myself through others’ eyes, rather that my own. And it was far more actionable and life-enhancing.

What impact do our words and behaviors actually have on others?

We can guess, but we don’t really know until we ask. The answers are often different than we expect. I thought I was being accommodating, conscientious, and polite, but others saw me as withholding, aloof, and withdrawn. That is quite a delta.

Yet all I had to do to close the gap between intention and impact was to ask. My peers held a wealth of information about me, which, if I asked in the right way, I could unlock.

These deltas of intention and impact happen all the time from interpersonal one-on-one relationships to large-scale brand perceptions. A company may believe it is presenting its product as mature, sleek, and clean, while its consumers actually find it dull and unengaging. This discrepancy is why focus groups and branding firms exist in our marketplace.

Effective customer research, crowd-sourcing, and supply-chain optimization projects decrease the delta between product intention and consumer reception. But who provides this service for the individual?

Obtaining individual feedback is as simple as asking for it, but this does not make it easy.

The word feedback often has a cringe-worthy association as an opportunity for someone to deliver unsolicited criticism or an annual event in which someone rates you against a contrived scoring system to determine your compensation, career trajectory, and ranked placement against your peers.

But real feedback, information carried from an output back to the input, provides a wealth of insight and opportunity to learn.

In my case, I had been told previously that I was intimidating. But no one ever explained to me why that was. I was left to interpret for myself. I made up a story about being “too much.” Not until graduate school did someone explain to me that it was my quietness that was intimidating. My silence made people feel judged. I was intending to be polite and the impact was intimidation. That is a big difference.

Receiving feedback on your actual impact allows you to narrow the delta between intention and impact and increase your effectiveness.

Good feedback has this goal at its heart: success for the recipient.

Good feedback is also actionable. It is not directed at one’s character (e.g. “you are boring, careless, or intimidating.”) Useful feedback identifies the specific, observable behaviors that lead to the character labels. Telling someone they are boring does very little for them except make them defensive and hurt their feelings; they don’t know what about them is boring (the stories they tell? the way they dress? the tone of their voice?).

However, when someone describes a specific behavior (e.g. “when you speak in monologue without pausing, I find myself losing interest”), the recipient has the data needed to change the impact. Graceful feedback empowers the recipient.

Isn’t the opportunity to be more effective a lovely gift we can give each other?

Here at Keen, our coaching team is striving to change perceptions about direct feedback from being a scary, confrontational event to a learning opportunity and expression of caring.

In addition to individual coaching sessions, we provide an Effective Communication Learning Lab to all employees. We teach the principles of non-violent communication and active listening while giving participants opportunities to practice requesting, delivering, and receiving feedback in a conscientious, honest, and caring way.

Narrowing the delta of intention and impact can be broken into three steps:

  1. Acknowledge that the way you intend to be perceived is not necessarily what is happening.

  2. Find a group of people you trust to deliver honest and caring feedback.

  3. Muster the courage to ask and listen.

By seeking and sharing meaningful feedback, you can overcome misconceptions about yourself and others, discover hidden strengths and talents, and build trust with the people close to you. Most importantly, you can close the gap between intention and impact and be perceived the way you truly want to be seen.

Lisa Nielsen

People developer, behavioral science enthusiast and baking diva.

How to do a join on event data

Joins are a powerful feature in traditional static databases that combine data stored in two or more entity tables using SQL. You might use a join to answer a question like “Which customer spent the most money last month?”

A lot of our customers have asked us “Can I do a join with event data?”

The answer is: While you can’t do a traditional join on event data, you can accomplish exactly the same outcome by running a group_by on an event property. It’s pretty cool and very easy!

Here’s how:

First, imagine all the information you might want to join together if you were using a traditional entity database. With event data, all of that information is already there, right inside the event, every single time!

To understand this, let’s take a look at how event data is stored. An event is triggered by a customer or user’s actions, and this event contains data regarding what the action was, when it occurred, and the most up-to-date information about the state of that user at that time.

For example, if you work at an e-commerce company, you will probably want to track purchases. Every time you track a purchase, you can include information about that purchase. Here’s an example of some of the information you might want to track on every purchase and how you would model this event with event data:

purchases = {
   "user": {
       "first_name": "Arya",
       "last_name": "Stark",
       "email": "",
       "id": 22
   "order": {
       "id": "XD-01-25"
   "product": {
       "list_price": 19.99,
       "description": "This is the best Dog Shirt",
       "name": "Dog Shirt",
       "id": 10
   "keen": { // these keen properties are automatically added to each event
       "timestamp": "2015-06-16T23:24:05.558Z", // when the event occurred
       "created_at": "2015-06-16T23:24:05.558Z", // when the event is written
       "id": "5580b0153bc6964d87a3a657" // unique event id

As you can see, every time a purchase is made we are tracking things like:

  • User information
  • Order information
  • Product information
  • Time

This format allows for quick and efficient aggregation querying: that is, the ability to easily derive sums, counts, averages, and other calculations. With this format, we will be able to ask questions like:

  • Which products were purchased most often?
  • Which users have spent the most money?
  • What is the average order value?

We can do this all in one simple query! As an example, let’s ask the question, “What was the most popular product?” Here’s what the query would look like:

What is the most popular product purchased?

new Keen.Query("count", {
    eventCollection: "purchases",
    groupBy: "",
    timeframe: "last_week",

Result: The Mallard and The Horse Shirt are the most popular.

Now, let’s say we want to know which customer made the most purchases last week.

Which user made the most purchases?

new Keen.Query("count", {
     eventCollection: "purchases",
     groupBy: "user.first_name",
     timeframe: "last_week", 

Query Result: Sansa & Stannis tie!

Finally, let’s find out what our total gross revenue is across all users.

What is my total gross revenue?

new Keen.Query("sum", {
     eventCollection: "purchases",
     targetProperty : "product.price",
     timeframe: "last_week", 

Query Result: $439 (not bad for animal-themed t-shirts!)

With entity data, you could use SQL to answer these questions by running joins on multiple tables. To answer the question “What was the most popular product?” you would need to have a users table, a products table, and a purchases table. You would get the same result, but the path to get there would be longer.

In Keen, when an event is triggered you’ll include everything you know about the user at that point in time. This serves as a snapshot of the user as you know him/her. That information can include data about who (their name, username, account number, userid, age at that time), what device they were using, what was purchased, and any other properties you have available. When you’re ready to query, this snapshot becomes incredibly powerful.

If you want to learn more about the difference between Entity Data and Event Data, check out this guide on How to Think About Event Data.

The most important point with event data is to think carefully about the kind of questions you’d like answered when you set up your data tracking. That way you’ll be sure to have the information available when it comes time to query.

To learn more about what to track, and when, check out our Data Modeling Guide.

So which is better: entity data or event data?

Both have their strengths. In general, entity data is best for storing static information about nouns (users, inventory, assets, etc.) while event data is ideal for tracking data related to verbs (signup, purchase, click, upgrade, etc.)

Very often, the questions that are most important to your business revolve around these user actions, and event data allows you to run analytics on them without having to do joins at all.

Learn more about modeling event data

Check out our data modeling guide and sign up for a free account to start playing around with your own event data. Questions? Reach out to us or post a question on Slack!

Maggie Jan

Data Scientist, Engineer, Teacher & Learner