# 02 — Facebook Publishing (Page & Account)

---

## 1. Reality check (global / Meta policy)

| Destination | Third-party Graph API | PostSync today |
|-------------|----------------------|----------------|
| **Facebook Page** | Supported (`pages_manage_posts`, Page access token) | **Implemented** |
| **Facebook personal profile / timeline** | Generally **not** available for third-party content publishing the way Pages are | **Not implemented** — treat as **out of product scope** unless Meta product changes |
| **Instagram Business** (linked to Page) | Supported | **Implemented** (image) |

**Product language for clients:**  
“We publish to your **Facebook Page** (and Instagram Business). Personal profile auto-posting is not offered by Meta’s standard Graph APIs for apps like ours.”

If stakeholders insist on “Facebook account,” clarify they usually mean:

1. **Login with a Facebook user** that **administers a Page**, then publish **as the Page**, or  
2. A misunderstanding of personal timeline posting.

---

## 2. Current implementation

| Piece | Path |
|-------|------|
| Scopes | `src/lib/social/meta-scopes.ts` — `pages_show_list`, `pages_manage_posts`, … |
| OAuth + page list | `src/lib/social/meta-oauth.ts` — `/me/accounts` → page id + page token |
| Publish photo/text | `src/lib/social/facebook-publish.ts` — `/{pageId}/photos` or feed |
| Orchestration | `src/lib/social/publish-post.ts` |
| Connect UI | `src/app/connected-accounts/` + Meta/Facebook OAuth callbacks |

**Flow today**

```
User Meta OAuth
  → user token
  → fetch Pages
  → store Page id + page access token as ConnectedAccount
  → publish uses page token (not user timeline)
```

---

## 3. Target capabilities

### 3.1 Manual + auto → Facebook Page

| Media | API approach | Priority |
|-------|--------------|----------|
| Photo | `/{page-id}/photos` (current) | P0 — done |
| Text-only | Page feed | P0 — done |
| Video | `/{page-id}/videos` (hosted file URL or upload session) | P1 |
| Reels | Separate Reels APIs | P2 |

### 3.2 Multi-Page per project

Allow connecting **multiple Pages**; manual publish UI picks which Page(s); auto-publish uses all `status=connected` Pages (or a default Page flag).

### 3.3 Token maintenance

Keep `ensure-publish-tokens.ts` extending user token and renewing page tokens before publish.

---

## 4. Required Meta app setup (ops checklist)

1. Meta Developer App — **Pages** use case  
2. Permissions in App Review (Live): `pages_show_list`, `pages_manage_posts`, …  
3. Valid OAuth redirect URIs matching production host  
4. `appsecret_proof` on Graph calls (already used in `meta-graph.ts`)  
5. Never log page tokens  

Env names (existing patterns): `META_APP_ID`, `META_APP_SECRET`, `FACEBOOK_*` / redirect URIs — see `.env.example`.

---

## 5. Proposed code extensions

```
src/lib/social/
  facebook-publish.ts      # add publishFacebookPageVideo()
  facebook-destinations.ts # list pages, default page
```

DB/account field: `target_type = 'page'`, `external_id = pageId`.

API:

- Manual: `POST /api/generation/posts/[id]/publish` body includes `destinations: [{ network:'facebook', target:'page', externalId }]`.
- Auto: load all facebook page connections for project.

---

## 6. Acceptance criteria

- [ ] Manual photo publish to selected Facebook Page  
- [ ] Manual video publish to Facebook Page  
- [ ] Auto slot publishes photo to default/all connected Pages  
- [ ] Clear UI copy: Page publishing (not personal timeline)  
- [ ] Expired page token surfaces reconnect CTA  
