Generate Leads with a Free Product

Instagram Winner Picker leads per day

The above image is a graph of the number of leads generated from a small marketing tool that we created at TINT. Everyday, about 18 marketers use our tool to pick a winner for their Instagram campaign. These emails are valuable to us because anyone who is wrapping up an Instagram campaign is a potential customer.

Are you a team that is lucky enough to have some extra technical talent who can crank out a fun side-project during a hack day? If so, then here’s what you need to do to get leads with a free tool:

1. Find a Customer Problem

Muriel eating a cupcake

Find a problem your customers are having. Here’s how I did it: I was getting lunch with my coworker Muriel, and she mentioned that she was having a hard time picking a winner for our Instagram contest. It was a real pain! There just wasn’t a good tool to pick a winner. She ended up searching Instagram for the contest’s hashtag, closing her eyes, scrolling down, and randomly choosing one of the images.

At that moment, I realized that I had stumbled on a perfect problem. A perfect problem is highly targeted: Something specific enough that you know the people who have this problem are your customers, but universal enough that it’ll be a popular search. Speaking of search, the next step is to…

2. Identify the Search Query

Google Keyword Planner

The next question is how they’ll find your tool. Most likely, they’ll be searching on Google. I asked Muriel what she searched for when she was looking for tools. She said, “Instagram winner picker”. Then I went on a walk outside and thought about what I would search for if I were a marketer looking to pick a winner for my contest. “instagram contest winner chooser”, “pick hashtag contest winner”, and “instagram giveaway generator” were some of the different keywords that came to mind. Finally, I went to Google Keyword Planner to type my ideas in and figure out which keywords were actually being searched for. I picked the top ones, and used that to determine what keywords to optimize the tool for.

3. Build an MVP to solve the problem

Luckily, I’m a developer, so it was easy to find someone to build my idea. But, if you need to recruit someone from the engineering team, you can still make your tool happen.

Some things to keep in mind:

  • Make it look great - A good design can keep people on the site longer, and increase the chances of interaction, which will boost SEO.
  • Make it fast - Page load speed is an important factor in bounce rates, especially when people are looking for a quick tool to solve a specific problem. Improve your ranking by making sure load time is optimized.
  • Make it simple - In our experience, the simplest landing pages perform the best. Make sure it’s brain-dead obvious to someone landing on this page that it solves the problem that they are searching for. Our Instagram Winner Picker tool just has a single button, “Get Started”.

Instagram Winner Picker Screenshot

4. Re-evaluate and iterate every 2 weeks

Although this step is easy to do, it’s also the easiest to forget. First, create a document to track all the details of your marketing experiment. Set calendar events when you release the project in 2 week intervals to:

  • Look at Google Webmaster Tools to see how your rankings are doing
  • Figure out why you might be ranking lower than expected, and build backlinks to your app that can help it rank higher


Product marketing search results

As you can see above, our tool now consistently gets about 80 clicks a day, resulting in about 18 emails a day of marketers who are running Instagram campaigns. Nice.

What is a company culture?

“What is culture and how do you start to define it for your company / startup?”

I ask myself this question often. And I answer it by saying, “A company culture isn’t a list of perks. It’s what people do when their boss isn’t looking. It’s how people make decisions, the norms and habits taken for granted, and invisible relationships that shape our workplace.”

But, how do we define OUR company culture? That’s a harder question.

Greater minds than mine have taken a stab at it. They’ve put together ways of categorizing corporate cultures through surveys and models. Using vocabulary to shine a light on what continues to be an elusive mystery.

Last year Lukas, our PM and go-to person for all miscellaneous knowledge, introduced me to the Schneider Culture Model. In 1999, William Schneider took it upon himself to try to build on previous works to create a model to describe how organizations make decisions.

Schneider’s model divides companies by how they score on two axes, one axis is the “personal vs impersonal”. Are decisions made in a detached and objective way that focuses on the company, or are they personal, taking into account the individuals involved? The other axis is “actuality vs possibility”. Are decisions made with a focus on what we can actually accomplish today, or the possibility of tomorrow?

Based on these two basic ideas, he divides corporate cultures into 4 types:

  • Collaboration - “We succeed by working together”
  • Control - “We succeed by getting and keeping control”
  • Competence - “We succeed by being the best”
  • Cultivation - “We succeed by growing people who fulfill our vision”

Schneider Culture Model

What I like about this model is that there isn’t a “good” or a “bad” culture. These are all different types of cultures that succeed in different environments. There are examples of Great Places to Work™ in each of these categories. For example:

  • Collaboration - Delta, UPS, Valve
  • Control - Proctor and Gamble, Marriot, US Army
  • Competence - Microsoft, Citibank, Pixar, Netflix
  • Cultivation - 3M, Zappos

