Instant Games

Migrating from Canvas Games

Updated: Jul 15, 2026
Copy for LLM
If you have an existing Canvas Game (also known as a Legacy Web Game) running on Facebook, this guide will help you migrate it to the Instant Games platform. Canvas Games are being deprecated, and Instant Games are the actively supported game platform on Facebook. Migrating your game ensures continued access to Facebook’s gaming audience, modern social features, and current monetization tools.
We understand that migrating a live game is a significant undertaking. This guide is designed to walk you through the process methodically, covering every major area where Canvas Games and Instant Games differ. Take it one section at a time, and test thoroughly at each step.
This document serves to provide information and context to developers upgrading their Canvas Game to Instant Games (with Network Enabled Zero Permissions).
Note: For cases where your Canvas Game App ID differs from your Instant Game App ID, an Application Migration is required. You can access this through Gaming Services > Migration in the App Dashboard. This links the two App IDs so that player identity can be mapped between them.

Additional Time for Games Actively Migrating

We understand that the Web Games migration is a significant undertaking, and some developers may need additional time to complete platform reviews and testing. For games that are actively in the process of migrating, the following adjusted timeline applies:
  • December 1, 2026: In-app purchases (IAP) on the Web Games version will be turned off. We recommend providing notice to your end users to set their expectations accordingly.
  • December 30, 2026: Web Games that have not completed migration will no longer be accessible by end users on Facebook.
To qualify for this adjusted timeline, you must demonstrate that your game is actively migrating by August 31, 2026. The specific steps depend on whether you are migrating using the same app ID or a different app ID.

If you are migrating with the same app ID

This is the recommended path. You add the Instant Games product directly to your existing Web Game application and upload your bundle there.
Steps to confirm your migration:
  1. Add the Instant Games product to your existing Web Game application in the App Dashboard.
  2. Upload an Instant Games bundle built with SDK 8.0 to your Web Game application by August 31, 2026.

If you are migrating with a different app ID

If you create a separate Instant Games application rather than adding the Instant Games product directly to your existing Web Games application, you can still qualify for the adjusted timeline.
Steps to confirm your migration:
  1. Upload an Instant Games bundle built with SDK 8.0 to your Instant Games application by August 31, 2026.
  2. In the Cross play management setting of your Instant Games, link the original Web Game application as the Linked Off-Platform App for your migration.
Important: Linking your Web Games with your Instant Games application is irreversible. You should finalize the Instant Games application to which your Web Game is intended to migrate before linking them.

If you do not plan to migrate

You do not need to take any action. Any app that is not linked to an Instant Game via either of the two paths above by August 31, 2026 will be treated as not migrating. There will be no exceptions for this deadline. The following timeline applies:
  • September 1, 2026: In-app purchases (IAP) will be turned off for Web Games that are not migrating. We recommend providing notice to your end users to set their expectations accordingly.
  • September 30, 2026: Web Games that are not migrating will no longer be accessible by end users on Facebook.
We encourage all developers planning to migrate to confirm their migration plans by uploading their bundle as early as possible to avoid any disruption to their game’s monetization.

Key Differences Between Canvas and Instant Games

Before diving into the migration steps, it is important to understand the fundamental differences between the two platforms. These differences affect your architecture, your code, and your player experience.

Hosting and Delivery Model

AspectCanvas GamesInstant Games
Hosting
You host the game on your own servers. Facebook loads it in an iframe.
You upload a bundle (ZIP file) to Facebook. Facebook hosts and serves your game. Optionally, you can host assets on your own CDN if Zero Permissions is enabled.
Iframe
Your game runs inside an iframe on facebook.com.
Your game runs inside Facebook’s own sandbox iframe, with Content Security Policy (CSP) controls and other security protocols. The game appears in a dedicated, full-screen web view within the Facebook app (mobile) or in a dedicated page (web).
Server requirement
A web server is required to serve your game.
No server is required for the game client. A server is optional (for multiplayer, analytics, etc.) and requires Zero Permissions to be enabled.

SDK

