<?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>Mixpanel - Real-time Web Analytics</title>
	<atom:link href="http://blog.mixpanel.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mixpanel.com</link>
	<description>Get data driven</description>
	<lastBuildDate>Wed, 25 Apr 2012 23:58:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Making your Ad Network Accountable</title>
		<link>http://blog.mixpanel.com/2012/04/25/making-your-ad-network-accountable/</link>
		<comments>http://blog.mixpanel.com/2012/04/25/making-your-ad-network-accountable/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 23:58:36 +0000</pubDate>
		<dc:creator>geddes</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=603</guid>
		<description><![CDATA[How to Evaluate your Mobile User Acquisition Spend Last week an experienced digital marketer visited our offices to learn about Mixpanel. His background was in web analytics, but he had recently been hired by a growing mobile company to professionalize their digital marketing. When he arrived at his new company, he was shocked to learn [...]]]></description>
			<content:encoded><![CDATA[<p><strong>How to Evaluate your Mobile User Acquisition Spend</strong></p>
<p>Last week an experienced digital marketer visited our offices to learn about Mixpanel. His background was in web analytics, but he had recently been hired by a growing mobile company to professionalize their digital marketing. </p>
<p>When he arrived at his new company, he was shocked to learn they were paying thousands of dollars for users via a number of ad networks (iAd/MoPub/Admob/Tapjoy, etc) but didn’t have numbers showing how engaged the users acquired this way were. He had no way to know if a user acquired from one campaign brought in more revenue than one acquired a different way. </p>
<p>Source attribution on the web is relatively easy. If I want to bring users via AdWords to my site, I’ll make the landing page link from the ad something like this:</p>
<p><code>http://www.mysite.com/landingpage?utm_source=AdWords&#038;utm_medium=PPC&#038;utm_campaign=NameOfMyCampaign<br />
</code><br />
Once I’ve done that, in Mixpanel the utm_source, utm_campaign, and utm_medium all become super properties I can use for segmentation. This is vital to determining how effective each campaign, medium, or source was in terms of conversions to actual users or revenue generated and retention.  Without this information you cannot make an informed decision about how to allocate your marketing resources.  This has become a standard practice for web-based marketing.  </p>
<p>However, as I told the marketer I was speaking with, for mobile apps, tying a user’s behavior within the app with their acquisition source data is more complicated. This means very few mobile app marketers actually do it. However, it is possible! If you go through the trouble of linking up your ad network with Mixpanel you can hold your ad network accountable for the quality of the users they send you. </p>
<p><strong>Android<br />
</strong><br />
Acquisition source attribution is much easier in the Android Marketplace than in the iOS App store. This is because if you provide a link to your application that looks like this:</p>
<p><code>http://market.android.com/details?id=your.package.name&#038;referrer=<strong>your_referrer_parameter</strong><br />
</code><br />
Android will make the <strong>your_referrer_parameter</strong> available to your app when it first launches., This parameter needs to be a series of specific key / value pairs and be URL encoded. The keys you can use are utm_source, utm_medium, utm_term, utm_content and utm_name. utm_source, utm_medium and utm_name are required. You can use these values to categorize the campaign in different ways.  A completed Android Market URL would look something like this:</p>
<p><code>http://market.android.com/details ?id=your.package.name&#038;referrer=utm_source%3Dtapjoy%26utm_medium%3Dbanner%26utm_campaign%3Dbrainy%2520images<br />
</code></p>
<p>To access the referrer information, create a Broadcast Receiver in your app registered to the <code>com.android.vending.INSTALL_REFERRER</code> intent filter. A good code example for doing this is available <a href="http://stackoverflow.com/questions/3817030/get-android-google-analytics-referrer-tag/3945100#3945100">here</a>.</p>
<p>Once you have access to your referrer parameter, you can register it as a Mixpanel super property, so all future events will be associated with it. </p>
<p><strong>iOS<br />
</strong><br />
Acquisition source attribution is much more difficult on iOS. Apple does not provide any capability to pass a referrer string through to your app from a link to the app store. The result is that when someone installs an app for the first time, you are blind as to where they came from. </p>
<p>To solve this problem, traditionally the ad networks would record the UDID (a unique identifier assigned by apple to every iDevice) of anyone who tapped on one of their ads.  They also provide you with a code snippet that you add to your application. This code snippet will ping the ad network’s server when your app first opens with the UDID of the device that opened the app. The ad network will take credit for all UDIDs that both tapped on their ad, and launched your app for the first time. </p>
<p><a href="http://www.mobyaffiliates.com/blog/the-end-of-udids-what-it-means-for-mobile-advertising">Much</a> <a href="http://www.mobile-ent.biz/news/read/udid-ban-could-reduce-developer-ad-revenues-by-24-per-cent/017841">has</a> <a href="http://www.mobile-ent.biz/news/read/udid-ban-could-reduce-developer-ad-revenues-by-24-per-cent/017841">been</a> <a href="http://techcrunch.com/2012/03/24/apple-udids/">written</a> about Apple’s recent rejection of some apps that access UDIDs, causing a minor panic. Though it is important not to panic (apps that disclose they collect the UDID are not being rejected) it is clear that the industry is moving away from UDID to an array of alternatives. In general these alternatives are drop-in replacements for UDID, and don’t change this general paradigm.</p>
<p>Whether an ad network is using UDID or some other identifying string, the app itself does not know when it first launches that it was discovered through a certain acquisition source. This means you can’t just register a super property the way you would in Android to perform easy segmentation of user behavior in Mixpanel.  Instead, you have to add the data to Mixpanel after the fact. </p>
<p>Most ad providers will provide you with a flat file that indicates which UDIDs (or other identifier) installed after tapping their ad. This is usually generated daily, and is accessible in an automated way via FTP or S3. To get this data into Mixpanel, write a script that processes this data file and uses our HTTP API to insert a back dated event for each user called “Annotated Signup.” At a minimum this event needs to have the following properties:</p>
<ul>
<li>The <strong>distinct_id</strong> of the user</li>
<li>The <strong>time</strong> the user’s account was created</li>
<li>The <strong>acquisition source</strong> of the user</li>
</ul>
<p>The <strong>distinct_id</strong> is the identifier you are using to identify users within Mixpanel. Depending on your implementation this could be your own internal ID or the identifier Mixpanel uses (a one way hash of the MAC address). </p>
<p>The <strong>time</strong> should be a UTC unixtime stamp representing when the account was created. This is most likely recorded in your database.</p>
<p>The <strong>acquisition source</strong> is the name of the ad network or the campaign the user came from. This will be determined by which file you got the identifier from.</p>
<p>The trickiest part of this is mapping the identifier you get from your ad network to the distinct_id used within Mixpanel. You need to understand exactly which identifier system your ad network is using, and add logic to your application to send that identifier to your server, so you can store it in your database and associate it with each of your users. You can then use your database to lookup each identifier you get from the ad network, translate it to the distinct_id you are using for Mixpanel, and then send the event to Mixpanel.</p>
<p>This “Annotated Signup” event can be used as the first step for your funnel reports and retention reports, allowing you to understand how users from different sources convert to different actions and retain in your application.</p>
<p>Below are two examples of reports in Mixpanel you can create after sending an “Annotated Signup” event. Reports like these let you determine not only how many users you are buying, but how valuable the users you bought are actually are.</p>
<p><a href="http://blog.mixpanel.com/wp-content/uploads/2012/04/funnel.png"><img src="http://blog.mixpanel.com/wp-content/uploads/2012/04/funnel.png" alt="" title="Funnel Showing Mobile Acquisition Source" width="452" height="534" class="alignnone size-full wp-image-606" /></a><br />
This funnel uses “Annotated Signup” to determine what percentage of users from different acquisition sources eventually complete level 5 of this game, a key metric of engagement for this publisher. </p>
<p><a href="http://blog.mixpanel.com/wp-content/uploads/2012/04/retention.png"><img src="http://blog.mixpanel.com/wp-content/uploads/2012/04/retention.png" alt="" title="Retention Showing Mobile Acquisition Source" width="428" height="327" class="alignnone size-full wp-image-607" /></a><br />
This report looks at what percentage of users acquired via TapJoy return and continue to use the app 7 days later. You apply different filters for each of your acquisition sources to see which ones are retaining the best. </p>
<p>Once you’ve put the basic infrastructure in place, you can start being more granular. Different campaigns with different messages, creative and placements can be assigned different values for your acquisition source property, so you can optimize your spend to where it is most effective. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/04/25/making-your-ad-network-accountable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>API Downtime on April 16, 2012</title>
		<link>http://blog.mixpanel.com/2012/04/18/api-downtime-on-april-16-2012/</link>
		<comments>http://blog.mixpanel.com/2012/04/18/api-downtime-on-april-16-2012/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 02:39:34 +0000</pubDate>
		<dc:creator>geddes</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=581</guid>
		<description><![CDATA[At Mixpanel, we take the stability and reliability of our product very seriously. Yesterday, our track API was down from 2:55 PM to 4:20 PM PDT. We are extremely sorry and feel that we owe you, our customers, an explanation of what happened and how we&#8217;re going to prevent it from happening again. What happened [...]]]></description>
			<content:encoded><![CDATA[<p>At Mixpanel, we take the stability and reliability of our product very seriously. Yesterday, our track API was down from 2:55 PM to 4:20 PM PDT. We are extremely sorry and feel that we owe you, our customers, an explanation of what happened and how we&#8217;re going to prevent it from happening again.</p>
<p><strong>What happened</strong></p>
<p>Before explaining exactly what happened, it&#8217;s useful to have a rough overview of what happens to an event when it&#8217;s sent to Mixpanel. From the client perspective, each event is simply an HTTP request. On Mixpanel&#8217;s side, however, each HTTP request hits a few different servers in succession:</p>
<ol>
<li>First, we have HTTP load balancers running on api.mixpanel.com with IP level failover. Each balancer maintains a list of API servers that are currently running and will pick one for each event it processes.</li>
<li>Our API servers do basic event validation and optionally add some useful information to the event, such as time if it&#8217;s missing or the client IP address if requested. Similar to our balancers, each API server maintains a list of queue servers that are running and will pick one for each event.</li>
<li>For queueing, we use piece of software called kestrel, which is a hybrid in-memory / on-disk queue. This is the final step during the initial track request. Normally, these queues hover around 0, meaning that you&#8217;ll see your data in real time.</li>
</ol>
<p>Yesterday, we saw failures on each of these pieces of infrastructure. We spent most of the downtime tracking down the root problem (and we made a few mistakes changing settings on otherwise working servers). Ultimately, we found one queue server with an apparently running version of kestrel, but with the following in the log:</p>
<pre>#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (safepoint.cpp:308), pid=13379, tid=140221886957312
# guarantee(PageArmed == 0) failed: invariant
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)
# An error report file with more information is saved as:
# /tmp/hs_err_pid13379.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#</pre>
<p>Unfortunately, because the process was still running according to Linux, none of our automated failover systems worked. They rely on TCP/IP level errors, such as would happen if the machine was down, or kestrel wasn&#8217;t running. Instead of marking the machine as down, our API servers simply filled up with connections trying to write events to a process that presumably was spending time doing the Java equivalent of a core dump.</p>
<p>Once, we figured this all out fixing the problem was simply a matter of restarting the affected server.</p>
<p><strong>What this means for you</strong></p>
<p>Regrettably, track requests sent during this time were lost. In an hourly report on April 16th, you will see a drop-off in events for the hour of 3pm PDT, and slightly lower events for 2pm and 4pm. Consequently, your daily data for April 16th will be slightly depressed as well.</p>
<p><strong>How we&#8217;re going to fix the problem</strong></p>
<p>We are extremely proud of our uptime and stability, and are working to prevent this from happening again. We realize that all sorts of failures happen in the real world and we need to be able to recover from them quickly and transparently regardless of whether it&#8217;s a networking problem or a JVM crash. It&#8217;s clear that our current detection system is not good enough. The queue server should have been marked down almost immediately.</p>
<p>With that in mind, we&#8217;re rewriting our kestrel client code to put strict timeouts on every operation when enqueueing events. Even if we never get any TCP/IP errors, we should still fail and fail fast, so that we can mark the server as down and our API continues to work.</p>
<p>Additionally, it&#8217;s clear that our testing does not currently cover all failure scenarios. We&#8217;re working on expanding that test coverage so that when we can be sure that the failover systems we have in place will work correctly in production.</p>
<p>If you have any questions about the downtime, please email support@mixpanel.com</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/04/18/api-downtime-on-april-16-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selecting Events and Properties with Extensibility and Targeted Reporting in Mind</title>
		<link>http://blog.mixpanel.com/2012/04/12/selecting-events-and-properties-with-extensibility-and-targeted-reporting-in-mind/</link>
		<comments>http://blog.mixpanel.com/2012/04/12/selecting-events-and-properties-with-extensibility-and-targeted-reporting-in-mind/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 03:28:49 +0000</pubDate>
		<dc:creator>woody</dc:creator>
				<category><![CDATA[Getting Started]]></category>

		<guid isPermaLink="false">http://blog.mixpanel.com/?p=534</guid>
		<description><![CDATA[A Review of Best Practices Introduction - Our philosophy here at Mixpanel is that your analytics should embody a scientific approach to solving your business problems. This all starts with planning out your data collection strategy. A little work upfront before your implementation can pay off tenfold when down the line you can instantly access [...]]]></description>
			<content:encoded><![CDATA[<p align="CENTER">A Review of Best Practices</p>
<p align="LEFT"><strong>Introduction -</strong></p>
<p align="LEFT">Our philosophy here at Mixpanel is that your analytics should embody a scientific approach to solving your business problems. This all starts with planning out your data collection strategy. A little work upfront before your implementation can pay off tenfold when down the line you can instantly access the metrics you need.</p>
<p align="LEFT">The data that goes into mixpanel is broken out into events and properties. Events represent meaningful interactions a user has with your website or mobile app, properties log any type of data that you might later want to associate with that event. Properties can be associated with a single event, or, in the case of super properties, with all events sent by a user.</p>
<p align="LEFT"><strong>Which Events to Track –</strong></p>
<p align="LEFT">Seperate signal from noise. Only track events that are important to your business. We’ve found that there is a temptation to make sure that every mouse click or tap should be recorded, especially when folks are just starting with analytics. What we recommend though, is that you just pick five or six meaningful events to start out with.</p>
<p align="LEFT">Begin by thinking about your business model, and the mission of your project. Which actions do users take on your site which affect the bottom line, which move your mission forward? Start with your pivotal events. These are generally easy to come up with. They are generally the same events that your board of directors is interested in! Hint: if you are a profit driven project, these are the events that effect the bottom line. Some examples of pivotal events for different kinds of web and mobile applications include:</p>
<ul>
<li>
<p align="LEFT">Account Created</p>
</li>
<li>
<p align="LEFT">Order Completed</p>
</li>
<li>
<p align="LEFT">App Downloaded</p>
</li>
<li>
<p align="LEFT">Link Shared</p>
</li>
<li>
<p align="LEFT">Photo Uploaded</p>
</li>
<li>
<p align="LEFT">Email Opened</p>
</li>
</ul>
<p align="LEFT">Once you have a list of pivotal events, imagine a few “funnels” for these events. Funnels are paths that users might take before completing the pivotal event. Here’s an example.</p>
<blockquote>
<p align="CENTER">(1)Viewed item detail→(2)added item to cart → (3)viewed cart<br />
→ (4)entered billing info → (5)order completed</p>
</blockquote>
<p align="LEFT">This list of steps is a good starting point for the events that you should track.</p>
<p align="LEFT">Think about other reports that you would like to see. Which events would be required? Allow your reporting needs to drive your event tracking. If you are unfamiliar with mixpanel’s reporting. Attend one of our <a href="http://www.mixpanel.com/webinar">Webinars</a>, or reach out to us at support@mixpanel.com.</p>
<p align="LEFT"><strong>Naming Events vs Properties -</strong></p>
<p align="LEFT">Notice in the above example</p>
<blockquote>
<p align="CENTER">(1)Viewed item detail→(2)added item to cart → (3)viewed cart<br />
→ (4)entered billing info → (5)order completed</p>
</blockquote>
<div></div>
<p align="LEFT">we have chosen names for these events which are pretty general. On the contrary, we could have listed:</p>
<blockquote>
<p align="CENTER">(1)Viewed Product #248677 detail→(2)added item to cart<br />
→(3)entered coupon code → (4)viewed non-empty cart<br />
→ (5)entered US billing info → (6)order completed (coupon)</p>
</blockquote>
<p align="LEFT">Obviously, this is a little over the top, but our point is that in the second set of events we’re storing extra data in the event names. Doing this will cause problems when you try to scale, let alone hamper your agility when reporting. Keep your mixpanel event names generalized. Store details in properties.</p>
<p style="text-align: center;" align="LEFT"><a href="http://blog.mixpanel.com/wp-content/uploads/2012/04/Events-vs-Properties1.png"><img class="aligncenter  wp-image-557" title="Events vs Properties" src="http://blog.mixpanel.com/wp-content/uploads/2012/04/Events-vs-Properties1.png" alt="" width="510" height="507" /></a></p>
<p align="LEFT">For example, if your users can download a file from your site, even if you have only one type of file users can download, call the event “initiated download” rather than “downloaded lolcat.gif.” It’s better to store the details of what’s being downloaded in a property for that event. Then when your company expands and adds “potato_like_elvis.gif,” you can easily keep tracking (and reporting to assess the success of your new content) without a hiccup! Keeping meta-data out of your events and in your properties where it belongs will keep your mixpanel implementation scalable and maximize the value you get out of reporting.</p>
<p align="LEFT"><strong>To Super or not to Super -</strong></p>
<p align="LEFT">Many properties are static for a given user. Examples are:</p>
<ul>
<li>
<p align="LEFT">user-name</p>
</li>
<li>
<p align="LEFT">gender (at least for the duration of the user’s session on your site)</p>
</li>
<li>
<p align="LEFT">whether or not they’ve viewed the FAQ</p>
</li>
<li>
<p align="LEFT">which ab testing group they are part of</p>
</li>
</ul>
<p align="LEFT">These are all prime candidates for being registered as super properties. This will save you time on your implementation because even a naked mixpanel.track(“this event”) will be tagged with any super properties already registered for a user.</p>
<p align="LEFT">Any piece of user specific meta-data that is dynamic should be included within the mixpanel.track call. Examples are:</p>
<ul>
<li>
<p align="LEFT">used coupon</p>
</li>
<li>
<p align="LEFT">number of items in cart</p>
</li>
<li>
<p align="LEFT">total photos in upload cue</p>
</li>
<li>
<p align="LEFT">recipient of message</p>
</li>
</ul>
<p align="LEFT">these dynamic elements are often event specific, like the filename of the file that was downloaded, the user-name of the person messaged, etc.</p>
<p align="LEFT"><strong>Getting Distinct-</strong></p>
<p align="LEFT">Issues often arise, especially when defining funnels in which not all the events are sent from the same place, due to a property called distinct_id. Distinct_id is Mixpanel’s way of telling which user to attribute an event to.</p>
<p align="LEFT">By default, Mixpanel will assign users distinct_id’s on the fly, and you could choose to use ours. However, if you want to send an event server-side, or when an email is opened, or across you web app and your android app, you’ll need to find a way to pass the value of distinct_id across those devices. Usually it is easier to register your own distinct_id through the <a href="https://mixpanel.com/docs/integration-libraries/javascript-full-api#identify">identify function</a>. Use something unique but easy for your app to find, like a user’s email or User ID. Being explicit about distinct_id will help keep your data attributed to the same user across devices.</p>
<p align="LEFT"><strong>Good Luck -</strong></p>
<p align="LEFT">Mixpanel is an incredible tool, and it’s getting better all the time. We’re really excited that you’re adding our tracking code to your site and the solutions team is here to help you get the most out of your data. Still feeling confused, drop us a line at <a href="mailto:support@mixpanel.com">support@mixpanel.com</a>, or drop by the site during pacific business hours and catch us on IM.</p>
<p>&nbsp;</p>
<p align="CENTER"><span style="font-family: 'DejaVu Sans Condensed', sans-serif; font-size: x-small;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/04/12/selecting-events-and-properties-with-extensibility-and-targeted-reporting-in-mind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funnels analysis: More advanced slicing &amp; dicing</title>
		<link>http://blog.mixpanel.com/2012/04/08/funnels-analysis-more-advanced-slicing-dicing/</link>
		<comments>http://blog.mixpanel.com/2012/04/08/funnels-analysis-more-advanced-slicing-dicing/#comments</comments>
		<pubDate>Sun, 08 Apr 2012 20:27:29 +0000</pubDate>
		<dc:creator>Suhail</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=511</guid>
		<description><![CDATA[A few weeks ago we made a significant improvement to our (already quite powerful) funnel analysis tool. You can now do advanced slicing &#038; dicing on your Funnel data, just like you can in our Segmentation feature. Previously, you could only do a single segment, asking questions like &#8220;Show me my funnel broken down by [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago we made a significant improvement to our (already quite powerful) funnel analysis tool. You can now do advanced slicing &#038; dicing on your Funnel data, just like you can in our <a href="https://mixpanel.com/features/segmentation">Segmentation feature</a>.</p>
<p>Previously, you could only do a single segment, asking questions like &#8220;Show me my funnel broken down by country.&#8221; Now, you can ask much more advanced questions, filtering and segmenting on multiple properties &#8211; for example, &#8220;Show me my funnel where users are male, greater than the age 40, and break it down by where the user came from.&#8221;</p>
<p>Some valuable use cases that came directly from customers include:</p>
<ul>
<li>Segmenting your funnel but constraining your segmentation to a particular A/B test. (e.g. Break this down by country but only where users saw experiment &#8220;A&#8221;)</li>
<li>The ability to filter on multiple utm_* parameters and then being able to segment.</li>
<li>The ability to handle specific data types like numbers and lists of things to give you more control over how you &#8220;query&#8221; your data.</li>
</ul>
<p>To try it out, all you have to do is flip the toggle beneath the funnel visualization to &#8220;Advanced&#8221;:</p>
<p><a href="http://blog.mixpanel.com/wp-content/uploads/2012/04/Screen-shot-2012-04-08-at-1.15.51-PM.png"><img class="alignnone size-full wp-image-512" title="slice and dice your funnels" src="http://blog.mixpanel.com/wp-content/uploads/2012/04/Screen-shot-2012-04-08-at-1.15.51-PM.png" alt="" width="955" height="667" /></a></p>
<p>Our goal is to empower our customers to answer some of the hardest questions in the world about their data in the simplest way possible. We hope we created more value for all of you aiming to understand more about your own customers. This most recent addition truly makes funnel analysis with Mixpanel the most powerful and advanced in the industry.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/04/08/funnels-analysis-more-advanced-slicing-dicing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone SDK &amp; UDIDs</title>
		<link>http://blog.mixpanel.com/2012/04/02/iphone-sdk-and-udids/</link>
		<comments>http://blog.mixpanel.com/2012/04/02/iphone-sdk-and-udids/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 20:44:59 +0000</pubDate>
		<dc:creator>Suhail</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=489</guid>
		<description><![CDATA[We&#8217;ve been receiving a lot of feedback about UDIDs and how we treat them. This is in part due to how iOS 5 is deprecating the use of UDIDs and Apple rejecting apps who make use of it. The good news is that we removed the use of UDIDs from our library a few months after Apple issued notice on [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been receiving a lot of feedback about UDIDs and how we treat them. This is in part due to how <a href="http://www.tuaw.com/2011/08/19/ios-5-deprecates-udid-as-identifier-for-developers-but-its-not/">iOS 5 is deprecating the use of UDIDs</a> and <a href="http://thenextweb.com/apple/2012/03/29/confirmed-apple-now-rejecting-apps-for-use-of-udid-start-finding-alternatives/">Apple rejecting apps</a> who make use of it. The good news is that we removed the use of UDIDs from our library a few months after Apple issued notice on them so that our customers would not have any issues. In short, if you&#8217;ve integrated or updated our library within the past 6 months you&#8217;re totally safe. If you haven&#8217;t, then feel free to update it to our latest library on <a href="https://github.com/mixpanel/mixpanel-iphone">Github</a>.</p>
<p>Just so you&#8217;re not concerned, here&#8217;s some <a href="https://github.com/mixpanel/mixpanel-iphone/blob/master/MPLib/MixpanelAPI.m#L101">proof (lines 101-157)</a>. Instead of using UDIDs, we use a one-way hash of the user&#8217;s MAC address which we believe is a reasonable solution for tracking the same user consistently yet allows us to be polite about their privacy. As usual, you can always override a property called &#8220;distinct_id&#8221; with your own unique identifier (like a user id in your database).</p>
<p>Developers: See the <a href="https://github.com/mixpanel/mixpanel-iphone/commit/63ff824ca1157f4e88a97432d46328683fd14239">diff that was made 6 months ago</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/04/02/iphone-sdk-and-udids/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing the ability to export your raw data</title>
		<link>http://blog.mixpanel.com/2012/02/22/announcing-the-ability-to-export-your-raw-data/</link>
		<comments>http://blog.mixpanel.com/2012/02/22/announcing-the-ability-to-export-your-raw-data/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 17:21:48 +0000</pubDate>
		<dc:creator>Suhail</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=469</guid>
		<description><![CDATA[Today we would like to announce the ability to export any data you insert into Mixpanel. It&#8217;s finally ready for prime-time, after testing with some of our biggest customers on data sets ranging into 100s of millions of data points. You find the official documentation for the API here: https://mixpanel.com/docs/api-documentation/exporting-raw-data-you-inserted-into-mixpanel Here are some useful examples [...]]]></description>
			<content:encoded><![CDATA[<p>Today we would like to announce the ability to export any data you insert into Mixpanel. It&#8217;s finally ready for prime-time, after testing with some of our biggest customers on data sets ranging into 100s of millions of data points.</p>
<p>You find the official documentation for the API here: <a href="https://mixpanel.com/docs/api-documentation/exporting-raw-data-you-inserted-into-mixpanel">https://mixpanel.com/docs/api-documentation/exporting-raw-data-you-inserted-into-mixpanel</a></p>
<p>Here are some useful examples of ways you can use this to your advantage:</p>
<ul>
<li>If you&#8217;re advertising on mobile, you can export and analyze all the UDIDs that advertisers are claiming they got for you. This helps you with attribution and de-duplication if you&#8217;re working with multiple advertisers.</li>
<li>If you saw a spike of 10,000 events but noticed only a few unique users contributed to it, you can now dive a bit deeper to determine what exactly happened.</li>
<li>If there&#8217;s a particular feature Mixpanel can&#8217;t do (we&#8217;d love to hear about what that case is by the way: support@mixpanel.com), you can always feel safe knowing there&#8217;s a way to get it. You can avoid having to store the data on your side manually from now on.</li>
</ul>
<h3>Feature highlight</h3>
<p>One feature we would like to highlight is the ability to filter on a property or segment. Not only can you say &#8220;I want all the data from this date to this date&#8221; but you can also say &#8220;I want all this data from this date to this date where my property <em>source</em> = google.&#8221; Check out the &#8220;where&#8221; parameter in the documentation which can handle all kinds of expressions.</p>
<p>As always, please let us know if you run into any problems by emailing <a href="mailto:support@mixpanel.com">support@mixpanel.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/02/22/announcing-the-ability-to-export-your-raw-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Product Development and Experiments</title>
		<link>http://blog.mixpanel.com/2012/02/02/product-development-and-experiments/</link>
		<comments>http://blog.mixpanel.com/2012/02/02/product-development-and-experiments/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 22:34:38 +0000</pubDate>
		<dc:creator>michael</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=453</guid>
		<description><![CDATA[The following is a guest blog post from Michael Twardos, Director of Analytics at Mog. If you&#8217;re interested in writing a post, please get in touch. Testing is an essential part of life. We touch the water with our toes before we jump in. We taste a piece of new food before we eat the entire meal. [...]]]></description>
			<content:encoded><![CDATA[<p><em style="font-style: italic;">The following is a guest blog post from <a href="http://www.linkedin.com/profile/view?id=3929678">Michael Twardos</a>, Director of Analytics at <a href="http://mog.com">Mog</a>. If you&#8217;re interested in writing a post, please get in touch.</em></p>
<p>Testing is an essential part of life. We touch the water with our toes before we jump in. We taste a piece of new food before we eat the entire meal. We test drive cars and skis before we buy them. In general, we try to collect information when it is available to make future decisions about larger investments. In some ways, measuring cause and effect is easy: When you can hold &#8220;everything else constant&#8221;, its easy to determine that a new pair of sneakers gave you blisters and a shampoo you used gave you dry scalp and not the other way around. But in other cases it is more difficult: was it the coffee or the wine or the soda you drank yesterday (or a combination of all three) that gave you a stomach ache last night?</p>
<p>When building software that is used by many customers the same problem presents itself. Was it the new algorithm or the new module that generated an increase in average engagement for users? Did the new user tutorial or the coupon offer drive a higher conversion rate? One way to isolate the effects from these potential sources is to introduce them one at a time and see what measures change. But this is not realistic: other businesses who don&#8217;t test this way will move much faster and a subset of these will beat their competition. Also, pushing new features out one at a time does not account for hourly, weekly or seasonal effects.</p>
<p>What do you do then when you need visibility on the impact of product features and insight on where to take the next steps? The answer: experiments. Experiments are actually ideally suited for rapid development in the web and software industries that are filled with a large number of fluid users. Why?</p>
<p>1) It is easy to segment users randomly based on a numerical identifier (by taking the modulus of that identifier for example).</p>
<p>2) Software and particular features are easy to execute on those segments (if id meets a condition then show new feature).</p>
<p>3) It is easy to measure results and compare segments if you are logging raw data of user behavior.</p>
<p>Employing the scientific method ensures the credibility of the experiment. This means forming a hypothesis, implementing a control group and collecting the right data to make the measurements you need to draw conclusions. However, in competitive markets, there is not much room for retesting and verifying results as the scientific method encourages. In other words, a compromise between experimental verification and intuition is a far more successful strategy for business than intuition alone.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/02/02/product-development-and-experiments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Inconsistency on January 16</title>
		<link>http://blog.mixpanel.com/2012/01/17/data-inconsistency-on-january-16/</link>
		<comments>http://blog.mixpanel.com/2012/01/17/data-inconsistency-on-january-16/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 19:53:06 +0000</pubDate>
		<dc:creator>geddes</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=432</guid>
		<description><![CDATA[On January 16th, from 6:00 – 6:20 pm Pacific Time there was an error in our production system, causing every event sent to Mixpanel to be counted four times. All of our customers, if looking at an hourly view of their data, will see an artificial spike for the hour between 6:00pm and 7:00pm, similar [...]]]></description>
			<content:encoded><![CDATA[<p>On January 16th, from 6:00 – 6:20 pm Pacific Time there was an error in our production system, causing every event sent to Mixpanel to be counted four times. All of our customers, if looking at an hourly view of their data, will see an artificial spike for the hour between 6:00pm and 7:00pm, similar to the one pictured below: </p>
<p><img src="http://mpdocs.s3.amazonaws.com/images/6pm-spike.png" alt="Spike Image" /></p>
<p>We are very proud of the accuracy of our data, and are extremely sorry that this error occurred. We know that you make key business decisions based on the data you see in Mixpanel, and even though the miscounting only lasted for twenty minutes, we wanted to make you immediately aware of it. The rest of this blog post will discuss the full details of this error and possible ramifications for your decision-making. </p>
<p>The over-counting impacts all reports on Mixpanel.com or any API calls that request a <strong>total count</strong> for any event and include 6pm PST on 1/16/12 within the time period of the query. However, this over counting <strong>does not impact queries for unique event counts</strong>. This means that the Funnels report and the Retention report, which are entirely based on uniques, are completely unaffected. In addition, any queries in the Segmenation  or Trends report in uniques mode are not impacted either. </p>
<p><strong>How can I adjust my data to account for this?<br />
</strong>In most cases, we do not recommend trying to adjust your data to account for this error. For daily reports, the difference will be trivial. For the day of January 16th total event counts will be roughly 5% higher than they were in actuality. For monthly reports, the total event counts will only be 0.1% higher than they were in actuality. The only case where you might want to adjust the data coming out of Mixpanel is in the case of hourly reports. If you are basing a decision on an hourly report, then divide the count for your total events that happened during the hour of 6 PM by 2. The result will be very close to the true event count for that hour.</p>
<p><strong>Will I be billed for these data points?<br />
</strong>Absolutely not. You will not be charged for any overages to your plan caused by this error.</p>
<p><strong>I&#8217;m a geek &#8211; tell me what really happened</strong><br />
First, it&#8217;s necessary to describe a small part of our infrastructure. When a user sends an event to Mixpanel, we do a small amount of validation &#8212; mostly checking for syntactical correctness &#8212; and then immediately put the event on a queue. Under normal circumstances, the number of items on the queue stays very close to zero, meaning that within seconds of sending an event it should show up in your reports. However, decoupling receiving events from processing them allows us to easily perform server maintenance that would otherwise require significant downtime.</p>
<p>For a long time now, we&#8217;ve had multiple queue servers so we aren&#8217;t reliant on a single machine, but we haven&#8217;t had automated failover. In practical terms, that means that if a queue server goes down in the middle of the day we can do a manual failover within minutes, but if it goes down in the middle of the night, it could be quite a bit longer before we can switch everything over. The change we pushed out Monday was intended to remedy this situation. Basically, when an event comes in, we try each queue server that we currently think is up one at a time until we successfully enqueue an item. Unfortunately, our code to check whether putting an item on a queue was successful or not was incorrect and consequently each event was added to each queue server (currently, there are four). We noticed the problem almost immediately and had the fix within 20 minutes.</p>
<p><strong>What we are doing to keep this from happening again</strong><br />
Unfortunately, although we have queueing related tests, in our test environment there is only one queue server and so none of our tests caught this particular problem. That particular hole will be fixed in the coming days.</p>
<p>Once again, our most sincere apologies and regrets for this error. If you have any questions please do not hesitate to reach out to us at support@mixpanel.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2012/01/17/data-inconsistency-on-january-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Importing $signup events for existing users</title>
		<link>http://blog.mixpanel.com/2011/12/22/importing-born-or-signup-events-for-existing-users/</link>
		<comments>http://blog.mixpanel.com/2011/12/22/importing-born-or-signup-events-for-existing-users/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 02:41:34 +0000</pubDate>
		<dc:creator>geddes</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=402</guid>
		<description><![CDATA[Update: The import functionality is now available for all events, and is fully documented in our help section. The below is still a good step-by-step guide for importing $signup events. Today we are rolling out our new retention tracking system. Now, instead of choosing a user&#8217;s cohort on an event-by-event basis (the first time the [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update:</strong> The import functionality is now available for all events, and is <a href="http://mixpanel.com/docs/api-documentation/importing-events-older-than-48-hours">fully documented in our help section</a>. The below is still a good step-by-step guide for importing $signup events.</em></p>
<p>Today we are rolling out our new retention tracking system. Now, instead of choosing a user&#8217;s cohort on an event-by-event basis (the first time the event was fired) you tell Mixpanel their cohort by sending a $signup event (in fact, this event can be called anything, the key is that you only send it once per distinct_id. If you call it $signup there will be a slight improvement in performance for your report). Usually you would send this event when they first make an account, but a lot of our customers have been asking us about their existing users. How can you tell Mixpanel which cohort to put your current users in?</p>
<p>You can do this, but there are a couple prerequisites:</p>
<ul>
<li>You must be already be using mpq.identify() or distinct_id to keep track of your users within Mixpanel</li>
<li>You must have an existing record tying the identify() or distict_id value you have been sending to Mixpanel with a date you want to use as a user&#8217;s birthday. For example: a users table in your database with user_id and date_created fields. </li>
</ul>
<p>If you meet those prerequisites, you can write a one-off script to send the $signup event to Mixpanel for all your users (each request will count as a Mixpanel data point for billing purposes). To do this, for every user in your database you would make a GET request that looks like this:</p>
<div style="font-family:monospace; line-height: 1em; margin-bottom: 10px;">
http://api.mixpanel.com/import/?<span style="color:red">data</span>=<span style="color:#ccc">eyJldmVudCI6IiRib3JuIiwic HJvcGVydGllcyI6eyJkaXN0aW5jdF9pZCI6NDgxLCJ0aW1lIjoxMzIxNDk5MzcxLCJ0b2tlbiI6IjEz ZmUzZGRjODZlYjZmOTBjNGVlN2QwZDQ3NTYzMTUwIn19</span>&#038;<span style="color:red">api_key</span>=<span style="color:#ccc">7a7727f7880dc39463f99475e7cefcf8</span></div>
<p>This request is very similar to our standard HTTP API (<a href="http://mixpanel.com/docs/api-documentation/http-specification-insert-data">documented here</a>). The <span style="color:red">data</span> parameter is a Base64 encoded JSON array with the event you are importing ($signup) and the associated properties. By decoding the Base64 data parameter from the above request you can see this:</p>
<pre>
{u'event': u'$signup',
 u'properties': {u'distinct_id': 481,
                 u'time': 1321499371,
                 u'token': u'13fe3ddc86eb6f90c4ee7d0d47563150'}}
</pre>
<ul>
<li> The <strong>event</strong> is $signup</li>
<li> The &#8216;<strong>distinct_id</strong>&#8216; property is the user ID you have been sending to Mixpanel up to this point for that user. For Javascript Library users &#8211; this is the value you put in mpq.identify()</li>
<li> The <strong>time</strong> property determines which cohort the user will be in. It is in Unix Epoch format (seconds since 1970). Times should be GMT. The above example, 1321499371, represents November 17th at 3:09 AM GMT.</li>
<li> The token property is your Mixpanel project token. </li>
</ul>
<p>There are three differences between this import method and the regular HTTP API:
<ul>
<li> this method lets you import events older than 31 days</li>
<li> the endpoint is <strong>/import/</strong> instead of /track/</li>
<li> <strong>as an added level of security, you must include your API key as a parameter outside the Base64 </strong></li>
</ul>
<p>The /import endpoint works for any events you would like to import &#8211; not just the $signup event.</p>
<p>You can <a href="http://mpdocs.s3.amazonaws.com/import-old-signup-events-demo.php">download a sample PHP script</a> that you can modify with your own data, token and API key to send $signup events to Mixpanel.</p>
<p>If you have trouble importing $signup events for your current users, please reach out to support@mixpanel.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2011/12/22/importing-born-or-signup-events-for-existing-users/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Retention just got better</title>
		<link>http://blog.mixpanel.com/2011/12/21/retention-just-got-better/</link>
		<comments>http://blog.mixpanel.com/2011/12/21/retention-just-got-better/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 22:29:13 +0000</pubDate>
		<dc:creator>geddes</dc:creator>
		
		<guid isPermaLink="false">http://blog.mixpanel.com/?p=423</guid>
		<description><![CDATA[We rolled out some big changes to the way retention reports work. Now you can slice and dice your retention data the same way you can in the Segmentation report. To our existing customers, the biggest change is in the way cohort groups are determined. In the past, you could only select a single event [...]]]></description>
			<content:encoded><![CDATA[<p>We rolled out some big changes to the way retention reports work. Now you can slice and dice your retention data the same way you can in the Segmentation report. </p>
<p>To our existing customers, the biggest change is in the way cohort groups are determined. In the past, you could only select a single event for retention analysis, now you can select two &#8211; one for determining the cohort (usually you would pick a signup or $born event for this) and one to look at the retention for. This is explained in detail <a href="http://mixpanel.com/docs/learn-the-features/retention-overview">on our documentation page</a>, and in the video below the fold.</p>
<p>You may be wondering: &#8220;what happened to compounded retention?&#8221; Now all retention is compounded retention &#8211; when you pick the first event, we will include all users in the cohort who fired that event, not just those who fired it the first time. To see birth retention, you need to fire an event that will only be sent once and determine the birthday for each user. This event can be called whatever you want, but we recommend calling it <strong>$born</strong> or <strong>$signup</strong>. To learn how to properly send a $born or $signup event, <a href="http://blog.mixpanel.com/2011/11/09/upcoming-changes-to-retention-on-nov-21/">read this blog post</a>. To learn how to import these events for your existing users, <a href="http://blog.mixpanel.com/2011/12/22/importing-born-or-signup-events-for-existing-users/">we have a blog post about that as well</a>!</p>
<p>If you have any questions about new retention, we will be hosting a Live Q&#038;A Webinar tomorrow at 11 AM PST. To tune in visit <a href="http://www.mixpanel.com/webinar">http://www.mixpanel.com/webinar</a> then.<br />
<span id="more-423"></span><br />
<video class="sublime" width="854" height="480" poster="" preload="none" id="retention"><br />
  <source src="http://mpdocs.s3.amazonaws.com/retention.mov" /><br />
</video></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mixpanel.com/2011/12/21/retention-just-got-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://mpdocs.s3.amazonaws.com/retention.mov" length="12362391" type="video/quicktime" />
		</item>
	</channel>
</rss>