Most people would be excited to work at any of these companies, yet they occupy totally different spaces in the model. This is important to note! Especially since it’s easy to get distracted by arguing, “oh, this kind of company culture is better”. Nonsense! Instead, I want to figure out what our company culture is, where we want to be, and then find ways to take us there.

So where does TINT fit in the chart? Last year, I had the company sit down and take a 20 question survey to figure it out. I asked the team, “Where do you think our company is today, and where do you want it to be tomorrow?”. And this year, I did the same thing. Here are the results that I got (You can use the checkboxes to explore the data):

Some initial observations:

  • People > Company - We are more people oriented than company oriented. This makes sense, as the company has produced policies that give employees more flexibility and freedom.
  • Possibility > Actuality - We are slightly more possibility oriented than actuality oriented.
  • More Actuality in 2016 - Since 2015, there is double the number of people in the “Collaboration” vs “Cultivation” quadrant, suggesting that we have become more focused on the present than the future. This makes sense, as we’ve gone through some harsh realities in the past year making it essential for us to focus on what we can do right now.
  • Cultivation - According to the results, we succeed by growing people who fulfill our vision. Not surprising, given that our vision statement is to help our team and customers achieve their potential.
  • A Common Future - If you compare the 2 predictions of an ideal future, you will see that the “where do you want to be in the future” has not changed, and that we seek to be in the Cultivation quadrant.

Screen Shot 2016-11-22 at 1.41.40 PM.png

What do I want to do based on these results?

  • The Future - From the survey, we see the team expressing a consistent ideal of being more in the cultivation corner. So, let’s figure out how we can uphold what got us there in the first place!
  • Self Improvement Program - At TINT, we have a program that’s focused on being the best you can be, where we can expense up to $100 in anything related to self improvement, as long as you complete a monthly challenge. The results from the survey highlight the importance of this program at our company, and it lets me know that I personally need to continue putting effort into participating and encouraging others to participate in the program.
    • Advisors - This tells me that I should continue to seek highly skilled advisors to help cultivate our team. Since we’ve brought her on, our sales advisor Bridget has helped us tremendously both with the co-founders management skills and also for our sales process.
    • Recruiting and Onboarding - I want to incorporate this framework into our recruiting and onboarding process to tell candidates and new hires what our company culture is and isn’t, and show them how they can contribute. The best way to maintain a culture with new employees is education, and now I have a vocabulary to teach!
    • Everyday Spirit and Compassion - How do we make a more spirited and compassionate workplace? And how can we introduce more change within our everyday routines to take us closer to a workplace that cultivates others? These are questions that I now need to focus on.

    After doing this exercise, I think it would be even more valuable if other companies joined in to see how they see themselves in terms of culture.

Your Turn

Do you want to do the same experiment for your team?

  • Step 1: Copy this Schneider Culture Survey google form
  • Step 2: Use the results, and this google sheet as a template to figure out X and Y coordinates from the results
  • Step 3: Reflect! Some questions to ask yourself:
    • Do I agree or disagree with the results, why?
    • What policies and processes at the company reflect your culture quadrant?
    • How dispersed is everyone’s assessment of the organization, and what does it mean?
    • How can these results help the team better express the company’s culture?

If you do go about doing the above, book a time to share your results with me. And even if you don’t, I’m happy to chat about anything related to company cultures in startups, I enjoy connecting with like minds on the topic.

Additional Reading

Tough Times Don’t Last But Tough Startups Do

I closed my eyes and counted to three while in an empty and dark conference room. I told myself that I was ready to tell my friend and coworker that I would be laying him off. I needed to shut off my emotions. I needed to close the valve on my feelings, and close it tight. I opened my eyes, and walked downstairs. I tap my friend on the shoulder, “Can we talk?”, and we move into another conference room. Tim, our CEO, is already in the room, ready to co-pilot the meeting with me. I close the door tightly. The three of us sit in a distanced triangle. There is a long pause.

“I need to tell you something important.”

I present the details that need to be presented: The reasons, the timeline, how long benefits will last, severance, next steps. I’ve seen Tim do this before, and I’ve been the co-pilot. It is much easier to be the co-pilot. All you have to do is pay attention and fill in any gaps that you notice. This time, I’m driving. I am making eye contact, fully aware because of the adrenaline. At the same time, distant because of what I told myself in the dark conference room. I dutifully complete the agenda.

“Out of all people, I would have expected you to be more empathetic about this.” says my friend.

All of a sudden, I realize how deeply offensive I must seem to him, to be so cold. Suddenly, the valve in my heart twists open, and all of the feelings start flooding out: The disappointment, the guilt, the anger, and sadness. My eyes begin to water and my throat closes up. I try to speak, but can’t. I hoarsely force a couple words out, but stop mid-sentence. Tim notices, and picks up from where I am stuck, and the meeting continues. How did it get to this?


