1The one rule
Every wish on FeedMarch has a single score called canonical_rank. This score is the same across every surface: the home feed, category feeds, and brand profile pages all read the same number, just composed differently per surface.
The formula is published below. The weights are stored in a database table called ranking_weights and we'll publish any change to that table on the Transparency page. We won't change the formula silently.
2The formula
This is the exact composition used by the ranking job that runs every 15 minutes:
canonical_rank = α · verified_demand_score
+ β · recent_momentum
+ γ · evidence_depth
+ δ · status_boost
+ ε · company_attention
+ η · unresolved_pain_age ← positive bonus
− ζ · spam_penalty
− θ · age_freshness_decayDefault weights at launch: α=1.0, β=1.0, γ=0.5, δ=1.0, ε=1.0, η=1.0, ζ=1.0, θ=1.0. A wish's position is the deterministic result of this sum applied to verified voice counts, comment quality, lifecycle status, and brand engagement.
3What each component means
verified_demand_score
log₁₀(verified_votes_count + 1) × 10. Verified votes only: accounts that have proven they're human (phone, social, or email-verified) and at least 24 hours old.
Why: Bot armies and sock-puppets can inflate raw voice counts. Verified voices are the brand-promise of demand signal.
recent_momentum
(verified_votes_1h × 4) + (verified_votes_24h × 0.8). Counts only verified voices.
Why: Surfaces new and rising wishes faster than slow-burn aggregations.
evidence_depth
(comments_with_attachment × 2) + (substantive_comments × 1), capped at 20. Substantive = comment ≥ 50 chars.
Why: A wish with screenshots and detailed accounts is more actionable than one with five-word complaints.
status_boost
A small fixed boost based on lifecycle state: needs_response +10, dispatched +8, shipped +15, stale −50, archived −999.
Why: Keeps the most narratively important wishes visible (the one Spotify is currently working on, the one that just shipped).
company_attention
min(company_views × 5, 20) + (has_response ? 20 : 0). Cap at 40.
Why: Brand engagement is a signal, but capped so a brand can't game ranking just by viewing aggressively.
unresolved_pain_age
max(0, days_since_dispatch − 14) × 0.5. Positive bonus for old unresolved dispatched wishes.
Why: Patience signal. The longer a wish goes unanswered after dispatch, the more weight it should carry.
spam_penalty
low_effort_flag × 10 + duplicate_cluster_size × 0.5. Subtracted.
Why: Removes ranking gain from spammy or duplicated posts.
age_freshness_decay
min(days_since_created, 30) × 0.1. Subtracted. Maximum penalty of -3 over 30 days.
Why: Mild aging so the feed doesn't ossify around old top-ranked wishes, while keeping the floor high enough that quality work isn't punished.
4Per-surface composition
Different surfaces emphasize different parts of canonical_rank. The base scoring is the same; the weights per surface are tuned for the surface's job:
5What we never do
To keep the ranking honest, we publish what FeedMarch will NOT do:
- —No paid ranking. Brands cannot pay to suppress, boost, or modify the position of any wish. There is no "promoted" tier and no paid placement at v1.
- —No user-tier voice weighting. A verified voice from a Mayor (top-tier contributor) counts exactly the same as a verified voice from a New Marcher. Tier privileges are recognition and access only.
- —No personalization that distorts ranking. Two logged-out users in different cities will see the same wishes in the same order on the same feed. Your tier badge, voices cast, and follow list affect what you see in your personal views (saved, following) but never the public ranking.
- —No silent algorithm changes. Material updates to
ranking_weightsare published with a changelog entry on the Transparency page.
6Verifying for yourself
You can audit any wish's ranking. Every wish page shows its canonical_rank breakdown in the developer footer (click "Why this rank?" on any wish detail page). The numbers shown match the formula above exactly. There's no hidden term.
If you spot a wish whose ranking doesn't add up, email transparency@feedmarch.com with the wish URL and what you computed. We'll publish a public response.