AspectCanvas GamesInstant Games
SDK
Facebook JavaScript SDK (FB.init(), FB.api(), etc.)
Instant Games SDK (FBInstant)
Initialization
FB.init({ appId: '...', ... })
FBInstant.initializeAsync().then(() => { ... })
Loading flow
No explicit loading flow. Game appears when the iframe loads.
Explicit loading lifecycle: initializeAsync() -> report progress with setLoadingProgress() -> startGameAsync()

Authentication

AspectCanvas GamesInstant Games
Authentication
Facebook Login with OAuth. You receive an access token. You can call the Graph API from the client or your server.
Automatic. The player is already signed into Facebook. No login prompt. You receive a signed player object via FBInstant.player. No direct Graph API access from the client.
Player identity
Facebook user ID (real, stable across apps with same business)
Context-specific player ID via FBInstant.player.getID(). This ID is unique to your game and is not the same as the Facebook user ID. Use FBInstant.player.getSignedPlayerInfoAsync() for server-side identity verification.

Monetization

AspectCanvas GamesInstant Games
Payments
Facebook Payments (Credits, then local currency payments via FB.ui({ method: 'pay', ... }))
Instant Games In-App Purchases (FBInstant.payments.getCatalogAsync(), FBInstant.payments.purchaseAsync()) or In-App Advertising (FBInstant.getRewardedVideoAsync(), FBInstant.getInterstitialAdAsync(), FBInstant.getBannerAdAsync())
Payment model
Server-to-server payment callbacks with order verification
Client-side purchase flow with signed purchase receipts for server verification

Social Features

AspectCanvas GamesInstant Games
Social interactions
Graph API calls for friends, feed posts, requests (FB.ui({ method: 'apprequests', ... }))
Instant Games SDK social APIs: FBInstant.player.getConnectedPlayersAsync(), FBInstant.updateAsync(), FBInstant.shareAsync(), FBInstant.context.chooseAsync(), tournaments

Step-by-Step Migration Process

Phase 1: Setting up the Instant Games Application

Step 1: Add the Instant Game product to your app

If your Canvas Game already has a Facebook App ID, you can add Instant Games to the same app:
  1. Go to the App Dashboard.
  2. Select your existing app.
  3. In the left sidebar, click Add Product and select Instant Games.
  4. Complete the initial Instant Games setup, including uploading a placeholder bundle.
Note: If you are unable to find or add the Instant Games product to your app, please contact your partner manager or contact support.
Add Instant Games Product

Step 2: Select Zero Permissions in Network Connection Settings

Select Zero Permissions in the Connection Experience Settings page. This will begin the transition of your game from standard permissions to Zero Permissions. Connection Experience Settings

Step 3: Apply for Advanced Zero Permission Access

Submit a request for Zero Permissions Advanced Access through the App Review > Permissions and Features interface. This is required for games undergoing Canvas-to-Instant Games migration, as it allows your application to exist in both Canvas and Instant Games states during the course of the migration. This Advanced Access will revert to Standard Access when the migration is complete. Direct link: https://developers.facebook.com/apps/YOUR_APP_ID/app-review/permissions/Permissions and Features page showing Zero Permission Access

Step 4: Resolve health check items

Check the Instant Games > Launch Status page for any health check items that need to be resolved before your game can go live. Direct link: https://developers.facebook.com/apps/YOUR_APP_ID/instant-games/launch-status/Instant game health check showing required actions
  • If prompted, go to Instant Games > Audience Details to confirm your app details and submit an IARC certificate. Direct link: https://developers.facebook.com/apps/YOUR_APP_ID/instant-games/audience-details/Audience details page with age confirmation and IARC certificate
  • If prompted, go to the Instant Games > Migration page and confirm the User data deletion clause. You must agree to delete all personally identifiable information (name, profile picture, friends data) within 90 days of starting migration. Direct link: https://developers.facebook.com/apps/YOUR_APP_ID/instant-games/migration/
  • Once added, configure and confirm your game details under Instant Games > Details. Direct link: https://developers.facebook.com/apps/YOUR_APP_ID/instant-games/details/
