interstitialAd.IsLoaded() always returns false (Google AdMob)?

I tried putting Google Ads into my Unity app and I’ve ran into a weird issue. When I request an interstitial ad, I receive the AdLoaded event, but interstitialAd.IsLoaded() still returns false. If I show the ad, it doesn’t give any errors and shows it.

What I’m using:

Unity version 2020.3.2

Google AdMob 5.4.0 (Release Google Mobile Ads Unity Plugin v5.4.0 · googleads/googleads-mobile-unity · GitHub)

I’m currently using test ads because it’s my first time using Google Ads in a Unity project, could it be that?

My AdsManager script:

using System;
using System.Collections;
using UnityEngine;
using GoogleMobileAds.Api;

public class AdsManager : MonoBehaviour
{
    //Sample app ID: ca-app-pub-3940256099942544~3347511713
    private static readonly string appId = "ca-app-pub-3940256099942544/3419835294";
    private static readonly string bannerId = "ca-app-pub-3940256099942544/6300978111";
    private static readonly string interstitialId = "ca-app-pub-3940256099942544/1033173712";
    private static readonly string rewardedId = "ca-app-pub-3940256099942544/5224354917";
    private static readonly string rewardedInterstitialId = "ca-app-pub-3940256099942544/5354046379";
    private static readonly string nativeId = "ca-app-pub-3940256099942544/2247696110";

    public BannerView bannerAd;
    public InterstitialAd interstitialAd;

    IEnumerator Start()
    {
        while(Application.internetReachability == NetworkReachability.NotReachable) {
            yield return null;
        };
        MobileAds.Initialize(InitializationStatus => {});
        this.RequestInterstitial();
    }

    public AdRequest CreateAdRequest() {
        return new AdRequest.Builder().Build();
    }

    public void RequestInterstitial() {
        Debug.Log("Requesting interstitial ad");
        if(this.interstitialAd != null) {
            this.interstitialAd.Destroy();
        };

        this.interstitialAd = new InterstitialAd(interstitialId);
        this.interstitialAd.OnAdClosed += HandleOnInterstitialAdClosed;
        this.interstitialAd.OnAdFailedToLoad += HandleOnInterstitialAdFailedToLoad;
        this.interstitialAd.OnAdLoaded += HandleOnInterstitialAdLoaded;

        this.interstitialAd.LoadAd(this.CreateAdRequest());

        //ShowInterstitial(); - didn't show the ad
    }

    public void ShowInterstitial() {
        if(this.interstitialAd.IsLoaded()) {
            Debug.Log("Showing interstitial ad"); //didn't log
            this.interstitialAd.Show();
        }
    }

    public void HandleOnInterstitialAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
    {
        Debug.Log("HandleFailedToReceiveInterstitialAd event received with message: " + args.Message); //never called
    }

    public void HandleOnInterstitialAdLoaded(object sender, EventArgs args)
    {
        Debug.Log("HandleInterstitialAdLoaded event received"); //does log
        Debug.Log("Is interstitial ad loaded? " + this.interstitialAd.IsLoaded()); //Logs "Is interstitial ad loaded? False"
        this.interstitialAd.Show(); //shows the ad without any issues
    }
}

You can take a look documentation that share google here. Banner ads  |  Unity  |  Google for Developers

You need to call the request first. I add my classic admanager script for you. You can view and if you have problem, you can write me again.

public BannerView bannerView;
public InterstitialAd interstitial;
public RewardedAd rewardedAd;

private void Awake()
{
    if (adsManagerInstance == null)
    {
        adsManagerInstance = this;
    }
    else if (adsManagerInstance != this)
    {
        Destroy(gameObject);
    }
    DontDestroyOnLoad(this);
    // the above code, when load another scene, does not remove this gameobject
}

void Start()
{
    // Initialize the Google Mobile Ads SDK.
    MobileAds.Initialize(initStatus => { });

    this.RequestBanner();
    RequestInterstitial();
    RequestRewardAd();
}
private void RequestBanner()
{
    #if UNITY_ANDROID
        string adUnitBannerId = "ca-app-pub-1111111111111111/0000000000";
    #elif UNITY_IPHONE
        string adUnitBannerId = "ca-app-pub-1111111111111111/0000000000";
    #else
        string adUnitBannerId = "unexpected_platform";
    #endif

    // Create a Smart Banner at the top of the screen.
    this.bannerView = new BannerView(adUnitBannerId, AdSize.SmartBanner, AdPosition.Bottom);

    // Create an empty ad request.
    AdRequest request = new AdRequest.Builder().Build();

    // Load the banner with the request.
    this.bannerView.LoadAd(request);
}
private void RequestInterstitial()
{
    #if UNITY_ANDROID
    string adUnitInterstitialId = "ca-app-pub-1111111111111111/0000000000";
    #elif UNITY_IPHONE
        string adUnitInterstitialId = "ca-app-pub-1111111111111111/0000000000";
    #else
        string adUnitInterstitialId = "unexpected_platform";
    #endif

    if (interstitial != null)
    {
        interstitial.Destroy();
    }

    // Initialize an InterstitialAd.
    this.interstitial = new InterstitialAd(adUnitInterstitialId);
    // Create an empty ad request.

    // Called when the ad click caused the user to leave the application.
    this.interstitial.OnAdClosed += HandleOnAdClosed;

    AdRequest request = new AdRequest.Builder().Build();
    // Load the interstitial with the request.
    this.interstitial.LoadAd(request);
}
public void HandleOnAdClosed(object sender, EventArgs args)
{
    RequestInterstitial();
    // when close request ads, we request and keep ready for show
}
public void ShowAds()
{
    // call functioon another scripts
    // you can ads that you want
    if (rewardedAd.IsLoaded())
    {
         rewardedAd.Show();
    }
    if (this.interstitial.IsLoaded())
    {
        this.interstitial.Show();
    }
}
private void RequestRewardAd()
{
    string adUnitId;
    #if UNITY_ANDROID
        adUnitId = "ca-app-pub-11111111111811111/111111111";
    #elif UNITY_IPHONE
        adUnitId = "ca-app-pub-11111111111111111/1111111111";
    #else
        adUnitId = "unexpected_platform";
    #endif

    this.rewardedAd = new RewardedAd(adUnitId);

    // Called when the user should be rewarded for interacting with the ad.
    this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
    // Called when the ad is closed.
    this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;

    // Create an empty ad request.
    AdRequest request = new AdRequest.Builder().Build();
    // Load the rewarded ad with the request.
    this.rewardedAd.LoadAd(request);
}
public void HandleUserEarnedReward(object sender, EventArgs args)
{
    // rewarded  ad reward event
}
public void HandleRewardedAdClosed(object sender, EventArgs args)
{
    RequestRewardAd();
}

}