Post Promotions Review
Admins approve or reject pending post-promotion (paid ad boost) campaigns. The creator-facing side (creating/managing a campaign) is also fully wired end to end, with a "My promotions" screen under Settings → My promotions — see Post Promotions for that half of the feature.
Implementation checklist
- List pending promotion campaigns (
adminGetPendingPromotions) - Approve a campaign (
adminApprovePromotion) — flips it toactive, which gives it a real ranking boost in the home feed - Reject a campaign with a reason (
adminRejectPromotion) — refunds the creator's unspent coin budget
Where this lives
Backend — apps/backend/graphql/resolvers/post-promotion.resolver.js, gated on the MANAGE_PROMOTIONS admin permission. Same resolver file as the creator-facing operations (myPromotions, createPostPromotion, pausePostPromotion, etc.), which are consumed by apps/frontend-nextjs's "My promotions" screen — see the technical reference.
Frontend — apps/frontend-admin/src/app/promotions/page.tsx, conditionally shown in the admin nav based on the MANAGE_PROMOTIONS permission.
GraphQL reference
query AdminGetPendingPromotions {
adminGetPendingPromotions {
id campaignName objective budgetType budgetAmount
post { id text }
user { id username }
}
}
mutation AdminApprovePromotion($id: ID!) { adminApprovePromotion(id: $id) { id status reviewedAt } }
mutation AdminRejectPromotion($id: ID!, $reason: String) { adminRejectPromotion(id: $id, reason: $reason) { id status rejectionReason reviewedAt } }