← back to Marketing Command Center
Add Meta App Review prep doc (System-User route + full review steps, paste-ready justifications)
e76aecd2378bbd4a3bba1e2f68ccedeb58f9e0f8 · 2026-06-15 12:20:12 -0700 · SteveStudio2
Files touched
A docs/META-APP-REVIEW.md
Diff
commit e76aecd2378bbd4a3bba1e2f68ccedeb58f9e0f8
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Mon Jun 15 12:20:12 2026 -0700
Add Meta App Review prep doc (System-User route + full review steps, paste-ready justifications)
---
docs/META-APP-REVIEW.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 99 insertions(+)
diff --git a/docs/META-APP-REVIEW.md b/docs/META-APP-REVIEW.md
new file mode 100644
index 0000000..d3cb3c6
--- /dev/null
+++ b/docs/META-APP-REVIEW.md
@@ -0,0 +1,99 @@
+# Meta App Review — getting FB + Instagram to post LIVE
+
+**App:** DW Marketing · **App ID:** `985142067843357` · owned by the Designer
+Wallcoverings business portfolio (`214184499265528`).
+
+## The problem (root cause)
+
+MCC connects and **reads** Facebook/Instagram fine (we pulled the page list +
+`@designerwallcoverings` follower count). But **publishing fails**:
+
+```
+(#200) The permission(s) pages_manage_posts are not available … need to be approved by App Review.
+(#10) Application does not have permission for this action ← instagram_content_publish
+```
+
+Every token minted via Graph API Explorer comes back WITHOUT the two **write**
+scopes — `pages_manage_posts` and `instagram_content_publish`. They have
+**Advanced Access** gating: Meta no longer hands them to a plain admin token on a
+use-case app. Two ways past it, in order of effort.
+
+---
+
+## ROUTE A — System User token (try this FIRST, often no full review)
+
+A Business **System User** token for assets the business **owns** frequently
+carries the write scopes without a public App Review, because it's first-party
+access to owned pages.
+
+1. https://business.facebook.com/settings → **Users → System Users**
+2. **Add** → name `MCC Publisher` → role **Admin** → Create
+3. **Add Assets** → Pages → select **DesignerWallcoverings.com** → toggle
+ **Manage Page** (full control) ON. Repeat for any other pages to post from.
+ Add Assets → Instagram accounts → select **@designerwallcoverings**.
+4. **Generate New Token** → app = **DW Marketing** → check:
+ - `pages_manage_posts`
+ - `pages_read_engagement`
+ - `pages_show_list`
+ - `instagram_basic`
+ - `instagram_content_publish`
+ - `business_management`
+ → **Generate**, copy the token.
+5. Paste the token to Claude. We re-run `debug_token`; if the two write scopes
+ are present, MCC posts live immediately (System User tokens are long-lived /
+ effectively non-expiring). **Done — no public review.**
+
+If `debug_token` STILL shows the writes missing → the app needs Advanced Access
+granted, which means Route B.
+
+---
+
+## ROUTE B — Full App Review (Advanced Access)
+
+Needed only if Route A doesn't grant the writes. Days-long Meta-side approval.
+
+### Prerequisites (do once)
+- **Business verification** — Business Settings → Security Center → Verify the
+ Designer Wallcoverings business (legal docs / domain). Required for Advanced
+ Access.
+- **Privacy Policy URL** — App Settings → Basic. Use
+ `https://designerwallcoverings.com/policies/privacy-policy`.
+- **App icon** (1024×1024) + **Category** (Business & Pages) in Settings → Basic.
+- App stays in the Designer Wallcoverings business (already is).
+
+### Request the permissions
+App Dashboard → **App Review → Permissions and Features** → request **Advanced
+Access** for each:
+
+| Permission | Justification (paste-ready) |
+|---|---|
+| `pages_manage_posts` | "Our internal Marketing Command Center schedules and publishes photo and text posts to Facebook Pages that our business owns and manages (Designer Wallcoverings and sister brand pages). No third-party or end-user pages are accessed." |
+| `pages_read_engagement` | "We read post/engagement metrics on our own Pages to report performance inside our internal dashboard." |
+| `instagram_content_publish` | "We publish images with captions to the Instagram Business accounts we own that are linked to our Pages (e.g. @designerwallcoverings), scheduled from our internal dashboard." |
+| `instagram_basic` | "We read the linked IG Business account's id/username/media count to display account status and confirm the publish target." |
+| `business_management` | "We enumerate the Pages and linked IG accounts our business owns so the dashboard can list valid publish targets." |
+
+### Screencast the reviewers need (record one ~2-min video)
+Show the full Facebook-login → use flow, because reviewers must see real usage:
+1. Open MCC → log in (show the basic-auth, then the dashboard).
+2. Channels panel → click **Connect Facebook** → complete the FB login consent,
+ granting the listed permissions.
+3. Compose a post (caption + image) → select the DesignerWallcoverings page +
+ @designerwallcoverings → **Publish** → show it succeed.
+4. Open the actual Facebook Page + Instagram and show the post live.
+Upload the video in each permission's submission. (A reviewer test account /
+instructions box: "This is an internal tool; the attached video demonstrates the
+full publish flow on our own owned assets.")
+
+### Submit
+App Review → **Requests** → review the bundle → **Submit**. Typical turnaround
+2–7 business days. While pending, MCC keeps **staging** posts (no data lost) and
+flips to live the moment Advanced Access is granted — no code change needed.
+
+---
+
+## After approval
+Mint the token (System User per Route A, or Graph Explorer), paste to Claude →
+we save `FB_PAGE_ACCESS_TOKEN` / `IG_ACCESS_TOKEN` and the publish pipeline goes
+live. The Streams Board's Facebook/Instagram columns flip from "Stages" to
+"Connected · live".
← 5435736 Channels: add Facebook/Instagram Page picker — select WHICH
·
back to Marketing Command Center
·
Channels: add Bluesky (live, app-password) + Threads (review 8e94008 →