Appodeal ads "failed to load"

Hi everyone!

While the plugin works in test mode when I switch to real ads, I fail to get interstitials and rewarded videos. I get an event.response of “failed to load” with no further information. Asked Appodeal support and they told me to ask for technical help SDK-side so here I am. Does anyone know what might be the case?

Using Appodeal Beta Plugin 2.6.2 with Corona builds (2020.3582)

What country are you in? Did you sync with admob? iOS or Android? What do you see in the console? Do you get test ads if you switch to test ads? What adapters are you using? Did you provide your keys for Facebook, Unity and others?

  • I’m trying this from Turkey.
  • I did the Admob sync and the warning is gone so I assume it’s working at the moment.
  • Trying it on Android and I see event.response “failed to load” from stripped Corona logs on logcat. I don’t know how I can get a detailed response.
  • Test ads are working fine. They load and show without any problems.
  • I tried to include everything there is because I don’t know which ones work best or not. I haven’t connected Facebook ads and they are turned off. Also, Unity Ads are not connected. It also requires 50k impressions daily for rewarded. I have no idea what this means.

For interstitials, Admob, Applovin, Appodeal Exchange, Backfill
For videos, (all of the above - Admob) + AdColony.
For rewarded, all of the above combined seems enabled.

plugins =
    {
        ['plugin.appodeal.beta.base'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.AdColony'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.AmazonAds'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.AppLovin'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Appnext'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Chartboost'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.FacebookAudience'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Flurry'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.GoogleAdMob'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.InMobi'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.IronSource'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Mobvista'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.MyTarget'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Ogury'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.StartApp'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Tapjoy'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.TwitterMoPub'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Unity'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Vungle'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Yandex'] = { publisherId = 'com.coronalabs' },
    },

I suspect it is a no fill issue.
So a few things to help you out:

  1. There is no impression floor if you use your own keys. Go to settings and add keys to all the accounts that have impression floors and then switch to your keys. This holds true for AmazonAds, Unity, Chartboost and probably others.
  2. Facebook, Mopub, and Flurry don’t provide any impressions if you don’t set up your account. I believe this is also true for Yandex (but don’t remember). If you are not going to use them then remove them from the config.
  3. Tapjoy doesn’t work at all. Not sure what the problem is but you are safe to remove that one.
  4. Backfill doesn’t pay unless you have set up ads to self serve. So turn that off.

I also suspect that but since Appodeal support is not really willing to help and lead me to plugin-side I thought I should ask.

I followed your advice and did the fastest option without the creating new account hustle, I connected Unity but still, I got nothing. 112 request with no fills just today, %0. I’m clearly missing something here.

To speed things up, I’m sharing how I set things up. Hopefully, you can shed some light on what I’m missing. Even if it’s something on the dashboard side, I could really use some help. (Using Solar2D 2020.3598)

main

appodeal = require( "plugin.appodeal" )
local paramsAppodeal = {
        testMode = false, 
        appKey = myKey, 
        hasUserConsent = false,
        supportedAdTypes = { 'interstitial', 'rewardedVideo' },
    }
appodeal.init( adsListener, paramsAppodeal )

build.settings

android = 
    {
        usesPermissions = 
        {
            "android.permission.INTERNET",
        },

        applicationChildElements =
        {
            [[
                <meta-data
                    android:name="com.google.android.gms.ads.APPLICATION_ID"
                    android:value="my key value here"/>
            ]],
        },
    },

plugins =
    {
        ['plugin.appodeal.beta.base'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.AdColony'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.AppLovin'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.GoogleAdMob'] = { publisherId = 'com.coronalabs' },
        ['plugin.appodeal.beta.Unity'] = { publisherId = 'com.coronalabs' },
    },

function call (same applies for interstitial)

if (appodeal.canShow("rewardedVideo")) then
    appodeal.show("rewardedVideo")
end

New findings edit: Switched over to Android Studio for more detailed debugging. Saw these lines:
I/dalvikvm: Could not find method android.security.NetworkSecurityPolicy.getInstance, referenced from method com.appodeal.ads.bq.h
I/dalvikvm: Could not find method android.security.NetworkSecurityPolicy.getInstance, referenced from method com.applovin.impl.sdk.utils.h.a
D/AppodealX: Register adapter: mraid
D/AppodealX: Register adapter: vast
W/Ads: The Google Mobile Ads SDK will not integrate with Firebase. Admob/Firebase integration requires the latest Firebase SDK jar, but Firebase SDK is either missing or out of date

Just discovered, when I deliberately enter the app key wrong, I get the “you provided the wrong key” ad from Appodeal. I can also get the test ads.

Also, in the docs it says that when initialized Appodeal loads the ads itself but it doesn’t. It takes too much time for it to kick in, resulting with failure every time. When I try loading them by myself, I get a warning that I haven’t provided X ad type in init phase where I already did.

I am updating one of my apps (android) this weekend and share my code. Also as a side note do you have your apps-ads.txt file set up. Lately I have noticed that the fill rate will go down without it.

This one ? https://www.appodeal.com/profile/app_ads_txt
If so, seems read-only to me. Also, I have no idea what I’m doing regarding ads :slight_smile:

By the way, I sent another message to Appodeal support and they say the problem is definitely on my side.

Yes but that is theirs. You have to make yours. You have to make a similar file on the domain you entered for your app. So mine says cabagomez.com so if you go to https://cabagomez.com/app-ads.txt you see mine.

Wow! That’s getting out of hand :smiley: Do you think this might be the reason to 0 fill? It shouldn’t be that complicated to show ads :slight_smile:

By domain, do you refer to package name for the app? If I do this, does it automatically get app-ads.txt from that address?

No, you should get more than 0 fills even without your app-ads.txt.

My android is up with the latest version of appodeal. I don’t have that many users in Turkey but you can give it a try and see how many reward/interstitial you get. I see 98% fill rate.

My implementation is obtuse because I can switch providers with a config change, but you should be able to get the gist of it:

The init:

appodeal.init( adProvider.adListener, { 
        appKey= options.id, -- appodeal key
        disableWriteExternalPermissionCheck= true, 
        testMode= adProvider.options.debug, 
        hasUserConsent= adProvider.options.consent, 
        childDirectedTreatment = adProvider.options.childDirectedTreatment,
        disableNetworks = {"mintegral", "my_target" } 
    } )

the show:
if adProvider.isAvailable(adType) then

        if adType == "banner" then
            appodeal.show( "banner", { yAlign=options.y} )
            return true
        elseif adType == "rewardedVideo" then
            appodeal.show( adType, { placement = "rewarded" })
        
        else 
            appodeal.show(adType)
            return true
        end
        
    else
        return false
    end

The check if available:

adProvider.isAvailable = function(adType)

if adType == "offerWall" then -- Ignore this is for other ad providers.
    return false
end

if adType == "rewardedVideo" then
    local isLoaded = appodeal.canShow( "rewardedVideo", "rewarded" ) -- notice i use "canShow". Also notice that I send a placement name as "rewarded". Read below.
    return isLoaded

else
    local isLoaded = appodeal.isLoaded( adType )
    return isLoaded

end

return false end

Appodeal shares the frequency of interstitial and rewarded in a placement. That means that if you set the frequency of interstitial 1 every 3 minutes that would hold true for both. If you show an inter it won’t show a reward for 3 minutes. With a second placement, you can separate them. IN my case 2 minutes for inter, 1 second for rewarded.

Hope this helps.

Thank you for the detailed response, really appreciate it. Sorry to say, my code looks pretty close to this but sadly, it’s not working for me so I’m giving up on Appodeal integration. I started looking for alternatives, probably won’t be ad mediation but at least they’ll work :slight_smile: Thank you for your help so far @agramonte