If you’ve been following my blog, you know that I was busy integrating Microsoft pubCenter ads into my free “Ener-Jewels TGIF!” game over the past few months. And if you’ve played the game, you might have also noticed some ads that occasionally appear in my ad-stream that aren’t pubCenter ads (the ones with a highlighted graphic on the left and text on the right). Those are my “House Ads” which are built-in to fill the gaps when pubCenter can’t send ads to my game (can’t connect to pubCenter, no ad publishers bidding on my ad space, and other pubCenter errors). I use the House Ads to cross-sell my $1.99 “Ener-Jewels!” game, show ImproviSoft’s Contests to Win an XBOX 360 with Kinect and some Cool Games, and also to show affiliate marketing ads for products on Amazon and other websites.
Today I submitted version 1.6 of “Ener-Jewels TGIF!” to Microsoft for testing and expect it to be published sometime next week. This version makes the Burst game a lot more fun to play (in my opinion) and also integrates two more ad networks – Smaato and AdDuplex. So now my game uses two ad networks (pubCenter & Smaato) that pay per impression, one ad-sharing network (AdDuplex) where you display ads for other apps that will in-turn display your ads, and my house ad network that only pays off when a click-through purchase occurs. Why so many? To get world-wide ad coverage (pubCenter currently only shows ads on U.S. phones) and to maximize the ad-space by gap-filling whenever the primary ad network can’t display an ad. Of course doing that takes a lot of ad-network management and that’s not easy because all of these networks have very different APIs. Some trigger events, some use polling, and one is completely autonomous. This past month I’ve been working on an “ad network management framework” that handles all of those differences and practically guarantees 100% ad-space coverage (even when there is no Internet connection!).
Why did I choose pubCenter, Smaato, and AdDuplex? With XNA games you don’t have a lot of ad-network choices. While there are various ad networks for Silverlight apps, I only know of 4 publicly available ad networks for XNA games at this time: pubCenter, Smaato, AdDuplex (in Beta), and MillennialMedia. Apparently Mobclix has one in Beta, but I requested it twice over the past month and still haven’t received it. MobFox said “not yet, but soon” – whatever that means. And AdMob, AldarIT, and ZestADZ are Silverlight-only! Even the companies with XNA ad components released them after the Silverlight controls had been out for a while. Likewise, there are a few Silverlight “ad network management” components available, but none for XNA (mine is the 1st one that I am aware of).
Here’s an overview of what I learned while evaluating and integrating these XNA ad-network SDKs in April:
- Millennial Media SDK (version 1.0) – My Rating: 0/5 Jewels
When I first downloaded the Millennial Media SDK, I thought it had a lot of promise. This company has a good website and SDKs for 10 platforms including well-known 4.2.X versions for Android and iPhone. But it didn’t take long to realize that there is little delivery on that promise right now with the current Windows Phone version of the SDK. The API seems highly customizable, but by only running the demo app for a while, I soon found this SDK is just simply unstable! After a while, the demo app started acting badly – the shutter animation on the ads was in a closed position 99% of the time, completely obscuring the ads. Then the demo app froze. Not good! This is only a 1.0 product and based on what I saw, it’s not even Beta quality. There’s no way I’m going to use it in any product of mine until it gets fixed, and I recommend that you don’t either.
- AdDuplex SDK (version 1.1 Beta) – My Rating: 3/5 Jewels
AdDuplex is a very simple SDK with minimal documentation and a minimal API. It’s too minimal for my taste, but it’s admittedly only in beta, and I like it none-the-less.The whole ad-sharing idea is great for the platform and an excellent way to advertise if you don’t have a lot of money (or any money) to spend on website advertising. What’s there does work, but the SDK needs some important improvements:
- AdDuplex ads aren’t pretty – white text on a black background with somewhat awkward text animation. Even my static text-based house ads look much better than these, not to mention my graphics-based house ads.
- There are no specified events or exceptions to handle – and I wish there were. Your code has no way to know when AdDuplex can’t acquire an ad because of this. But the AdDuplex component knows – and it displays it’s own advertisement on your app when this happens (where you could be displaying another money-paying ad-network).
- You can specify ad-requests every some number of seconds, but AdDuplex always overrides this value with 60 (although this isn’t documented anywhere).
- The SDK documentation is pretty much non-existent, but there’s really not much functionality to talk about. You can get the whole feel for the SDK by looking at the demo app source code.
- The AdManager has no Visible or Enabled properties. This is a problem because once AdDuplex is started, it becomes enabled and automatically handles input – even if it’s not the visible ad network! I have worked around this problem by wrapping it in a class with an Enabled property. I also reported this problem to AdDuplex and was insured that these properties will be coming next week (hope so!).
Integrating AdDuplex is a great way to get “free” advertising for your game. It’s not exactly free, because while you’re displaying AdDuplex ads, you’re not getting paid, but hopefully the exposure you get from AdDuplex will more than offset the lost revenue. And if you display AdDuplex ads when your paid-per-impression ad-network errors-out, then you’re winning! I don’t see using it as your primary ad-network, but it’s a good gap-filler.
- Smaato SDK (1.2) – My Rating: 2/5 Jewels
Smaato serves ads to over 220 countries and there is currently no other functional ad-network for WP7 XNA games that serves ads outside the USA. So please remember that, because if there was – Smaato would not-oh be in my framework-oh.
Smaato is another ad network that has no Visible or Enabled properties. There’s a GetAds() function, but no “Stop Getting Ads” command (no Enabled = false;), and it really needs one. Once you call GetAds() you get ad-acquired & error events until you dispose of the AdManager object. So when you have a another ad-network running at the moment, you actually need to kill Smaato to get it to stop communicating with its server. It would be much better to just be able to set Enabled to false. And killing Smaato means that whenever you want to go back to Smaato, you need to set up the ad-network all over again. Hmmm.
This SDK has the ugliest ad-network API that I’ve seen for Windows Phone. The “NewAdAcquired” event indicates when you have acquired a new ad. Unfortunately it also is fired when Smaato can’t acquire a new ad or anytime Smaato generates any kind of error. Seems like there should be a different event for errors. And almost every non-numeric SDK field is a string – there’s not an enum in sight. Error codes are integers -for example, error code 42 means “no ad available”. The SDK documentation even has some error code numbers that are described as “if you get this error code, please tell us”. And you need to switch your own ads, get textures from streams, and dispose of old ads yourself – instead of the component doing this for you. There is an intermittent app-slowdown at times too, which may be because the manual ad-switching code isn’t being done in its own thread. Simply a poor API -requiring a lot of work by the integrator to get it right.
The Smaato website isn’t that good either. Smaato’s developer website is slow, sometimes taking around 10 seconds before responding (and I have blazing-fast Internet service). There is no concept of ad-units or filters like pubCenter has, so you get whatever ad Smaato sends you (even some that aren’t exactly “Rated G”). There are some interesting fields in the AdManager – giving you the ability to specify keywords associated with your app (that perhaps affects which ads you are sent), but there is no description of how it’s used by Smaato. Disappointing.
There’s a lot to complain about, but it actually seems to work once you get it set up “as best as you can”. But did I mention that it serves ads to over 220 countries, Millennial Media is unstable, pubCenter only serves ads to the U.S. phones currently, and there’s no other option? That makes Smaato a must have for advertising in XNA games – until something better comes along. I’m hoping Smaato fixes these problems, but if not, I really hope AdMob puts out an XNA SDK soon.
- Microsoft Advertising pubCenter SDK (184.108.40.206) – My Rating: 3.5 of 5 Jewels
Despite all of my previous posts about issues that I’ve had with pubCenter (I’ve noted 70+ issues in problem reports that I’ve submitted against the SDK’s code and documentation), it’s still the best ad network for displaying ads on U.S. based Windows Phones – period. It’s not impressive like iAd rich media ads (for iPhone), but it works and has the best thought-out Ad API for Windows Phone. There are definitely some quirks in the API, issues with pubCenter, problems with ad-links and how ads are displayed, but overall it works, serves Rated-G ads only, and has a decent fill rate for many ad categories. pubCenter allows you to set up ad-units that get you category-specific ads. And you can use as many ad-units in your game as you wish, placing them where-ever, and rotating them whenever you want. You can provide location data to get local ads. You can also filter out ad URLs that you don’t want provided at the server. There are a few key limitations with the Microsoft Ad solution right now though:
- Microsoft is officially only serving ads to U.S. based phones, although we have heard rumors that UK phones may be getting beta ads. Just about everywhere else, if you’re only using pubCenter ads, your users are seeing a blank space where your ads should be (and therefore, you aren’t getting any ad revenue from them).
- There aren’t as many advertisers as I’d like to see, so many ads get repeated over and over again. Fewer ad-space bidders means lower eCPM.
- Other than location, the API’s demographic data is not currently used by pubCenter to serve more user-relevant ads (apparently this will change “soon”)
- Ads received can be text or graphical, but not rich-media capable, and may not be the size you requested.
I’m really hoping that Microsoft quickly expands ad-serving to other countries soon. pubCenter Support also told me that all of the issues I reported will be addressed in the next release (just wish I knew when that would be!). Looking forward to that release, but until then it’s still very usable. I like this platform and their online support people are very responsive.
So here’s what I’m doing in my “Ener-Jewels TGIF!” ad network manager:
For U.S. based phones my primary network is pubCenter, with failovers to Smaato and then my House Ads. I inject an AdDuplex or Affiliate Marketing (House) ad every few minutes, and also use them to gapfill whenever there is a hopefully-recoverable error with the current ad-network. House Ads are displayed whenever there is no Internet connectivity in order to get users familiar with them. If a failover network is currently visible, every few minutes the framework checks whether the primary ad-network is now available, and switches to it if possible. For non U.S. phones, it’s basically the same, but without pubCenter in the mix.
[5/4/2011 Update]: Millennial Media contacted me yesterday and we had a conference call today. I explained the multiple problems that I experienced with their “AdView” XNA ad manager and provided them with a few ideas for improving AdView’s API. They were very receptive to my feedback and assured me that they are going to address these issues as quickly as possible. I have agreed to verify that the problems are resolved after they have updated the AdView component. I am looking forward to those changes and integrating Millennial Media’s AdView component when it’s ready.
[5/5/2011 Update]: I have tried twice to contact Smaato (via email and their Contact Us webpage) about these issues, but no reply so far. Will try Twitter next.
[5/6/2011 Update]: Alan Mendelevich from AdDuplex sent me a preview of his v1.2 component update that will be available publicly in a few days. This version adds Enabled and Visible properties to the component. Thanks for the quick turnaround on this, Alan! I will be using it in “Ener-Jewels TGIF!” v1.8 which should be released next week. Sent Alan additional feedback – software design ideas.
[5/12/2011 Update]: Responded to Millennial Media’s request for additional feedback today on event handlers & Internet connectivity scenarios.
[5/13/2011 Update]: Skype conference call today with Smaato in Germany and their SDK developer in California went well. I explained the issues above, made suggestions for addressing them, and agreed to provide feedback on the SDK changes prior to release. They’re already working on some SDK improvements. With today’s topics, it seems there’s a lot of work to do though. Hopefully they can redesign it quickly.
[5/13/2011 Update]: Requested status from Mobclix on their WP7 XNA Beta SDK because I still haven’t received it. Also noted MobFox is still Silverlight-only.
[5/17/2011 Update]: Reviewed Millennial Media’s latest unreleased build of their XNA SDK and sent them detailed feedback about problems that it continues to have.
[5/26/2011 Update]: Smaato makes main-thread blocking calls to iso-storage, which will cause frame-rate glitches in your game. I’m reimplementing their sample code now to use a background thread to reduce the glitch, but Smaato really needs to redesign the SDK to not use iso-storage for ad textures.
[6/5/2011 Update]: AdDuplex now has a way to monetize your apps by selling a fraction of your ad inventory and getting paid via PayPal. Nice!
[6/29/2011 Update]: Microsoft has updated the pubCenter Ad SDK! I plan to a new article about it within the next few weeks.
[7/6/2011 Update]: Unfortunately, still no new Smaato or Millennial Media SDKs to report. I don’t know why it’s taking so long to update them, other than that they have a lot of problems to fix. Despite the rating above, I have found Smaato to be a disappointment – 1% of the CPM that I’m getting from Microsoft pubCenter (so it might not be worth the trouble!). Anybody getting better results?