TMOD LogoTMOD

Duplicate content checker

Compares content pages at a 55% similarity threshold, skipping archives and pagination.

What TMOD checks

  • Extracts the visible text of every crawled page and compares each pair with Jaccard similarity, reporting any at 55% or above as duplicates and 40% to 55% as near-duplicates.
  • Excludes structurally non-unique pages, archives, category listings and paginated views, detected by structure rather than URL pattern, so it works on any CMS and in any language.
  • Reports the specific pair of URLs involved rather than just a count, so you can see immediately whether it is one article at two addresses or a template producing near-identical pages.
A scale of Jaccard similarity between two pages' text. 0% to 40% is a pass, distinct pages. 40% to 55% is a warning, near-duplicate. 55% and above is a fail, duplicate.

Why it matters

Internal duplication splits the signals for a topic across several URLs. Instead of one page that clearly covers something, you have three that partly cover it, competing with each other. Search engines pick one and often not the one you would have chosen.

For AdSense specifically, duplication reads as a padding tactic, a site inflating its page count without adding value. That interacts badly with the page-count and thin-content checks: a site that appears to have thirty pages but really has eight articles repeated is judged on the eight.

The great majority of flags here are not plagiarism or laziness. They are the same page reachable at multiple URLs: with and without www, http and https, with and without a trailing slash, with tracking parameters, or a printer-friendly variant. Those are canonicalization problems wearing a duplicate-content costume, and they are usually fixable in one template change.

How to fix it

01Check canonicalization first

Before rewriting anything, add self-referential canonical tags site-wide and make sure http redirects to https and one of www/non-www redirects to the other. This resolves the majority of duplicate flags without touching a single word of content.

02Merge genuine duplicates and redirect

Where two pages really do cover the same ground, pick the stronger one, fold anything unique from the other into it, and 301 the loser to the winner. Deleting without redirecting throws away whatever links and history the old URL had.

03Differentiate templated pages properly

If your location or product pages differ only by a name, they will trip this check and the scaled-content check together. Each needs genuinely specific content, different details, different examples, or it should not exist as a separate indexed page.

04Handle parameters at the source

Tracking, sorting and filtering parameters generate near-infinite URL variants of the same content. A self-referential canonical on the clean URL handles this. Blocking parameters in robots.txt does not, because a blocked URL can still be indexed from external links.

Canonical tags and the three ways they go wrong

A canonical tag is a hint, not an instruction. Search engines take it seriously when it agrees with everything else they can see, and quietly ignore it when it does not, which is why a canonical alone rarely fixes a duplicate problem that the rest of the site is contradicting.

The first failure is the site-wide canonical pointing at the homepage, usually a template variable that was never filled in. Every article on the site then declares itself a copy of the front page. The second is a canonical pointing at a URL that redirects, 404s or is blocked from crawling, which asks a crawler to prefer a page it cannot have. The third is a canonical that disagrees with your own sitemap or your internal links, where the site says one thing in the head of the page and another everywhere else.

The reliable version is dull. Every page declares itself, absolute URL, one protocol, one hostname, one trailing-slash convention, and the redirects, the internal links and the sitemap all agree with it. Consistency is doing more work here than the tag is.

One article, four addresses. The same page reachable four ways is four competing pages. https://example.com/post: The canonical one. https://www.example.com/post: www variant. http://example.com/post: Unsecured variant. https://example.com/post/: Trailing slash. https://example.com/post?utm_source=x: Tracking parameter.

Duplication you do not fully control

Some overlap comes from outside. Syndicating an article to a partner site, republishing on a platform, or letting an aggregator carry your text all create copies you did not make. The convention is that the copy carries a canonical back to your original, or is noindexed. Ask for it when you agree to the syndication, because asking afterwards rarely works.

Scrapers are the version people worry about most and the one worth worrying about least. Automated copies of a site are common, and search engines are generally good at resolving which version came first, particularly when the original is well linked and indexed quickly. It is a nuisance rather than a ranking event, and there is no version of this check that would tell you about it anyway, since it compares your pages against each other rather than against the web.

The one to take seriously is your own staging site. A development copy left publicly reachable and crawlable duplicates the entire production site, at a different hostname, and it does it while you are not looking. Password-protect it or serve it a noindex header, and check what a crawler can actually reach rather than assuming obscurity is protection.

The arithmetic behind one flagged pair

Take the pair this check flags most often in the wild: two service pages, /plumber-leeds and /plumber-york, each around 620 words, written from one template with the city name swapped and roughly 70 words of local detail changed. Strip the shared header and footer, compare the remaining vocabulary, and the two pages share almost everything: the pair scores around 0.78, well over the 0.55 line, and the report shows both URLs side by side with that number. Nobody copied anything. The template did.

Now the contrast case, because it explains why the threshold sits where it does. Two genuinely separate articles on adjacent topics, say fixing a dripping tap and replacing a tap cartridge, share plenty of terminology and still land somewhere around 0.25, comfortably under even the 0.4 near-duplicate line, because each contains hundreds of words the other does not. Jaccard divides shared vocabulary by combined vocabulary, so two pages have to be overwhelmingly the same text before the number climbs. A flag at 0.55 is never two articles that happen to resemble each other.

URL variants produce the extreme end of the scale. The same article reachable at /post and /post/ and /post?utm_source=newsletter is the same bytes at three addresses, so every pair scores close to 1.0, and one article can generate several rows in the report by itself. Those rows are not content work. They are one canonicalization fix at the template level, and they should be cleared first so that what remains in the report is real.

Which leaves the city pages, and an honest choice. Either each location genuinely has its own material, local photographs, local prices, the plumber who covers that postcode, in which case write it and the similarity falls on its own, or it does not, in which case one strong page with a served-areas section replaces the set. The second answer is usually the true one, and the set it removes is the same set the scaled-content check was about to flag for uniformity and the thin-page check for length.

Questions

Does this check whether my content was copied from other sites?

No. This compares your pages against each other, not against the wider web. External plagiarism detection needs an index of the entire internet, which is a fundamentally different product. The separate copyright check looks at intellectual-property risk signals on your pages, but it is not a plagiarism scanner either.

Why 55% similarity?

Because of how the measure works. Jaccard similarity divides the words two pages share by the total distinct words across both, so a pair scoring 0.8 would have to be roughly 89% identical, which in practice means a byte-for-byte copy. Real near-duplicates, the same article rewritten slightly or a template with a few fields swapped, land around 0.55. Chrome, header, footer and navigation are stripped before the comparison, so the score reflects body text only.

My category and tag pages overlap heavily. Will they be flagged?

No. Archive, category and paginated pages are detected structurally and excluded before comparison, because they overlap by design and no search engine treats them as duplicate content. Only real content pages are compared.

Do translations of the same article count as duplicates?

No. The comparison is over vocabulary, and two languages share almost none, so a Turkish and an English version of the same article score near zero and are never reported. The search-engine side of that situation is handled with hreflang annotations rather than canonicals. What does get flagged is a machine-translated near-copy in the same language as the original, and that is also exactly the pattern the scaled-content policy describes.

Does republishing my articles on Medium or LinkedIn create a duplicate problem?

Not one this check sees, since it only compares your own pages, but yes for search: the platform copy competes with your original, and platforms often outrank small sites on their own content. The clean ways to syndicate are a canonical tag on the platform copy pointing home, which Medium supports through its import tool, or publishing an excerpt with a link instead of the full text. Publish on your own site first either way, so the original is indexed before any copy exists.

Read more

This check also runs inside the content audit

Run it here on its own, or run the full audit to see this check scored alongside everything else that decides approval.

Open it