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.
- Destination Presets — when a preset fans a member's draft out to multiple channels, the fanned-out posts inherit the source's approval state.
- Calendar — pending posts show a "needs approval" badge on the calendar.
Client approval portal (white-label review)
If you're an agency managing client workspaces, you can also send posts to your clients for review and approval before they go live — without them needing a login or account.
How it works:
- Create a magic-link review token for a client workspace.
- Send the client a shareable URL (
/review/[token]). - The client taps Approve or Request changes directly on the link (no login).
- If approved, the post publishes on schedule. If changes are requested, the post returns to draft for you to edit.
- The approval journey is white-labeled (no Aidelly branding) and fully tracked in the audit trail.
This is separate from team approvals — use it to add an extra gate before your internal approvers sign off, or skip team approvals altogether and let clients be the sole reviewers.
See Client Approval Portal for full setup and workflow.
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