User Experience vs. Accuracy

We have this little note on statistics pages on AdDuplex:

* – in order to maximize user experience we are tracking clicks on marketplace ads only when user comes back to the app where the ad was clicked. This results in some clicks not being counted.

I get emails regarding this line periodically. So I decided to address it in this blog post in order to explain the decision in greater detail and hopefully get a valuable feedback from you.

Technical Difficulties

As you probably know, there’s no multitasking in current version of Windows Phone. So as soon as you open a marketplace app via MarketplaceDetailTask the control is transferred to the MP app and the call to register the click on your server gets killed.

There are 2 general ways to overcome this:

  1. Route all the taps through your web server.
  2. Delay opening the marketplace app until the click is registered with you server.

We’ve dismissed both of these approaches because of the effect they have on user experience and based on the understanding of what is the end goal for our clients.

The User is More Important than the Stat

We believe that the most important asset for our users (apps on the AdDuplex network) is a new customer they can get through their ads. Tracking that user is important but secondary.

This is why when user taps on an ad we save this event to Isolated Storage and take them to the Marketplace immediately. When (if) the user comes back to the app where he/she clicked the ad we check if there’s a saved click and report it to our server. Thanks to René Schulte for helping me crystalize this concept.

Obviously accuracy suffers with this approach. The user is not guaranteed to ever return to the same app. So some clicks stay unregistered. However she gets to your app in the fastest possible way, doesn’t get a chance to hit some button and drift away in the process, doesn’t get frustrated with waiting and no additional points of failure (web server) are introduced.

Believe me, I’m the last person who wants to artificially decrease CTR on the network. But since I’m a developer and not a marketing guy, I want the experience be the best. Even at the expense of some marketing (bragging) points.

So, How Much Do We Loose?

I’ve been running a campaign with 2 identical ads for some time now. One of them goes directly to the Marketplace and the other one goes through the web. The first one has a CTR of 0.97% and the second one – 1.22%. So based on this experiment about 20% of the Marketplace clicks are not registered.

I plan to continue this experiment for a little longer to get this number based on a larger data set and then I’ll probably add something like “estimated real CTR” to the statistics pages.

Conclusion

We, as technical people, often pay more attention to numbers and technical details rather than what’s really important. I think it’s really important to concentrate on our end goals. I’m sure that the end goal of all the participating AdDuplex apps and advertisers is to get more users.

Sure, if you work in a marketing department of a bigger company, your success metric could be a cost-per-click you got from the ad campaign. You can estimate this using the 20% number above. Still the end result of your campaign are the new customers for your app and I strongly believe you can get more of them by sacrificing a little accuracy in the statistics.

Do you agree? Do you have and idea on how to resolve this dilemma on both counts? Let me know in the comments.

Your App in Just One Tap – Advertise on AdDuplex

banner_square_advertiseI’m happy to announce that you no longer have to run ads in your app to advertise on AdDuplex. From now on you can just buy ad impressions and give your WP7 app (or site, or product, or service) some extra boost in exposure.

AdDuplex is targeted at Windows Phone specifically. So, if your main target audience is WP7 users, there is no better way to reach them. When you advertise an app on AdDuplex the user is taken into the Marketplace immediately placing him/her just one tap away from your app.

We’ve set up an introductory discount of 30% and you can take advantage of it right now. You can get an even bigger discount if your app participates in AdDuplex exchange. We are a small boutique network of Windows Phone apps and our inventory is relatively limited, so don’t miss your chance to get your slot before it’s sold out.

Learn more and join now.

In case you have any questions, suggestions or special needs, please, don’t hesitate to contact me at info@adduplex.com

Using AdDuplex as a Fallback for Microsoft pubCenter

Quite a few of Windows Phone developers would like to make money from their apps and games. The best way to do that for US based developers (and hopefully Europeans in the future) at this moment is Microsoft’s own pubCenter. In addition to accepting US developers only, it also serves ads to US customers exclusively. Fortunately it let’s you know when it can’t serve an ad via events so you can react accordingly in your app. And there’s no better way to utilize that unused inventory than using AdDuplex.

Jeff Weber, the creator of one of the best (if not THE best) Windows Phone games – Krashlander, was kind enough to share his fallback code with us. What it does is displays pubCenter ad control when it can display and ad, but when it can’t it falls back to AdDuplex ad control.

The sample code

Both controls are just placed in a simple StackPanel and AdDuplex is set to Collapsed by default.

<StackPanel>    
<ads:AdControl x:Name="MSAdControl"
Height="80" Width="480"
ApplicationId="YOUR_APPLICATION_ID"
AdUnitId="YOUR_AD_UNITID"
/>
<AdDuplex:AdControl x:Name="AdDuplexAdControl"
Height="80" Width="480"
Visibility="Collapsed"
AppId="YOUR_ADDUPLEX_APPID"
/>
</StackPanel>

In code-behind event handlers are attached to pubCenter control events and depending on the result of the pubCenter request either AdDuplex or pubCenter control is collapsed and the other one is displayed.