On August 24, 2015, the TINT Fundraising Committee was formed to decide on whether or not we should fundraise or to continue to bootstrap our own growth. In the traditional TINT fashion, we democratically elected a 7 person committee, and set up regular weekly meetings. Just one month before in July, we had closed our biggest deal yet.

One of our largest clients wanted to display their social media using TINT, and they committed $120k+ to us. We felt like the world was our oyster as we watched the monthly revenue soar to a spectacular $640k for that month, a huge difference from the previous highest revenue month of $432k.

The committee met weekly for the month of September, and developed a financial model to predict how aggressively we could spend, and when we could start seeing returns from our spending. After much back and forth, the committee coalesced around a single model that highlighted everything from a hiring model to our sales cycle. The model suggested that if we hired aggressively, we would be able to expect to see equally aggressive revenue growth after the negative effects of the slow winter season ended. The model also suggested that we would be able to stay safe even without outside funding.

Based on these suggestions, on October 7th, the committee sent out an email to the team. TINT would “delay fundraising and pursue a course of creating a relatively more aggressive hiring/spending plan. This plan will be focused on driving revenue growth over the next 6 months and measuring the incremental impact of marketing and outbound sales on our revenue as well as increased product and operational expenses.”

However, the committee was not completely blind to the risks. The email from the committee continues: “Admitted Risk: We realize there is a chance that increasing our spend could lead us to no longer being profitable and being forced to fundraise in a situation where we are burning cash in 2016. This is a calculated risk we are taking based on our projections which show we will not end up in a situation with significant burn. Excited to put some gas on the fire and prove out some of our growth assumptions!”

On December 3rd, 2015, we still felt that we were on track, and the committee sent out an update: “I am happy to say that we are overall exceeding our goal, despite being slightly below numbers for November.” The email told the team to anticipate 10 hires before next April.

The graph below shows what we saw when that email was sent. According to the plan, we were still on track. The X-axis is set up such that “4” represents November. On closer examination, you will notice that the revenue line (red) jumps up significantly at 7, 8, and 9, which represent February, March, and April. That’s when we’d start to see the returns from our investment. The model predicted that during those months we would see revenue climb to 580, 620, and 650. We could do it right? We did it in July!

ryochiba.hackpad.com_W9y0E5gwF4h_p.419835_1463877955182_Screen Shot 2016-05-21 at 5.41.31 PM


From September 2015 through February of 2016, we brought on 11 full time employees. 4 of them were international and were previously contracting. Before the growth plan, from April through September, payroll averaged at $234k. From September through February, payroll averaged $293k, growing a whopping $60k.

ryochiba.hackpad.com_W9y0E5gwF4h_p.419835_1463959619750_Screen Shot 2016-05-22 at 4.26.29 PM

In addition, we upgraded our digs. We went from paying $8.5k on a 3000 square foot office to paying $35k on a 10000 square foot office. Total office related expenditures climbed from a $28k in January to $62k in February. The cost of moving offices was even worse than we anticipated because we were not able to find a sublessor for the old office. Given the bullish office real estate market in San Francisco, we expected to make a healthy profit of 8k from our old office. Instead, we were experiencing an 8.5k loss, as we continued to lower the price each month, desperate for a company to move in. Ouch.



ryochiba.hackpad.com_W9y0E5gwF4h_p.419835_1463881015319_Screen Shot 2016-05-21 at 5.14.15 PM

In January, we hit our target of $450k. However, the good news did not last long. In February, we missed the 580 target significantly, and only made $436k. By the middle of March, it was clear that we were not going to hit $620k, and it was becoming increasingly obvious that we would not hit $650k as predicted in April. If we were to project more conservative revenue expectations forward, our bank account would look dangerously low.

How low? Well, let’s take a look at the projected health ratio. The health ratio is a number that represents the general health of the business and is simply the business’ bank balance divided by monthly core expenses. Anywhere below 1.0 is dangerous for the business, because once you dip below that, it is possible to not make payroll if revenue for that month does not arrive in time. The projection showed that our health ratio would dip to an alarming 0.6 by the middle of the year, and by the end of the year we would be bankrupt. Simply put, the model put us in an existential crisis. Compounding the necessity to make a decision was a team retreat that was scheduled for the beginning of April. If we were going to make drastic cuts, it would be best to make them before the all hands team retreat.

ryochiba.hackpad.com_W9y0E5gwF4h_p.419835_1463963350649_Screen Shot 2016-05-22 at 5.27.41 PM

