Skip to content

Rewarded Ads

Updated: Mar 3, 2026

Rewarded ads are full-screen video or interactive advertisements that players choose to watch in exchange for an in-game reward.

When implemented well, rewarded ads feel less like advertising and more like a game feature. Players actively seek them out, return to your game to watch them, and come to view them as a positive part of the experience.

Why Rewarded Ads Work

Rewarded ads create a three-way win:

  • Players win because they receive a tangible, valuable reward (extra life, bonus currency, hint, etc.) without spending real money.
  • Developers win because rewarded ads generate the highest eCPM of any ad format, often 2-5x more than interstitials.
  • Advertisers win because players are engaged and attentive — they chose to watch the ad and are watching it to completion, resulting in higher brand recall and conversion rates.

This voluntary, value-exchange model means players rarely feel frustrated by rewarded ads. In fact, many players report that they like rewarded ads because they provide access to premium-feeling content for free.

Creating a Rewarded Placement

Set up your rewarded ad placement in Monetization Manager:

  • Go to the Monetization Manager⁠.
  • Select your app.
  • Click Create Placement.
  • Choose Instant Games as the platform.
  • Select Rewarded Video as the ad format.
  • Give the placement a descriptive name (e.g., "Extra Life Reward", "Bonus Currency Reward", "Continue After Game Over").
  • Save and note the Placement ID.

Create separate placements for different reward types. This lets you track which rewards generate the most engagement and revenue.

SDK Integration

Rewarded ads follow the same create, preload, show pattern as interstitial ads, with the critical addition of granting the reward after the ad completes.

Creating a Rewarded Ad Instance

var rewardedAd = null;  
  
FBInstant.getRewardedVideoAsync('YOUR_PLACEMENT_ID')  
  .then(function (rewarded) {  
    rewardedAd = rewarded;  
    console.log('Rewarded ad instance created.');  
  })  
  .catch(function (error) {  
    console.error('Failed to create rewarded ad instance:', error.code);  
  });

Preloading the Ad

rewardedAd.loadAsync()  
  .then(function () {  
    console.log('Rewarded ad preloaded and ready.');  
  })  
  .catch(function (error) {  
    console.error('Failed to preload rewarded ad:', error.code);  
  });

Showing the Ad and Granting the Reward

rewardedAd.showAsync()  
  .then(function () {  
    // The player watched the entire ad. Grant the reward!  
    grantReward();  
    console.log('Rewarded ad completed. Reward granted.');  
  
    // Preload the next rewarded ad  
    preloadNextRewardedAd();  
  })  
  .catch(function (error) {  
    // The player did not complete the ad (dismissed early, error, etc.)  
    // Do NOT grant the reward.  
    console.error('Rewarded ad not completed:', error.code);  
  });

Critical: Only grant the reward when showAsync resolves successfully (in the .then handler). If showAsync rejects (in the .catch handler), the player did not complete the ad and should not receive the reward.

Complete Integration Example

Here is a full implementation for a common use case: granting an extra life after game over.

var rewardedAd = null;  
var isRewardedAdReady = false;  
  
// Initialize and preload a rewarded ad  
function preloadRewardedAd() {  
  isRewardedAdReady = false;  
  
  FBInstant.getRewardedVideoAsync('YOUR_PLACEMENT_ID')  
    .then(function (rewarded) {  
      rewardedAd = rewarded;  
      return rewardedAd.loadAsync();  
    })  
    .then(function () {  
      isRewardedAdReady = true;  
      console.log('Rewarded ad is ready.');  
    })  
    .catch(function (error) {  
      isRewardedAdReady = false;  
      handleRewardedAdError(error, 'preload');  
    });  
}  
  
// Show a "Watch ad for extra life" button on the game-over screen  
function showGameOverScreen(score) {  
  displayScore(score);  
  displayRestartButton();  
  
  if (isRewardedAdReady) {  
    // Show the "Watch Ad" button only if an ad is ready  
    displayWatchAdButton('Watch a short video for an Extra Life!');  
  } else {  
    // No ad available - hide the button  
    hideWatchAdButton();  
  }  
}  
  