Note: If you prefer, you can also create a new app specifically for the Instant Games version. This can be useful if you want to run both versions side by side during the transition, but be aware that players will have separate identities and data between the two apps. More information on identifying players between Canvas and Instant Games can be found here.
At this point your application will have Network Enabled Zero Permissions set up, however your players will not receive the game until the new version has been approved and the migration mode has been fully rolled out.

Phase 2: Restructuring Your Game Client

Canvas Games are typically structured as full web applications that expect to be served from a web server. Instant Games are structured as self-contained bundles. This section outlines the steps to convert your Canvas Game into an Instant Game bundle.

Step 5: Replace SDK Initialization

Canvas (before):
window.fbAsyncInit = function() {
  FB.init({
    appId: 'YOUR_APP_ID',
    cookie: true,
    xfbml: true,
    version: 'v18.0'
  });
};
Instant Games (after):
FBInstant.initializeAsync().then(function() {
  // SDK is ready. Load your game assets here.
  // Report loading progress to the platform:
  FBInstant.setLoadingProgress(50);

  // When your game is fully loaded and ready to play:
  FBInstant.startGameAsync().then(function() {
    // The loading screen is dismissed. Start gameplay.
    startMyGame();
  });
});
The loading lifecycle is important. The platform shows a loading screen to the player until you call startGameAsync(). Use setLoadingProgress() to provide a smooth progress bar experience. Do not call startGameAsync() until your game is genuinely ready for the player to interact with.

Step 6: Update Authentication and Player Identity

Canvas (before):
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    var userId = response.authResponse.userID;
    var accessToken = response.authResponse.accessToken;
    // Use accessToken to call Graph API
  }
});
Instant Games (after):
// After initializeAsync() resolves:
var playerID = FBInstant.player.getID();       // Unique to your game

// For server-side verification:
FBInstant.player.getSignedPlayerInfoAsync('my_request_payload')
  .then(function(result) {
    var signature = result.getSignature();
    // Send signature to your server for verification
  });
Note: To display the player’s name or photo, use overlay views. See Displaying the Current Player’s Profile for examples.
Important differences:
  • There is no login prompt. The player is always authenticated.
  • The player ID from FBInstant.player.getID() is not the same as the Facebook user ID you received in Canvas Games. It is a game-scoped ID. See Player Identification Post Migration for how to map players between your Canvas Game and your Instant Game using the available APIs.
  • There is no access token and no direct Graph API access from the client. All social data is accessed through the Instant Games SDK.
  • Player names and photos are rendered through overlay views and cannot be accessed directly in your game code.

Step 7: Update Social Features

Friends
Canvas (before):
FB.api('/me/friends', function(response) {
  // response.data contains friends who also use the app
});
Instant Games (after):
FBInstant.player.getConnectedPlayersAsync()
  .then(function(players) {
    players.forEach(function(player) {
      console.log(player.getID());
    });
  });
Sharing
Canvas (before):
FB.ui({
  method: 'feed',
  link: 'https://apps.facebook.com/mygame/',
  caption: 'I just scored 1000 points!'
});
Instant Games (after):
FBInstant.shareAsync({
  intent: 'SHARE',
  image: base64EncodedImage,  // Base64-encoded image data
  text: 'I just scored 1000 points!'
}).then(function() {
  // Share was completed
}).catch(function(error) {
  // Share was cancelled or failed
});
Invitations / Requests
Canvas (before):
FB.ui({
  method: 'apprequests',
  message: 'Come play my game!'
});
Instant Games (after):
// Choose a context (conversation) to play in:
FBInstant.context.chooseAsync().then(function() {
  // Player selected a friend or group. Send an update:
  FBInstant.updateAsync({
    action: 'CUSTOM',
    cta: 'Play Now',
    image: base64EncodedImage,
    text: {
      default: 'Come play with me!',
    },
    template: 'invite',
    strategy: 'IMMEDIATE',
    notification: 'PUSH',
  });
});

Step 8: Update Monetization