The day things came to a head was March 23, 2016. It was decided that afternoon among the co-founders that emergency planning would need to take place, and the co-founders met for extended periods between the 23rd to the 27th, scrambling on Saturday and Sunday to come up with a plan to both reduce expenses and to effectively communicate the reductions to the team. The two plans we needed to decide between were to either Cut Shallow or Cut Deep. The Cut Shallow plan involved cutting around $30k in expenses, and then working on immediately raising a $1-2M buffer round of funding. The Cut Deep plan involved cutting $50k in expenses, and then working on reaching profitability before considering raising money. After debate, we decided to go with the Cut Deep plan because it reduced the chances of a second cut, which would be devastating to morale and our long term growth. From there, we worked to make the impossible decision of which employees would be cut. Ultimately, it was a decision that was based on what would make the least drastic impact to the business.

The decision making process was brutal and ugly. It felt awful. It involved putting everyone’s name on the board and going through them one by one, and going through the impact each person would make on the business if they were laid off. After getting through the list, we went through the list again. And then we went through the list yet again, one last, painful time. Each time, we pushed back against each other when we disagreed and identified areas where we needed to collect more information. We wished we had the experience to be able to make an optimal call. Given the constraints given to us, we did the best we could, but we still walked away disappointed that employees would have to be cut for the mistakes that we had made as the leadership team.

Stakeholders were called in the weekend before the announcement to individually meet with the cofounders. They included some early employees, and continuing employees that would be affected the most. The cofounders shared the components of the plan that applied to them, so that they could gather feedback and to prepare them for Monday. By Sunday night the cofounders had a deck, a timeline, and a sleepless night ahead.

ryochiba.hackpad.com_W9y0E5gwF4h_p.419835_1463963410460_Screen Shot 2016-05-22 at 5.27.28 PM-1


On Monday, March 28, the co-founders proceeded with the layoffs, scheduling meetings with the applicable employees in hour long calendar events whose sole agenda was to let them know what was happening and to deliver the necessary details. The announcement to the team was scheduled for noon. Unfortunately, the last layoff meeting went longer than expected, and Tim had to deliver the news to the team alone without Ryo and Nik. Tim walked the team through the deck. It explained the necessity to make big expense reductions, restructure the company, and implement new processes.

After the presentation, employees were largely in shock. With a number of missing threads, the social fabric of the team was frayed, and walking through the office it could be felt. Adding to the tumultuous day, one of our top performing salespeople announced her resignation shortly after the presentation. It was by coincidence: She had planned on making her announcement on that day the week before, not knowing about the layoff.


It was only in the weeks afterward, that we began to realize the mistakes we had made when communicating the layoffs to the team. The biggest mistake we made was that we confused the difference between a firing and a layoff, which are legally very, very different. Inadvertently, we had created an HR liability for our company, and upon learning this mistake, we immediately worked to make clear that this was a layoff, not a firing. Another mistake we made was that we did not announce who was being laid off in the team announcement, until someone asked for it. That was really the only question on everyone’s mind, and it was against our values to not share it immediately. Yet another mistake we made was not looping in our Operations Manager and HR team before the announcement. This would likely have prevented the other mistakes.

On March 30, just 2 days after the announcement, the team set off for Wonder Valley in Fresno for the team retreat. We usually have a retreat every 6 months to strategize and bond. This time, it would be to repair. Our Operations Manager did a wonderful job of planning the retreat for the past couple months, and the retreat proceeded without incident, smoothly and efficiently. We paddled canoes, brainstormed Q2 strategies, and played cards late into the night. However, even the best retreat would not be able to fully heal the wounds left from losing one’s friends from the workplace. The team came back from Fresno closer than they were after the announcement, but still fragmented, and feeling the weird energy the layoffs brought about.


In April and May we saw a continuation of the aftermath when 2 key engineers announced their resignation in order to pursue their own interests. This hit the team particularly hard because both of these employees represented strong talent on the team.

That brings us to the present. Today, we are still working to handle the situation day by day, leading initiatives to get back to profitability. Until we reach a stable financial state, we will be operating in a mode of scarcity, holding off promotions and our 401k matching program. The scarcity is a painful but important motivator in absorbing the lessons learned.


  • Expect the best, but plan for the worst – We expected the best, and planned for the best. At each step of the way, we leaned on the optimistic side. Our aggressive hiring plan assumed that we would be able to source quality candidates in that time, even though past data showed that it takes months to find a quality candidate. Our office plan assumed that we would be making a big profit from subletting the space. The growth plan projected very, very optimistic revenue growth. We should not have baked as much optimism into our plans.
  • Cut Deep, Cut Once – This was the first word of advice from almost every advisor, mentor, and online resource we consulted before making the decision. Leadership only has one chance to convince the team that the company can be turned around.
  • Fundraising – Fundraising should be guided by an individual who has the most experience in fundraising. For us, that person was Allen Morgan, a member of our board, who should have been brought into the discussion much earlier. Instead, he was informed at the beginning of 2016, months after the committee laid the groundwork for the growth plan.
  • HR – We learned that a firing and a layoff are very different, even if both are based on performance. In the future, we will talk to an HR professional before making big moves.
  • Motivation – After making the announcement, morale was at a historic low. The co-founders felt pressure to motivate the team. However, how do you motivate a team that’s just gone through a round of layoffs? What we learned from our sales advisor Bridget Gleason, was “You can’t motivate people – it’s not your job to motivate people – your job is to provide a great environment where motivated people can be successful”. We learned not to beat ourselves up for everyone feeling awful, and to be patient and focus on what is under our control to create a successful environment moving forward.
  • Doing More with Less – In the months after the layoff, we asked ourselves more and more “What does success look like?” Instead of taking a “spray and pray” approach to our activities, we now spend more time tracking impact so that we can learn how we can do more with less. You can only improve what you can measure.


