How ranking works
For each feed request, the ranking system retrieves candidate content matching any filters, computes scores using signal weights, applies editorial overrides (pins, boosts, suppressions), and returns the feed ordered by final score.Signal-weighted ranking
The score for each content item is computed as:Ranking signals
| Signal | Description | Example |
|---|---|---|
| Recency | Exponential decay based on publish time | Content from 1 hour ago scores higher than 1 day ago |
| Engagement | Aggregate engagement across all users | High view count and watch time = higher score |
| Geo-relevance | Match between user location and content geo-targeting | Minnesota user sees Minnesota content boosted |
| Topic affinity | Match between user preferences and content tags | User who watches sports content sees sports boosted |
| Completion rate | How often users finish watching | Content with 80% completion rate ranks higher |
Signal weights
Default weights (configurable):| Signal | Default Weight |
|---|---|
| Recency | 0.25 |
| Engagement | 0.25 |
| Geo-relevance | 0.15 |
| Topic affinity | 0.20 |
| Completion rate | 0.15 |
Configuring ranking
Admin Portal
Adjust weights in Feed Configuration → Ranking:- Use sliders to adjust relative importance
- Preview changes on sample feeds
- A/B test different weight configurations
API
Configuration options
Signal weights. Must sum to 1.0.
Half-life for recency decay in hours. Content older than this has 50% recency score.
Minimum completion rate to include content. Filters out content with very low engagement.
Hard cutoff for content age. Content older than this is excluded regardless of score.
Editorial controls
Editorial teams can override algorithmic ranking with three controls:Pin
Force content to a specific position regardless of ranking score:- Deterministic: All users see pinned content at the same position
- Expiry: Optional expiration time
- Conflicts: If two items are pinned to the same position, the more recently pinned takes precedence
Boost
Add a positive modifier to ranking score:- Factor range: 1.1x to 10x score multiplier
- Competitive: Boosted content still competes with other signals
- Personalized: Final position varies by user
Suppress
Reduce visibility or exclude entirely:reduce- Apply 0.5x score modifierminimize- Apply 0.1x score modifierexclude- Remove from feed entirely
Admin Portal
Manage editorial controls in Content → [Content Item] → Editorial:- One-click pin, boost, suppress
- Set expiration times
- View active overrides across all content
Heuristic rules
Define hard rules evaluated before scoring:Rule conditions
Available variables:content.*- Content metadata (tags, ageInDays, duration, etc.)user.*- User context (region, topicAffinities, etc.)feed.*- Feed context (filter, name, etc.)
Rule actions
exclude- Remove from feedinclude- Force include (override other exclusions)boost- Apply score multipliersuppress- Apply negative modifier
Content filters
Define named filters for content subsets:- Adjacent feeds: Swipe between filtered feeds
- SDK filter parameter: Request filtered content
- User-facing filter UI: Let users select categories
Topic affinity
The User Signal Service builds topic affinity profiles based on engagement:How it’s calculated
- Watch time (weighted highest)
- Completion rate
- Interactions (shares, likes)
- Return views
Profile example
Cold start
For new users with no engagement history:- Topic affinity defaults to neutral (0.5 for all topics)
- Recency and engagement signals drive initial ranking
- Personalization improves with each interaction
A/B testing ranking
Test different ranking configurations:Future: ML-based ranking
The current signal-weighted model will be augmented with ML-based ranking:- Content embeddings: Multimodal representations (visual + text + audio)
- User embeddings: Dense vectors capturing engagement patterns
- Two-tower retrieval: Candidate generation via embedding similarity
- Ranking model: Listwise re-ranking optimizing for engagement and retention
