In-app purchasing (in saucy app)

Until recently I had just released two games and a utility. One of the games had 50,000 downloads in the first month but then its download rate plummeted, and now gets around 170 to 200 downloads per day. My ad revenue has been embarrassingly small so far. I have completely failed to get an ad system which provides decent fill rates, and cpc. I’m currently earning around $4 per day in ad revenue through VSERV and JumpTap (via VSERV), using interstitials.

Recently, on the assumption that “sex sells”, I have now made a saucy app (under a different brand to my previous apps!) Finger stripper and this time have arranged some in-app purchasing.

The first three days were quite exciting as the daily device installs looked like they were on a good upward trend,
day 1: 243
day 2: 385
day 3: 446
but then…
day 4: 276
day 5: 253
day 6: 265
day 7: 242

So far the ad revenue is microscopic - less than one dollar in total. But the in-app-purchasing revenue is around $17 even after Google has taken its cut.

So far this experience has shown me that in-app purchasing is the way to go (as so many people had been telling me)… but if anyone would like to suggest a good network for supplying interstitials, I’ll give them a go and report back.

My dream ad system would have the following characteristics:

  • good cpc
  • High fill rates.
  • If they are acting as an intermediary, they handle all the code (jar’s etc) within their single system.
  • If they are acting as an intermediary, they handle all payments - I.e. you get all your money from a single source.
  • Honest, knowledgeable salesmen.
  • A demo app that displayed all the ad types, that you can also use to see example code.
  • Java methods for *loading" ads which were separate from showing ads, so you can load in the background, then display ads quickly when you need them.
  • Responsive tech support.
  • Good documentation.

If anyone knows a company that tick’s all those boxes I’ll be impressed.

Can’t say that I’ve heard of any ad companies which tick all those boxes. But as far as interstitials go, I’ve had the most success with LeadBolt (currently getting ~$5 eCPMs, and previously I was getting much more). Also AppBrain works well if you want some nice-looking interstitials, and they have pretty reliable performance (although they don’t publish eCPM figures). Have heard mixed reactions to Airpush’s SmartWall, so haven’t used it yet myself.

Interesting, I’m already signed up with them for some banners in other apps.
When I looked into using their interstitials (using the SDK) I was disturbed by
the fact that there didn’t seem to be any way of separating the “loading”
part of the process from the “displaying” part. I had been hoping that I
could load in the background during one activity then when the user
chooses to switch to another activity, I could then call the display
method.

Without this separation, it appears that the only option is to call
load-and-display-all-in-one method when the user switches activity…
this is worrying because if the connection is slow then the user
could be waiting a long time for an ad to appear. The tech support
was not very reassuring on this issue, so I abandoned the idea…
but if you could tell me how to make the ads work nicely I’m all ears.

M.

You can use the HTML interstitials and come up with a method yourself to preloading them. I do load them before showing them - for example I start loading them when player is close to finishing a level - but not in every situation it’s posibble to guess when they will be posibble (and I avoid preloading them minutes before, don’t know how long they are valid).

That sound’s great, I’d like to do that. But this is just the kind of reason I’d like the ad agency to have good tech support. It seems I have to go “off piste” in order to get the system to behave sensibly… Surely LeadBolt should be facilitating this kind of thing themselves :frowning:

So maybe I need to have the HTML in a view that’s invisible, then change it to visible when I need it. Is that what you do?
And is there some sort of notification you get when the HTML is fully loaded. I wouldn’t want to present the user with a half drawn ad… or even no ad at all.

Pretty much, yes. I don’t check if it’s loaded when I show it though, so sometimes it will show up when it’s not loaded yet. Notification should be easily doable, you would have to look into Android’s WebView.

You don’t have to load the HTML using a WebView. You could just load it as a String, and then later create a WebView and load that String as HTML. I’m pretty sure that is fairly straightforward with WebView.

Direct from leadbolt (48hr response time) - “You can use HTML banners inside a WebView and you will need to implement a WebViewClient class on the WebView. This will give you access to the onPageStarted() andonPageFinished() functions. The onPageFinished() function is triggered when the HTML content in your WebView has finished loading and then you show the WebView to the device.”

Turns out I had too many problems with the HTML route. Instead
I have gone with the SDK,i.e. I put LeadBolt’s pubiapp.jar in my
libs directory and made a LeadBolt interstitial activity.
It just displays a circular ProgressBar on a black background
until an ad arrives. If the user presses the “x” to get rid of
the ad, then the activity does a finish, allowing it to go back
to the calling activity. If an ad fails to load, the activity
does a finish().