Screen Shot 2016-06-08 at 10.19.08 AM

Although we experienced the largest setback in this company’s history, we must remember everyday to appreciate how far we have come. We are making steady revenue from a group of passionate customers and have a product that regularly sells itself. The comments our customers give us for our easy to use product and personal customer service is inspiring.

We have overcome challenges in the past. Depression, burnout, breakups, and surviving on the bare minimum with only 3 months of runway left. Each challenge larger and more daunting than the one before. But each time, we have improved ourselves and developed solutions to move forward.

We are now 2 months past the layoffs, and are experimenting with new ways of approaching work. Here is how we are challenging ourselves to improve:

  • Data – In the past, we never got around to measuring what we wanted to know. Now, when we start a project, we are more disciplined about asking ourselves, “What does success look like?” We are more careful about measuring our results and more disciplined about learning from our mistakes. More analysis means faster failing, more learning, and a higher chance we’ll work on what will make the most difference for our customers.
  • Goals – In the past, we took a scattershot approach to what everyone was working on and didn’t provide adequate direction or coordination. We set goals, but they were often forgotten by the middle of the quarter. Now, we have improved how we create goals, spending more time making sure that they are the right size and have strong business value. Also, we have made our goals more visible by adding them to our 1:1 process. By keeping us focused on our long term objectives, we will be able to achieve more with less.
  • Restructuring – Previously, we had 7 department heads for an organization of about 30. This resulted in significant overhead in coordinating all of the heads. We are now dividing up management responsibilities among the 3 co-founders and our sales director, which results in less communication overhead, and more time to focus on customer needs.

As for what the future holds, much is beyond our control: Competitors continue to leave and enter the space, the market evolves at a rapid pace, and customers’ needs change. However, I believe the future is still in our hands. The best team is going to write the best software, sell the best pitch, generate the greatest following.

We are not the typical VC-funded Silicon Valley company. Because we are self-sustaining, we have the luxury of focusing on sustainable growth. And we have an excellent team at TINT, to move us forward on that path. We feel the pressure, but it makes us stronger. Next time, we’ll be more careful about putting gas on the fire.

My Ebike

Photo of bike


My commute to work is about 3 miles through the city of San Francisco. The weather stays around 50-60 throughout the whole year, it’s infrequently rainy, and the road on the way to work has a decent amount of bicycle infrastructure. I prefer to bike to work for a couple of reasons. Mainly, it allows me to get to work at a predictable time. Using Lyft Line or the bus adds variability into my schedule that can often exceed 30 minutes. If I commute using those methods, I have less time to sleep/prepare for my day and I have to spend more time commuting. So, I like to use my bike. Plus, I get to get some fresh air and it’s fun to see the city by bike! However, recently I’ve found that after a long day of work, the last thing I want to do is spend 20 minutes pedaling back home in the dark.


My colleague recently recommended to me the BBS02 electric bike kit from Luna Cycle. He has been commuting on a mountain bike that he converted to an electric bike and he said it was working well for his commute. After some investigation, I found that the BBS02 is one of the most popular ebike motors in the ebike community. I also found that it is generally reliable, easy to install, powerful, and a good value for the money. I debated myself on whether I should get it for a couple weeks, but eventually I splurged. The motor and battery cost me $970. I also added on a powerful front headlight and rear light to replace my weak blinkers for another $80.


I nervously waited for the kit to arrive, and when it finally did, I took my bike (a Schwinn Volare Road Bike) to a local bike store to have the kit installed. The hourly rate for the mechanic was $60, and they said it would take about 1-2 hours to install. It ended up taking 2 hours, so I paid them $120 for installation, and I had my first ebike! Before they would give me my bike, the owner of the store took it for a safety run on Market Street. When he came back from the safety run, he seemed pretty shocked at how fast it could go. Most of the bikes they sold at the store were about 350W and the kit is 700W which was probably the reason why he was so emphatic about making sure to take proper safety precautions. Riding back home for the first time on my bike, I could tell that this was a new machine.


