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:
- Add the Instant Games product to your existing Web Game application in the App Dashboard.
- 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:
- Upload an Instant Games bundle built with SDK 8.0 to your Instant Games application by August 31, 2026.
- 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
| Aspect | Canvas Games | Instant 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
| Aspect | Canvas Games | Instant 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
| Aspect | Canvas Games | Instant 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
| Aspect | Canvas Games | Instant 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 |
| Aspect | Canvas Games | Instant 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:
- Go to the App Dashboard.
- Select your existing app.
- In the left sidebar, click Add Product and select Instant Games.
- 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.

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.


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/
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/
- 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/
- 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.
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:
- 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.
- In your Instant Game, call
FBInstant.player.getASIDAsync()to retrieve the ASID, which matches the legacy Canvas user ID. - 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
- Place all of your game files in a single directory with
index.htmlat the root. - Include your
fbapp-config.jsonconfiguration file at the root. See Bundle Configuration.Minimally, your file structure should look like this:bundle/ | index.html | fbapp-config.json - Create a ZIP file of the directory contents (not the directory itself —
index.htmlshould be at the top level of the ZIP). - Go to the App Dashboard, select your app, and navigate to Instant Games > Web Hosting.
- Upload the ZIP file as a new build.
- 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()andstartGameAsync()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.


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.
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.htmlentry point. - Configure the bundle. Create the
fbapp-config.jsonfile at the root. - Implement SDK initialization. Integrate
initializeAsync(),setLoadingProgress(), andstartGameAsync(). - Update identity. Replace legacy authentication with
FBInstant.player.getID()and implement the ASID linking logic withFBInstant.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:
- SDK Reference — Complete API documentation for the Instant Games SDK.
- Player Identification Post Migration — How to map player identifiers between Canvas Games and Instant Games.
- Game Testing — Comprehensive testing guide.
- FAQ — Answers to frequently asked questions.
- Get Support — Support channels for developers.
Next steps
Once your game is running as an Instant Game:
- Optimize performance. Review Game Performance to ensure fast loading and smooth gameplay.
- Enhance social features. Explore Retain for guides on tournaments, challenges, and other social features that were not available on Canvas.
- Launch. Follow the Launch checklist to submit your game for review and go live.

Social Features