What the checker counts
Paste a draft, or enter a public URL. Pasted text is counted in the browser and is not uploaded. A URL is fetched on Posting Dude's server, the main text is pulled out of the HTML, and that text is counted in the browser. The address and the paste are not stored.
Words are groups of English letters and numbers. An apostrophe or a hyphen stays inside the word, so don't and state-of-the-art each count as one word. A period ends a word, so U.S. counts as two words, U and S. Capitalization is ignored, and a curly apostrophe is treated as a straight one. These are the same word rules as the readability checker on this site.
A phrase is those words sitting next to each other. A 2-word phrase is counted at every position where two words are adjacent, and a 3-word phrase at every position where three words are adjacent. The positions overlap. Unique words are the number of distinct words after that normalization.
How density is calculated
Density is the phrase's count divided by the number of groups of that length, times 100. A single word uses the word count as the number of groups. A 2-word phrase uses the word count minus 1, which is the number of adjacent pairs. A 3-word phrase uses the word count minus 2. The same phrase cannot be counted more times than there are groups, so the percentage stays between 0 and 100.
In a 100-word text, a word that appears 3 times has a density of 3.00%. A 2-word phrase that appears 3 times has a density of 3.03%, because that text has 99 adjacent pairs.
In the text "word word word", which is 3 words and 2 adjacent pairs, the phrase "word word" has a count of 2 and a density of 100.00%.
The checker rounds that percentage to two decimal places. The number is the formula. This page does not compare it with a recommended range, and it does not label a result too low or too high.
Density % = count ÷ (total words − words in the phrase + 1) × 100
The stop-word filter
The filter uses the English stop-word list from NLTK's stopwords corpus, 198 words. That list started from the Snowball stop words used by PostgreSQL, and NLTK extended it. It includes function words such as the, and, of, and is, and contractions such as don't. It is a list of words to hide, not a judgment about which words should rank.
When the filter is on, a single word on the list is left out of the single-word list, and a 2-word or 3-word phrase is left out when any word in it is on the list. The phrases are taken from the original word order. Removing a function word does not glue the words on either side into a new phrase. Total words and unique words still count every word. A target keyword is still counted when it is on the list, because you asked for that phrase.
A target keyword
The target field is optional. The checker counts that phrase with the same rules as the lists and shows the count and the density. On a fetched URL it also reports whether the phrase appears in the title tag, in an H1 in the counted text, in the first 100 words, and in the meta description. A match means the words sit next to each other in that field, ignoring case.
The title is the text of the first title element. The meta description is the content of the first meta element whose name is description. An og:description is not used in its place. If the page has no meta description, the check says the tag is absent. It does not call that a miss. H1 headings are the H1 text inside the region that was counted. The title tag and the meta description are not added to the word count, unless those words also appear in the body.
Pasted text has no title tag, H1, or meta description to read, so those three stay unchecked. The first 100 words are still checked. When the text is shorter than 100 words, that check covers the whole text.
What a URL check reads
The fetch stops at 1.5 MB, follows at most three http or https redirects, and does not run JavaScript. Iframes are not loaded. JSON-LD and other scripts are not counted. The checker prefers a main element. If that is missing, it uses the longest article. If both are missing, it uses the body. Nav, footer, aside, form, and buttons are left out, and so are dialogs and status messages. A header that contains a nav is left out with that nav. A header that holds the page title is kept. Text that the HTML marks hidden is still read, because some pages put the article there until a script shows it, and this checker does not run that script.
Local hosts, IP addresses, and private or link-local addresses, including 127.0.0.1 and 169.254.169.254, are refused before any request. A public name that resolves to a private address is refused as well. A redirect onto one of those addresses stops the check.
What density does not decide
Google publishes no keyword-density percentage. A number on this page answers a smaller question: using this formula, how often does the phrase occur in this text. It does not raise a ranking, earn a snippet, or win a citation in an assistant.
Google's spam policies describe keyword stuffing as filling a page with keywords or numbers in an attempt to manipulate rankings. The policy names the practice. It does not name a percentage to stay under. Repeating a phrase until the sentence breaks is a writing problem this count can show you. The title and the description are a different problem from the body.
Google's spam policies name keyword stuffing and do not publish a density percentage. The meta title checker previews a title and description before you publish. The readability checker scores the same kind of draft with the Flesch formulas. The free tools index lists the other tools on this site. Pricing lists Launch and Studio. The why page covers what happens when distribution stops after launch day.