Riding an ebike for the first time changes the bike fundamentally in that it becomes something that can be driven, not just ridden. In that sense, it almost becomes like a moped or an ultra-lightweight motocross bike that just happens to have pedals. It’s hard to describe the feeling of biking without pedaling, but cycling purists be damned, it is fun! Suddenly any part of the city is accessible to me faster than public transit or if I called a Lyft. For commuting within a city, it cannot be beat (unless you live in a city with crap weather). Every day, my commute feels like a pleasure rather than a chore. Even though externally, the bike looks similar to its original form, it is truly totally different.


  • I have to avoid locking my bike outdoors now due to it’s increase in value.
  • More mechanical complexity in the bike, the possibility of more expensive maintenance costs.
  • It’s still too easy to get seriously injured or die on SF streets as a biker due to limited biking affordances. Riding defensively is a must.


Base Bike


Total: $1,470

Lessons Learned

  • It’s surprisingly easy to make your own ebike.
  • Having an ebike improved my commute drastically.
  • Commuting by ebike has changed my perspective on what areas of the city are possible to live in now.

SF Selenium Meetup Talk

  1. Hi, my name is Ryo and I am a Cofounder and Co-CTO at TINT, a 35 person company that has a green selenium build. I’ve been a big advocate of selenium at our company and I want to tell you how we went from no test coverage to green selenium build and almost gave up on the way.

  2. So, let me give you a quick background. At TINT, we make social media display software. A year and a half ago, we were 5 engineers and were closing deals with our first large customers. This is a picture of one of our first, the mall of Dubai!

  3. The problem was, our software failed on a weekly basis due to our everyday deployments with no test coverage. You can guess that it resulted in A LOT of angry phone calls. With our product, you can only make a couple mistakes before your customers leave. Our company was teetering between failure and success, and instability was a make-it-or-break-it concern. This is when I started on our yearlong journey to a green selenium build.

  4. When we started, our team had no resources or domain experience with selenium. We started out writing Selenium IDE tests, but were not able to integrate them into our workflow because they required so much time to supervise. We switched to ruby selenium webdriver and rspec, and were able to make progress, but we still felt like were not doing things the right way.

  5. We almost gave up. Maybe selenium wasn’t worth all of the trouble after all.

  6. We started asking questions, and here is what got us over the hump. First, we found The Selenium Guidebook / Elemental Selenium by Dave Haeffner, we read this and it allowed us to organize our tests, but more importantly, help us feel confident that what we were doing wasn’t foolish. Secondly, we met Neil Manvar at Sauce Labs through a mutual friend. Neil brought a lot of domain knowledge and more importantly provided emotional support in letting us know that selenium was not flaky and in fact we had written our tests poorly. It just goes to show the value of working your network!

  7. We had no CI server, and were running tests manually. When that got too painful, I embarked on setting up a CI server. For about a month I spent time trying to get our unique Ruby on Rails / PHP environment working on Travis, Circle, and Codeship CI. I failed every time trying to get both apps running on the same server on these CI as a service solutions.

  8. We almost gave up. Maybe selenium wasn’t worth all of the trouble after all.

  9. Luckily, we discovered a couple things that got us over the hump. We stepped back and realized we were using the wrong tool for the job. Instead of using CI as a service solutions, we set up a TeamCity server that allowed us to customize how our environments are set up. Once the build was up and running, we noticed that it was still flaky. We wrote a custom re-run script that re-runs tests that have failed. This change took our build from an unusable 50% flakiness to a usable 10% flakiness. Once we had a consistently green build, we noticed that developer’s weren’t paying attention to it, so we integrated github with team city so that selenium builds would kick off automatically and developers would be reminded that they need to have a green build before merging any pull requests. Turning this on took developer participation from about 30% to 100% instantly. All of these tasks were small things we put off for a long time, but when we finally got around to implementing them, we wondered why we hadn’t done them sooner because of how much value they added for us. And although they don’t relate directly to selenium, they were essential in getting us to use it.

  10. When we started, we had very little developer participation in writing selenium tests. Nobody remembered to write selenium tests with this PR’s, and setting up your environment to run a test was cumbersome. After all, in order to write or debug a selenium test, we would have to shell into a machine, set up a sauce labs tunnel, run our tests, and watch it on the sauce labs viewer. Debugging a selenium test on sauce labs was nearly impossible. We reached a point where maybe there was too much pushback on the team to make adequate integration test coverage a reality.

  11. We almost gave up.

  12. But, we discovered a few key things that got us over the hump. I started nudging people in code reviews and letting them know PRs would not be accepted without integration tests.Others started to enforce this rule and we began to build up coverage. We wrote a script to make it easy to run a selenium test locally with a single command. We set up an unlimited sauce plan to run concurrent tests without worrying about utilization costs. These small behavioral nudges added up in making writing selenium tests a habit rather than a chore.

  13. I want to share a quote from my best friend from high school who is now a software developer at Slalom Consulting. We were hanging out and we naturally started talking about Selenium, and he said “We had a selenium suite, but it was flaky so we stopped using it.” They gave up.

  14. We almost gave up. But we didn’t! We spent a year working on our build on-and-off, almost giving up. And now we’re able to reap the benefits of our green selenium build. The best practices might sound like it wouldn’t make a big difference. My one message to you is: Don’t give up.

