Developing Sponsored Ad-Free Lite
Here at TextNow we use our app to bring reliable calling and texting service to people for no cost. Everything we do at TextNow is done with three key pillars in mind when building an application. Is it:
- Simple enough that anyone can use it.
- Reliable calling and texting.
- Free or as close to free as possible.
In line with the last pillar, TextNow is free to download on both Android and iOS, and ads are a big part of what allows us to offer it for free. Everything we do at TextNow is done with three key pillars in mind when building an application. For users who don’t want to see the ads we offer a couple of subscription options - we're going to focus on our Ad-Free Lite subscription.
Ad-Free Lite is the cheaper of our two ad removal subscriptions. It removes all ads, except for the small banner at the bottom of the screen. This is a popular option because the banner is our smallest and least intrusive ad size, meaning many users only care about removing the other ad sizes.
Our team wanted to create an experience where we could deliver clear value to both the user and advertiser, which led to a feature we call Sponsored Ad-Free Lite. We are now able to get an advertiser to sponsor an Ad-Free Lite experience - which means a user can receive the benefits of a subscription at no cost or effort to them.
It may sound too good to be true, but the end result was an experience where everyone involved wins and which still perfectly aligns with our design pillars.
First let’s go over the user experience during a Sponsored Ad-Free Lite campaign. A user is eligible as long as they don’t already have a subscription. When the user opens the app we check if they can be enrolled. If the enrollment succeeds, they see a notification which looks like this:
Definitely in line with pillar number one about being simple right? The user gets Ad-Free Lite for a time, and the sponsor gets exclusive rights to the remaining spots.
The vast majority of users are reporting a neutral-to-positive sentiment towards the advertiser providing the experience. The advertisers are seeing positive return on investment. So, to summarize, we created a situation where we are showing a user far less ads, an advertiser is getting amazing value, and TextNow is generating additional revenue to keep our service reliable and free.
While the implementation of something like this in the code is actually not that complex, there were a few things about the design that turned out really well I wanted to share. The first is that the whole thing was designed to have no impact on startup time since it runs in the background. This is just another way we make sure the feature is not having any negative effect on reliability since requests for enrollment and notifications are done on coroutines. We are also careful to ensure that if a user is already doing something such as accepting permissions or answering a call, we never interrupt that experience.
But the coolest part of the whole thing is how modular the architecture is. With plans for future campaigns not involving Ad-Free Lite I wanted the system built so that we could add them with as little work as possible.
Supported Ad-Free Lite is just one example of what we call a priority one ad campaign. New campaigns essentially only need a few things: the token by which we will identify it; the various behaviors a user will experience; and any campaign-specific criteria needed for enrollment eligibility. For Sponsored Ad-Free Lite this adds up to less than 40 lines of code:
If you are curious about how capabilitiesRepo works, we have a great article here, otherwise the code is really simple. The manager code handling these campaigns checks all campaigns, which looks like this:
For future campaigns the development effort and unknowns will be super low, which allows us to start trying all kinds of new campaigns with the goal of creating more win-win situations - for the user, for the advertiser, and for us.
If you are interested in building great products, and helping us scale our future work, we’re hiring, and always looking for curious minds to join our team.