<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Carsonified &#187; Back-End</title>
	<atom:link href="http://carsonified.com/blog/category/webapps/back-end/feed/" rel="self" type="application/rss+xml" />
	<link>http://carsonified.com</link>
	<description></description>
	<lastBuildDate>Fri, 12 Mar 2010 18:20:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Atlas: Under the Hood</title>
		<link>http://carsonified.com/blog/carsonified/features/atlas-under-the-hood/</link>
		<comments>http://carsonified.com/blog/carsonified/features/atlas-under-the-hood/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 21:02:52 +0000</pubDate>
		<dc:creator>Francisco Tolmasky</dc:creator>
				<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Cappuccino]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://thinkvitamin.com/?p=979</guid>
		<description><![CDATA[By <strong>Francisco Tolmasky</strong><br />At 280 North we&#8217;ve been working on a framework called Cappuccino for creating what we like to call desktop class applications. These are not your average web sites, but instead a new breed of web application that aims to replace many of the programs that currently run on your desktop. When we launched 280 Slides, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style=""><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fcarsonified%2Ffeatures%2Fatlas-under-the-hood%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fcarsonified%2Ffeatures%2Fatlas-under-the-hood%2F" height="61" width="51" /></a></div><p>At <a href="http://280north.com">280 North</a> we&#8217;ve been working on a framework called <a href="http://cappuccino.org">Cappuccino</a> for creating what we like to call desktop class applications. These are not your average web sites, but instead a new breed of web application that aims to replace many of the programs that currently run on your desktop. When we launched <a href="http://280slides.com">280 Slides</a>, the first application built on this framework, many people were surprised to see just what was possible in the browser. Since then, Cappuccino has been steadily progressing with over 40,000 downloads and code contributions from twenty-one individuals.</p>
<p>The goal of Cappuccino has always been to make it as simple as possible to build high quality applications in the browser, and up until now we&#8217;ve worked on providing built-in behavior for enabling such tasks as autosaving, undo/redo, and copy/paste.  But recently we&#8217;ve been focusing on an entirely new product: <a href="http://280atlas.com">Atlas</a>. Atlas is a new IDE and visual layout editor that leverages the power of Cappuccino, but drastically reduces the amount of work required for creating a truly rich application experience on the web.</p>
<p><strong>WYSIWYG</strong></p>
<p>With Atlas you can build and style your entire interface using drag and drop. By default we provide you with a large library of built in widgets along with the new Aristo open source theme, meaning your application will look fantastic with no additional work. However, you can also skin these applications entirely from the editor and extend the library of widgets with Atlas&#8217; plugin architecture. And unlike a lot of existing layout editor availabe today, Atlas is not a code generator. On the contrary, Atlas lets you edit the live JavaScript objects in memory and then takes a &#8220;snapshot&#8221; of them in place. When your application runs, it &#8216;thaws&#8217; these objects out, making sure that you see exactly how your application will look before you run it.</p>
<p><strong>Layout that Makes Sense</strong></p>
<p>Atlas provides a new take on web layout that make it easy to define precisely the behavior you want, while simultaneously doing away with existing browser inconsistencies.  Instead of having to learn the variety of different ways to position and resize elements in the browser, Atlas introduces the simple concept of &#8216;anchors and springs&#8217;. Anchoring an interface element to one of the edges around it ensures that it will stay &#8220;stuck&#8221; there when it&#8217;s container resizes. Activating the internal &#8217;springs&#8217; causes it to resize with its container.</p>
<p><object width="471" height="295"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3410186&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=eb6f00&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=3410186&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=eb6f00&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="471" height="295"></embed></object></p>
<p>While simple to learn, these two tools enable you to create incredibly complex and fluid layouts. More importantly, they&#8217;re guaranteed to behave the same way regardless of the browser you&#8217;re running your web app in. Atlas also provides a large selection of collection views to handle common layout tasks such as split views, table views, and scroll views.</p>
<p><strong>Connections Reduce Glue Code</strong></p>
<p>A common problem that has plagued layout editors in the past is the need for additional glue code to &#8220;talk&#8221; to the generated interface.  In Atlas, much of this work can be done with a technology called &#8216;connections&#8217;. Connections allow you to visually define the interactions between interface elements and other objects.  For example, you can define what action a slider should take when it is dragged:</p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/02/picture-1.jpg"><img class="alignnone" title="Screenshot of Atlas" src="http://thinkvitamin.com/wp-content/uploads/2009/01/280atlas.jpg" alt="" width="440" height="365" /><br />
</a></p>
<p>Similarly, you can &#8216;bind&#8217; the contents of an array to a table, so that when it changes the table automatically updates as well, all without having to ever touch the keyboard:</p>
<p><img class="alignnone" title="Atlas 02" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas2.png" alt="" width="511" height="525" /></p>
<p><strong>Model View Controller Built-In</strong></p>
<p>Cappuccino is a Model-View-Controller framework, and Atlas takes this idea to the next level by allowing you to not only create visual elements, but abstract models and controllers as well. By allowing you to interact directly with the objects in your program visually, you can focus on building unique interactions instead of learning a myriad of APIs.</p>
<p>Atlas has gone a step further and provided a number of pre-built controllers to existing web services that you can simply drop in to their applications. You can then simply use connections to grab information from services like RSS and Twitter. Once again, Atlas&#8217; plugin architecture allows you to create controllers for your own web services as well, which you can then share with others.</p>
<p><img class="alignnone" title="Atlas 03" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas3.png" alt="" width="515" height="542" /></p>
<p><strong>Multi-Platform Support</strong></p>
<p>Cappuccino was built from the ground up in preparation for a world of multiple platforms. It is becoming increasingly important for applications to run in several different environments: browsers, social networks, handheld devices, and much more. In general, very little application logic or backend code has to change from platform to platform, but the interface usually needs to be recreated from scratch.</p>
<p>With Atlas, it is drop dead simple to create a unique and custom interface for different platforms like the web browser and the iPhone. Cappuccino will then intelligently load the correct interface for your application depending on the environment it is being run on, allowing you to reduce the amount of code you need to rewrite and as well as using just one language and API for all the platforms you deploy on. We call this idea &#8216;Write once, layout everywhere&#8217;, and we feel it is the right way to gaurantee a high quality experience everywhere you ship your application.</p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png"><img class="alignnone" title="Atlas 04" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png" alt="" width="540" height="402" /></a><br />
View <a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas4.png">full size</a></p>
<p><a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png"><img class="alignnone" title="Altas 5" src="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png" alt="" width="540" height="402" /></a><br />
View <a href="http://thinkvitamin.com/wp-content/uploads/2009/01/atlas5.png">full size</a></p>
<p>Atlas will be shipping this summer and you can sign up for email updates at <a href="http://280atlas.com">280atlas.com</a>.</p>
<p>[Photo credit: <a href="http://flickr.com/photos/atelier_tee/">flickr.com/photos/atelier_tee</a>]</p>
<img src="http://carsonified.com/?ak_action=api_record_view&id=979&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://carsonified.com/blog/carsonified/features/atlas-under-the-hood/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Web Development is Moving On &#8211; Are you?</title>
		<link>http://carsonified.com/blog/web-apps/web-development-is-moving-on-are-you/</link>
		<comments>http://carsonified.com/blog/web-apps/web-development-is-moving-on-are-you/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 10:52:17 +0000</pubDate>
		<dc:creator>Christian Heilmann</dc:creator>
				<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://thinkvitamin.com/?p=793</guid>
		<description><![CDATA[By <strong>Christian Heilmann</strong><br />It is quite interesting to see how web development turned from a niche for brochure-ware and intranets to one of the biggest software development environments in the market over just a few years.
&#8220;The web as the platform&#8221; is a hollow dream no longer ‐ you can now run and develop a web application without needing [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style=""><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Fweb-development-is-moving-on-are-you%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Fweb-development-is-moving-on-are-you%2F" height="61" width="51" /></a></div><p>It is quite interesting to see how web development turned from a niche for brochure-ware and intranets to one of the biggest software development environments in the market over just a few years.</p>
<p>&#8220;The web as the platform&#8221; is a hollow dream no longer ‐ you can now run and develop a web application without needing to host anything yourself and you can even get the data from other sources. With this radical shift comes a lot of change for developers, but the question is, are you keeping up?</p>
<p>Change is good &#8211; we need to get our act together in any case. It&#8217;s 2009 and we have the chance to start this year by tackling issues that concern everybody: the general recession, inevitable lay‐offs and lack of investment in non-profit generating parts of organizations. Now&#8217;s a good time to get real, regroup, and reassess the ways in which we approach our jobs.</p>
<p>We are in a crisis &#8211; have you watched the television lately? It doesn&#8217;t make cheerful viewing. However, with every crisis comes the opportunity (and the necessity) to improve and see how we can work more efficiently, producing things that are more valuable and relevant to the people we want to reach. The hype is over ‐ it&#8217;s time to get busy, working as professionals.</p>
<h3>Back When All This Was Just Fields </h3>
<p>When I started web development every article, tutorial or introduction to a system started with &#8220;open your editor, read this documentation and start writing your app, (or web site, css trick or javascript trick)&#8221;. I loved it. I downloaded the article to a floppy disk at work, went home and in the evenings without the internet (remember you paid by the minute) wrote my first solutions and battled with the documentation. Later, the only thing that changed was that I didn&#8217;t work on it at home but on a laptop on the train instead.</p>
<p>Nowadays, things look different. First of all, for the most part it&#8217;s impossible to develop offline ‐ this is because we use hosted services, APIs and most likely you&#8217;ll write something that uses some data stored elsewhere on the web. Offline web development is becoming very rare indeed, which can be terribly frustrating if you are in a public space or hotel rooms. In other words, we build on already tested and proven concepts instead of building everything ourselves. This means we have to do much less work, but it also means that we don&#8217;t have full control. We rely on data being available to us by third parties or &#8216;the web&#8217;. This is pretty tough for developers as we tend to be control freaks.</p>
<h3>Aiming Higher and Wider</h3>
<p>The other thing that can be a hurdle for the old school developer is the fact that we tend not to build new systems any longer. Back in the day we worked on the bleeding edge: almost everything we built was the first of its kind on the web and clients came to us to build their first web presence. Users were easy to come by and people were eager to do things easier and quicker on the web. This is pretty much over.</p>
<p>Unless you have a &#8216;very&#8217; compelling product or idea clients will already have something in place that they use and will have already spent a lot of time and money on it. Maintenance is much more common than innovation. Users are much more spoilt by choice and already spend a lot of their time using other products ‐ just building something and hoping that users will come is not enough any longer.</p>
<p>Most products you&#8217;ll build these days are aimed at piggy‐backing on existing user bases and use cases, rather than creating something entirely new. The web has become much more of a commodity than it used to be and a lot of people rely on it for their day‐to-day chores and social communication. For example, the amount of people that started to get in contact with me after years of silence is staggering. The reason? Facebook and how simple it is to use.  These are the same people that asked me if my e-mail address would change when I moved to another city!</p>
<p>These social networks create huge traction, and even hardware developers jump on them  to sell their newest products. Just yesterday I saw a mobile ad at the train station telling me that  the new smart phone automatically gets updates from my friends on Facebook. Sounds a tad  creepy to me, but I&#8217;m sure it boosted that manufacturer&#8217;s smart phone sales and I am sure many a  teenager will be asking for this one for their birthday.</p>
<p>Social networks are taking over in all kind of environments. The same is happening to search engines.  </p>
<p>For example, I do see a lot of movie posters on my way to work and realized lately that the  film industry has stopped bothering with domain names for movies (I guess domain squatters blackmailing them are to blame). Instead I started to see &#8220;enter xyz in Google to learn more&#8221; and one movie even used a bebo and myspace address instead of a domain. This is quite commonplace in South East Asia already.</p>
<h3>A &#8216;New&#8217; Breed of Developers </h3>
<p>What shall we do about it? We could sit sulking in our developer corner claiming that these things will never work but the fact is that this is where people invest and the money still flows. It is also where  the users are. There is a big market in some technologically underdeveloped countries for Facebook applications and even blog systems. Using out‐of‐the‐box  solutions companies can easily cover both the development and the maintenance of the content. Can you for example guess where <a href="http://s2999.com">http://s2999.com</a> is written and maintained?  </p>
<p>The interesting fact for businesses is that these developers are pragmatic. They don&#8217;t cost much for a business to hire, they deliver the job without trying to lecture you and all they expect is a share of the outcome. Us on the other hand, leading and amazing developers that we are, are rumored to be tricky to work with, grumpy even. We don&#8217;t want to use things that other people made and are very happy indeed to tell any business person that they are wrong  and we know all about the web. Who&#8217;d you work with?</p>
<p>Sure, this is nothing new – outsourcing shops have promised cut‐price development for years and most of the time the outcome was appalling (funnily enough,  in a lot of cases not because the developers were bad but the management didn&#8217;t know what they  wanted or failed to give precise delivery specs). With the systems in place though, development  becomes much more of a &#8216;use&#8217; case than a &#8216;build&#8217; case and this is the biggest challenge we now face.</p>
<h3>Good­bye White Canvas, Hello Lego Bricks</h3>
<p>In essence, web development these days doesn&#8217;t start with a blank document but with downloading an SDK or entering your application data in some web app to get a developer key. In other words using a system that is much larger than anything you&#8217;d ever have done yourself. This concept is very hard to swallow for us battle‐hardened masters of the command line and I myself have problems getting enthusiastic about using a chunk of &#8216;hello world&#8217; code and turning it into something great.</p>
<p>If we look at it logically, however, and leave our ego to go and play in the garden for a while it&#8217;s clear that there are many valid reasons to use SDKs and hosted development environments. It&#8217;s exactly the same thing we do as clever developers ‐ build ourselves  shortcuts, hack our development tools or assemble our very own library of snippets &#8211; in order to avoid having to do the same things over and over again.</p>
<p>Using SDKs and hosted development environments shouldn&#8217;t mean your work will be dumbed down or that people won&#8217;t respect you as a developer. It means that they are helping to take the pain away and have taken away the hoops that they jumped through so that you can just build something interesting without worrying about the underlying  architecture, security of the system or its performance.</p>
<p>Abstracting these away means you can easily do fixes or improvements should the need occur ‐ and boy will it occur. It is not fun to maintain a site or a server these days. The amount of people that want to hack you and inject malicious code is staggering and their skills are impressive. The only way to battle these threats is to have one system to fix ‐ not millions  of little applications.</p>
<p>Abstraction also means that many more people can start developing applications. Geeks build geek tools, designers build designer tools, ‐ if you lower the entry barrier to developing, all groups can bring their expertise to play with the system and subsequently you can build really cool tools together. Of course, there is a lot of pointless and bad work being done too (no, I don&#8217;t want your teddy bear to travel on Facebook or catch dozens of sheep) but that&#8217;s like saying HTML is bad because people can use tables and fonts to create layouts fast instead of using CSS.</p>
<h3>So Are We Obsolete?</h3>
<p>Does this mean that the tinkerers, the people who spend hours fixing an IE6 bug or open the border of the screen to show sprites outside the dedicated area (yes, C64) are obsolete and should just move on? No, it doesn&#8217;t ‐ not by a long shot. If we cave in now and grumpily sit in the corner pointing at the kids with their fancy SDK toys we are  indeed obsolete, but there are a lot of things that this brave new world of development needs us to do.</p>
<p>It needs us to analyze the systems and see where they need improvement. For example the  amount of accessibility issues that can be fixed in social networks with very little effort is  staggering. Most of these issues are not there because people are lazy but because they  just don&#8217;t know about the consequences of their actions.</p>
<p>Why not help with turning these systems into a working network of systems. <a href="http://code.google.com/apis/opensocial/">Open Social </a>is a great idea but suffers from too many people shouting &#8216;FAIL&#8217; at it instead  of helping to fix it.</p>
<p>Why not work on bridging the gap between our two worlds. There is no sense in offering people a text box in an HTML page to develop in. I have used one of these and the resulting code is &#8216;always&#8217; terrible. The same applies to code editors in a browser doing the indenting and colour coding for us ‐ they are flaky and when they crash they take your whole app with it (and the pictures of kittens you had in another tab). There are some Firefox extensions that allow you to edit text in your editor and then enable you to pull it back into the text area with a keyboard shortcut ‐ more of those please. Show by example how your expertise can make web applications better and how communicating with you upfront makes for better APIs and SDKs.</p>
<h3>So What About the Future?</h3>
<p>If I knew that&#8230; However, what I will say is that the way some web developers deal with market forces and business people is wrong. </p>
<p>Our craft is becoming a commodity and people in charge don&#8217;t care about the quality  of the markup, CSS or how short our JavaScript is. What matters is how fast you can get it to market, how many people it reaches and how cheaply it can be built. I think that web  development has come on in leaps and bounds in the last years, not because of top‐down decisions and empowerment of the folks on the ground, but by geeks just doing the right  thing without asking for permission first. We should follow standards and build solid code to make  our own life easier ‐ not to impress other people. Then show the code and explain its merits  to people outside of the development world to improve it for everybody.</p>
<p>So, (a little late) here are some of my New Year’s resolutions for this year:</p>
<ol>
<li>Give things the benefit of the doubt before judging them. In other words, keep the &#8216;FAIL&#8217; shouting to the funny blogs where it belongs.</li>
<li>Take time to have a look at the SDKs, hosted services and frameworks out there and write about them instead of showing yet another proof of concept.</li>
<li>Try to talk to people in charge of these systems to stop them from aggravating the developer crowd with decisions that are perfectly logical to them but don&#8217;t hold up in our world.</li>
<li>Great API developers don&#8217;t necessarily know HTML and their demos might be atrocious table and font monsters. Instead of shunning the API provide examples of how to do it better. Explaining the effects that bad API design can have goes much further than judging only by our own standards. </li>
<li>Clean up the demo code of the systems, SDKs and APIs that I have direct  access to. There is nothing worse than a bad example being replicated million fold as people copy+paste instead of reading docs.</li>
<li>Write human readable documentation and don&#8217;t expect a degree in Klingon. Ask non-developers how real people use systems and what they like most about them.</li>
</ol>
<p>What do you think? Is it time to live in the now and help build a good web 2.0,3.0,4.3212 and so on or have we lost the battle for a beautiful, valid and semantically rich web already?</p>
<img src="http://carsonified.com/?ak_action=api_record_view&id=793&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://carsonified.com/blog/web-apps/web-development-is-moving-on-are-you/feed/</wfw:commentRss>
		<slash:comments>120</slash:comments>
		</item>
		<item>
		<title>Pragmatic Reporting for your Web Apps</title>
		<link>http://carsonified.com/blog/web-apps/pragmatic-reporting-for-your-web-apps/</link>
		<comments>http://carsonified.com/blog/web-apps/pragmatic-reporting-for-your-web-apps/#comments</comments>
		<pubDate>Tue, 23 Oct 2007 14:17:19 +0000</pubDate>
		<dc:creator>Daniel Hilton</dc:creator>
				<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[reporting]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/features/biz/pragmatic-reporting-for-web-apps</guid>
		<description><![CDATA[By <strong>Daniel Hilton</strong><br />Reporting is perhaps one of the biggest business deliverables for enterprise IT. Being able to say how many widgets were sold in month seven in year XX, sub-divided by customer ABC grouping, is one of the easiest ways to make management happy. But when building a web app, reporting is the last thing on many [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style=""><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Fpragmatic-reporting-for-your-web-apps%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Fpragmatic-reporting-for-your-web-apps%2F" height="61" width="51" /></a></div><p>Reporting is perhaps one of the biggest business deliverables for enterprise IT. Being able to say how many widgets were sold in month seven in year XX, sub-divided by customer ABC grouping, is one of the easiest ways to make management happy. But when building a web app, reporting is the last thing on many feature lists. Clear reporting is vitally important for the long term success of your web app and managing your growth. However, if you&#39;re still in the beta stage, we&#39;ll explore some ways of building simple reporting fast.</p>
<p>Why reporting? Because it helps you know the <a href="http://carsonified.com/misc/how-to-be-a-successful-ceo">numbers</a>. You need to be able to take data from web analytics, your own system stats (how many sign-ups per month, what&#39;s this month&#39;s revenue?, etc.) and be able to render that visually in some sensible way for you to be able to understand it and make the correct business decisions based upon it.</p>
<h4>Big business style</h4>
<p>If you&#39;re a large multi-national with large IT budgets, you&#39;re going to looking for a reporting system that can query multiple data warehouses with hundreds of users and multiple output formats. You&#39;ll also want it as near real time as possible. Packages like <a href="http://www.businessobjects.com/products/crystal/default.asp">Crystal Reports</a> and <a href="http://www.jaspersoft.com/">Jasper reports</a> provide large scale interfaces to data sources and provide nice tools to create easy to read reports. But being as we&#39;re bootstraping upstarts, we need a solution that can pull together the data we need into one place and export it how we want.</p>
<h4>Super simple (nearly) real time reporting</h4>
<p>I&#39;m not going to go into depth about database replication, load balancing your queries, redundancy or the technological challenges you face in getting your web app&#39;s data out. I am going to assume that you have a database of some sort, a web analytics package and clear objectives for what you want to measure. The most important of those is the objectives. What is it that illustrates growth and successes of your web app? This question in itself could fill thousands of articles, but for the sake of getting to some useful examples we&#39;ll look at the following:</p>
<ol>
<li>Number of unique visits to your site: last 24 hours, last month, ever</li>
<li>Number of new subscribers to your rss feed: last 24 hours, last month, ever</li>
<li>Number of sign ups: last 24 hours, last month, ever</li>
<li>Number of adds of your f8/widget: last 24 hours, last month, ever</li>
<li>How much downtime: last 24 hours, last month, ever</li>
<li>How much revenue have you generated: last 24 hours, last month, year to date</li>
</ol>
<p>If we look at the list above as our starting six key performance indicators, lets look at some ways of getting the information into a format we can use. For the web analytics based targets (1,2) we can within most analytical packages, create custom reports and get them emailed to us in a variety of formats. We&#39;re going to use XML and reformat it for our needs quickly in PHP5. Having setup our goals and metrics in Google analytics, for example, we can then set them to be emailed every morning. We then have the attachment written to a log folder. Whenever we refresh our reporting dashboard we check for the latest file in the folder and process it, then store the processed data as a small HTML fragment which we include into our dashboard. This limits the amount of processing we have to do to a minimum and keeps our dashboard quick to refresh for the more real-time metrics.</p>
<p>For number 3 (number of sign ups) we&#39;ll make a query of our users table, requesting the number of users created in the last 24 hours, last month, ever. As you start to get bigger, these queries will start to become very long, taking valuable time away from your production database. You can attack this problem either by using aggregates or by moving all your data to a non-production environment purely for reporting. There is a danger in this in terms of replication lag and out of date data, but facing tables locks and the problems they cause traditional LAMP based web applications, it perhaps is a risk worth managing.</p>
<p>For number 4 (widget adds) we can do a variety of things. If we&#39;re looking at new Facebook subscribers then we can use the CSV download from <a href="http://adonomics.com/">Adonomics</a> (formerly Appaholic). For example, the Gaping Void app, is accessibile via the url: <a href="http://adonomics.com/csv.php?mode=daily&#038;display=4703559265">http://adonomics.com/csv.php?mode=daily&#038;display=4703559265</a> We can thus make a CURL or wget call to get this data every morning:</p>
<p>
<pre>
   wget <a href="http://adonomics.com/csv.php?mode=daily&#038;display=4703559265">http://adonomics.com/csv.php?mode=daily&#038;display=4703559265</a>
 </pre>
</p>
<p>If we&#39;re looking at a widget, say embedded into MySpace or a blog, then we could set-up a download goal in an analytics package and measure it just like we did the unique visitors or you could get a feed from a log analyzer crunching the server logs for requests for a key component of your widget.</p>
<p>For number 5 (downtime), we need to define what downtime is in regards to your web app. Is it not only when the server is down but also when the database is locked or when traffic causes it to go slow? Or when disk space runs out or the load is massive? However, we don&#39;t need that granularity. For our purposes we just care if it&#39;s been usable and if not how long it wasn&#39;t usable for.</p>
<p>The best way of doing the more in-depth testing is to monitor the system externally via a package such as Mon, Ganglia and Nagios, all of which are beyond the scope of this article. We shall assume that you care when your service or application can not be reached. Thus we need to use Synthetic monitoring, a form of monitoring that checks a particular web app action every minute or so.</p>
<p>For example, you could set-up a check-out every minute to check that your basket works. Or perform a site search for a particular phrase and check the response contains a link to a certain page. If we a large corporation, we&#39;d go and buy something like <a href="http://www.mercury.com/us/products/business-availability-center/sitescope/">Sitescope from HP</a>   However yet again we&#39;re bootstrapping a we need a super simple solution. We can again use CURL to simulate an action, check the response for what we expect and then log the data for further analysis. If you were looking to run this in production you&#39;d have to look at using a server in a different location to do the polling, perhaps just a cheap VPS with a cron job that runs every minute. It&#39;s left as an exercise to the reader to think of what actions are triggered by a downtime event. (SMS Alert? email? Jabber?)</p>
<p>
<pre>
$test1 =  curl_init("<a href="http://www.ourapp.com/action1?search=bob">http://www.ourapp.com/action1<wbr>?search=bob</a>&#8220;);
	try {
	    $buffer = curl_exec($test1);
		curl_close($test1);
		if (strpos($buffer, &#8220;Bob Jones&#8221;) === false) {
			throwAlert(&#8221;App Down, Server Up&#8221;);
		} else {
			// Let&#39;s log a good search - so we can track the timeline of when things go bad.
			// We could also log how long the action took to complete - an interesting
			// metric to compare against system resources over time.
			logGoodSearch(now());
		}
	catch (Exception $e) {
		   // Having caught the error do something useful with it, including both logging and alerting
		}
</pre>
</p>
<p>For number six we need to do a query in your database. If you work with a Payment Services Provider, such as <a href="http://www.metacharge.com">Metacharge</a> or <a href="http://www.secpay.com">SECPay</a> you&#39;ll probably interface via an API or payment page where you post in the amount and other details about a transaction. You should log the transactions in a database somewhere, taking note of the time, amount and other related metadata. You can&#39;t however store any of the card details unless you are <a href="https://www.pcisecuritystandards.org/tech/">PCI-DSS</a> compliant as enforced by your merchant account provider. If we assume you use a table called transactionsSuccessful we can query it thus:</p>
<p>
<pre>
	SELECT SUM(value) FROM transactionsSuccessful;
	# Total revenue ever from online transactions

	SELECT SUM(value) FROM transactionsSuccessful WHERE time > NOW() - 86400;
	# Total revenue in the last 24 hours

	SELECT SUM(value) FROM transactionsSuccessful WHERE time > NOW() - 2419200;
	# Total revenue in the last month
</pre>
</p>
<p>We can do that query in real-time (dependent on database size and whether you&#39;re sharding, etc.) which means we can add that to your web app reporting screen.</p>
<h3>Displaying your data</h3>
<p>When displaying statistical data, there is a belief that more &ldquo;data porn&rdquo; is better. While that may give you a false sense of knowing the real picture, what we really need to be able to understand is what actions need to taken based upon the data. Is our disk space creeping up slowly or suddenly filling up? Do we need more disks? Are people who come from blogs to our site more likely to sign-up versus general traffic? If they are, what are you going to do about it? The brilliant O&#39;reilly book, <em>Information Dashboard Design</em> goes through the many pitfalls of designing dashboards for management information systems. Visual metaphors such as speed dials don&#39;t help explain or enrich your data. They just decrease the signal to noise ratio. Edward Tuft&#39;s work on design is worth studying in this field, if only for his examples of how to display information with the lowest amount of visual noise.</p>
<h3>Conclusions</h3>
<p>In this brief article we&#39;ve looked at some examples of how to produce reporting, how to provide it in a useful form and how to look at the data over time. This is a huge field &#8211; one in its infancy. However, I hope that I have at least got you thinking about how you produce internal metrics and how you can use that business data to make better business decisions to help build and grow your web app.</p>
<p><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
<img src="http://carsonified.com/?ak_action=api_record_view&id=1763&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://carsonified.com/blog/web-apps/pragmatic-reporting-for-your-web-apps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building Scalable Web Apps</title>
		<link>http://carsonified.com/blog/web-apps/feature-building-scalable-web-apps/</link>
		<comments>http://carsonified.com/blog/web-apps/feature-building-scalable-web-apps/#comments</comments>
		<pubDate>Sun, 06 Aug 2006 06:01:30 +0000</pubDate>
		<dc:creator>Cal Henderson</dc:creator>
				<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[scalable]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/single/?p=68</guid>
		<description><![CDATA[By <strong>Cal Henderson</strong><br />Before we even get near a terminal, we&#8217;re going to want to think about the general architecture of our application and do a fair bit of planning. So put away your PowerBook, find a big whiteboard and some markers, order some pizza, and get your engineers together.
In this article, we&#8217;ll look at some general software [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style=""><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Ffeature-building-scalable-web-apps%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Ffeature-building-scalable-web-apps%2F" height="61" width="51" /></a></div><p>Before we even get near a terminal, we&#8217;re going to want to think about the general architecture of our application and do a fair bit of planning. So put away your PowerBook, find a big whiteboard and some markers, order some pizza, and get your engineers together.</p>
<p>In this article, we&#8217;ll look at some general software design principles for web applications and how they apply to real world problems. We&#8217;ll also take a look at the design, planning, and management of hardware platforms for web applications and the role they play in the design and development of software. By the end of this article, we should be ready to start getting our environment together and writing some code. But before we get ahead of ourselves, let me tell you a story. . . .</p>
<h3>Layered Software Architecture</h3>
<p>A good web application should look like a trifle&#8230;<br />
<img src="http://www.thinkvitamin.com/images/articles/features/cal/trifle.jpg" alt="Pic of a trifle"/></p>
<p><em>A well-layered trifle (photo by <a href="http://flickr.com/photos/kukeit/8295137">minky sue</a>)</em></p>
<p>Bear with me here, because it gets worse before it gets better. It&#8217;s important to note that I mean English trifle and not Canadian &#8211; there is only one layer of each kind. This will become clear shortly. If you have no idea what trifle is, then this will still make sense &#8211; just remember it&#8217;s a dessert with layers.</p>
<p>At the bottom of our trifle, we have the solid layer of sponge. Everything else sits on top of the sponge. It wouldn&#8217;t be trifle without it. The sponge supports everything above it and forms the real inner core of the dessert. The sponge is big, solid, and reliable. Everything above it is transient and whimsical.</p>
<p>In web applications, persistent storage is the sponge. The storage might be manifested as files on disk or records in a database, but it represents our most important asset &#8211; data. Before we can access, manipulate, or display our data, it has to have a place to reside. The data we store underpins the rest of the application.</p>
<p>Sitting on top of the sponge is the all-important layer of jelly (Jell-O, to our North American readers). While every trifle has the same layer of sponge &#8211; an important foundation but essentially the same thing everywhere &#8211; the personality of the trifle is defined by the jelly. Users/diners only interact/eat the sponge with the jelly. The jelly is the main distinguishing feature of our trifle&#8217;s uniqueness and our sole access to the supporting sponge below. Together with the sponge, the jelly defines all that the trifle really is. Anything we add on top is about interaction and appearance.</p>
<h3>Adding the Business Logic</h3>
<p>In a web application, the jelly is represented by our business logic. The business logic defines what&#8217;s different and unique about our application. The way we access and manipulate data defines the behavior of our system and the rules that govern it. The only way we access our data is through our business logic. If we added nothing but a persistent store and some business logic, we would still have the functioning soul of an application &#8211; it&#8217;s just that nobody would want to eat/use it. In days of old, business logic was written in C or COBOL (seriously). These days, only the big (where performance <em>really</em> matters) and the entrenched (where it&#8217;s too painful to change) do it that way. It&#8217;s perfectly acceptable to write business logic in your scripting language of choice (PHP, Perl, Python, Ruby, etc.) or the corporate-friendly alternative of Java.</p>
<p>So we have our supporting sponge and our personality jelly (perhaps with lumps of fruit, which have no sensible analogous component, but are useful ingredients in a trifle, nonetheless). We might have a dessert and we can certainly see the shape it&#8217;s taking, but it&#8217;s not yet a trifle. What we need now is custard. Custard covers the jelly and acts as the diners&#8217; interface to the layers beyond. The custard doesn&#8217;t underpin the system; in fact, it can be swapped out when needed. True story &#8211; I once burnt custard horribly (burnt milk is really disgusting) but didn&#8217;t realize how vile it was until I&#8217;d poured it over the jelly. Big mistake. But I was able to scrape if off and remake it, and the trifle was a success. It&#8217;s essentially swappable.</p>
<page and Interaction Logic>
<p>In our web application, the custard represents our page and interaction logic. The jelly of the business logic determines how data is accessed, manipulated, and stored, but doesn&#8217;t dictate which bits of data are displayed together, or the process for modifying that data. The page logic performs this duty, telling us what hoops our users will jump through to get stuff done. Our page and interaction logic is swappable, without changing what our application really does. If you build a set of APIs on top of our business logic layer, then it&#8217;s perfectly possible to have more than one layer of interaction logic on top of your business logic. The trifle analogy starts to fall down here (which was inevitable at some point), but imagine a trifle with a huge layer of sponge and jelly, on which several different areas have additional layers; the bottom layers can support multiple interactions on top of the immutable bottom foundation.</p>
<p>The keen observer and/or chef will notice that we don&#8217;t yet have a full dessert. There&#8217;s at least one more layer to go, and two in our analogy. On top of the custard comes the cream. You can&#8217;t really have custard without cream; the two just belong together on a trifle. A trifle with just custard would be inaccessible to the casual diner. While the hardened chef/developer would recognize a trifle without cream, it just looks like a mess to the diner/user. We need some way to convey the message of the lower layers to our diners/users.</p>
<p>In our web application, the part of the cream is played by markup on the web, GUI toolkits on the desktop, and XML in our APIs. The markup layer provides a way for people to access the lower layers and gives people the impression of what lies beneath. While it&#8217;s true that the cream is not a trifle by itself, or even a very important structural part of a trifle as a whole, it serves a very important purpose: conveying the concept of the trifle to the casual observer. And so our markup is the same &#8211; the way we confer the data and the interaction concepts to the user. As a slight detour from our trifle, the browser or other user agent is then represented by the mouth and taste buds of our users &#8211; a device at the other end of the equation to turn our layers into meaning for the diner/user.</p>
<h3>The Finishing Touches</h3>
<p>There&#8217;s once thing left to make our trifle complete, other than the crockery (marketing) and diners (users). It would already work as is, containing all the needed parts. A developer might be happy enough to stop here, but the casual user cares more about presentation than perhaps he should. So on the top of our layered masterpiece goes garnish in the form of fruit, sprinkles, or whatever else takes your fancy. The one role this garnish performs, important as it is, is to make the lower layers look nice. Looking nice helps people understand the trifle and makes them more likely to want to eat some (assuming the garnish is well presented &#8211; it can also have the opposite effect).</p>
<p>Atop the masterpiece of code and engineering comes our metaphorical garnish &#8211; presentation. When talking about web pages, presentation is the domain of some parts of the markup, the CSS, and the graphics (and sometimes the scripty widgets, when they don&#8217;t fall into the realm of markup). For API-based applications, this usually falls into the same realm, and for email, it doesn&#8217;t necessarily exist (unless you&#8217;re sending HTML email, in which case it resembles regular web pages).</p>
<p>So the point of all this? A good web application has many layers, each of which provides a discrete function. All of the layers together make up the application, but randomly combining them will get you a badly built application or a bowl of sugary foodstuffs. From the perspective of the developer/chef, the most important layers are at the bottom because they support and provide the basis for the ones above. From the perspective of the diner/user, the higher layers are the important part that set the dessert apart, with the lower layers being taken for granted, particularly the ones at the very bottom of the stack. And so it should be with web applications. </p>
<h3>The Book</h3>
<p>This article is an excerpt from <a href="http://safari.oreilly.com/0596102356">Building Scalable Web Sites</a> by Cal Henderson, published by O&#8217;Reilly. In the book, Cal talks about how best to tackle each of the stages of development mentioned above, and includes practical advice on the design of software architecture, how to keep your app data clean and secure, planning your hardware needs, scaling development and working with APIs.
</p>
<p class="diggit"><img src="http://www.digg.com/img/digg-guy-small.gif" alt="digg.com logo" /> Like this article? <a href="http://digg.com/software/Building_scalable_web_apps">Digg it</a>!</p>
<img src="http://carsonified.com/?ak_action=api_record_view&id=1703&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://carsonified.com/blog/web-apps/feature-building-scalable-web-apps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Measure the Success of your Web App</title>
		<link>http://carsonified.com/blog/web-apps/feature-how-to-measure-the-success-of-your-web-app/</link>
		<comments>http://carsonified.com/blog/web-apps/feature-how-to-measure-the-success-of-your-web-app/#comments</comments>
		<pubDate>Wed, 02 Aug 2006 12:22:15 +0000</pubDate>
		<dc:creator>Michael McDerment</dc:creator>
				<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Back-End]]></category>
		<category><![CDATA[Features]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.thinkvitamin.com/single/?p=69</guid>
		<description><![CDATA[By <strong>Michael McDerment</strong><br />So you are building a web application&#8230; good for you! How are you doing? &#8220;Lots of people have signed up so we&#8217;re doing really well&#8221;, that sounds nice in a &#8220;you probably have no clue&#8221; kind of way. Allow me to explain.
Part of the benefit of doing business online is you can track EVERYTHING. Web [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style=""><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Ffeature-how-to-measure-the-success-of-your-web-app%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fweb-apps%2Ffeature-how-to-measure-the-success-of-your-web-app%2F" height="61" width="51" /></a></div><p>So you are building a web application&#8230; good for you! How are you doing? &#8220;Lots of people have signed up so we&#8217;re doing really well&#8221;, that sounds nice in a &#8220;you probably have no clue&#8221; kind of way. Allow me to explain.</p>
<p>Part of the benefit of doing business online is you can track EVERYTHING. Web services are the pinnacle of such businesses in my eyes because they are eminently trackable. But the questions you will be asking are: what to track, and where to start, and why even bother. In this article I&#8217;ll show you how to approach these questions, so you can find out (or at least have a much better idea) how your web application really is doing.</p>
<h3>Why Track Anything?</h3>
<p>The Eisenberg Brothers at <a href="http://www.futurenowinc.com" target="_blank">Future Now Inc.</a> have put together a great body of work preaching the message, not for eyeballs and traffic, but rather for conversions. To explain why conversions are so important to your business, the Eisenbergs introduced the concept of the leaky bucket. Very simply stated, if you have a leaky bucket, to keep it full you can keep adding water, or you can patch the hole. If the bucket represents your website, and water represents your sales, you can keep adding traffic to keep your sales numbers high, or you can patch up the holes in your website and increase the number of sales with your existing traffic. Constantly adding more traffic is not sustainable for many small businesses (especially start-ups with a $0 marketing budget), so the only option is to patch up the bucket.</p>
<h3>The Conversion Funnel</h3>
<p>A good way to start tracking all the different types of conversion for your business is to put them together in a funnel diagram like this:</p>
<p align="center"><img src="http://www.freshbooks.com/images/vit-simple.gif" alt="Simple Funnel" width="400" height="173" /></p>
<p>This is a classic sales funnel for a web application. At each stage of the funnel, you can expect to lose a percentage of your visitors. So, let&#8217;s say 10 per cent of the people who visit your website trial your product, and let&#8217;s assume 10 per cent of those people decide to pay for your service. Therefore you are in fact losing 90 per cent of your visitors at each step of the process. This is actually not a bad conversion rate for many services and in this scenario your sales funnel would look like this:</p>
<p align="center"><img src="http://www.freshbooks.com/images/vit-conv.gif" alt="Simple Conversion Funnel" width="400" height="173" /></p>
<p>To sum up, if you lose people at every stage &#8211; and again, it is a fairly common scenario for you to lose 90 per cent at each stage with a web service &#8211; then your bucket is leaking.</p>
<h3>A More Sophisticated Web Service Funnel</h3>
<p>If your bucket is leaking, then you need to identify the largest leaks and plug them fast. Breaking up your funnel into smaller pieces can help. Here is a more precise funnel, useful for services such as <a href="http://www.freshbooks.com" target="_blank">FreshBooks</a>, <a href="http://www.basecamphq.com" target="_blank">Basecamp</a> or <a href="http://www.dropsend.com" target="_blank">DropSend</a>:</p>
<p align="center"><img src="http://www.freshbooks.com/images/vit-soph.gif" alt="More Sophisticated Conversion Funnel" width="400" height="293" /></p>
<p>Whoa&#8230; how did things get so complicated? They actually aren&#8217;t. Comb over that list and you will see these are merely the general steps a user must go through before they pay you for your web service. Once you see this funnel laid out on the page, identifying your weak spots becomes easier.</p>
<h3>How to Track Your Progress</h3>
<p>Let&#8217;s assume you commit to tracking and defining each of the six number of steps I laid out above. Here&#8217;s how we do it with FreshBooks:</p>
<table cellpadding="5" cellspacing="4">
<thead>
<tr>
<th>Metric</th>
<th>Description</th>
<th>How to Track (Tool)</th>
<th>Units</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td>Visitors</td>
<td>First time unique visitors to your website</td>
<td>Remotely hosted web site analytics service</td>
<td>First time unique visitors</td>
</tr>
<tr valign="top">
<td>Trials</td>
<td>People who sign up to trial your service</td>
<td>Remotely hosted web site analytics service <strong>AND</strong> in-house database</td>
<td>Signups</td>
</tr>
<tr valign="top">
<td>Logins</td>
<td>People complete all your registration steps and actually login to their account</td>
<td>In-house database</td>
<td>Auto increment a &#8220;number of logins&#8221; field each time they login. &#8220;0&#8243; for did not login.</td>
</tr>
<tr valign="top">
<td>Active Users</td>
<td>People who have used the service recently (ie. in the last 2 months) and have logged in a given number of times (ie. logged in at least 10 times)</td>
<td>In-house database</td>
<td>&#8220;Number of logins&#8221; greater than some number you choose (for example, &#8220;greater than 10 logins&#8221;).</td>
</tr>
<tr valign="top">
<td>Paying Users</td>
<td>People who pay for you your service</td>
<td>In-house database</td>
<td>Number of users/systems/accounts who pay you for your service.</td>
</tr>
<tr valign="top">
<td>Staying Users</td>
<td>People who continue to pay for your service for more that 12 consecutive months</td>
<td>In-house database</td>
<td>Number of users who have been paying you for more than 12 months.</td>
</tr>
</tbody>
</table>
<p>To track step #1 (visitors), go get yourself a good, remotely hosted JavaScript (not server log) analytics solution. <a href="http://www.google.com/analytics/" target="_blank">Google Analytics</a> is a free example. We recommend <a href="http://www.indextools.com/" target="_blank">IndexTools</a>. If you can afford enterprise software (or just like data and have the money) you might want to try <a href="http://www.omniture.com" target="_blank">Omniture</a>. Again, I would avoid server log parsing solutions like <a href="http://awstats.sourceforge.net/" target="_blank">AWStats</a>, <a href="http://www.webalizer.com/" target="_blank">Webalizer</a> and Urchin 5 because they are not as accurate as you need them to be.</p>
<p>You may have noticed in the chart above that we don&#8217;t use our stats to track anything but the first two steps in our conversion funnel: visitors and trials. That is true. I like the accuracy of database tracking &#8211; especially when your numbers are low (ie. you are just getting started) and inaccuracies can really throw you off. Tracking does create programming and database overhead, but since you are storing very little information it does not put much strain on your database, and you can always turn the tracking off at some point down the road. Also, and I would say this is much more important, analytics do not give you good active user counts. What does give you good active user counts is tracking the number of times a user logs in.</p>
<p>Stats are also AWFUL at tracking paying user upgrades for a web service, because the transaction is not immediate &#8211; it can take weeks and/or months &#8211; and sometimes one user will upgrade multiple times. For these reasons I highly advocate tracking these metrics yourself using your database. You will likely want to build some custom reports for yourself as well. Allocating developing resources for internal projects like this is part of a growing application development trend known as <a href="http://web2.wsj2.com/news_from_the_field_web_20_best_practices.htm" target="_blank">shadow application development</a>. It&#8217;s an investment in yourself and it will pay off.</p>
<h3>How to Decide What to Fix First </h3>
<p>So let&#8217;s assume you take my advice and you build and track the conversion steps. And let&#8217;s assume your bucket is leaking (if it isn&#8217;t, email me with the subject &#8220;EAT MY SHORTS&#8221;). The question is, &#8220;what do I fix first?&#8221; The answer? Start as high up the funnel as possible.</p>
<p>Most people need to start with visitors to trials. If 5-10 per cent of first time visitors do not trial your service, you have some work to do &#8211; fast. If you need more specific guidance, I recommend adding another step to your conversion funnel. For example, if you can&#8217;t figure out where you are losing people before they sign up to trial your service, add another step in your stats called &#8220;view sign up&#8221;. If 30 per cent of your visitors are viewing your sign-up page, but only 2 per cent are actually signing up, you&#8217;ll want to redesign your sign-up page.</p>
<p>Here is a chart with some hints as to where to invest your time in an effort to improve each stage of your conversion funnel:</p>
<table cellpadding="5" cellspacing="1" border="1">
<thead>
<tr>
<th>Metric</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td>Visitors</td>
<td>Referral program, spend on marketing (Google AdWords), get links from friends etc.</td>
</tr>
<tr valign="top">
<td>Trials</td>
<td>Closely monitor your web stats. See what pages people commonly exit your site from and figure out why, then change that page. Track to see if people are making it to your &#8220;trial/sign up&#8221; page&#8230; if they are not, make sure you are clearly directing people to this page in appropriate places throughout your site.</td>
</tr>
<tr valign="top">
<td>Logins</td>
<td>Spend time making your forms friendly, and anywhere you can, reduce steps between your public-facing website and your account login. Reduce barriers. Handle form errors in a friendly manner. This step is easy to track, and done well, will turn your users into friends.</td>
</tr>
<tr valign="top">
<td>Active Users</td>
<td>Make your application simple to use and useful. Spend time watching people use your application. Do the &#8220;Mom Test&#8221; and get your Mom in there if you can.</td>
</tr>
<tr valign="top">
<td>Paying Users</td>
<td>Active users become paying users if you add enough value and get your pricing right. Pricing is tough &#8211; don&#8217;t be afraid to change your pricing down the road once you have more data about how your users work.</td>
</tr>
<tr valign="top">
<td>Staying Users</td>
<td>Deliver a great service with excellent support EVERY DAY.</td>
</tr>
</tbody>
</table>
<h3>How Much Data Do You Need to Have a Decent Sample?</h3>
<p>Ideally, you want 100 or more records so you have a decent sample in any stage of your conversion funnel. But think about that for a second, if you need 100 paying subscribers, and you convert one per cent of all site visitors to paying users, then you need to generate 1,000 trials, and drive 10,000 visitors to your website. That can take months when you are just getting started. This is why it is so important to start focusing on the top of that funnel first (ie. visitors to trials, the trials to successful registration form completion). These metrics are the fastest to track, and if you get them set right, you will get more people into your application who will then give you feedback so you can work on your other metrics. It&#8217;s a virtuous circle.</p>
<h3>Conclusion</h3>
<p>You can&#8217;t improve what you can&#8217;t measure, so start measuring your conversion funnel ASAP. It&#8217;s pretty remarkable when you see the results, and if you take the time to do it, you will know how you are doing in no uncertain terms.</p>
<p><em><strong>Shout out to those of you who run web services:</strong> I&#8217;d love to know how your conversion funnel is doing so that I can aggregate some data and share it with entrepreneurs who are trying to get started. <a href="http://www.freshbooks.com/contact-vitamin.php">Shoot me an email</a> if you would like to participate. Thanks.</em></p>
<p class="diggit"><img src="http://www.digg.com/img/digg-guy-small.gif" alt="digg.com logo" /> Like this article? <a href="http://digg.com/software/How_to_measure_the_success_of_your_web_app">Digg it</a>!</p>
<img src="http://carsonified.com/?ak_action=api_record_view&id=1702&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://carsonified.com/blog/web-apps/feature-how-to-measure-the-success-of-your-web-app/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
