<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Scout ~ The Blog</title>
    <link>http://blog.scoutapp.com/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Scout ~ The Blog</description>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/scoutapp" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Running a freemium web app? Here's a big reason we're growing.</title>
      <description>&lt;p style="float:left"&gt;&lt;img src="http://img.skitch.com/20091104-8ch1np6qu1tauqi9jy47hex3f1.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Before &lt;a href="http://scoutapp.com"&gt;Scout&lt;/a&gt;, my experience developing software was primarily consulting. Success was measured by delivering software on time and on budget.&lt;/p&gt;


	&lt;p&gt;With Scout, a subscription-based service, my focus isn&amp;#8217;t on scheduling. We are self-funded and we didn&amp;#8217;t have the luxury of a venture-backed startup. We&amp;#8217;re focused on figuring out which pieces of development work can increase revenue the most. What follows is how we&amp;#8217;re approaching it.&lt;/p&gt;
&lt;h2&gt;The 1% paid conversion rule&lt;/h2&gt;


	&lt;p&gt;If there&amp;#8217;s a golden rule of a subscription-type service like Scout, it&amp;#8217;s this: &lt;a href="http://particletree.com/features/web-app-autopsy/"&gt;&lt;strong&gt;1% of visitors will signup for a paying subscription&lt;/strong&gt;&lt;/a&gt;. This 1% rule exposes itself across industries, price point, and size.&lt;/p&gt;


	&lt;p&gt;The 1% rule is the &lt;a href="http://en.wikipedia.org/wiki/Pi"&gt;Pi&lt;/a&gt; of &lt;a href="http://en.wikipedia.org/wiki/Freemium"&gt;freemium&lt;/a&gt; web apps.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s very easy to think you can improve this because 1% is such a small number, but your business is the rare exception if your paid conversion rate dramatically exceeds 1%. If your paid conversion rate is around 1%, you need to dig somewhere else for treasure.&lt;/p&gt;


	&lt;p&gt;As our signup rate is around 1%, what have we focused on?&lt;/p&gt;


	&lt;h2&gt;Retention &amp;#38; Lifetime Value&lt;/h2&gt;


	&lt;p&gt;Increasing the rate that customers renew their subscriptions (retention rate) can have a dramatic impact on revenue. For example, increasing retention by 1/2 results in the following revenue per/month:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091029-r7ckh33enrwjm64ef34ypk95m5.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;If you sum the periods, you&amp;#8217;ll see that revenue actually doubles with a 50% increase in the retention rate:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091106-quyk5rkecifrjm9tnagnyi77jf.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;To determine the revenue, I&amp;#8217;m using an equation for Lifetime Value, which is the revenue expected from a customer over their lifetime. Every period (in our case, 1 month), decreases the chances that they&amp;#8217;ll renew. &lt;code&gt;R&lt;/code&gt; represents the retention rate and &lt;code&gt;rev&lt;/code&gt; is the revenue per/period in the equation below:&lt;/p&gt;


&lt;pre&gt;
LTV = rev + rev*R + rev*R^2 + rev*R3 + …
&lt;/pre&gt;

	&lt;p&gt;This can be simplified to:&lt;/p&gt;


&lt;pre&gt;
LTV = 1/(1-R) * rev
&lt;/pre&gt;

	&lt;p&gt;The retention rate can be calculated using the equation below:&lt;/p&gt;


