How the FOMO score works
fomint reads X and Telegram for the last 60 minutes and gives every token two numbers: Heat, which is how loud the chatter is, and Organic %, which is how much of it comes from accounts that look real. Both come from a published formula, and the same inputs always give the same score.
- Heat
- 0.35 V +0.25 B +0.20 E +0.20 C
- Organic %
- 100 × (sum of author weights ÷ number of authors)
V is velocity, B breadth, E engagement and C cross-platform. Each part is scored from 0 to 100.
Heat
Heat adds up four parts, each scored from 0 to 100 and weighted as shown below. Velocity is how much louder the last hour is than usual, breadth is how many different people are talking, engagement is how much attention their posts get, and cross-platform is whether the talk shows up on both X and Telegram.
| Part | Weight | Input | Sub-score, 0 to 100 |
|---|---|---|---|
| V Velocity | 35% | v = weighted mentions in the window ÷ the larger of the hourly baseline and 3 | 100 × min(1, log2(1 + v) ÷ log2(21))A 20× spike scores 100. Normal volume (1×) scores 23. |
| B Breadth | 25% | a = unique authors across the X sample and the Telegram posts in the window, capped at 50 | 100 × min(1, log10(1 + a) ÷ log10(51))50 authors score 100. 10 authors score 61. |
| E Engagement | 20% | r = median engagement per mention in the window ÷ the larger of the baseline median and 1. Engagement is likes + 2 × reposts + 2 × replies on X, and reactions + replies on Telegram. The baseline is this token’s own history, or the median across all tracked tokens when it has none. | 100 × min(1, log2(1 + r) ÷ log2(11))A 10× lift scores 100. |
| C Cross-platform | 20% | aX and aT = unique authors in the window on X (in the 50-post sample) and on Telegram | 100 × min(1, min(aX, aT) ÷ 10)Ten authors on each platform score 100. |
Every part is rounded to a whole number before it is weighted, so the four numbers on a result reproduce its Heat by hand. Heat is then rounded to a whole number too.
Two things are fixed before anything is scored. The window is the last 60 minutes: a post counts if it was made after 60 minutes ago and no later than now. The baseline is the token’s average mentions per hour over the previous 24 hours, with the window left out.
| A post that | Weight | Where |
|---|---|---|
| contains the exact contract address | 1.0 | X and Telegram |
| contains a DexScreener, Birdeye or pump.fun link to the token | 1.0 | X and Telegram |
| uses only the $TICKER, with no address | 0.3 | X only, labelled ambiguous |
Each author counts at most 3 mentions in the window toward velocity, so one account cannot move the score alone.
A post that only uses the $TICKER, with no contract address, could be about any token with that ticker. It counts at 0.3 of a mention and is labelled ambiguous. Cashtags are counted on X only, so a $TICKER on Telegram is not a mention.
On X, the Counts endpoint returns totals without authors. To keep the three-per-author limit meaningful, fomint scales each Counts total by the ratio of capped to raw mentions in the 50-post sample. If 6 of the 50 sampled posts come from authors who had already used up their three, the sample counts as 44 of 50 and the totals are multiplied by 0.88.
Every part flattens out on purpose. The first few authors and the first doubling of volume move the score most, and nothing past the cap adds more.
A token trading at 12 times its usual hourly volume, with 53 different authors (22 on X and 31 on Telegram), whose posts draw 3 times the usual engagement.
| Part | Score × weight | Points | On the scale |
|---|---|---|---|
| Velocity | 84 × 0.35 | 29.4 | |
| Breadth | 100 × 0.25 | 25.0 | |
| Engagement | 58 × 0.20 | 11.6 | |
| Cross-platform | 100 × 0.20 | 20.0 | |
| Heat | Sum of the four | 86.0 | Peak FOMO |
The total is rounded to a whole number. 86 sits in Peak FOMO, which runs from 76 to 100.
Bands
The Heat number maps to one of four bands. The cut-offs are fixed, so a band means the same thing for every token and does not move with the market.
Color is never the only signal: every band also has a name and an icon. The imp on the gauge changes with the band too, asleep when it is cold and fired up at the peak.
- Ice Cold0 to 20
- Warming Up21 to 50
- Building Momentum51 to 75
- Peak FOMO76 to 100
Organic %
Organic % shows how much of the chatter comes from accounts that look like established, independent people. It reads account age, followers, profile details and posting patterns, so it describes account quality, not anyone’s intentions. It never names an account, and it says nothing about what anyone meant by posting.
Every unique author in the window gets a weight from 0.05 to 1.0. Organic % is 100 × (the sum of the weights ÷ the number of authors), rounded to a whole number. With no authors there is nothing to average, so it reads “no mentions”, never 0%.
A weight starts at 1.0. Each signal that applies to an author multiplies it, and the result never goes below 0.05.
| Signal | Multiplier |
|---|---|
| X account younger than 30 days | × 0.2 |
| X account with fewer than 50 followers | × 0.4 |
| X account with a default avatar | × 0.5 |
| Telegram sender with no username and no profile photo | × 0.4 |
| In a duplicate-text cluster: 3 or more posts in the window with the same normalized text, or 85% or more similar | × 0.25 |
| In a burst: more than 40% of all mentions in the window land inside one 60-second span, and the author posted in it | × 0.5 |
| Serial poster: 8 or more different token addresses tracked by fomint in the last hour | × 0.3 |
Multipliers stack. An X account made 12 days ago with 31 followers gets 0.2 × 0.4 = 0.08. If it also posts copied text, 0.08 × 0.25 = 0.02, which is lifted to the floor of 0.05.
Where the rules leave room, these are the readings fomint uses:
- Before posts are compared, the text is lowercased and its links, @mentions, emoji, punctuation and # marks are removed. The dollar sign stays, so $TICKER keeps its meaning.
- A post with no words left after that never joins a duplicate cluster. That covers a bare link, a post of only emoji, and a label like “CA:” next to the token’s own address. Otherwise three people pasting the same address would look like one copied sentence.
- Two posts belong together when their normalized text is identical or at least 85% similar, measured on overlapping three-word phrases. Clusters grow by single linkage: if post A matches B and B matches C, all three are one cluster, even if A and C are less alike. A cluster needs 3 or more posts, and each author in it takes the multiplier once.
- The burst rule looks for any 60-second span that holds more than 40% of all the mentions in the window, counting the X Counts total plus Telegram. Every author who posted inside such a span takes the burst multiplier.
A low Organic % does not say anyone did something wrong. It says the accounts posting look new, small or repetitive, or posted in a tight burst.
| Level | Organic % |
|---|---|
| Mostly real accounts | 70 to 100 |
| Mixed | 40 to 69 |
| Mostly low-quality accounts | 0 to 39 |
| No authors in the window | no mentions |
Verdict
The verdict is one plain sentence, chosen from this table using both numbers. It describes the accounts that are talking and never makes a claim about the project itself.
| Heat | Organic % | Verdict |
|---|---|---|
| 51 to 100 | 70 to 100 | Real momentum |
| 51 to 100 | 40 to 69 | Busy, mixed account quality |
| 51 to 100 | 0 to 39 | Loud, but mostly low-quality accounts |
| 21 to 50 | Any | Some chatter, with the Organic % beside it |
| 0 to 20 | Any | Almost nobody is talking about this |
In the 21 to 50 row, the result always prints the Organic % beside the verdict.
Confidence
Confidence says how much evidence sits behind a score. It is based on weighted mentions in the window: each mention counts at its weight from the table above, and each author counts at most three times. It is not a probability that the score is right.
| Weighted mentions | Tag |
|---|---|
| Under 10 | Thin data |
| 10 to 49 | Medium |
| 50 or more | High |
Under 10, a result also says: “Fewer than 10 mentions in the last hour. Treat this score as a rough signal.” When X is unavailable, either because the daily spend cap was reached or because the X API failed, fomint scores from Telegram alone and grades confidence on the Telegram mentions. “Show the math” under each result lists the sources it read.
Edge cases
Four situations get special handling.
- A token with less than 6 hours of tracked history has no baseline yet. Its velocity part is capped at 60, and the result shows “New token, limited baseline”.
- With zero mentions, Heat is 0 and the band is Ice Cold. Organic % reads “no mentions”, not 0%.
- A ticker is never scored. If several tokens share it, fomint lists them ranked by liquidity and you pick the address you mean.
- Author weights are computed once per window and cached with the result, so the same lookup repeated inside the 10-minute cache time shows identical numbers.
Sources
fomint reads three outside sources and keeps no post text from any of them. Each post is turned into a fingerprint the moment it is read, the fingerprint is used to spot copied text, and the text is dropped.
- X, through the official API
Volume comes from the Counts endpoint, which returns hourly post counts for a query without reading the posts. fomint makes two requests: one for the address-and-link query, and one for the cashtag query, which leaves out posts that already match the first so no post is counted twice.
Authors, engagement and account details come from a sample: the 50 most recent posts in the window, posted after 60 minutes ago and no later than now. If the window holds 50 posts or fewer, the sample is every post.
If X cannot be reached, or the daily spend cap has been reached, the result is built from Telegram alone.
- Telegram, public groups only
fomint reads public groups through one dedicated account and measures them in full from its own database. It can only see groups on its monitored list, so every result shows how long that list is.
Telegram: 20 groups monitored
[owner to add how monitored Telegram groups are chosen: which groups qualify, how they are tagged by chain, and when one is removed]
If Telegram cannot be read, the result is built from the last stored data and marked stale.
- DexScreener, with GeckoTerminal as a backup
DexScreener turns an address into a token: its chain, name, symbol, liquidity, pair age and official links, on Solana, Ethereum, Base and BNB Chain. If DexScreener is unavailable, fomint uses the public GeckoTerminal API instead.
Limits
A score reflects what fomint can see. This is what it cannot.
- Private Telegram groups and channels, and any public group that is not on the monitored list.
- Posts that were deleted before fomint read them.
- Anywhere other than X and Telegram, such as Discord, Reddit, YouTube or Farcaster.
- Posts outside the 60-minute window. A burst that ended an hour and a minute ago does not count.
- Most of the posts on a busy token. On X, authors, engagement and account details come from the 50 most recent posts in the window, so breadth, cross-platform and Organic % describe that sample, and at most 50 X authors can be seen.
- Price. fomint reports chatter only, and has no view on value or on what happens next.
Versioning
This page describes formula 1.0. When a rule, a weight or a threshold changes, the version number changes and the change is published on this page. Every result and share card shows the version it was computed with.
Under one version, the same inputs always give the same output. All times are UTC.
| Version | Status | What changed |
|---|---|---|
| 1.0 | Current | First published formula. |
Disclaimer
Social activity, not financial advice or a prediction.
fomint reports how much people are posting about a token and how real the accounts posting look. It does not report or predict price, and nothing on this site is a recommendation to buy, sell or hold anything. Scores come from public posts in a 60-minute window and can be wrong, so read the confidence tag and the limits above before relying on one. What fomint stores is on the Legal page.