// Called when the player taps the "Watch Ad" button  
function onWatchAdButtonClicked() {  
  if (!isRewardedAdReady || !rewardedAd) {  
    showMessage('Ad not available right now. Please try again later.');  
    return;  
  }  
  
  isRewardedAdReady = false;  
  
  rewardedAd.showAsync()  
    .then(function () {  
      // SUCCESS: Player watched the full ad. Grant the reward.  
      grantExtraLife();  
      showMessage('You earned an extra life! Keep playing!');  
      resumeGameFromLastPosition();  
  
      // Preload the next rewarded ad  
      preloadRewardedAd();  
    })  
    .catch(function (error) {  
      // FAILURE: Player did not complete the ad. No reward.  
      if (error.code === 'USER_INPUT') {  
        showMessage('You need to watch the full video to earn the reward.');  
      } else {  
        showMessage('Something went wrong. Please try again.');  
      }  
      handleRewardedAdError(error, 'show');  
  
      // Preload for next attempt  
      preloadRewardedAd();  
    });  
}  
  
// Handle errors  
function handleRewardedAdError(error, phase) {  
  switch (error.code) {  
    case 'USER_INPUT':  
      // Player dismissed the ad early - not a technical error  
      console.log('Player dismissed the rewarded ad.');  
      break;  
    case 'ADS_NO_FILL':  
      console.log('No rewarded ad available. Will retry later.');  
      setTimeout(preloadRewardedAd, 30000);  
      break;  
    case 'ADS_FREQUENT_LOAD':  
      console.log('Rewarded ad load too frequent.');  
      setTimeout(preloadRewardedAd, 60000);  
      break;  
    case 'ADS_TOO_MANY_INSTANCES':  
      console.log('Too many rewarded ad instances.');  
      break;  
    default:  
      console.error('Rewarded ad ' + phase + ' error:', error.code, error.message);  
      setTimeout(preloadRewardedAd, 30000);  
  }  
}  
  
// Start preloading during game initialization  
function initializeGame() {  
  FBInstant.startGameAsync().then(function () {  
    preloadRewardedAd();  
    // ... rest of initialization  
  });  
}

Common Reward Integrations

Here are eight proven reward patterns that work well in Instant Games, along with implementation guidance for each:

1. Extra Lives / Continue After Game Over

The most common and effective rewarded ad pattern. When the player dies or runs out of lives, offer an ad-funded extra life to continue playing.

function onGameOver() {  
  if (isRewardedAdReady && continuesUsed < MAX_CONTINUES_PER_SESSION) {  
    showContinuePrompt('Watch a video to continue where you left off!');  
  } else {  
    showFinalGameOverScreen();  
  }  
}  
  
function onContinueAccepted() {  
  rewardedAd.showAsync().then(function () {  
    continuesUsed++;  
    playerLives = 1;  
    resumeGameplay();  
    preloadRewardedAd();  
  }).catch(function () {  
    showFinalGameOverScreen();  
    preloadRewardedAd();  
  });  
}

Tip: Limit the number of continues per session (e.g., 2-3) to maintain game challenge and prevent ad fatigue.

2. Bonus Currency

Offer a currency bonus (coins, gems, diamonds) for watching an ad. This is especially effective when the player is saving up for an item they want.

function showBonusCurrencyOffer() {  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to earn 100 bonus coins!');  
  }  
}  
  
function onBonusCurrencyAccepted() {  
  rewardedAd.showAsync().then(function () {  
    addCoins(100);  
    showMessage('+100 Coins!');  
    preloadRewardedAd();  
  }).catch(function () {  
    preloadRewardedAd();  
  });  
}

Tip: Place this offer near the shop or on screens where the player can see items they want but cannot yet afford.

3. Daily Bonus Multiplier

Let the player double (or triple) their daily login bonus by watching an ad. This combines retention mechanics with ad monetization.

