From 2014 to 2015 I worked on developing an advertising platform called FreeAppLife. This platform served incentivized app install ads to users. These apps could be downloaded by users in return for points. The points were then able to be exchanged for a variety of gift cards.
The platform needed to serve three main groups of people:
- Users who would install the apps, and earn points
- Clients who would have apps they wanted to advertise
- The team which needed to be able to cleanly manage users and clients and prevent fraud
User-facing mobile app
The app is pictured above. It aimed to deliver an experience that was as frictionless as technically possible. Since a user was performing tasks, the idea was that this platform should require the least effort for the highest compensation in points, in comparison to any of the competitors at the time.
Account-less sign up, workaround
To accomplish account-less sign up, I utilized the fact that we had access to an enterprise distribution certificate. With this I was able to access private iOS APIs within the app. This allowed me to associate user accounts directly with a hashed serial number of their device.
When iOS 8 was released, the serial number of a device was not directly accessible through private APIs. This posed a serious issue: users would update their operating systems and the current authentication scheme of the app (frictionless authentication from the users perspective) would be completely broken. However I noticed that a specific device configuration profile could be installed onto a users device, which would report metadata including the serial number, back to the server.
Offer Duplicate Handling
App install offers were collected from multiple sources, including third-party app install services, and an in house advertising solution.
Often times the same offer would be presented by more than one provider. I had to make sure that once a opened the app, or refreshed the offers page, that only the best version of an offer would be shown. Some offers didn’t work all the time, and others posed inconveniences for users. Part of the problem was that there was no way to uniquely identify offers across multiple sources. The names, descriptions, icons, and other offer metadata could not be assumed to be consistent within the same minute.
To alleviate some of the issues of low-quality offers, I tracked a lot of data about each offer (as accurate as it was with some reporting not available from some providers). This data included click-rate, where the offer led to, and how often the offer paid out. This allowed me to determine probabilities for each offer. When offers from different sources were merged, and sent to a user, these probabilities were filtered against in attempts to achieve the highest yield.