← back to Marketing Command Center

docs/META-APP-REVIEW.md

100 lines

# 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".