Startup Promotions and Equity Grants

  • The problem: Employees who stay with your company deserve to be rewarded with more salary and equity. How do you design a system that is fair, easy to understand, and easy to implement?
  • Our process: We asked friends in the industry to explain how promotion process works in their company and researched online to understand the status-quo for the tech industry. Based on our findings, we identified parts of other companies’ processes that we liked. Finally, we assembled a policy that felt the most in-line with the company culture.

Our first step was to ask our friends. Here’s what they had to say (I highlight the parts interesting to me):


It all depends on performance, very heavily weighted. The most obvious thing they do is to have a set of responsibilities for each level and see quantitative proof that the person meets the expectations of the next level. They do this by discussing among the next to next level guys. The most realistic estimate is 1-1.5 years at lower levels. Hike is subjective, again, by performance. They have a committee that decides the hike. it’s a combination of max pay per level, how good this person is, and how much he gets. As a common trend, they give more bonuses and fewer hikes. Because bonus is a one-time thing and hike is a commitment. I don’t know the qualitative number for hike, but bonus is around 10-12% for normal performance


Compensation is reevaluated every year according to market standards. Promotions are totally merit-based, performance-based, so it depends on the level you are operating on, consistently, for at least 6 months. We want people to be consistently performing at the next level for at least 6 months before promotion. Every 6 months, we have a review cycle. Managers get peer feedback on what the engineer accomplished, and managers from different orgs will review the anonymized engineer, and compare engineers at the same rank to calibrate for impact across orgs.


The employee who thinks he/she is eligible for promotion applies to their manager. Along with this application he/she gets recommendation from other engineers they worked with during the last 6 months. These peer employees write a single paragraph describing what they worked on how that employee did a good job. Once the application is in, the manger sits with the promotion committee and determines the case. A promotion committee is usually 2-3 top senior engineers who evaluate the work and give their opinion. Ultimately its the manager’s decision to promote that employee.


At Salesforce, my title transitions were: AMTS -> MTS: 13 months, 10% increase MTS -> SMTS: 15 months, 8.77% increase Here’s what I think is standard: AMTS -> MTS: 11-18 months MTS -> SMTS: 24 months SMTS -> LMTS: 24-36 months LMTS -> PMTS: 36+ months.


Based on the above accounts and other research we did, we picked out the patterns that stood out to us:

  • Performance Reviews - Everybody does them. People hate them. It seems that they are imperfect in many ways, but are often the best that can be done in tackling the impossible challenge of gauging how an employee has performed. Performance reviews are inherently challenging because:
    • Performance is subjective: People can easily have a different idea of how an individual is performing based on how much they like that person, their visibility of that role, and other non-objective factors. This is especially the case in startups where employees where multiple hats and are continuously redefining their role.
    • Criteria is subjective: It is difficult to set an expectation on what behavior results in a promotion when . Especially in a startup that does not have other employees to serve as data points in a compensation function.
    • Power Dynamics: It leads to a power dynamic where those conducting the performance review have power over the one being evaluated. Which is especially challenging for a startup which values collaboration over competition.
  • Stack Ranking - Also known as a vitality curve, this is the management technique of grading employees based on their individual productivity. Many large organizations such as Yahoo, Amazon, and Microsoft have implemented stack ranking with mixed results.
  • Peter Principle and The Law of Crappy People - The Law of Crappy People (TLCP) states: “For any title level in a large organization, the talent on that level will eventually converge to the crappiest person with the title.” Ben Horowitz has a good segment on mitigating TLCP that boils down to being very disciplined about defining skills at each level.


After absorbing the above research, we finally came up with a rough guideline to handle promotions: Promotions are done every quarter and generally the expectation for promotions are as follows, broken down by the frequency of promotions depending on performance. These frequencies are relative to start date or date of last promotion. Keep in mind that these are guidelines, not hard rules, and does not mean that circumstances outside of the guidelines will not be considered: 3 months - a promotion can be given in 3 months after an employee’s start date or after any promotion if evaluations show that the company would be in a more fair state if the employee was set at a higher multiplier. Promotions do not necessarily mean that your next promotion is delayed by 3 months. 6 months - an exceptional promotion given very rarely, to employees whose performance greatly exceeds expectations 9 months - a great promotion, given infrequently to employees whose performance exceeds expectations 12 months - a good promotion given regularly to employees whose performance meets expectations


