Layers

UGC Scoring

How UGC posts are scored 0–10 for ad eligibility. Pool-specific formula.

View as Markdown

UGC posts score in the ugc pool of the organic scoring algorithm. Score components:

quality         = weighted engagement rate percentile within UGC pool (weight 0.45)
reach           = views percentile within UGC pool              (weight 0.25)
outperformance  = log2(views / creator median views)             (weight 0.30)
weighted_er     = (likes + 3·comments + 5·shares + 6·saves) / views
freshness       = bonus up to +1.5 that decays over 90 days

Combined into a 0–10 score (base multiplier 8.5 + freshness bonus).

Min views threshold

Posts below 50 views are NOT scored. They sit at score 0 until they accumulate enough views (or get archived as too old).

Freshness window

Bonus decays linearly over the 90-day freshness window. After 90 days, posts typically score below threshold and exit the eligible pool.

Why scoring?

Two reasons:

  1. Most UGC isn't worth amplifying. Even good creators have flop posts. Scoring picks the winners automatically.
  2. Spend efficiency. Promoting 10 high-quality UGC posts beats promoting 100 average ones with the same budget.

Re-scoring cadence

Every 6 hours, the update-organic-performance workflow rescores all UGC posts. New metrics → new score.

Score history

Each post's detail panel shows its score over time. You'll see:

  • Initial score after metrics first arrived.
  • Bumps as engagement compounded.
  • Decay as the post aged out of the freshness window.

Manual override

If a post's score is below 4.0 but you want it eligible, set override = 'include'. If above 4.0 but you want it excluded (off-brand, contains a competitor), set override = 'exclude'.

Pool-specific scoring

UGC scores are NOT comparable to generated or manual pool scores — each pool's score is computed differently. The optimizer handles pool mixing via the creative selection algorithm.

On this page