Rewarded ads

  • Rewarded ads incentivize users with in-app rewards for engaging with video ads, playable ads, and surveys.

  • To implement rewarded ads, you need Google Mobile Ads SDK 19.7.0 or higher and complete the Get started guide.

  • Before publishing your app, replace the test ad unit ID (ca-app-pub-3940256099942544/5224354917) with your own ad unit ID.

  • Implement FullScreenContentCallback to manage rewarded ad display events and OnUserEarnedRewardListener to handle reward events.

  • Server-side verification (SSV) can be used for enhanced security, and custom data can be passed to SSV callbacks.

Select platform: Android iOS Unity Flutter

Rewarded ads allow you to reward users with in-app items for interacting with video ads, playable ads, and surveys.

Prerequisites

Always test with test ads

When building and testing your apps, make sure you use test ads rather than live, production ads. Failure to do so can lead to suspension of your account.

The easiest way to load test ads is to use our dedicated test ad unit ID for Android rewarded ads:

ca-app-pub-3940256099942544/5224354917

It's been specially configured to return test ads for every request, and you're free to use it in your own apps while coding, testing, and debugging. Just make sure you replace it with your own ad unit ID before publishing your app.

For more information about how Google Mobile Ads SDK test ads work, see Test Ads.

Load a rewarded ad object

Rewarded ads are loaded by calling the static load() method on the RewardedAd class and passing in a RewardedAdLoadCallback. This is usually done in the onCreate() method of an Activity. Notice that like other format load callbacks, RewardedAdLoadCallback leverages LoadAdError to provide higher fidelity error details.

Java

RewardedAd.load(
    this,
    "AD_UNIT_ID",
    new AdRequest.Builder().build(),
    new RewardedAdLoadCallback() {
      @Override
      public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
        Log.d(TAG, "Ad was loaded.");
        MainActivity.this.rewardedAd = rewardedAd;
      }

      @Override
      public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
        Log.d(TAG, loadAdError.getMessage());
        rewardedAd = null;
      }
    });

Kotlin

RewardedAd.load(
  this,
  "AD_UNIT_ID",
  AdRequest.Builder().build(),
  object : RewardedAdLoadCallback() {
    override fun onAdLoaded(ad: RewardedAd) {
      Log.d(TAG, "Ad was loaded.")
      rewardedAd = ad
    }

    override fun onAdFailedToLoad(adError: LoadAdError) {
      Log.d(TAG, adError.message)
      rewardedAd = null
    }
  },
)

Replace AD_UNIT_ID with your ad unit ID.

Set the FullScreenContentCallback

The FullScreenContentCallback handles events related to displaying your RewardedAd. Before you show your RewardedAd, make sure to set the callback like so:

Java

rewardedAd.setFullScreenContentCallback(
    new FullScreenContentCallback() {
      @Override
      public void onAdDismissedFullScreenContent() {
        // Called when fullscreen content is dismissed.
        Log.d(TAG, "Ad was dismissed.");
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        rewardedAd = null;
      }

      @Override
      public void onAdFailedToShowFullScreenContent(AdError adError) {
        // Called when fullscreen content failed to show.
        Log.d(TAG, "Ad failed to show.");
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        rewardedAd = null;
      }

      @Override
      public void onAdShowedFullScreenContent() {
        // Called when fullscreen content is shown.
        Log.d(TAG, "Ad showed fullscreen content.");
      }

      @Override
      public void onAdImpression() {
        // Called when an impression is recorded for an ad.
        Log.d(TAG, "Ad recorded an impression.");
      }

      @Override
      public void onAdClicked() {
        // Called when an ad is clicked.
        Log.d(TAG, "Ad was clicked.");
      }
    });

Kotlin

rewardedAd?.fullScreenContentCallback =
  object : FullScreenContentCallback() {
    override fun onAdDismissedFullScreenContent() {
      // Called when fullscreen content is dismissed.
      Log.d(TAG, "Ad was dismissed.")
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      rewardedAd = null
    }

    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
      // Called when fullscreen content failed to show.
      Log.d(TAG, "Ad failed to show.")
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      rewardedAd = null
    }

    override fun onAdShowedFullScreenContent() {
      // Called when fullscreen content is shown.
      Log.d(TAG, "Ad showed fullscreen content.")
    }

    override fun onAdImpression() {
      // Called when an impression is recorded for an ad.
      Log.d(TAG, "Ad recorded an impression.")
    }

    override fun onAdClicked() {
      // Called when an ad is clicked.
      Log.d(TAG, "Ad was clicked.")
    }
  }

Show the ad

When you show a rewarded ad, you will use an OnUserEarnedRewardListener object to handle reward events.

Java

rewardedAd.show(
    MainActivity.this,
    new OnUserEarnedRewardListener() {
      @Override
      public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
        Log.d(TAG, "User earned the reward.");
        // Handle the reward.
      }
    });

Kotlin

rewardedAd?.show(
  this,
  OnUserEarnedRewardListener { rewardItem ->
    Log.d(TAG, "User earned the reward.")
    // Handle the reward.
    val rewardAmount = rewardItem.amount
    val rewardType = rewardItem.type
  },
)

[Optional] Validate server-side verification (SSV) callbacks

Apps that require extra data in server-side verification callbacks should use the custom data feature of rewarded ads. Any string value set on a rewarded ad object is passed to the custom_data query parameter of the SSV callback. If no custom data value is set, the custom_data query parameter value won't be present in the SSV callback.

The following code sample demonstrates how to set custom data on a rewarded ad object before requesting an ad.

Java

RewardedAd.load(
    context,
    AD_UNIT_ID,
    new AdRequest.Builder().build(),
    new RewardedAdLoadCallback() {
      @Override
      public void onAdLoaded(RewardedAd ad) {
        rewardedAd = ad;
        ServerSideVerificationOptions options =
            new ServerSideVerificationOptions.Builder()
                .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
                .build();
        rewardedAd.setServerSideVerificationOptions(options);
      }
    });

Kotlin

RewardedAd.load(
  context,
  AD_UNIT_ID,
  AdRequest.Builder().build(),
  object : RewardedAdLoadCallback() {
    override fun onAdLoaded(ad: RewardedAd) {
      rewardedAd = ad
      val options =
        ServerSideVerificationOptions.Builder().setCustomData("SAMPLE_CUSTOM_DATA_STRING").build()
      rewardedAd?.setServerSideVerificationOptions(options)
    }
  },
)

Replace SAMPLE_CUSTOM_DATA_STRING with your custom data.

If you want to set the custom reward string, you must do so before showing the ad.