&lt;pre&gt;
R = 1-(# of canceled accounts in a given period / # of accounts in a given period)
&lt;/pre&gt;

	&lt;p&gt;So, is it as difficult to increase retention as it is increase the signup rate?&lt;/p&gt;


	&lt;h2&gt;Good news &amp;#8211; there is no rule for retention rate&lt;/h2&gt;


	&lt;p&gt;While there is a rule for paid signup conversions, you won&amp;#8217;t find one for retention rate. Retention rates vary widely and are a great target for increasing revenue.&lt;/p&gt;


	&lt;p&gt;Focusing on churn also makes sense in another way: &lt;strong&gt;increasing retention by 50% is the same as doubling your signup rate&lt;/strong&gt;. If your paid conversion rate is already around 1% and you think you can double it, you might be a bit crazy.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve had good success increasing retention by:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Closely monitoring application performance. As you&amp;#8217;d expect, we use &lt;a href="http://scoutapp.com"&gt;Scout&lt;/a&gt; for this. &lt;/li&gt;
		&lt;li&gt;Getting feedback from users when they cancel. &lt;/li&gt;
		&lt;li&gt;Asking users for feedback after they&amp;#8217;ve setup their account.&lt;/li&gt;
		&lt;li&gt;Aggregating and prioritizing user feedback. We use &lt;a href="http://uservoice.com"&gt;UserVoice&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;Tracking user behavior. We use &lt;a href="http://google.com/analytics"&gt;Google Analytics&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Focusing on retention rate isn&amp;#8217;t glamourous work, but for many subscription-based web apps, it may hold the most untapped potential to increase revenue.&lt;/p&gt;


	&lt;h2&gt;A higher retention rate can have a dramatic impact on signups too&lt;/h2&gt;


	&lt;p&gt;You can double your revenue if you decrease your churn by half. That is a substantial number &amp;#8211; it means you could also charge customers the same amount, but &lt;strong&gt;double your spending on acquiring customers&lt;/strong&gt; and have the same income.&lt;/p&gt;


	&lt;p&gt;Increasing your retention rate gives you room to breath.&lt;/p&gt;


	&lt;h2&gt;Also See&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;Andrew Chen&amp;#8217;s excellent blog post, &lt;a href="http://andrewchenblog.com/2009/01/19/how-to-create-a-profitable-freemium-startup-spreadsheet-model-included/" title="spreadsheet model included!"&gt;How to create a profitable Freemium startup&lt;/a&gt;. This was my original inspiration. &lt;/li&gt;
		&lt;li&gt;Paul Graham&amp;#8217;s post on &lt;a href="http://www.paulgraham.com/really.html"&gt;What Startups Are Really Like&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Our previous blog post, &lt;a href="http://blog.scoutapp.com/articles/2009/10/06/we-just-undid-three-months-of-dev-work-heres-what-we-learned"&gt;We Just Undid Three Months of Dev work. Here&amp;#8217;s What We Learned.&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Subscribe&lt;/h2&gt;


	&lt;p&gt;We&amp;#8217;ll continue to talk about our experiences growing &lt;a href="http://scoutapp.com"&gt;Scout&lt;/a&gt;. &lt;a href="http://feeds.feedburner.com/scoutapp"&gt;Subscribe to our &lt;span class="caps"&gt;RSS&lt;/span&gt; feed&lt;/a&gt; or &lt;a href="http://twitter.com/scoutapp"&gt;follow us on Twitter&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/DXqVeg3PjWs" height="1" width="1"/&gt;</description>
      <pubDate>Wed,  4 Nov 2009 13:18:00 EST</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/11/04/running-a-freemium-web-app-heres-a-big-reason-were-growing</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/DXqVeg3PjWs/running-a-freemium-web-app-heres-a-big-reason-were-growing</link>
      <category>Business</category>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/89</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/11/04/running-a-freemium-web-app-heres-a-big-reason-were-growing</feedburner:origLink></item>
    <item>
      <title>Bulk Plugin Management &amp;amp;mdash; Your Input Wanted</title>
      <description>&lt;p&gt;Some of our customers are monitoring a lot of servers with Scout. We&amp;#8217;re psyched about this, and we&amp;#8217;re looking at ways to make Scout even easier to use.&lt;/p&gt;


	&lt;p&gt;Bulk plugin management is a topic that comes up pretty often.&lt;/p&gt;


	&lt;p&gt;So we&amp;#8217;re looking at the ability to make changes &lt;em&gt;en masse&lt;/em&gt; to your servers:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;add / delete a plugin on all servers in one shot&lt;/li&gt;
		&lt;li&gt;add / delete a trigger to a plugin across all servers&lt;/li&gt;
		&lt;li&gt;clone all plugins and triggers from one server to another&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;b&gt;We&amp;#8217;d love your feedback.&lt;/b&gt; How do you want to be able to bulk update your plugins? Feel free to leave feedback in comments.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/dHgs8aF_0wA" height="1" width="1"/&gt;</description>
      <pubDate>Tue,  3 Nov 2009 19:01:00 EST</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/11/03/bulk-plugin-management-mdash-your-input-wanted</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/dHgs8aF_0wA/bulk-plugin-management-mdash-your-input-wanted</link>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/90</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/11/03/bulk-plugin-management-mdash-your-input-wanted</feedburner:origLink></item>
    <item>
      <title>Rails Monitoring Improvement: Ignore Specific Actions</title>
      <description>&lt;p&gt;Sometimes you have actions in your Rails app that you &lt;em&gt;know&lt;/em&gt; take a long time. Getting alerts on these actions is just noise.&lt;/p&gt;

&lt;p&gt;With the updated &lt;a href="http://scoutapp.com/plugin_urls/181-ruby-on-rails-monitoring"&gt;Rails Monitoring Plugin&lt;/a&gt;, you can filter out any requests on which you don't want to be notified. You supply a regular expression, so you make as simple or complicated as you need to.&lt;/p&gt;

&lt;h2&gt;Update your Rails plugin&lt;/h2&gt;

&lt;p&gt;If you already have the Rails plugin installed, you need to update it. Go to plugin-&gt;code and click &lt;strong&gt;Update&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20091028-eu52yp5hde14krp3aw71q8tbpk.png" style="border:2px solid #888" /&gt;&lt;/p&gt;

&lt;p&gt;Then go to plugin-&gt;edit and click &lt;strong&gt;Update Options&lt;/strong&gt;: 
&lt;img src="http://img.skitch.com/20091028-dux7mry7wisbj8xebqxpqx2x79.png" style="border:2px solid #888" /&gt;&lt;/p&gt;

&lt;p&gt;The new goodness is under "advanced options":&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20091028-8idud9h54f3yinbcs1wi77ss5k.png" style="border:2px solid #888" /&gt;&lt;/p&gt;

&lt;h2&gt;Ignoring Actions&lt;/h2&gt;

&lt;p&gt;You provide a regular expression for actions you want &lt;strong&gt;don't want to be alerted on&lt;/strong&gt; when they're slow. In the simplest case, don't even worry about it being a regular expression -- just provide a string you want to match. For example, if you don't want to be alerted to any slow actions with &lt;code&gt;admin&lt;/code&gt; in the URI, just put &lt;code&gt;admin&lt;/code&gt; in the Ignored Actions field.&lt;/p&gt;

&lt;h2&gt;More Complicated Matches&lt;/h2&gt;

&lt;p&gt;To ignore all actions under &lt;code&gt;admin&lt;/code&gt; and also &lt;code&gt;accounts/new&lt;/code&gt;,  the regex is&lt;code&gt;(admin|accounts\/new)&lt;/code&gt;. If you wanted to make sure &lt;code&gt;admin&lt;/code&gt; only matches paths &lt;em&gt;starting with&lt;/em&gt; admin, just match the beginning slash: &lt;code&gt;(\/admin|accounts\/new)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you're building a complicated regex, try it out separately to ensure it matches/doesn't match what you expect. I dig on &lt;a href="http://www.rubular.com/"&gt;Rubular&lt;/a&gt; for quick regex sanity checks. Of course, the plugin will tell you if your regex has a problem, but you'll get faster feedback by running it through Rubular.&lt;/p&gt;

&lt;h2&gt;Notes&lt;/h2&gt;

&lt;p&gt;Note that the match is case insensitive -- no need to worry about case. &lt;/p&gt;

&lt;p&gt;Finally, note that excluded actions will still be analyzed in the daily &lt;a href="http://blog.scoutapp.com/articles/2009/09/22/lightweight-ruby-on-rails-analysis"&gt;Rails Analysis reports&lt;/a&gt;, so you'll still get metrics on them -- you just won't get email notifications for actions you already know are slow!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/UVLBwlB44M0" height="1" width="1"/&gt;</description>
      <pubDate>Mon,  2 Nov 2009 11:31:00 EST</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/11/02/rails-monitoring-improvement-ignore-specific-actions</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/UVLBwlB44M0/rails-monitoring-improvement-ignore-specific-actions</link>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/88</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/11/02/rails-monitoring-improvement-ignore-specific-actions</feedburner:origLink></item>
    <item>
      <title>Rails + Google Analytics = easy goal tracking</title>
      <description>&lt;p&gt;Google Analytics is an indispensable tool as you optimize the business side of your operation. If you haven't already set up goals in Analytics for viewing your pricing information, accessing the sign-up form, and signing up for an account -- go do it! It's vital information.&lt;/p&gt;

&lt;p&gt;However, Google Analytics' goals have to be attached to a specific URL. What if there is no URL for an important goal? For example, the New Account goal for Scout is just the account/show page -- there's no specific URL to represent a newly created account. &lt;/p&gt;
&lt;h2&gt;flash[:analytics] to the rescue&lt;/h2&gt;

&lt;p&gt;For this situation, we found a nice clean solution with Rails' flash helper + a touch of Javascript. &lt;/p&gt;

&lt;p&gt;Rails' flash helper is exactly the same one you use to &lt;a href="http://api.rubyonrails.org/classes/ActionController/Flash.html"&gt;display errors and notices&lt;/a&gt;. But you can pass anything in a flash. In our &lt;code&gt;Accounts_controller#create&lt;/code&gt; action, we call: &lt;/p&gt;

&lt;div class="terminal"&gt;
flash[:analytics] = @account.free? ? "/goals/free" : "/goals/paid"
&lt;/div&gt;

&lt;p&gt;Then, in our layout, &lt;code&gt;application.html.erb&lt;/code&gt;, within the same &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag in which we include Google Analytics:&lt;/p&gt;

&lt;div class="terminal"&gt;&amp;lt;%if&amp;nbsp;flash[:analytics]%&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;pageTracker._trackPageview("&amp;lt;%=flash[:analytics]%&amp;gt;");&lt;br/&gt;&amp;lt;%end%&amp;gt;&lt;/div&gt;

&lt;p&gt;It's as simple as that! We can register arbitrary goals in any action by setting &lt;code&gt;flash[:analytics]&lt;/code&gt;. Within Google Analytics, just set the goals with the same names you've given the flash: &lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20091013-derwqmuja6ydud3r772tqkxtu1.gif" height="99" width="404"/&gt;&lt;/p&gt;

&lt;h2&gt;Key takeaways&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Analytics is essential&lt;/li&gt;
&lt;li&gt;you can register arbitrary URL's via Google Analytics' &lt;code&gt;_trackPageview()&lt;/code&gt; call&lt;/li&gt;
&lt;li&gt;Rails' flash helpers make it easy and clean to register analytics for any action in your app&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/jcIhHYvC5hE" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 27 Oct 2009 11:34:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/27/rails-google-analytics-easy-goal-tracking</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/jcIhHYvC5hE/rails-google-analytics-easy-goal-tracking</link>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/86</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/27/rails-google-analytics-easy-goal-tracking</feedburner:origLink></item>
    <item>
      <title>Major chart updates - variability, overlays, scaling &amp;amp; stacking</title>
      <description>&lt;p&gt;&lt;img src="http://scoutapp.com/images/blog/charts_update.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;When debugging performance problems, visualizing server metrics in a variety of ways is a critical part of isolating the cause:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Visualizing variance&lt;/li&gt;
		&lt;li&gt;Overlaying metrics to identify correlations&lt;/li&gt;
		&lt;li&gt;Scaling to compare several metrics with different units&lt;/li&gt;
		&lt;li&gt;Stacking graphs to visualize distributed setups&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We&amp;#8217;ve just released a major update to &lt;a href="http://scoutapp.com"&gt;Scout&amp;#8217;s&lt;/a&gt; charting functionality that makes it easier to analyze your metrics.&lt;/p&gt;
&lt;h2&gt;Variability&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091021-b7yijgw1jiyryqpigc94akw5tc.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;The average value of a metric only tells part of the story &amp;#8211; where does the average fall in relation to the min &amp;#38; max? How volatile is the metric? Scout now shows the highs &amp;#38; lows for each time period when graphing via a shaded vertical column.&lt;/p&gt;


	&lt;h2&gt; Overlays&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091021-ewd1xfic3t5mjqywnueg1de7ik.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;What&amp;#8217;s the correlation between database load and web requests? Or how about average request and and memory usage? It&amp;#8217;s easy to compare different metrics with overlays.&lt;/p&gt;


	&lt;h2&gt;Scaling&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091021-cf4831aqxwyshhm4ghfjgwq7sk.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Have a complicated setup and need to compare several metrics with different units? No problem &amp;#8211; Scout can scale each metric so you can compare them on a single graph.&lt;/p&gt;


	&lt;h2&gt;Stacked Graphs&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091021-dd4rsmyfugi8pebdc4yige3ppr.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Stacked graphs help you get a complete picture of your distributed setup. Receiving requests across multiple web servers? Have several database servers? See how it all adds up with stacked graphs.&lt;/p&gt;


	&lt;h2&gt;Accessing Charts&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091021-cquyw6k5auyhu9i56gr22h8uge.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Just click on a metric when viewing a server in Scout and you&amp;#8217;ll be directed to the charts page using the selected metric. From there, mix and match your metrics.&lt;/p&gt;


	&lt;h2&gt;30-Day Free Trial&lt;/h2&gt;


	&lt;p&gt;Want to try out charts? We offer a 30-day free trial on all of our plans. &lt;a href="http://scoutapp.com/signup"&gt;Sign up for Scout&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/UAA69hq8BJo" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 21 Oct 2009 15:07:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/21/major-chart-updates-variability-overlays-scaling-stacking</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/UAA69hq8BJo/major-chart-updates-variability-overlays-scaling-stacking</link>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/87</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/21/major-chart-updates-variability-overlays-scaling-stacking</feedburner:origLink></item>
    <item>
      <title>Part II: We Just Undid Three Months of Dev work. Here's What We Learned.</title>
      <description>&lt;p&gt;Two weeks ago I covered some of the &lt;a href="http://blog.scoutapp.com/articles/2009/10/06/we-just-undid-three-months-of-dev-work-heres-what-we-learned"&gt;business lessons learned&lt;/a&gt; from a large (~3 months) investment in new features, and the hard decision to roll them back. I discussed how &lt;b&gt;you will underestimate the ongoing cost of complexity in your product&lt;/b&gt;, and how &lt;b&gt;cool new capabilities don&amp;#8217;t sell themselves&lt;/b&gt;.&lt;/p&gt;


	&lt;p&gt;Continuing this week&amp;#8212;more insights gained from undoing development work.&lt;/p&gt;
&lt;h2&gt;Lesson #3: The best features are ones that support better business decisions&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3401/3491395689_fe1d2050fb.jpg" width="200px" style="float:right; border:2px solid #bbb; margin:8px"/&gt;&lt;/p&gt;


	&lt;p&gt;In cost-benefit terms, there are some clear winners in our recent feature development: the winners are the features that support better business decisions and enable more business development. For us, this meant:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;b&gt;front-and-center reports&lt;/b&gt; of signups, plan upgrade/downgrades, and cancellations. This data was always there, but making it accessible in a hassle-free way was a huge win for us. You will naturally optimize around what is easily accessible and visible.&lt;/li&gt;
		&lt;li&gt;&lt;b&gt;an affiliate program&lt;/b&gt; and corresponding administrative functionality, integrated with our signup system. This enabled us to pursue a whole new class of business relationships and revenue opportunities.&lt;/li&gt;
		&lt;li&gt;&lt;b&gt;feedback collection from users who cancel&lt;/b&gt;. A surprising percentage of canceling accounts will give you honest feedback on why they are quitting. The subjective feedback goes a long way in coloring your signup metrics.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Lesson #4: There is no substitute for talking to your users.&lt;/h2&gt;


	&lt;p&gt;We launched a major development initiative based on our internal ideas of what users wanted. In retrospect, we should have spent much more time speaking with customers and vetting the ideas. The closer you get to your product, the easier it is to fall into this trap. Two examples of thinking that lead us to assume too much:&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;A. Extrapolating feature needs from a competitor&amp;#8217;s offering &amp;#8230; &amp;#8220;Competitor X does feature Y. We should do feature Y, since there&amp;#8217;s obviously a demand for it.&amp;#8221;&lt;/b&gt;&lt;/p&gt;


	&lt;p&gt;Well, maybe. Company X may already &amp;#8220;own&amp;#8221; that feature in customers&amp;#8217; minds. Or they may be losing money on the feature. The existence of a competitor in the space isn&amp;#8217;t necessarily a good argument for entering that space yourself.&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;The lesson:&lt;/b&gt; do some more research before committing serious development resources.&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;B. Assuming users will invest in more complicated features.&lt;/b&gt;&lt;/p&gt;


	&lt;p&gt;We assumed that if we offered the capability to report structured data into Scout, plugin authors would create more sophisticated plugins. Signup numbers didn&amp;#8217;t bear out this hypothesis. Why? Too much complexity. Building and debugging plugins to report complex, structured data wasn&amp;#8217;t something you could easily pick up and see immediate results. It was too involved for all but the most dedicated plugin authors to utilize.&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;The lesson:&lt;/b&gt; complexity can change the game. If you&amp;#8217;re asking a lot more of your users, do a gut check and have some more conversations.&lt;/p&gt;


	&lt;h2&gt;Lesson #5: Be wary of &amp;#8220;comfort work&amp;#8221;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://farm1.static.flickr.com/89/247714575_9fa65829d8_m.jpg" width="200px" style="float:right; border:2px solid #bbb; margin:8px"/&gt;&lt;/p&gt;


	&lt;p&gt;We all tend to see challenges in terms of our own skillset. If you&amp;#8217;re a good developer, you will think of product solutions to growing your business. If you&amp;#8217;re good at business development, you will see business development solutions. That&amp;#8217;s not a bad thing, but part of the challenge of building a business is to expand the domain of solutions you are comfortable trying.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s easy to be biased toward development work because that&amp;#8217;s what you know best.&lt;/p&gt;


	&lt;p&gt;So, are you getting a warm, comfortable feeling for the &lt;em&gt;execution&lt;/em&gt; of the solution? Then do a quick sanity check. You may be guided by your comfort with the execution rather than how appropriate it is for your problem.&lt;/p&gt;


	&lt;p&gt;Liked this article? &lt;a href="http://feeds.feedburner.com/scoutapp"&gt;Subscribe to our &lt;span class="caps"&gt;RSS&lt;/span&gt; feed&lt;/a&gt; or &lt;a href="http://twitter.com/scoutapp"&gt;follow us on Twitter&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/OuiTfpnqHgc" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Oct 2009 09:11:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/20/part-ii-we-just-undid-three-months-of-dev-work-heres-what-we-learned</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/OuiTfpnqHgc/part-ii-we-just-undid-three-months-of-dev-work-heres-what-we-learned</link>
      <category>Business</category>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/83</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/20/part-ii-we-just-undid-three-months-of-dev-work-heres-what-we-learned</feedburner:origLink></item>
    <item>
      <title>The MySQL MyISAM and InnoDB engines and a grocery checkout</title>
      <description>&lt;p&gt;There&amp;#8217;s no shortage of resources &lt;a href="http://en.wikipedia.org/wiki/InnoDB#Comparison_with_MyISAM"&gt;comparing&lt;/a&gt; the &lt;a href="http://en.wikipedia.org/wiki/MyISAM"&gt;MyISAM&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/InnoDB"&gt;InnoDB&lt;/a&gt; storage engines. You&amp;#8217;ll quickly see it isn&amp;#8217;t a black-and-white decision after reading through &lt;a href="http://www.google.com/search?q=myisam+vs+innodb"&gt;various discussions&lt;/a&gt; debating MyISAM and InnoDB.&lt;/p&gt;


	&lt;p&gt;Why is the decision so hard?&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Setting up your database is one of the first steps when building a web application. You probably don&amp;#8217;t have a good idea on the database activity at this point, so you may have little data to work with. &lt;/li&gt;
		&lt;li&gt;The ordering and number of statements can have a big impact on database performance. It&amp;#8217;s difficult to simulate until you have real users.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;However, there is a one case where choosing the wrong table type can be crippling.&lt;/p&gt;
&lt;h2&gt;The Grocery Checkout&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091012-qqahnuhc8h41agx1yjirxyjcd9.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Many web applications primarily issue &lt;span class="caps"&gt;READ&lt;/span&gt; queries &amp;#8211; &lt;span class="caps"&gt;SELECT&lt;/span&gt; statements. Both the MyISAM and InnoDB table types can execute these &lt;a href="http://en.wikipedia.org/wiki/Concurrency_(computer_science)"&gt;concurrently&lt;/a&gt;. There isn&amp;#8217;t a single queue &amp;#8211; you&amp;#8217;re checking out at the cash register with 10 possible lines. One long query won&amp;#8217;t stop another from running:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091009-1jmhd3xdwc5mw9x94fxhc15gid.png" alt="" /&gt;&lt;/p&gt;


	&lt;h3&gt;UPDATE statements are another story&lt;/h3&gt;


	&lt;p&gt;For the MyISAM engine, an &lt;span class="caps"&gt;UPDATE&lt;/span&gt; can only execute if the other checkout lines are empty. All of the other cashiers must stop working. This is table-level locking.&lt;/p&gt;


	&lt;p&gt;Normally, this isn&amp;#8217;t a problem. However, what if there is long 10 second &lt;span class="caps"&gt;SELECT&lt;/span&gt; query, then an update, and then several other &lt;span class="caps"&gt;SELECT&lt;/span&gt; statements?&lt;/p&gt;


	&lt;p&gt;The additional &lt;span class="caps"&gt;SELECT&lt;/span&gt; statements must wait unit the &lt;span class="caps"&gt;UPDATE&lt;/span&gt; query finishes:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091009-rwjhy5py2b547yxmh4n5n3eee.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;This means that the 3 queries after the &lt;span class="caps"&gt;UPDATE&lt;/span&gt; statement will take a minimum of 10 seconds to run. The execution time of these queries may be very small &amp;#8211; perhaps 0.001 seconds, but it doesn&amp;#8217;t matter &amp;#8211; &lt;strong&gt;they have to wait for the &lt;span class="caps"&gt;UPDATE&lt;/span&gt; to finish&lt;/strong&gt;, which is waiting for the long &lt;span class="caps"&gt;SELECT&lt;/span&gt; statement to finish.&lt;/p&gt;


	&lt;p&gt;InnoDB doesn&amp;#8217;t have this restriction as it uses row-level locking &amp;#8211; only the updated rows are locked. &lt;span class="caps"&gt;SELECT&lt;/span&gt; queries can continue to execute.&lt;/p&gt;


	&lt;h2&gt;This seems like a fatal flaw. Why would MySQL make MyISAM the default storage engine?&lt;/h2&gt;


	&lt;p&gt;In a well-optimized web application, the table type may not matter:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Most web applications primarily issue reads, not writes, so table locks don&amp;#8217;t occur frequently. &lt;/li&gt;
		&lt;li&gt;There should be few (if any queries) that take a 1/2 second or more.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;However, new web applications are anything but optimized. You&amp;#8217;re more likely to have missing indexes that result in slow queries. You don&amp;#8217;t know if you&amp;#8217;ll be doing reporting, which often involves slow queries.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;There are a lot of unknowns, so it&amp;#8217;s often worthwhile to go with the safe choice.&lt;/strong&gt; This can be a difficult problem to diagnose, and during the post-launch phase, you&amp;#8217;ll have plenty of other things to worry about.&lt;/p&gt;


	&lt;h2&gt;More on MySQL&lt;/h2&gt;


	&lt;p&gt;I&amp;#8217;ll be following up this post with a walk-thru of several tools for monitoring MySQL performance.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://feeds.feedburner.com/scoutapp"&gt;Subscribe to our &lt;span class="caps"&gt;RSS&lt;/span&gt; feed&lt;/a&gt; or &lt;a href="http://twitter.com/scoutapp"&gt;follow us on Twitter&lt;/a&gt; for part 2.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/7vo74esxNhc" height="1" width="1"/&gt;</description>
      <pubDate>Fri,  9 Oct 2009 16:15:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/09/choosing-between-the-mysql-myisam-and-innodb-table-types</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/7vo74esxNhc/choosing-between-the-mysql-myisam-and-innodb-table-types</link>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/85</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/09/choosing-between-the-mysql-myisam-and-innodb-table-types</feedburner:origLink></item>
    <item>
      <title>First Impressions Count</title>
      <description>&lt;p&gt;Scout is making a better first impression than ever starting today. When you start monitoring a new server, you'll immediately get a high-level summary of the vital stats:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20091007-ti22yk8m3mai5anw92is1adxe2.gif" width="609" height="134"/&gt;&lt;/p&gt;

&lt;p&gt;Scout reports this for you automatically. From there, you choose the deeper metrics you need, like &lt;a href="http://scoutapp.com/tour/rails_monitoring"&gt;Ruby on Rails monitoring&lt;/a&gt;, &lt;a href="http://scoutapp.com/plugin_urls/21-mysql-slow-queries"&gt;MySQL Slow Queries&lt;/a&gt;, &lt;a href="http://scoutapp.com/plugin_urls/1-process-usage"&gt;Process memory usage&lt;/a&gt;, etc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/bucCHAMq4eg" height="1" width="1"/&gt;</description>
      <pubDate>Wed,  7 Oct 2009 15:09:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/07/first-impressions-count</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/bucCHAMq4eg/first-impressions-count</link>
      <category>Features</category>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/84</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/07/first-impressions-count</feedburner:origLink></item>
    <item>
      <title>We Just Undid Three Months of Dev work. Here's What We Learned.</title>
      <description>&lt;p&gt;We&amp;#8217;ve been deleting a lot of code from Scout. We&amp;#8217;re ripping out major infrastructure, and in doing so, pulling the plug on functionality which, just six months ago, we believed would be crucial to our business. Most importantly, we&amp;#8217;re simplifying the most complex, error-prone, and poorly-performing parts of the application. At the same time, our revenue and sales pipeline is growing at a faster rate.&lt;/p&gt;


	&lt;p&gt;How did this happen? How did we get to a place where we can remove code and functionality and &lt;strong&gt;see our business will grow&lt;/strong&gt; because of it?&lt;/p&gt;


	&lt;p&gt;As they say, &amp;#8220;mistakes were made.&amp;#8221; You don&amp;#8217;t get the satisfaction of throwing out a bunch of cruft and performance-degrading features without having gone through the pain of:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;Building those features in the first place.&lt;/li&gt;
		&lt;li&gt;Fighting the performance problems for a few months before you realize its all untenable and come up with alternatives.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;So yes, mistakes were made. But also, lessons were learned.&lt;/p&gt;
&lt;h2&gt;Lesson #1: You will underestimate the ongoing cost of complexity in your product&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3475/3839063286_4fdaa5365c.jpg" width="200" style="float:right; border:2px solid #aaa; margin:10px;"/&gt;&lt;/p&gt;


	&lt;p&gt;When you have a small team, complexity is a killer. But no-one sets out to make their product complex, right? That&amp;#8217;s the irony: we grappled with heinous complexity in the name of simplicity&amp;#8212;simplicity for the end user. It turns out that simplicity and elegance for the end user can mean some awfully complicated stuff behind the scenes to make it work.&lt;/p&gt;


	&lt;p&gt;In our case, the move from flat data to nested data was the killer.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the culprit:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20090526-cbjbhsx1t6td9b3hdk2mce933g.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;We envisioned a very versatile data store and alerting system in which a broad variety of data could be stored, analyzed and reported on. This wasn&amp;#8217;t a pipe dream or an abstract feature wish&amp;#8212;it had immediate application to the kind of &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt; application reporting we were building. We came up with a sweet way of storing the nested data and abstracting away most of complexities of dealing all kinds of data.&lt;/p&gt;


	&lt;p&gt;However, the load on our database was far more than we envisioned. The performance problems that resulted from this dominated our efforts for the coming months. We upped our hardware budget. We fought the fires, and yes, we made it work.&lt;/p&gt;


	&lt;p&gt;But, we made it work with very little headroom. We were already spending more than we wanted to on hardware, and we didn&amp;#8217;t have room to grow. The database operations on the nested data were just taking too much processing power. From a business perspective, these problems went from annoying to crippling. When the service is slow, you have to address it &lt;span class="caps"&gt;ASAP&lt;/span&gt;. That takes time and focus away from sales and business development, so it&amp;#8217;s a double hit. We ended up spending nearly all our effort during the period after launch keeping that elegant and sophisticated system running.&lt;/p&gt;


	&lt;h3&gt;The takeaway&lt;/h3&gt;


	&lt;p&gt;The ongoing cost of complexity is higher than you think. And it&amp;#8217;s easy for complexity to sneak in through the back door in the guise of its nemesis, simplicity. &lt;b&gt;Complexity is sneaky that way. Don&amp;#8217;t be fooled.&lt;/b&gt;&lt;/p&gt;


	&lt;h2&gt;Lesson #2: Cool new capabilities don&amp;#8217;t sell themselves&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://www.creationevolution.net/user/cimage/924mousetrap.jpg" style="width:200px; float: right;border:2px solid #aaa; margin:8px"/&gt;&lt;/p&gt;


	&lt;p&gt;And more to the point, you can&amp;#8217;t sell them if you have to spend all your time hand-holding an overloaded database. After a few months of our Cool New Features being live, we had certainly signed up some customers because of them. Not as many as we wanted to however. There are two reasons for this:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;b&gt;The features never reached their full potential.&lt;/b&gt; All that time on upkeep? That&amp;#8217;s time taken away from incorporating user feedback, fixing annoying little bugs, and putting in that next 20% to make it all really shine. The vision we started with got tested in only superficial ways. What was clear though, is that we couldn&amp;#8217;t get there from here without either a major increase in team size (which brings its own set of problems), or much, much more time to work out the kinks. We didn&amp;#8217;t want to do either.&lt;/li&gt;
		&lt;li&gt;&lt;b&gt;We didn&amp;#8217;t have time to properly publicize and sell the features.&lt;/b&gt; This is key. We&amp;#8217;re a lean team, and we all wear multiple hats. If we&amp;#8217;re spending more time analyzing the performance of a particular MySQL index, we&amp;#8217;re spending less time writing blog posts or forming partnership with other companies. The biggest hit we took during those months of building and stabilization was the corresponding decrease in sales and marketing.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;Why you need sales and marketing&lt;/h3&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091006-jh4et321trs17npnt2ewxmaye9.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re running a web application and the majority of your work is spent delivering the service you advertised to your customers, you&amp;#8217;re probably in bad shape. A good rule of thumb for paid web apps: &lt;a href="http://particletree.com/features/web-app-autopsy/"&gt;1 out of every 100 visitors&lt;/a&gt; will become a paying customer. With &lt;a href="http://webappsurvey2009.techcrunch.com/"&gt;almost 1/2 of all web applications attracting less than 1,000 visitors per/month&lt;/a&gt;, it&amp;#8217;s reasonable to expect just 10 paid signups per-month. You need to do more than just deliver the web app to make a living.&lt;/p&gt;


	&lt;h3&gt;The takeway&lt;/h3&gt;


	&lt;p&gt;It&amp;#8217;s a huge net-negative to build something so resource-intensive that you don&amp;#8217;t have time to sell it. You&amp;#8217;re much better off spending more time selling a less expansive product.&lt;/p&gt;


	&lt;h2&gt;That&amp;#8217;s it &amp;#8230; two lessons?&lt;/h2&gt;


	&lt;p&gt;This is part 1 of 2. &lt;a href="http://feeds.feedburner.com/scoutapp"&gt;Subscribe to our &lt;span class="caps"&gt;RSS&lt;/span&gt; feed&lt;/a&gt; or &lt;a href="http://twitter.com/scoutapp"&gt;follow us on Twitter&lt;/a&gt; for part 2.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/R_4on1oIwbA" height="1" width="1"/&gt;</description>
      <pubDate>Tue,  6 Oct 2009 13:38:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/06/we-just-undid-three-months-of-dev-work-heres-what-we-learned</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/R_4on1oIwbA/we-just-undid-three-months-of-dev-work-heres-what-we-learned</link>
      <category>Business</category>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/82</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/06/we-just-undid-three-months-of-dev-work-heres-what-we-learned</feedburner:origLink></item>
    <item>
      <title>Simplify. Get an order of magnitude speedup.</title>
      <description>&lt;p&gt;Have you noticed Scout feels snappier lately? We made some major simplifications that sped things up a lot. Here&amp;#8217;s the &lt;span class="caps"&gt;CPU&lt;/span&gt; load on one of our DB servers:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091001-d2hamkrq1d77ysrm65dtmdkhrf.gif" height="192" width="486" /&gt;&lt;/p&gt;


	&lt;p&gt;(&lt;b&gt;and yes, we use Scout to monitor itself!&lt;/b&gt;)&lt;/p&gt;


	&lt;p&gt;Even better, the response time for users improved dramatically.&lt;/p&gt;


	&lt;p&gt;Scout&amp;#8217;s longest actions before and after the speedup:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20091001-b5ytfpihu642sjdecju5kud1rg.gif" width="473" height="274" /&gt;&lt;/p&gt;


	&lt;h2&gt;The simplification&lt;/h2&gt;


	&lt;p&gt;What yielded such a dramatic speedup? Earlier this year, we implemented a &lt;b&gt;very generic datastore and reporting system.&lt;/b&gt; It could handle all sorts of data, relationships within the data, etc.&lt;/p&gt;


	&lt;p&gt;Unfortunately, we never got to demonstrate all the benefits of this cool system. It wasn&amp;#8217;t viable from either a maintenance or a performance standpoint.&lt;/p&gt;


	&lt;p&gt;So we rolled it back. And we got back a ton of performance, as you can see.&lt;/p&gt;


	&lt;h2&gt;The lessons &amp;#8230;&lt;/h2&gt;


	&lt;p&gt;I will be writing up some business lessons we learned from this experience&amp;#8212;stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/scoutapp/~4/xcZFnsGgJ5g" height="1" width="1"/&gt;</description>
      <pubDate>Thu,  1 Oct 2009 11:39:00 EDT</pubDate>
      <guid isPermaLink="false">http://blog.scoutapp.com/articles/2009/10/01/simplify-get-an-order-of-magnitude-speedup</guid>
      <link>http://feedproxy.google.com/~r/scoutapp/~3/xcZFnsGgJ5g/simplify-get-an-order-of-magnitude-speedup</link>
      <category>Updates</category>
      <trackback:ping>http://blog.scoutapp.com/articles/trackback/81</trackback:ping>
    <feedburner:origLink>http://blog.scoutapp.com/articles/2009/10/01/simplify-get-an-order-of-magnitude-speedup</feedburner:origLink></item>
  </channel>
</rss>