function showDailyBonus() {  
  var baseBonus = calculateDailyBonus(consecutiveLoginDays);  
  showMessage('Daily Bonus: ' + baseBonus + ' coins!');  
  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to DOUBLE your daily bonus to ' + (baseBonus * 2) + ' coins!');  
  }  
}  
  
function onDoubleAccepted() {  
  rewardedAd.showAsync().then(function () {  
    var doubledBonus = calculateDailyBonus(consecutiveLoginDays) * 2;  
    addCoins(doubledBonus);  
    showMessage('Daily bonus doubled! +' + doubledBonus + ' coins!');  
    preloadRewardedAd();  
  }).catch(function () {  
    var baseBonus = calculateDailyBonus(consecutiveLoginDays);  
    addCoins(baseBonus);  
    preloadRewardedAd();  
  });  
}

4. Unlock Levels or Content

Allow players to unlock the next level, chapter, or content pack by watching an ad instead of paying.

function onLevelLocked(levelNumber) {  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to unlock Level ' + levelNumber + '!');  
  } else {  
    showPrompt('Purchase the Level Pack to unlock this level.');  
  }  
}  
  
function onUnlockAccepted(levelNumber) {  
  rewardedAd.showAsync().then(function () {  
    unlockLevel(levelNumber);  
    startLevel(levelNumber);  
    preloadRewardedAd();  
  }).catch(function () {  
    preloadRewardedAd();  
  });  
}

Tip: Consider making ad-unlocked levels temporary (unlocked for 24 hours) so the player needs to watch again or purchase permanently.

5. Score Multiplier

Offer the player a score multiplier before starting a level. This encourages ad engagement at the start of gameplay.

function showPreLevelScreen(levelNumber) {  
  showLevelInfo(levelNumber);  
  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to start with a 2x score multiplier!');  
  }  
}  
  
function onMultiplierAccepted() {  
  rewardedAd.showAsync().then(function () {  
    scoreMultiplier = 2;  
    showMessage('2x Score Multiplier activated!');  
    startLevel();  
    preloadRewardedAd();  
  }).catch(function () {  
    scoreMultiplier = 1;  
    startLevel();  
    preloadRewardedAd();  
  });  
}

6. Speed Up Timers

For games with wait timers (energy refill, building construction, upgrade completion), let players skip the wait by watching an ad.

function onTimerActive(remainingSeconds) {  
  showTimer(remainingSeconds);  
  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to skip the wait!');  
  }  
}  
  
function onSkipTimerAccepted() {  
  rewardedAd.showAsync().then(function () {  
    completeTimerImmediately();  
    showMessage('Timer skipped! Your item is ready.');  
    preloadRewardedAd();  
  }).catch(function () {  
    preloadRewardedAd();  
  });  
}

7. Reveal Hints

In puzzle, trivia, or word games, offer hints in exchange for watching an ad.

function onHintRequested() {  
  if (hintCredits > 0) {  
    useHintCredit();  
    revealHint();  
  } else if (isRewardedAdReady) {  
    showPrompt('Watch a video to get a free hint!');  
  } else {  
    showPrompt('No hints available. Purchase hint packs in the shop.');  
  }  
}  
  
function onAdHintAccepted() {  
  rewardedAd.showAsync().then(function () {  
    revealHint();  
    showMessage('Hint revealed!');  
    preloadRewardedAd();  
  }).catch(function () {  
    preloadRewardedAd();  
  });  
}

8. Cosmetic Trials

Let players preview or temporarily use a premium cosmetic item (skin, avatar, theme) by watching an ad. This serves as a "try before you buy" mechanic.

function onCosmeticPreview(cosmeticId) {  
  showCosmeticDetails(cosmeticId);  
  
  if (isRewardedAdReady) {  
    showPrompt('Watch a video to try this skin for 3 games!');  
  }  
}  
  