I’m sharing the code here, partly so that anyone can use it, and
partly because someone may spot some possible improvements… or bugs!

====================================================================
Leadbolt.xml

<?xml version=“1.0” encoding=“utf-8”?>
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:gravity=“center”
android:orientation=“vertical” >

&lt;ProgressBar
    android:id="@+id/progressBar1"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /&gt;

&lt;TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Advertisement"
    android:textAppearance="?android:attr/textAppearanceSmall" /&gt;

</LinearLayout>

LeadBoltInterstitialActivity.java

package com.yourcompany.yourapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.pad.android.iappad.AdController;
import com.pad.android.listener.AdListener;

public class LeadBoltInterstitialActivity extends Activity implements AdListener
{
String TAG = “LB”;
String LeadBoltSectionID = “PUT YOUR NINE DIGIT NUMBER HERE”;
private AdController myLeadBoltController;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.leadbolt);

    myLeadBoltController = new AdController(this, LeadBoltSectionID ,this);
            myLeadBoltController.loadAd();
}

public void onAdLoaded()
{
    Log.i(TAG,"onAdLoaded()");
// add app specific code for this event here...
// called when an ad is successfully displayed on device
}
public void onAdClicked()
{
    Log.i(TAG,"onAdClicked()");
// add app specific code for this event here...
// called when an ad is clicked by user
}
public void onAdClosed()
{
    Log.i(TAG,"onAdClosed()");
// add app specific code for this event here...
// called when the ad window is closed by user
    proceed_to_destination();

}
public void onAdCompleted()
{
    Log.i(TAG,"onAdCompleted()");
// add app specific code for this event here...
// supported for Advanced Overlay & Form Capture template types.
// called when ad window is closed with successful conversion
}
public void onAdFailed()
{
// add app specific code for this event here...
// called when the ad request to the ad server has failed
// e.g No Internet connection
// if destroyAd needs to be called in this function please use
// following code
    Log.i(TAG,"onAdFailed()");
    this.runOnUiThread(new Runnable()
    {
        public void run()
        {
            if(myLeadBoltController != null)
            {
                myLeadBoltController.destroyAd();
            }
        }
    });
    proceed_to_destination();
}

public void onAdAlreadyCompleted()
{
// add app specific code for this event here...
// triggered when loadAd() is called & current device has recorded
// a successful conversion
    Log.i(TAG,"onAdAlreadyCompleted()");
}
public void onAdHidden()
{
// deprecated – replaced by onAdPaused()
    Log.i(TAG,"onAdHidden()");
}
public void onAdPaused()
{
// add app specific code for this event here...
// triggered when loadAd() is called & pauseAd() has previously
// been called by App Developer
    Log.i(TAG,"onAdPaused()");
}

@Override
public void onAdResumed() {
    
    // add app specific code for this event here...
    // triggered when resumeAd() is called by App Developer
    Log.i(TAG,"onAdResumed()");
}

@Override
public void onAdProgress() {
    // add app specific code for this event here...
    // call every x seconds while ad loading is in progress
    // x must be set by calling myController.setOnProgressInterval(x);
    // this function is off by default
    Log.i(TAG,"onAdProgress()");
}
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    myLeadBoltController.destroyAd();
    super.onDestroy();
}


void proceed_to_destination()
{
    // if the calling activity has already called its finish(), 
    // then this finish() will exit the app altogether.

    // if the calling activity did not call its finish(), 
    // then this finish() will return to the calling app.

    finish();
}

}

I’ll be damned if I can work out how to keep the indentations using this forum’s editor!

Hehe, You even put Leadbolt referrals in code? lol… just kidding… Thanks for the code.

I’ve made one improvement already. I wanted to ensure that if there was a slow connection that the user would not be held for ages waiting for an ad… so before calling myLeadBoltController.loadAd(); I call myLeadBoltController.setOnProgressInterval(1); this makes a call to onAdProgress() every second. I then modified onAdProgress() as follows:

public void onAdProgress()
{
Log.i(TAG,“onAdProgress()”);
loading_seconds_counter++;
if (loading_seconds_counter >= MAX_SECONDS_WAITING)
{
myLeadBoltController.destroyAd();
proceed_to_destination();
}
}

Wanted to share an eBook that just got released with best practices on in-app purchase monetization, interesting read - The App Developer’s Guide to In-App Purchases - An Apptopia eBook - Apptopia Inc.

for your 50-10000 installs ( congratulations!) i think Startapp will be perfect - less intrusive them leadbolt , you can stil use leadbolt or airpush or everybody - and they pay per install - check it out , its a 2 minute implantation StartApp - Developer Register