Role Differences: The compensation vs. time (assuming constant performance) curves for sales and engineering are different when considering market rate and as such the guidelines may be applied differently depending on the role. See graphic below from Seniority: The seniority of positions affects how frequently promotions are given. It is common for promotion frequency to decrease as the position becomes higher, and this will affect how the guidelines will be applied. Expectations Work smarter, not harder (aka work more efficiently, not more hours). There is no expectation for work outside of regular office hours, and you will not be held back for promotion because you didn’t work outside office hours.


Our system isn’t perfect. After having implemented it and running it for the past two quarters, we have identified challenges that we will want to solve as we grow:

  • No crisp definitions of skill levels at different skill multipliers. This has left us vulnerable to The Law of Crappy People. As the roles in our organization become more specialized, this issue will become easier to resolve.
  • No crisp definitions of responsibilities at different skill multipliers. This has caused employees to feel that there is no clear long-term path for career advancement in the company.
  • High overhead process: Currently the way we decide who gets promoted involves a lengthy representative nomination process with multiple handoffs and a committee meeting that needs to be scheduled around everyone’s busy schedules. This happens every quarter, and takes up a lot of time to organize.
  • Responsibility bottleneck: Right now the cofounders are the ones ultimately making the decision on promotions. This is a problem because as the team is growing, the cofounders are becoming more and more distant from the day-to-day tasks of everyone and less qualified to make judgements on compensation. In addition, our time just does not scale.


If you have any questions or feedback for us on what you’ve read or our promotion guidelines, feel free to tweet me @ryochiba and @tint . Would love to hear your ideas and share what we have learned!


Good Pair Bad Pair

  • A good partner understands pairing is a difficult skill that takes time and effort to cultivate. A bad partner expects others to be great pairs right off the bat.
  • A good partner seeks to understand their own bad pairing habits. A bad pair fails to think about their own pairing habits and only blames others.
  • A good partner brings up mistakes that they make and that others make in a way that turns a mistake into an improvement opportunity. A bad partner bottles up issues they have while pairing and allows the issues to harm relationships and their quality of life at work.
  • A good partner frequently syncs up on schedule and goals and is not afraid to adjust the schedule to make it more realistic. A bad partner does not talk about schedule or goals and avoids adjusting the schedule until the last minute, causing confusion and mismatched expectations.
  • A good partner sets small achievable goals and celebrates achieving them. A bad partner sets one big (likely unrealistic) goal and stresses out about achieving it.
  • A good partner clearly communicates availability. A bad partner disappears for unpredictable periods of time with no notice leaving the other partner to work alone and confused.
  • A good partner uses 2 input devices and 1 computer and avoids using 2 computers unless necessary. A bad partner defaults to using 2 computers and gets distracted / unpaired.
  • A good partner balances give and take in decision making. A bad partner will not be aware of the decision making balance and either be a bunny or Alpha Male.
  • A good partner is aware of skill differences and works to rebalance them by making the effort to be a mentor or a student.
  • A good partner will continue to help with an epic all the way to the finish line and after with deployment tasks and bug fixes. A bad partner will stop contributing to the epic once the feature is accepted and not help their pair get the feature stable and in production.

A good partner focuses on cultivating the following pairing roles

  • Mentor - explains concepts and reasoning with minimal judgement
  • Moleskine - maintains state and checks for edge cases and unexpected side effects
  • Captain - cultivates their own soft skills necessary in effective pairing and cultivating their partners as well

And a bad partner falls into the following bad pairing roles

  • Alpha Male - mainly takes in a give and take discussion
  • Superman - grabs keyboard and starts coding quickly and silently
  • Bunny - mainly gives in a give and take discussion
  • Rodolfo Valentino - never disagrees with their partner’s decision
  • Monk - does not acknowledge the validity of other’s ideas
  • Puppet Master - uses their influence to control the driver’s coding
  • Backseat Driver - uses their voice to control the driver’s coding
  • Auditor - nitpicks small, trivial decisions at the expense of larger and more important decisions

About Drivers:

  • A good driver frequently asks for agreement on ambiguous choices. A bad driver makes difficult choices silently and does not ask the navigator for input.
  • A good driver makes easy decisions fast. A bad driver constantly asks for input on decisions that do not require input.
  • A good driver is aware of the navigator’s focus and will ask for input or suggest trading off if they notice the navigator is distracted.
  • A good driver thinks out loud and communicates intentions and reasons.

About Navigators:

  • A good navigator is continuously sanity checking code. A bad navigator is checking their phone for text messages.
  • A good navigator anticipates next steps and maintains the overall state of the system, reminding the driver about necessary changes that may have been overlooked. A bad navigator is working on a bug while simultaneously attempting to pair, but not contributing to the pair.
  • A good navigator is aware of their own focus, and suggests switching roles if they notice that their focus is slipping. A bad navigator allows their focus to deteriorate and is afraid of suggesting to switch roles.


  • A good pair has built the rapport between them to share a few laughs while pairing and have fun.