Why Meta rejects apps
Rejections aren’t random. Almost every one I fix comes down to one of these 16, and each has a clear fix.
-
The reviewer can’t follow your notes
What the reviewer sees
A wall of text, or one paragraph covering every permission. The reviewer can’t tell where to click, so they stop and reject.
The fix
- Write numbered steps for each permission separately: where to go, what to click, what should happen.
- Start every set of steps from the login screen, not from somewhere deep in the app.
- Name the permission at the step where it is used, and match the order of your screencast.
Notes that pass
1. Open https://app.example.com and log in with the test account below. 2. Click “Connect Instagram” and approve. 3. Open Inbox, choose any conversation, type a reply and press Send. 4. The reply appears in the customer’s Instagram DMs (shown at 1:42 in the video).
-
The reviewer can’t get in
What the reviewer sees
Test credentials are missing, expired or only cover one layer. The website login works, but there is no Facebook, Instagram, Threads or WhatsApp account to connect, or two-step verification blocks the reviewer.
The fix
- Give credentials for every layer: your app’s login, plus a Facebook, Instagram, Threads or WhatsApp test account with the right role.
- Turn off two-step verification, IP allow-lists and invite-only signup for the test account.
- Unlock paid features and skip onboarding, so nothing stands between login and the feature.
- Log in from a private window on another network before submitting.
-
The screencast shows a different feature from the permission
What the reviewer sees
The permission is real, but what the video shows belongs to a different one. The most common mix-up is between the two engagement permissions.
The fix
- Map each permission to one feature before recording.
pages_is for reading the Page’s own posts, followers and metadata, so show posts or Page stats loading in your app.read_ engagement pages_is for acting on comments as the Page, so show replying to, hiding or deleting a comment, then show the result on Facebook.manage_ engagement pages_covers what visitors post, such as comments, posts and reviews from other people.read_ user_ content
Proof:
pages_read_engagementpages_manage_engagementpages_read_user_content -
The privacy policy doesn’t load or says nothing
What the reviewer sees
The privacy policy URL returns a 404, redirects to a login page, or is a generic template that never mentions Meta data.
The fix
- Use a public URL that loads without login, on your own domain.
- Name your app or company, list the Meta data you collect, why, how long you keep it, and how users can delete it.
- Add a working data deletion callback URL, or a page with deletion instructions.
-
App settings point to the wrong place
What the reviewer sees
The App URL, Site URL or App Domains in Basic Settings are empty, point to a placeholder, or don’t match where the reviewer is told to log in. OAuth redirect URIs don’t match either, so login fails.
The fix
- Set the Site URL and App Domains to the live domain the reviewer will use.
- Add every redirect URI your login uses under Valid OAuth Redirect URIs.
- Make sure the URL in your notes, the URL in settings and the URL in the video are the same.
-
The login dialog doesn’t show the permissions you requested
What the reviewer sees
In the video, Facebook Login (or the “Edit access” screen) lists fewer permissions than the submission. The reviewer can’t see the user granting what you asked for.
The fix
- Add every requested scope to your login call, or to your Facebook Login for Business configuration.
- Record the full permission dialog, and open “Edit access” so each scope is visible.
- Remove scopes from the submission that your login never asks for.
-
You requested a permission your app never calls
What the reviewer sees
App Review shows no successful API calls for the permission, or the scope isn’t in the login request at all. To Meta it looks unused.
The fix
- Make at least one successful call for each permission with a test user before submitting. App Review shows the call count next to each one.
- Request only what the feature needs.
business_is not needed to list Pages;management pages_does that.show_ list - If a feature isn’t built yet, leave its permission out of this submission.
-
The video never shows the result on Facebook, Instagram or WhatsApp
What the reviewer sees
The app shows “Posted!” or “Message sent”, but the reviewer never sees it arrive on Meta’s side, so there is no proof the permission did anything.
The fix
- For every permission, show the action in your app and then the result on Facebook, Instagram, Threads or a WhatsApp phone.
- Keep a second window or phone on screen for that moment.
Proof:
instagram_content_publishpages_manage_postswhatsapp_business_messagingthreads_content_publish -
The use case is vague or copy-pasted
What the reviewer sees
The same paragraph is pasted under every permission, or it says things like “to improve our service”. The reviewer can’t tell who uses the feature or why.
The fix
- Write one short paragraph per permission: who the user is, what they do, and what they get.
- Use the permission’s own language. For messaging: “Support agents reply to customer DMs from one inbox.”
-
A bot is shown where a human use case is required
What the reviewer sees
Messaging permissions or Human Agent are requested, but the video only shows automated replies.
The fix
- Show a person reading the message and typing the reply in your inbox.
- For Human Agent, show a conversation older than 24 hours and the human reply arriving in Messenger or Instagram.
Proof: Human Agent
pages_messaginginstagram_business_manage_messagesinstagram_manage_messages -
The permission doesn’t match the login flow
What the reviewer sees
instagram_scopes requested with Facebook Login, orbusiness_ * instagram_with Instagram Business Login. The reviewer can’t exercise the permission in the flow you showed.basic The fix
- Instagram Business Login uses the
instagram_scopes.business_ * - Facebook Login needs a Facebook Page linked to the Instagram account, and uses
instagram_,basic instagram_and so on.manage_ messages
- Instagram Business Login uses the
-
The test account isn’t set up for the API
What the reviewer sees
A personal Instagram account instead of a professional one, “Allow access to messages” turned off, a Threads tester invite not accepted, or a new account with no data, so insights are blank.
The fix
- Use a Business or Creator Instagram account, with message access for connected tools turned on.
- Accept tester invites before recording.
- Use an account with real activity, or create the activity on camera.
Proof:
instagram_business_manage_messagesinstagram_manage_insightsthreads_basic -
Business verification is missing or doesn’t match
What the reviewer sees
Advanced Access needs a verified business, and the legal name, address or phone on the documents doesn’t match Business Manager or the website.
The fix
- Use the exact legal name everywhere: documents, Business Manager and the website footer.
- Verify a domain or domain email first.
- For apps serving other businesses, complete Access Verification (Tech Provider) too.
-
The app isn’t finished
What the reviewer sees
Buttons that do nothing, placeholder screens, or a loading spinner where the result should be. Reviewers test the app as it is.
The fix
- Submit only the permissions whose features work end to end today.
- Request the rest in a later submission, once they’re built.
-
The reviewer can’t read the app
What the reviewer sees
The interface or video is in a language other than English, with no captions, so the reviewer can’t follow what happens.
The fix
- Switch the app to English for the recording, or add English captions to every step.
- Write the notes in English, even if your users don’t use it.
-
The app name or icon uses Meta’s brands
What the reviewer sees
Names like “InstaHelper” or “FB Tools”, or an icon that looks like a Meta logo. These fail Meta’s brand rules.
The fix
- Use your own product name and icon.
- Mention Facebook or Instagram only to describe what you connect to, as in “Scheduler for Instagram”.
Deep dives
- Meta App Review Rejected? The 9 Real Reasons and How to Fix Each
The rejection reasons Meta reviewers actually use, what each one means in plain language, and the specific fix that gets the permission approved on resubmission.
- How to Record a Screencast Meta Reviewers Approve
A step-by-step recording plan for Meta App Review screencasts: what to show for each permission, how to caption it, and the mistakes that get otherwise good apps rejected.
- Human Agent Permission Rejected: How to Get It Approved
Why Meta rejects the Human Agent feature for Messenger and Instagram, what the 7-day HUMAN_AGENT tag actually allows, and how to show a use case reviewers accept.
- instagram_business_manage_messages vs instagram_manage_messages: Which Should You Request?
The difference between Instagram Business Login scopes and the older Facebook Login Instagram permissions, which one your app needs, and why mixing them gets rejected.
- Meta Business Verification Rejected: Documents That Actually Work
Why Meta Business Verification fails, which documents pass, how to match your business details, and how it connects to Advanced Access and Tech Provider verification.
- Threads API App Review: Permissions and Approval Checklist
Every Threads API permission, what each one needs to show in App Review, and a pre-submission checklist for threads_content_publish, replies, insights and keyword search.