Client approval desk for your Facebook Page content calendar

By General Input

Stop chasing sign off in email threads. Reviewers approve posts in one place, and approving is what schedules them on your Facebook Page.

Integrations

  • Facebook Pages
  • Notion
  • Slack Bot

Type

App

Categories

  • Marketing
  • Operations

Build me an approval desk where our client or marketing lead signs off on Facebook Page posts before anything goes live, so approvals stop happening in email threads. Our content calendar lives in a Notion database, and the rule the whole app enforces is that approving a post is what schedules it: there is no other path from draft to the Page, so nothing can be published without a recorded approval.

Read the calendar from Notion with Query a Data Source. Let me configure the data source id and map my own column names for post copy, link, image, intended publish date, owner, reviewer and status, rather than hardcoding a schema, because every content calendar is laid out differently. Cache the mapping so I only set it up once. Use Query a Data Source rather than the deprecated Query a Database operation, and remember Notion requires a version header on every call.

The main view is a review board. Each planned post is a card showing the copy in full, the link, an image thumbnail if there is one, the intended publish date and the owner. Group the cards into four columns: Needs review, Approved, Scheduled and Published. Derive the grouping from the Notion status column plus whether the app has actually scheduled the post on the Page yet, so Approved and Scheduled are genuinely different states: Approved means a person said yes, Scheduled means the post now exists on the Page with a future publish time.

Add a waiting on you filter so each reviewer sees only their own queue. Match the signed in viewer against the reviewer column on each row, and if their identity is not mapped let them pick who they are from a list and remember it. The filter should be the default view for anyone whose name appears as a reviewer, because a client opening this app wants their five cards, not the whole calendar.

Every card carries three decisions: Approve, Request changes and Reject. All three write straight back to the Notion row with Update a Page, recording the new status, the reviewer name, the timestamp and any comment the reviewer typed. Require a comment on Request changes and Reject, since a bare no is useless to the person who has to fix the draft. Keep Notion as the status of record so the calendar stays the single source of truth even for people who never open this app.

Approving also schedules the post. Fetch the managed Pages with List Pages and use that Page's own access token for every Page write, since Page endpoints reject the plain user token. For a post with an image, first send the image through Upload Page Photo held unpublished, then create the post with Create Page Post attaching that photo, set as unpublished with a future publish time. Text and link posts skip straight to Create Page Post. Facebook only accepts scheduled times inside a minimum and maximum window ahead of now, so validate the intended date before saving and show the reviewer a clear message if the slot is too soon or too far out, instead of letting the approval succeed and the scheduling fail silently. Write the resulting post id back to the Notion row so the card knows what it created.

The second view is a two week planner that puts the live scheduled queue from the Page next to the plan. Pull what is really queued with List Scheduled Posts and lay it against the next fourteen days of Notion rows on the same timeline, one row per day. Make two things obvious at a glance: days with nothing scheduled, and days with more than one post going out. This exists because Meta's own planner is slow to load across wide date ranges, so this view has to answer where are the gaps in one screen.

From the planner I can fix the schedule without opening Meta Business Suite. Let me move a scheduled post to a new time with Update Post, and cancel one outright with Delete Post. Both actions update the Notion row too, so the plan and the live queue never drift apart. If the Page will not accept a change to the publish time on an existing scheduled post, fall back to cancelling it and creating a replacement at the new time, and keep the card history continuous across that swap so it still reads as one post being moved.

When a draft is approved or sent back, post a note in Slack to the post owner using Send a Message, including the decision, the reviewer, any comment and a link back to the card in this app. Resolve the owner to a Slack account with Look Up User by Email from the owner column, and if there is no match fall back to a review channel I configure so the note is never silently dropped.

Keep a visible history on every card: each decision, who made it, when, and what they said, oldest to newest, plus the scheduling events so I can see that a post was approved on Tuesday, scheduled for Friday, moved to Monday and then published. That history is what people go looking for when a client asks whether they ever signed off on something.

Handle the ordinary failures visibly rather than quietly. If a Page write is rejected for a missing permission or an expired token, if Notion returns a page the connection cannot see, or if a scheduled time is refused, surface it on the card with the reason and leave the row in a state I can retry from. An approval that failed to schedule must never be shown as Scheduled.

Related prompts

Explore more prompts
A brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsLinkedIn Ads budget pacing dashboard for every client accountGive your team Looker numbers without buying more seatsPause marketing emails to escalated customers, then restore them