Skip to main content

Post Promotions

Creators and brands can pay to boost posts as promoted content, reaching audiences beyond their existing followers.

Each property has its own checkbox marking whether that specific piece is fully implemented and functional end to end (frontend-nextjs + backend) — update these yourself as work lands; this page won't overwrite them.

  • Create a promotion campaign for a post — built this pass: a "Promote post" action in the post options menu (owner-only, hidden if the post already has an in-flight campaign) opens CreatePromotionModal.tsx (campaign name, objective, budget type, budget in coins with a live balance check and the 50-coin minimum enforced client-side, start/end dates). Submits to createPostPromotion.
  • Branded content / paid partnerships — mark a post as a paid promotion for a sponsor profile (renders "Colaboración pagada con @X") with a call-to-action button to a profile / clip / live / product / link (Post.sponsor, actionButtonText/actionButtonUrl)
  • Promote a live or clip — the Promote option appears on clips and lives; a live creates a companion announcement post that links back to /live/:id (promoteLiveStream)
  • Manage a campaign — update, pause, resume, cancel — built this pass: the "My promotions" screen (Settings → My promotions) lists every campaign with status-appropriate Pause/Resume/Cancel actions (Cancel has a confirm step, since it's irreversible and refunds unspent budget)
  • Campaign performance analytics — impressions, clicks, CTR, CPM, CPC, and days-remaining are shown per-campaign on the "My promotions" screen. ROI and a daily breakdown still don't exist in the schema — never built, not part of this pass either.
  • Impression / click tracking — trackImpression/trackClick are now exposed as trackPromotionImpression/trackPromotionClick mutations and fired from PostCard: one impression when an active sponsored post is shown (guarded against double-count) and a click when its CTA is tapped. The counts on the stats view now actually move (and feed CTR/CPC/CPM in promotionStats).
  • Audience targeting by location, demographics, and interests — deliberately not built this pass: the stored targetAudience JSON is inert (never read or applied anywhere) — the create form intentionally has no targeting fields at all, so it doesn't present a capability that wouldn't actually do anything. The reach-estimate query (estimatePromotionReach) is real now — a rough estimate from the promoter's follower count, recent post engagement, and budget/duration — but it doesn't factor in location/demographics/interests either, since nothing does.
  • "My promotions" management screen — built this pass, see above

An approved promotion does get real feed placement: the home feed gives active promoted posts a small ranking boost. Approval happens through an admin review queue that lives in the separate frontend-admin app — see Post Promotions Review.

See the technical reference for GraphQL schemas, routes, source file links, and per-field wiring status.