In-App Purchases
If your Canvas Game used Facebook Payments, you will need to migrate to the Instant Games In-App Purchases (IAP) system.
Canvas (before):
FB.ui({
  method: 'pay',
  action: 'purchaseitem',
  product: 'https://myserver.com/products/gems_100.html',
  quantity: 1
}, function(response) {
  // Handle purchase callback
});
Instant Games (after):
First, set up your product catalog in the App Dashboard under Instant Games > In-App Purchases.
Then, in your game code:
// Get the product catalog
FBInstant.payments.getCatalogAsync().then(function(catalog) {
  catalog.forEach(function(product) {
    console.log(product.productID, product.title, product.price);
  });
});

// Make a purchase
FBInstant.payments.purchaseAsync({
  productID: 'gems_100',
  developerPayload: 'optional_payload'
}).then(function(purchase) {
  // Purchase successful
  console.log(purchase.purchaseToken);

  // Consume the purchase (for consumable products)
  return FBInstant.payments.consumePurchaseAsync(purchase.purchaseToken);
}).then(function() {
  // Purchase consumed, grant the item to the player
});
Important: The product catalog, pricing, and product metadata are now managed in the App Dashboard rather than being hosted on your server. You will need to recreate your products in the dashboard.
In-App Advertising
Instant Games support ads through Facebook Audience Network. If your Canvas Game did not use ads, this is an opportunity to add a new revenue stream.
Note: Interstitial ads have been replaced by Rewarded Video ads.
// Rewarded video
FBInstant.getRewardedVideoAsync('YOUR_PLACEMENT_ID')
  .then(function(rewarded) {
    return rewarded.loadAsync();
  })
  .then(function(rewarded) {
    return rewarded.showAsync();
  })
  .then(function() {
    // Player watched the ad. Grant the reward.
  });

// Interstitial ad
FBInstant.getInterstitialAdAsync('YOUR_PLACEMENT_ID')
  .then(function(interstitial) {
    return interstitial.loadAsync();
  })
  .then(function(interstitial) {
    return interstitial.showAsync();
  });

Step 9: Update Data Persistence

Canvas (before):
Canvas Games typically stored player data on the developer’s own server, often using the Facebook user ID as the key.
Instant Games (after):
Instant Games provide built-in cloud storage through the SDK:
// Save data
FBInstant.player.setDataAsync({
  level: 5,
  score: 1200,
  inventory: ['sword', 'shield']
}).then(function() {
  // Data saved
});

// Load data
FBInstant.player.getDataAsync(['level', 'score', 'inventory'])
  .then(function(data) {
    console.log(data.level);  // 5
    console.log(data.score);  // 1200
    console.log(data.inventory);  // ['sword', 'shield']
  });
If your game has complex data requirements that exceed what the SDK’s cloud storage provides, you can use your own backend server with a Content Security Policy (CSP) allowlist enabled for that domain.
Data migration with ASIDs
Because Player IDs differ between Canvas and Instant Games, you must map them to preserve player progress. Use the Application-Scoped ID (ASID) to link accounts:
  1. Set up the Cross-play management tool through Instant Games > Audience Details in the App Dashboard to link your legacy app and the Instant Game.
  2. In your Instant Game, call FBInstant.player.getASIDAsync() to retrieve the ASID, which matches the legacy Canvas user ID.
  3. Use the ASID to look up the player’s existing backend data and merge it with their new Instant Games Player ID.
See Player Identification Post Migration for full details on the available mapping APIs.
Alternative approaches:
  • Providing a one-time migration code that players can enter in the Instant Game to recover their progress.
  • Accepting that some players may start fresh, and focusing your migration effort on active, high-value players.

Step 10: Enable Zero Permissions (if needed)

If your game communicates with external servers — for multiplayer, server-side logic, analytics, or data migration — you will need to enable Zero Permissions. See Zero Permissions for instructions.
All external requests must use HTTPS. Enabling Zero Permissions updates the Content Security Policy (CSP) to allow requests to your allowlisted domains.

