Team Approvals
Flip a workspace switch and every member-submitted post lands in an owner/admin approval queue, with a reject-with-reason flow and a full audit trail.
What Team Approvals is for
Team Approvals is a server-side gate: when the workspace toggle is on, any scheduled post created by a workspace member is held in approval_status = pending until an owner or admin clears it. Approved posts ship at their original scheduled time. Rejected posts return to draft with a required rejection reason attached.
Useful for agencies who can't let a client misfire, brands with a regulated voice, and any team where the person hitting publish isn't the person signing off.
Where it lives
- Workspace setting — Workspace Settings → Team Approvals → "Require member approval before publish". Owners and admins only.
- Approval queue —
/w/[workspace]/team-approvals(or the matching workspace-scoped path your sidebar surfaces).
Plan availability
| Plan | Team Approvals |
|---|---|
| Launch | Not included |
| Scale | Included |
| Agency | Included |
The gate is workspace-scoped, so an Agency workspace can have the toggle on for one client and off for another.
How the gate decides
When a scheduled post is created via any surface (composer, calendar, chat, API, MCP), Aidelly evaluates the approval gate server-side:
| Submitting role | Gate result |
|---|---|
| Owner | Always bypass — post publishes on schedule |
| Admin | Always bypass — post publishes on schedule |
| Member | Gated when the workspace toggle is on |
There is no client-side bypass. The decision is made in evaluateApprovalGate() at the API layer, before the post is enqueued.
Step 1 — Turn the gate on
- As the workspace owner or admin, open Workspace Settings → Team Approvals.
- Toggle "Require member approval before publish" to on.
- Save.
From this moment, every member submission lands in the approval queue.
Step 2 — Members submit as usual
Members compose and schedule like normal. There is no extra step in the composer — Aidelly silently sets approval_status = pending on the scheduled post. The post is visible to the submitting member as "Pending approval" on the calendar.
Step 3 — Owner / admin reviews
- Open the Team Approvals page.
- The queue shows every pending post: caption preview, platform, account, submitting member, scheduled time, and a strip of media thumbnails when the post has images or video.
- For each post you can:
- Approve — flips
approval_statustoapproved. Post enters the regular publish pipeline at its originalscheduled_at. - Reject — opens a comment box; the rejection reason is required. Submitting member is notified in-app.
- Open detail — click the caption, the media strip, or the 💬 icon on the row. A right-side panel opens with the full caption, every media item, scheduled time, campaign (if any), and a threaded discussion below. Use the discussion to ask the author a question before approving — they get notified the same way Draft Discussions work.
- Approve — flips
Members of the workspace who aren't approvers can still open the detail panel to read the discussion on their own submissions. Only Approve / Reject are gated to owners and admins.
Step 4 — Bulk-clear the queue
For a backlog, multi-select pending posts and:
- Approve selected — applies to every selected post.
- Reject selected — prompts for a single comment that applies to the whole batch.
Audit trail
Every approval action writes a row to post_approval_events:
| Event type | Triggered when |
|---|---|
submitted | Member creates a gated post |
approved | Owner/admin approves the post |
rejected | Owner/admin rejects with a reason |
returned_to_draft | Owner/admin opens the post for redraft |
commented | Comment added to the approval timeline |
Events are visible on the post detail drawer ("Approval timeline" tab) and roll up to the Activity Log.
How Team Approvals interacts with other Aidelly features
- Draft Discussions — discuss the draft before submitting it for approval. Discussion is informal; approval is the formal sign-off.
- Activity Log — every approval action shows up in the audit trail.
- Version History — if a post is rejected, restore an earlier version before resubmitting.
- Crosspost Routes — when a route fans a member's source post out, the fanned-out destinations inherit the source's approval state.
- Calendar — pending posts show a "needs approval" badge on the calendar.
What approval does NOT do
- It doesn't rewrite the schedule. Approved posts ship at their original
scheduled_at. If a post sits in the queue past its scheduled time, it publishes immediately on approval (the publish pipeline treats "due in the past" as "publish now"). - It doesn't lock the draft. Members can keep editing the draft while it's pending — every save creates a new version. The approver always reviews the latest version.
- It doesn't notify out-of-band by default. Reviewers see the queue in-app. If you want email notifications, configure them via Warning Rules.
Troubleshooting
- My post bypassed the gate — you're an owner or admin in this workspace. The gate only applies to members.
- The toggle is greyed out — only the workspace owner can flip it. Admins can review approvals but can't change the workspace setting.
- Approved post didn't publish — check the Activity Log for a publish failure event. The approval was honored; the failure is downstream.
Related guides
- Draft Discussions — the informal review step
- Activity Log — full audit trail across the workspace
- Version History — restore an earlier draft after rejection
- Workspace Settings — where the gate toggle lives