function onTrialAccepted(cosmeticId) {  
  rewardedAd.showAsync().then(function () {  
    activateTemporaryCosmetic(cosmeticId, 3); // 3 games  
    showMessage('Skin activated for 3 games! Enjoy!');  
    preloadRewardedAd();  
  }).catch(function () {  
    preloadRewardedAd();  
  });  
}

Tip: Temporary cosmetic trials drive IAP conversions. Players who experience a premium skin are more likely to buy it permanently.

Verifying Ad Completion

The showAsync promise is your verification mechanism:

  • If showAsyncresolves (.then): The player watched the full ad. Grant the reward.
  • If showAsyncrejects (.catch): The player did not complete the ad. Do not grant the reward.

For most games, this client-side verification is sufficient. However, if you are concerned about client-side tampering (e.g., in competitive games with real-money prizes), consider these additional measures:

  • Server-side validation: Send a reward claim to your server after the ad completes. Your server can validate the claim by tracking reward frequency and cross-referencing with expected ad impression data.
  • Rate limiting: Cap the number of rewards a player can earn per day from ads (e.g., maximum 5 extra lives per day, maximum 500 bonus coins per day).

Preloading Strategy

Rewarded ads are larger (especially video ads) and take longer to preload than other formats. Follow this strategy:

  • Start preloading immediately on game init. Do not wait until the player needs the ad.
  • Preload the next ad right after showing one. The player will be in a menu or gameplay for at least 30-60 seconds — plenty of time to preload.
  • Show/hide the reward button based on ad readiness. Only display the "Watch Ad" button when an ad is actually ready to show. Tapping the button and getting an error is a frustrating experience.
  • Retry on failure. If preloading fails, retry after a 30-second delay. Do not retry in a tight loop.
// Show the button only when ad is ready  
function updateRewardButton() {  
  if (isRewardedAdReady) {  
    showWatchAdButton();  
  } else {  
    hideWatchAdButton();  
  }  
}

Best Practices

Make the Reward Valuable

The reward must feel worth the player's time. If the reward is too small (e.g., 5 coins when items cost 500), players will not watch the ad. If the reward is too large (e.g., 1,000 coins when items cost 500), you may undermine your IAP economy. Find the sweet spot where the reward is generous enough to be appealing but not so generous that it replaces purchases entirely.

Clearly Communicate the Exchange

Before showing the ad, tell the player exactly what they will receive. Use clear, specific language:

  • Good: "Watch a short video to earn 100 Gold Coins"
  • Good: "Watch a video for an Extra Life"
  • Bad: "Watch an ad for a reward" (too vague)
  • Bad: "Watch ad" (no mention of what the player gets)

Always Make It Optional

Rewarded ads must always be the player's choice. Never force a player to watch a rewarded ad. There should always be an alternative (close the prompt, use currency instead, or simply not get the reward). The voluntary nature is what makes the format feel fair.

Limit Daily Rewards

Cap the number of ad-funded rewards per day to prevent:

  • Ad fatigue: Players who watch too many ads in one day have a worse experience.
  • Economy inflation: Unlimited free currency from ads can devalue your IAP offerings.
  • Diminishing returns: Ad eCPM can decrease if the same player watches too many ads.

A common approach is 5-10 rewarded ad opportunities per day, depending on the reward value.

Place the Offer at the Right Moment

Offer rewards when the player wants something, not randomly:

  • After game over — "Want to continue?" (the player wants to keep playing)
  • When out of currency — "Need more coins?" (the player wants to buy something)
  • Before a hard level — "Get a power-up boost?" (the player wants an advantage)
  • During daily login — "Double your bonus?" (the player wants more free stuff)

Test and Iterate

  • Track which reward placements get the most opt-ins and the highest completion rates.
  • A/B test different reward values to find the optimal amount.
  • Monitor your IAP revenue alongside rewarded ad usage — make sure ads are complementing purchases, not cannibalizing them.

Next Steps

Unofficial mirror for reference/search purposes. All content originates from developers.facebook.com — see the source link at the top of each page. Machine-readable indexes: llms.txt · llms-full.txt · About