Step 11: Package and upload your bundle

  1. Place all of your game files in a single directory with index.html at the root.
  2. Include your fbapp-config.json configuration file at the root. See Bundle Configuration.
    Minimally, your file structure should look like this:
    bundle/
    |  index.html
    |  fbapp-config.json
    
  3. Create a ZIP file of the directory contents (not the directory itself — index.html should be at the top level of the ZIP).
  4. Go to the App Dashboard, select your app, and navigate to Instant Games > Web Hosting.
  5. Upload the ZIP file as a new build.
  6. Mark the build as the active build for testing, or push it to production when ready.

Step 12: Test thoroughly

Testing is critical after a migration. See Game Testing for a complete testing guide. Pay special attention to:
  • Loading flow: Ensure initializeAsync() and startGameAsync() work correctly and the loading progress bar behaves as expected.
  • Player identity: Verify that player IDs are being handled correctly and that your game does not accidentally use stale Canvas-era user IDs. See Player Identification Post Migration for details on mapping player identities across platforms.
  • Social features: Test sharing, connected players, and context switching.
  • Monetization: Test purchases using test users and verify that ad placements load and display correctly.
  • Data persistence: Verify that saving and loading player data works reliably.
  • Cross-platform: Test on iOS, Android, and web. Canvas Games only ran on the web, but Instant Games run on mobile as well. Ensure your game’s UI and controls work on touchscreens.
For testing your game internally, you have a few options in the App Dashboard:
  • ASID Override is a feature that allows you to override the ASID of a test user. This is useful for testing the migration flow.
  • Setting the test migration toggle will serve the Instant Game bundle to the testers.

Step 13: Submit your game for app review

When you are ready, submit your application for app review in Instant Games > Review > App Review for Instant Games. Once approved, you will be able to begin the rollout to your players. This process will take a few days, but you can continue to test your game in the meantime. App Review for Instant Games

Phase 3: Rolling out to production

Step 14: Setting a bundle for Instant Games and NEZP environment

As NEZP is a new environment, you need to set the bundle for the Instant Games and NEZP environment separately. You can select this on the App Dashboard under Instant Games > Web Hosting.

Step 15: Rolling out to public users

When rolling out your game to your players in public, you have the option to rollout to a percentage of your players. This is done by setting the rollout percentage in the App Dashboard.
Note: Rolling out is only incremental and cannot be rolled back. Migration settings
When migration is complete, the bundle marked as the Shield bundle will be changed to Production, and will be what is served to the public. No further action is required. At this point, your game will be fully migrated to Instant Games with Network Enabled Zero Permissions.

Common Migration Challenges

Web Game Test App Limitations

Test apps cannot add the Instant Games product. This is a platform limitation. If your game relies on test apps as part of your processes, you’ll need to decide on your migration path upfront, which determines how to set up your Instant Games app. You have two migration paths:
Path A: Same-App-ID Migration
  • Add Instant Games directly to your existing Web Game app in the developer portal.
  • No new app ID needed. Your Web Game app becomes both your Web Game and Instant Game app.
  • Best for teams that want to preserve their existing app ID and avoid player ID remapping.
Path B: Different-App-ID Migration
  • Create a new app that will serve as your production Instant Games app, then link it to your Web Game app through the cross-play flow.
  • Best for teams that prefer a clean separation between their Web Game and Instant Game builds.
Important for both paths: Migration does not “start” for your live users until you roll out to more than 0%. So there’s no risk to your active player base while you’re building and testing. You can iterate freely on your Instant Games build without any user-facing impact.
One note on setup: Whichever path you choose, the Instant Games app you develop against should be the same one you intend to use for your production migration. We recommend deciding your path now so your QA and development work carries straight through to launch.

Screen Size and Responsive Design

Canvas Games ran in a fixed-size iframe on the desktop web. Instant Games run on a wide variety of screen sizes, including mobile phones and tablets. You may need to make your game responsive or add support for different aspect ratios.
Use FBInstant.getEntryPointData() and listen to window.resize events to adapt your layout dynamically. Consider supporting both portrait and landscape orientations, and configure your preferred orientation in fbapp-config.json.

No Direct Graph API Access

In Canvas Games, you could call the Graph API directly from the client using the access token. In Instant Games, there is no access token and no direct Graph API access. All social data must be accessed through the Instant Games SDK.
If you need server-side Graph API access, you can use your app’s access token on your backend server (with Zero Permissions enabled for client-server communication), but be mindful of platform policies regarding data usage.