public MyClass()
{
InitializeComponent();
MSAdControl.AdControlError += new EventHandler<ErrorEventArgs>(MSAdControl_AdControlError);
MSAdControl.NewAd += new EventHandler(MSAdControl_NewAd);
}

void MSAdControl_NewAd(object sender, EventArgs e)
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
AdDuplexAdControl.Visibility = Visibility.Collapsed;
MSAdControl.Visibility = Visibility.Visible;
});
}

void MSAdControl_AdControlError(object sender, Microsoft.Advertising.Mobile.UI.ErrorEventArgs e)
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MSAdControl.Visibility = Visibility.Collapsed;
AdDuplexAdControl.Visibility = Visibility.Visible;
});
}

IMPORTANT: in case you decide to implement the layout in a way that pubCenter control overlaps AdDuplex control, don’t be fooled by the fact that pubCenter control visually collapses when there’s no ad to display. It still occupies the space and catches all the taps rendering AdDuplex control unclickable. So the key is to explicitly set Microsoft’s control to Collapsed.

Thanks to Jeff for this simple but proven code snippet and check out his awesome game if you haven’t already.

Bug fix release: Silverlight control version 1.1.2

A bug in the AdDuplex Silverlight control version 1.1.1 has been reported. It manifested itself as an exception thrown when AdDuplex control was used on several pages throughout the app. I’m sorry for the inconvenience and trouble it may have caused you.

This bug should be fixed in the new version which is now available for download through the client area.

Thank you to everyone who reported this bug and please accept my sincere apologies. In case you find any issues with the controls, please, don’t hesitate to email me or leave a comment on this blog.

Silverlight Control v.1.1.1 Released. Upgrade strongly recommended

We have released a new version of our Windows Phone 7 Silverlight AdControl. An internal issue has been identified that resulted in some inconsistencies in serving ads, especially in scenarios where AdDuplex was used as fallback to other ad networks.

The issue is not critical in most cases but important enough for the health of the network. I encourage you to upgrade the control to the newest version as soon as possible. You can download it through Downloads page in Client Area.

Another thing I’d like to ask is that you test your app in regard to AdDuplex and related issues. The process of going through the certification is not instant and it pays to check before submitting than resubmitting later.

Things to Remember

Some AdDuplex related things to remember when testing that came to our attention over the recent weeks:

  • Make sure you set AppId property to your AppId on AdDuplex network and not your marketplace app id. You can find AdDuplex AppId for your app in the Client Area.
  • Make sure AdDuplex ad is clickable. Sometimes the ad is visible but obstructed by some transparent object that “swallows” all the taps. This is especially important to check in fallback scenarios when you place AdDuplex under some other ad. Microsoft’s pubCenter ad control is known for this behavior. When it can’t show an ad it collapses some internal visible parts and is actually translucent but it doesn’t collapse altogether and still catches all taps. You should manually set it’s Visibility to Collapsed.
  • Explicitly set Visibility on the AdDuplex control to Collapsed whenever you don’t want to show it. We make every effort to detect when something covers AdDuplex control but it would be easier for everyone if you just let the control know that it’s not supposed to be visible. Remember that running AdDuplex control in some invisible form is a violation of our terms.

In case you have any questions or encounter some issues, please, don’t hesitate to contact us at info@adduplex.com

Thank you for making AdDuplex a success and lets all benefit from it!

XNA Library is Now Available

xna_logoI’m happy to announce that you can start implementing AdDuplex ads into your great XNA games right now!

We’ve just released a public beta of the XNA library for AdDuplex and it’s available for immediate download in the client area. The package includes the library DLL, basic implementation instructions and a sample application for your reference.

Over the next couple of days I will publish a detailed tutorial describing implementation in detail.

XNA developers! Welcome to AdDuplex.

Migration Completed

I’m happy to report that server migration went smoothly and everything should be operational by now in full capacity. In case you notice any irregularities and/or bugs in the new setup, please, don’t hesitate to let us know at info@adduplex.com.

One thing to notice is that the new servers are operating on UTC timezone settings and old ones were on CST. So, even though there was no interruption in service, you will probably notice a drop in your stats for March 2 since the “server day” was 6 hours shorter than the real one.

Planned Migration, Client Area Downtime

Thanks to all the app authors participating in AdDuplex network for making it a success and driving traffic up! In order to provide best possible service going forward we decided to move our servers to Windows Azure.

Tomorrow, March 2nd, 2011, we will be performing a planned migration to a new hosting environment. The core ad serving engine should stay operational throughout the process, but we will close the client area on the old server to maintain consistency. We plan to start the process around 7:00 AM GMT. Please, make any planned changes to your ads before that time. You will be able to access Client Area on a new server once DNS records are updated (usually within a day).

Thank you for your cooperation!

Incoming Clicks Statistics

Up until now our app statistics page reported on the clicks originating from your app. That was probably not the most interesting metric for you. Way more interesting is how many clicks did you get on your ads displayed in other apps. Now you can learn just that.

image

Keep in mind that we track Marketplace clicks in unobtrusive way. Meaning that the click is only tracked when user returns to the app where he/she clicked on the ad. If the user never returns to the app, the click is not registered in the system. So, the actual number of clicks (both incoming and outgoing) is most definitely higher than reported.