Skip to main content

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 to active, 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

Backendapps/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.

Frontendapps/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 } }