Different Player IDs

As mentioned above, the player ID in Instant Games is game-scoped and different from the Facebook user ID used in Canvas Games. Plan accordingly for any features that depend on stable player identity across platforms. See Player Identification Post Migration for the APIs available to map between these identifiers.

Payment Product Migration

Your existing Facebook Payments product catalog does not automatically transfer to Instant Games IAP. You will need to recreate your products in the App Dashboard and update your client-side code to use the new purchase flow.

Unable to connect or call external resources

Instant Games using Network Enabled Zero Permissions functions inside a sandbox; this is required to ensure that the game is running in a secure environment and that user data is protected. If your game relies on external resources, you will need to allowlist them through your partner manager or as a request through dev comms. A self-serve CSP allowlist tool will be coming soon.

Migration checklist

Pre-migration preparation

  • Review documentation. Read this guide, the Zero Permissions Overview, and the SDK Reference.
  • Audit current architecture. Identify all server-side rendering, Graph API calls, and Facebook Payments integrations that need to be replaced.
  • Plan data migration. Formulate a strategy for mapping legacy Canvas user IDs (ASIDs) to new Instant Games Player IDs to preserve player progress.
  • Prepare assets. Ensure you have the required assets: 800x800 game icon, 1200x630 landscape cover, 1080x1080 square cover, and a gameplay MP4 video.
  • Set up the App Dashboard. Decide whether to add the Instant Games product to the existing app or create a new one.

During migration (development)

  • Restructure the client. Convert the game to a static client-side bundle with an index.html entry point.
  • Configure the bundle. Create the fbapp-config.json file at the root.
  • Implement SDK initialization. Integrate initializeAsync(), setLoadingProgress(), and startGameAsync().
  • Update identity. Replace legacy authentication with FBInstant.player.getID() and implement the ASID linking logic with FBInstant.player.getASIDAsync().
  • Migrate social APIs. Replace Graph API sharing and friend requests with Instant Games social APIs (shareAsync, updateAsync, getConnectedPlayersAsync).
  • Migrate monetization. Recreate IAP products in the App Dashboard and implement the new client-side purchase flow. Integrate Audience Network ads if applicable.
  • Enable Zero Permissions. Toggle Zero Permissions in the App Dashboard if your game requires external server communication via HTTPS.
  • Request Advanced Access. Submit a request for Zero Permissions Advanced Access through App Review > Permissions and Features to allow your app to exist in both Canvas and Instant Games states during the migration.

Post-migration (testing and launch)

  • Local testing. Test game logic locally using a mock SDK or local HTTPS server.
  • Platform testing. Upload the bundle to Web Hosting and test on the platform.
  • Cross-device testing. Verify functionality on iOS (Facebook app), Android (Facebook app), and desktop web (facebook.com/gaming). Ensure the UI is responsive to different screen sizes.
  • Social and IAP testing. Use App Dashboard test users to verify connected players, sharing, and in-app purchases.
  • Performance testing. Ensure the game loads in under 5 seconds on average networks and handles network interruptions gracefully.
  • App review and quality review. Submit the game for Instant Games Quality Review and ensure all required permissions and IAP reviews are approved.
  • Legal and configuration check. Verify that the Privacy Policy URL, Terms of Service URL, Data Deletion Callback, and Business Verification are complete.
  • Push to production. Select the approved version in Web Hosting, click Push to Production, and switch the App Mode to Live.
  • Post-launch monitoring. Monitor analytics (DAU, retention, session length) and watch for crashes, errors, or long load times in the early days after launch.

Getting help

Migrating from Canvas to Instant Games is a significant project, and you may encounter issues that are specific to your game’s architecture. Here are resources that can help:

Next steps

Once your game is running as an Instant Game:
  1. Optimize performance. Review Game Performance to ensure fast loading and smooth gameplay.
  2. Enhance social features. Explore Retain for guides on tournaments, challenges, and other social features that were not available on Canvas.
  3. Launch. Follow the Launch checklist to submit your game for review and go live.