<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Petteri Pucilowski</title>
    <description>The latest articles on DEV Community by Petteri Pucilowski (@petteri_pucilowski_7ec755).</description>
    <link>https://dev.to/petteri_pucilowski_7ec755</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3958159%2F10c01a3a-4ac9-40e7-8cb4-63d6b0869fdb.jpg</url>
      <title>DEV Community: Petteri Pucilowski</title>
      <link>https://dev.to/petteri_pucilowski_7ec755</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/petteri_pucilowski_7ec755"/>
    <language>en</language>
    <item>
      <title>9 domains link to every major live chat tool</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Mon, 02 Nov 2026 00:36:32 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/9-domains-link-to-every-major-live-chat-tool-8m1</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/9-domains-link-to-every-major-live-chat-tool-8m1</guid>
      <description>&lt;p&gt;we compared 8 live chat tools in common crawl's domain-level link graph. 9 non-platform domains link to all 8, while 86% of linking domains appear for only one subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  how we pulled this
&lt;/h2&gt;

&lt;p&gt;for each subject domain, we pulled the top 2,000 referring domains by authority from common crawl release Apr-Jun 2026 (cc-main-2026-apr-may-jun). we intersected those lists, then removed platform, cdn, social, and other non-editorial domains from the clean overlap counts.&lt;/p&gt;

&lt;p&gt;the filter matters. hosting providers, cdns, url shorteners and the big social networks link to almost everything, so leaving them in would produce a universal list that is technically correct and useless for outreach. the counts below are after that filter unless a column says otherwise. everything here comes from the open common crawl webgraph, so you can reproduce it without a paid backlink tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;subject domains&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;referring domains&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;tidio.com&lt;/td&gt;
&lt;td&gt;9,302&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tawk.to&lt;/td&gt;
&lt;td&gt;34,125&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;livechat.com&lt;/td&gt;
&lt;td&gt;56,621&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;olark.com&lt;/td&gt;
&lt;td&gt;4,408&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;drift.com&lt;/td&gt;
&lt;td&gt;6,064&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crisp.chat&lt;/td&gt;
&lt;td&gt;13,823&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chatra.com&lt;/td&gt;
&lt;td&gt;312&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;liveagent.com&lt;/td&gt;
&lt;td&gt;2,019&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  the overlap
&lt;/h2&gt;

&lt;p&gt;across the 8 subjects, we found 11,499 unique linking domains. the clean universal set contains 9 domains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unique linking domains&lt;/td&gt;
&lt;td&gt;11,499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to one subject&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;overlap distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;th&gt;all domains&lt;/th&gt;
&lt;th&gt;non-platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 7&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 6&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 5&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 4&lt;/td&gt;
&lt;td&gt;148&lt;/td&gt;
&lt;td&gt;142&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 3&lt;/td&gt;
&lt;td&gt;326&lt;/td&gt;
&lt;td&gt;318&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 2&lt;/td&gt;
&lt;td&gt;937&lt;/td&gt;
&lt;td&gt;925&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to just 1&lt;/td&gt;
&lt;td&gt;9,929&lt;/td&gt;
&lt;td&gt;9,920&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;the distribution is the interesting part. most linking domains sit in the bottom row: they mention one product and never come back. the rows above it are where outreach lives, because a site that already covers several products in a category has an editorial reason to cover another one. a short universal list usually means the category is covered by a handful of directories, review sites and integration hubs rather than by a broad press base. a long one means the category has real editorial coverage, and the same sites are reachable for you.&lt;/p&gt;

&lt;p&gt;the highest-authority sites linking to all of them are shopify.com, hubspot.com and sendpulse.com. those are the pages worth reading before you pitch anything, because they already decided this category is worth covering.&lt;/p&gt;

&lt;p&gt;livechat.com carries the widest referring-domain profile of the set and chatra.com the narrowest, which is usually a function of age and press coverage rather than product quality. the gap between them is the practical opportunity: sites that cover the widest profile but not the narrowest are demonstrably willing to write about this category.&lt;/p&gt;

&lt;h2&gt;
  
  
  the category linkers
&lt;/h2&gt;

&lt;p&gt;77 non-platform domains link to at least 6 of the 8 subjects. these repeat linkers are the sites most consistently connected to live chat tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;highest-overlap category linkers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;subjects&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;th&gt;links to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shopify.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hubspot.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sendpulse.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jivochat.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saashub.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;elink.io&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chatty.net&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;designbeep.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;podium.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zendesk.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jotform.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;brevo.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zendesk.co.uk&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;databox.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seo.ai&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;socialcompare.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, crisp.chat, chatra.com, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;site123.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, chatra.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;callbell.eu&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zendesk.com.br&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;entireweb.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;tidio.com, tawk.to, livechat.com, olark.com, drift.com, crisp.chat, liveagent.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  the full data
&lt;/h3&gt;

&lt;p&gt;download all 77 clean domains that link to at least 6 of the 8 subjects, ranked by overlap and authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-live-chat-tool/dataset.csv" rel="noopener noreferrer"&gt;download csv&lt;/a&gt; | &lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-live-chat-tool/dataset.json" rel="noopener noreferrer"&gt;download json&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  check any of these domains
&lt;/h3&gt;

&lt;p&gt;every domain in the tables above links to its full referring-domain profile. run your own domain to see who links to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/" rel="noopener noreferrer"&gt;look up your backlinks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  run this for your own niche
&lt;/h2&gt;

&lt;p&gt;pick your closest competitors, compare their referring domains, and keep the sites that link to several of them but not to you. sorting that gap by overlap and authority turns the same method into a specific outreach list.&lt;/p&gt;

&lt;p&gt;the ordering is what makes it usable. a site that links to most of your competitors and not to you is a gap with an obvious pitch. the observed overlap gives you a specific reason to contact each site instead of relying on domain authority alone. work down from the top of the overlap column and stop when the reasons start feeling thin, because a pitch you cannot justify in one sentence is not worth sending.&lt;/p&gt;

&lt;p&gt;one caveat worth stating plainly. common crawl is a sample of the web, not a census, so treat these counts as the shape of a link profile rather than an exact total. this study measures the Apr-Jun 2026 release, so rerun the comparison against later releases before treating any movement as a trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  find the overlap in your market
&lt;/h3&gt;

&lt;p&gt;run a backlink gap analysis on the same common crawl data used for this study.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/gap-analysis" rel="noopener noreferrer"&gt;run a free gap analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>seo</category>
      <category>web</category>
    </item>
    <item>
      <title>We counted the links behind 580 first-page Google results</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Fri, 30 Oct 2026 19:38:18 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/we-counted-the-links-behind-580-first-page-google-results-529p</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/we-counted-the-links-behind-580-first-page-google-results-529p</guid>
      <description>&lt;p&gt;"How many backlinks do I need to rank?" gets the same answer almost everywhere: 0 to 25 for easy keywords, 50 to 100 for hard ones. I couldn't find where those numbers came from, so we measured them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we did
&lt;/h2&gt;

&lt;p&gt;We fixed a list of 60 keywords across six niches before pulling anything. Two had no stored results, which left 58. For each one we took the newest US Google snapshot in DataForSEO's data and the top 10 organic results, then read the referring domains for each exact URL and for its site.&lt;/p&gt;

&lt;p&gt;The page counts come from DataForSEO rather than our own product. CrawlGraph is built on the Common Crawl web graph, and that graph is domain-level, so it can't count links to a single page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyword difficulty&lt;/th&gt;
&lt;th&gt;Pages&lt;/th&gt;
&lt;th&gt;Median page&lt;/th&gt;
&lt;th&gt;Median site&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low (under 15)&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6,921&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium (15 to 29)&lt;/td&gt;
&lt;td&gt;190&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;40,851&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High (30 and up)&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;53,899&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All&lt;/td&gt;
&lt;td&gt;580&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;25,372&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The low end of the rule holds. 87% of pages on low-difficulty keywords had 25 referring domains or fewer.&lt;/li&gt;
&lt;li&gt;The high end doesn't. Only 9 of 120 pages on hard keywords fell between 50 and 100. 53 had 25 or fewer and 49 had 100 or more.&lt;/li&gt;
&lt;li&gt;The first result had the most links on its page, or tied for it, in only 8 of 58 keywords.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The catch
&lt;/h2&gt;

&lt;p&gt;300 of the 580 results had 5 or fewer referring domains, which sounds encouraging until you look at the sites. 154 of those pages were on sites with at least 10,000 referring domains, and Reddit alone accounted for 49.&lt;/p&gt;

&lt;p&gt;Only 17 of the 580 results came from sites with 100 or fewer referring domains, and 11 of those were on low-difficulty keywords. If your site is new, keyword choice probably matters before link count does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The limits
&lt;/h2&gt;

&lt;p&gt;We chose the keywords by hand, so this describes them, not all of Google. A zero means none found in one index, and exact-URL lookups can miss links to redirects. Snapshots and link counts weren't read on the same day. And none of this shows that links cause rankings.&lt;/p&gt;

&lt;p&gt;The full write-up, including how to work out a number for your own keyword and a CSV of the per-keyword summary, is here: &lt;a href="https://crawlgraph.com/blog/how-many-backlinks-to-rank?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=link-study-2026-10" rel="noopener noreferrer"&gt;how many backlinks do you need to rank?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>startup</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Two checks worth adding when you rewrite a checkout modal</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Wed, 28 Oct 2026 20:54:42 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/two-checks-worth-adding-when-you-rewrite-a-checkout-modal-43c6</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/two-checks-worth-adding-when-you-rewrite-a-checkout-modal-43c6</guid>
      <description>&lt;p&gt;While rebuilding the free-preview and checkout flow in CrawlGraph, our review caught two details that are easy to miss: inherited disabled state and native email validation.&lt;/p&gt;

&lt;p&gt;The browser APIs covered both cases. We added checks for the pending request state.&lt;/p&gt;

&lt;p&gt;I build CrawlGraph, a backlink research and outreach tool. Here are the two checks from the interface work we just released.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A fieldset can disable an input without changing its attributes
&lt;/h2&gt;

&lt;p&gt;Our checkout has a plan chooser. While its request is pending, the chooser's fieldset is disabled.&lt;/p&gt;

&lt;p&gt;A focus-trap selector like this looks reasonable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button:not([disabled]), input:not([disabled])&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But an input inside a disabled fieldset can match that selector while still being disabled by the browser. It may have no &lt;code&gt;disabled&lt;/code&gt; attribute of its own.&lt;/p&gt;

&lt;p&gt;That matters when your trap treats the input as its last focusable element. Shift+Tab can try to focus a control that cannot receive focus. Forward Tab can leave the dialog because your calculated boundary is wrong.&lt;/p&gt;

&lt;p&gt;Check effective state as well as visibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focusableSelector&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getClientRects&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:disabled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a delayed checkout response, then press Tab and Shift+Tab from the close button while the request is pending.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/disabled" rel="noopener noreferrer"&gt;MDN describes how disabled fieldsets affect their descendant controls.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Inline errors should keep the browser's email validity check
&lt;/h2&gt;

&lt;p&gt;We wanted an inline error instead of the browser's validation bubble, so the rewritten form used &lt;code&gt;noValidate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That makes the submit handler responsible for validation. A check that only asks whether the string contains &lt;code&gt;@&lt;/code&gt; accepts &lt;code&gt;user@@example.com&lt;/code&gt; far enough to start a request.&lt;/p&gt;

&lt;p&gt;For an email input, the browser still exposes its validity state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeMismatch&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;validity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invalid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;showInlineError&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Track the valid action and start the request after this guard.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the visible label, associate the error with the field, and preserve the typed address. Client validation improves the interaction; the server still validates the request independently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/ValidityState/typeMismatch" rel="noopener noreferrer"&gt;The &lt;code&gt;typeMismatch&lt;/code&gt; documentation explains the email and URL checks.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One more check for nested dialogs
&lt;/h2&gt;

&lt;p&gt;Our free preview can open checkout. Escape should close the top dialog, preserve the preview beneath it, and return focus to the button that opened checkout. Background scrolling should remain locked until the final dialog closes.&lt;/p&gt;

&lt;p&gt;We now render one responsive panel per modal instead of separate desktop and mobile copies. A shared stack owns focus and scroll behavior.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/" rel="noopener noreferrer"&gt;WAI modal-dialog pattern&lt;/a&gt; is a useful baseline for Tab, Shift+Tab, initial focus and Escape behavior. We checked the Stripe backlink lookup against the live API and covered pending, error and already-paid checkout states with controlled responses.&lt;/p&gt;

&lt;p&gt;The updated &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=cro1028" rel="noopener noreferrer"&gt;CrawlGraph preview&lt;/a&gt; lets you try up to five referring-domain rows without creating an account. Paid retrieval and CSV/JSON exports support up to 100,000 referring-domain rows per lookup. Paid users can also save outreach targets, find published contact emails and open a draft in their mail app.&lt;/p&gt;

&lt;p&gt;The updated flow is live. Try a stripe.com lookup and follow the results into the outreach workflow.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>7 domains link to every major payment gateway</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Mon, 26 Oct 2026 01:13:11 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/7-domains-link-to-every-major-payment-gateway-52gd</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/7-domains-link-to-every-major-payment-gateway-52gd</guid>
      <description>&lt;p&gt;we compared 8 payment gateways in common crawl's domain-level link graph. 7 non-platform domains link to all 8, while 82% of linking domains appear for only one subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  how we pulled this
&lt;/h2&gt;

&lt;p&gt;for each subject domain, we pulled the top 2,000 referring domains by authority from common crawl release Apr-Jun 2026 (cc-main-2026-apr-may-jun). we intersected those lists, then removed platform, cdn, social, and other non-editorial domains from the clean overlap counts.&lt;/p&gt;

&lt;p&gt;the filter matters. hosting providers, cdns, url shorteners and the big social networks link to almost everything, so leaving them in would produce a universal list that is technically correct and useless for outreach. the counts below are after that filter unless a column says otherwise. everything here comes from the open common crawl webgraph, so you can reproduce it without a paid backlink tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;subject domains&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;referring domains&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;stripe.com&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;paypal.com&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;adyen.com&lt;/td&gt;
&lt;td&gt;18,781&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;braintreepayments.com&lt;/td&gt;
&lt;td&gt;10,487&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;authorize.net&lt;/td&gt;
&lt;td&gt;23,356&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;worldpay.com&lt;/td&gt;
&lt;td&gt;4,861&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mollie.com&lt;/td&gt;
&lt;td&gt;18,907&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;checkout.com&lt;/td&gt;
&lt;td&gt;3,339&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  the overlap
&lt;/h2&gt;

&lt;p&gt;across the 8 subjects, we found 12,499 unique linking domains. the clean universal set contains 7 domains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unique linking domains&lt;/td&gt;
&lt;td&gt;12,499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to one subject&lt;/td&gt;
&lt;td&gt;82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;overlap distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;th&gt;all domains&lt;/th&gt;
&lt;th&gt;non-platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 7&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 6&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 5&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 4&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;155&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 3&lt;/td&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;391&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 2&lt;/td&gt;
&lt;td&gt;1,519&lt;/td&gt;
&lt;td&gt;1,503&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to just 1&lt;/td&gt;
&lt;td&gt;10,274&lt;/td&gt;
&lt;td&gt;10,254&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;the distribution is the interesting part. most linking domains sit in the bottom row: they mention one product and never come back. the rows above it are where outreach lives, because a site that already covers several products in a category has an editorial reason to cover another one. a short universal list usually means the category is covered by a handful of directories, review sites and integration hubs rather than by a broad press base. a long one means the category has real editorial coverage, and the same sites are reachable for you.&lt;/p&gt;

&lt;p&gt;the highest-authority sites linking to all of them are shopify.com, appspot.com and hubspot.com. those are the pages worth reading before you pitch anything, because they already decided this category is worth covering.&lt;/p&gt;

&lt;p&gt;stripe.com carries the widest referring-domain profile of the set and checkout.com the narrowest, which is usually a function of age and press coverage rather than product quality. the gap between them is the practical opportunity: sites that cover the widest profile but not the narrowest are demonstrably willing to write about this category.&lt;/p&gt;

&lt;h2&gt;
  
  
  the category linkers
&lt;/h2&gt;

&lt;p&gt;45 non-platform domains link to at least 6 of the 8 subjects. these repeat linkers are the sites most consistently connected to payment gateways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;highest-overlap category linkers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;subjects&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;th&gt;links to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shopify.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;appspot.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hubspot.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;drupal.org&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;entrepreneur.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pymnts.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google.cn&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;techradar.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bigcommerce.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iubenda.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wise.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jotform.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;woocommerce.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;elementor.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;freshdesk.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coda.io&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;packagist.org&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, mollie.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;geekflare.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;simplybook.me&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, mollie.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;netguru.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;stripe.com, paypal.com, adyen.com, braintreepayments.com, authorize.net, worldpay.com, checkout.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  the full data
&lt;/h3&gt;

&lt;p&gt;download all 45 clean domains that link to at least 6 of the 8 subjects, ranked by overlap and authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-payment-gateway/dataset.csv" rel="noopener noreferrer"&gt;download csv&lt;/a&gt; | &lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-payment-gateway/dataset.json" rel="noopener noreferrer"&gt;download json&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  check any of these domains
&lt;/h3&gt;

&lt;p&gt;every domain in the tables above links to its full referring-domain profile. run your own domain to see who links to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/" rel="noopener noreferrer"&gt;look up your backlinks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  run this for your own niche
&lt;/h2&gt;

&lt;p&gt;pick your closest competitors, compare their referring domains, and keep the sites that link to several of them but not to you. sorting that gap by overlap and authority turns the same method into a specific outreach list.&lt;/p&gt;

&lt;p&gt;the ordering is what makes it usable. a site that links to most of your competitors and not to you is a gap with an obvious pitch. the observed overlap gives you a specific reason to contact each site instead of relying on domain authority alone. work down from the top of the overlap column and stop when the reasons start feeling thin, because a pitch you cannot justify in one sentence is not worth sending.&lt;/p&gt;

&lt;p&gt;one caveat worth stating plainly. common crawl is a sample of the web, not a census, so treat these counts as the shape of a link profile rather than an exact total. this study measures the Apr-Jun 2026 release, so rerun the comparison against later releases before treating any movement as a trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  find the overlap in your market
&lt;/h3&gt;

&lt;p&gt;run a backlink gap analysis on the same common crawl data used for this study.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/gap-analysis" rel="noopener noreferrer"&gt;run a free gap analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>data</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your authority-score filter cannot be pasted into a different backlink export</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Sun, 25 Oct 2026 18:44:16 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/your-authority-score-filter-cannot-be-pasted-into-a-different-backlink-export-3c4l</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/your-authority-score-filter-cannot-be-pasted-into-a-different-backlink-export-3c4l</guid>
      <description>&lt;p&gt;A filter such as "authority at least 50" is incomplete until you name the metric and data source. A value from one backlink provider is not a portable threshold for another provider's score, even when both fit on a 0-to-100 scale.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=authority-filter-20261025" rel="noopener noreferrer"&gt;crawlgraph&lt;/a&gt;. This is the export worksheet I recommend when somebody wants to replace a backlink tool while keeping the old spreadsheet's filters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the metric's identity in the column name
&lt;/h2&gt;

&lt;p&gt;These headers make different promises:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;score
moz_da
ahrefs_dr
cg_authority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generic first header hides information you need later. Keep the provider's actual metric name. Store the source, observed release or date, export limit and filters beside the file.&lt;/p&gt;

&lt;p&gt;If the next report uses a different score, give it a different column. Do not silently rename it to the old metric because the spreadsheet formula expects that name.&lt;/p&gt;

&lt;p&gt;For example, crawlgraph's &lt;code&gt;cg_authority&lt;/code&gt; is a graph-derived score documented in its &lt;a href="https://crawlgraph.com/docs/api" rel="noopener noreferrer"&gt;API contract&lt;/a&gt;. It is not a DA or DR conversion. The same numeric range does not supply a conversion formula.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the report's purpose
&lt;/h2&gt;

&lt;p&gt;An authority cutoff is often standing in for a more useful question.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intended decision&lt;/th&gt;
&lt;th&gt;Evidence to inspect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is this publisher relevant to our audience?&lt;/td&gt;
&lt;td&gt;Its content, category and actual readers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does this site link to our competitors?&lt;/td&gt;
&lt;td&gt;Comparable referring-domain observations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is there a useful page to investigate?&lt;/td&gt;
&lt;td&gt;A relevant source page and its context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Should this candidate be investigated first?&lt;/td&gt;
&lt;td&gt;A stated prioritization rule, followed by inspection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A score can help sort a list. It does not establish those other facts by itself.&lt;/p&gt;

&lt;p&gt;Before changing tools, write down which decision your existing threshold supports. If nobody can explain why the report uses 50 rather than 40, preserve that as an assumption to test rather than an industry requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the candidate list, not just the totals
&lt;/h2&gt;

&lt;p&gt;Choose a small sample from above and below your proposed cutoff. Open the sites and record whether each candidate is relevant and worth further investigation.&lt;/p&gt;

&lt;p&gt;A simple worksheet is enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;referring_hostname,metric_name,metric_value,source,release_or_date,relevance_note,next_action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The columns deliberately separate the score from the human research result. Add an actual source-page URL once you locate one; a referring hostname alone is not a page-level backlink record.&lt;/p&gt;

&lt;p&gt;This is a way to assess your prioritization rule on the data you have. It is not a new vendor-neutral authority formula or a claim that the sampled sites represent the whole web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve unknowns
&lt;/h2&gt;

&lt;p&gt;Do not replace a missing authority value with zero unless the provider explicitly defines that behavior. A missing value and a measured value of zero are different observations.&lt;/p&gt;

&lt;p&gt;Keep truncated exports visible too. If a list contains only a top-ranked slice, it cannot establish that a lower-scored hostname has no link to the target.&lt;/p&gt;

&lt;p&gt;For recurring reports, keep these four checks beside the import:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The metric name and source match the report definition.&lt;/li&gt;
&lt;li&gt;The release or observation date is recorded.&lt;/li&gt;
&lt;li&gt;Missing values remain distinguishable from measured zeros.&lt;/li&gt;
&lt;li&gt;Returned rows and reported totals are kept separately.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Buy the fields your workflow needs
&lt;/h2&gt;

&lt;p&gt;Changing the provider can change the index, observation dates, available records and metric definition at the same time. Check each before treating the new export as interchangeable with the old one.&lt;/p&gt;

&lt;p&gt;If you need referring-domain research and competitor overlap, &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=authority-filter-20261025" rel="noopener noreferrer"&gt;check a domain free and inspect crawlgraph's current plans&lt;/a&gt;. Its free web preview shows five referring domains. Paid core access supports expanded results and CSV/JSON exports capped at 100,000 rows per domain, with the total reported separately. It does not replace daily rank tracking, keyword research or every field in a full SEO suite.&lt;/p&gt;

&lt;p&gt;The longer &lt;a href="https://crawlgraph.com/blog/domain-authority-vs-domain-rating" rel="noopener noreferrer"&gt;authority-metric guide&lt;/a&gt; covers the distinctions. Keep a provider-specific score when it is useful; keep the research decision explicit as well.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>startup</category>
      <category>marketing</category>
    </item>
    <item>
      <title>A missing backlink in a new snapshot is not a confirmed lost link</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Sun, 25 Oct 2026 18:42:17 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/a-missing-backlink-in-a-new-snapshot-is-not-a-confirmed-lost-link-5goi</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/a-missing-backlink-in-a-new-snapshot-is-not-a-confirmed-lost-link-5goi</guid>
      <description>&lt;p&gt;A referring domain that disappears from a new crawl snapshot is an observation to investigate. It is not proof that somebody removed a live backlink. Before sending a lost-link report, check the release identities, the comparison unit and whether either export was truncated.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=snapshot-diff-20261025" rel="noopener noreferrer"&gt;crawlgraph&lt;/a&gt;, which uses imported Common Crawl graphs for backlink research. Here is a small offline workflow for comparing saved responses without turning missing rows into false certainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep three dates separate
&lt;/h2&gt;

&lt;p&gt;A source crawl, an upstream graph publication and a tool's queryable release are different things.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What it establishes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A page was captured in a crawl&lt;/td&gt;
&lt;td&gt;That capture exists in that crawl archive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A graph was published upstream&lt;/td&gt;
&lt;td&gt;That graph artifact is available from its publisher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A release is queryable in your tool&lt;/td&gt;
&lt;td&gt;The tool can answer requests against its imported release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A newer graph on Common Crawl's website does not automatically become a new dataset inside every product that uses Common Crawl. Check the &lt;a href="https://commoncrawl.org/web-graphs" rel="noopener noreferrer"&gt;upstream graph list&lt;/a&gt; and the tool's own release availability separately.&lt;/p&gt;

&lt;p&gt;For a comparison, keep the original responses with their &lt;code&gt;release_id&lt;/code&gt;. Record which release is older and which is newer. Do not infer chronology by sorting arbitrary identifier strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refuse a partial comparison
&lt;/h2&gt;

&lt;p&gt;Suppose your older response reports 2,000 referring domains but returns only 1,000 rows. The absent half can contain a hostname that appears in your newer export. Calling that hostname newly discovered would overstate what the two files establish.&lt;/p&gt;

&lt;p&gt;The opposite problem also matters: a hostname from the older file can fall below a newer export's row cap while still existing in the newer observed set.&lt;/p&gt;

&lt;p&gt;For the strict workflow below, both responses must satisfy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;returned == len(results) == total_linking_domains
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The target domain must match, and release identifiers must differ. This checks the response's reported completeness. It does not independently verify the files' provenance, collection method or whole-web coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a synthetic fixture first
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://gist.github.com/pucilpet/e15a147922e3fe8e5882c20c91c534cb" rel="noopener noreferrer"&gt;standalone Python Gist&lt;/a&gt; contains &lt;code&gt;snapshot_diff.py&lt;/code&gt; and two synthetic JSON fixtures. Download its four files into one directory and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 snapshot_diff.py &lt;span class="nt"&gt;--older&lt;/span&gt; older.json.example &lt;span class="nt"&gt;--newer&lt;/span&gt; newer.json.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fixtures use reserved &lt;code&gt;.example&lt;/code&gt; names and invented release identifiers. They are not measurements of customer websites.&lt;/p&gt;

&lt;p&gt;The result contains two kinds of row:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;observed_added&lt;/code&gt;: present only in the newer saved response.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;observed_absent&lt;/code&gt;: present only in the older saved response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shared hostname is omitted. Missing authority values remain empty rather than becoming zero. The script copies supplied authority values; it does not calculate a new score or convert another vendor's metric.&lt;/p&gt;

&lt;p&gt;For real files, the command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 snapshot_diff.py &lt;span class="nt"&gt;--older&lt;/span&gt; earlier.json &lt;span class="nt"&gt;--newer&lt;/span&gt; later.json &lt;span class="nt"&gt;--output&lt;/span&gt; observations.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--output&lt;/code&gt; creates a new file and refuses to overwrite an existing one, including a symlink. Both inputs are validated before writing. The comparison runs locally: no API key, network request or lookup quota is needed to compare files you already hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name the result after the evidence
&lt;/h2&gt;

&lt;p&gt;A useful report sentence is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This referring hostname was observed in release A and absent from our complete response for release B. Its live-link status has not been verified.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That wording leaves room for several explanations: changed crawl coverage, a different graph observation, a site change or an actual removed link.&lt;/p&gt;

&lt;p&gt;The graph result is a referring hostname, not a source-page URL. To confirm a removed link, you still need to identify and inspect the relevant source page. If you cannot locate it, preserve the observation and the uncertainty rather than marking a deletion as confirmed.&lt;/p&gt;

&lt;p&gt;A new hostname also needs context. A directory entry, an editorial recommendation and a technical resource link can suggest different actions even when they all enter a referring-domain set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose the tool for the reporting job
&lt;/h2&gt;

&lt;p&gt;Snapshot comparisons can support periodic backlink research. They cannot promise that a link placed today will be found tomorrow, or that every live link is represented.&lt;/p&gt;

&lt;p&gt;If your workflow is researching referring domains and competitor overlap, &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=snapshot-diff-20261025" rel="noopener noreferrer"&gt;try your own domain free and compare the current plans&lt;/a&gt;. Crawlgraph's free web preview shows five referring domains; paid core access expands results and supports capped CSV/JSON exports. If your deliverable needs continuously refreshed source-page records, evaluate that requirement before buying.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://crawlgraph.com/blog/common-crawl-release-schedule" rel="noopener noreferrer"&gt;Common Crawl release guide&lt;/a&gt; explains crawl, graph and import states. The &lt;a href="https://crawlgraph.com/docs/api" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; documents fields, release availability, quotas and the hosted snapshot-change endpoint if you prefer it to local files.&lt;/p&gt;

</description>
      <category>python</category>
      <category>seo</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Before buying a backlink-tool subscription, run this three-domain test</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Sat, 24 Oct 2026 18:14:18 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/before-buying-a-backlink-tool-subscription-run-this-three-domain-test-1783</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/before-buying-a-backlink-tool-subscription-run-this-three-domain-test-1783</guid>
      <description>&lt;p&gt;A backlink subscription is useful only if it answers the question you actually need answered. Before comparing annual plans, test your own domain and two competitors. Check whether the data produces a useful research shortlist, whether you can export it, and whether its observation dates fit your work.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=buying-test-20261024" rel="noopener noreferrer"&gt;crawlgraph&lt;/a&gt;. It sells backlink intelligence from Common Crawl, including a one-time lifetime option. This is the buying test I recommend before paying for it or another backlink tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Write down the report you need
&lt;/h2&gt;

&lt;p&gt;These are different jobs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your next task&lt;/th&gt;
&lt;th&gt;What the tool must provide&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find sites that mention two competitors&lt;/td&gt;
&lt;td&gt;Comparable referring-domain sets and overlap analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify a specific link's anchor and source page&lt;/td&gt;
&lt;td&gt;Page-level backlink records with those fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report links gained or lost this week&lt;/td&gt;
&lt;td&gt;Repeated observations with dates and suitable freshness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report keyword positions every day&lt;/td&gt;
&lt;td&gt;A rank tracker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put referring domains into a spreadsheet&lt;/td&gt;
&lt;td&gt;A usable export within your required row limit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A referring-domain graph can help with the first and last tasks. It does not automatically provide the other three. A cheaper tool that omits your required fields costs you another purchase later.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use three real domains
&lt;/h2&gt;

&lt;p&gt;Choose your site and two competitors whose products serve the same audience. A famous company in a different category is usually a poor comparison.&lt;/p&gt;

&lt;p&gt;Run the same lookup for all three. Save the date, dataset release where available, filters, returned row count and reported total. Then ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the result contain publishers you can plausibly learn from?&lt;/li&gt;
&lt;li&gt;Can you distinguish the source hostname from an actual source-page URL?&lt;/li&gt;
&lt;li&gt;Does the export include the fields your report needs?&lt;/li&gt;
&lt;li&gt;Is the result a sample, a capped slice or the full set observed by that provider?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An absent hostname in a five-row preview is not evidence that the site has no link. It is evidence that the hostname was absent from those five rows.&lt;/p&gt;

&lt;p&gt;If you compare competitor overlap, use comparable inputs. A partial own-site list can label an existing referring domain as a new prospect. Keep truncation and observation dates visible in the report.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Inspect five candidates before buying
&lt;/h2&gt;

&lt;p&gt;Take five potentially relevant hosts from the result. Visit their sites and look for the context in which they discuss your category.&lt;/p&gt;

&lt;p&gt;A software directory, an editorial comparison and a footer link can all appear as referring domains. They suggest different next steps. A hostname alone does not tell you where the link sits, whether it still exists or whether the publisher accepts submissions.&lt;/p&gt;

&lt;p&gt;The test succeeds when you can explain why those candidates are relevant and how you would verify them. Five irrelevant rows are a reason to investigate coverage or targeting before unlocking a larger export.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Compare the cost of that job
&lt;/h2&gt;

&lt;p&gt;Use the quote and billing terms you can actually buy. For illustration, a hypothetical $40 monthly subscription costs $120 for three monthly payments and $480 for twelve. That arithmetic says nothing about whether its features match a one-time purchase.&lt;/p&gt;

&lt;p&gt;Compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your expected number of research sessions.&lt;/li&gt;
&lt;li&gt;The export allowance and API quota you need.&lt;/li&gt;
&lt;li&gt;The required freshness and history.&lt;/li&gt;
&lt;li&gt;Features you would still need to buy separately.&lt;/li&gt;
&lt;li&gt;Refund terms and what happens to saved projects after cancellation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a one-off task, a monthly plan may be sensible. For repeated referring-domain research, a specialist lifetime option may be worth testing. For weekly link-loss reports, freshness can matter more than either price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where crawlgraph fits
&lt;/h2&gt;

&lt;p&gt;Crawlgraph's free web lookup shows five referring domains. Paid core access expands the available result slice and supports CSV and JSON exports, capped at 100,000 rows per domain with the total reported separately. It also offers hosted competitor-gap analysis.&lt;/p&gt;

&lt;p&gt;It uses imported Common Crawl graph snapshots. It does not replace keyword research, daily rank tracking, a technical site crawler or a continuously refreshed page-level backlink index. Its authority percentile is not another vendor's DA or DR score.&lt;/p&gt;

&lt;p&gt;The free API allocation is 15 backlink calls per UTC month. Hosted gap jobs require paid core access; the current paid API allocation is 1,000 backlink calls and 50 gap jobs per UTC month. See the &lt;a href="https://crawlgraph.com/docs/api" rel="noopener noreferrer"&gt;API documentation&lt;/a&gt; for the current contract.&lt;/p&gt;

&lt;p&gt;If this is the research job you need, &lt;a href="https://crawlgraph.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=buying-test-20261024" rel="noopener noreferrer"&gt;check your own domain free, then compare the available plans&lt;/a&gt;. Check the current price, plan eligibility and limits on the site before purchasing.&lt;/p&gt;

&lt;p&gt;The longer &lt;a href="https://crawlgraph.com/blog/cheapest-ahrefs-alternative" rel="noopener noreferrer"&gt;backlink-tool cost and product-fit guide&lt;/a&gt; explains the tradeoffs. &lt;a href="https://commoncrawl.org/web-graphs" rel="noopener noreferrer"&gt;Common Crawl's graph documentation&lt;/a&gt; describes the underlying dataset.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>startup</category>
      <category>webdev</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Save backlink responses once, then build a local competitor-gap report</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:52:01 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/save-backlink-responses-once-then-build-a-local-competitor-gap-report-db6</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/save-backlink-responses-once-then-build-a-local-competitor-gap-report-db6</guid>
      <description>&lt;p&gt;Changing an authority threshold or sorting a backlink report should not require downloading the same data again. Save the original API responses, keep their release metadata, and run the comparison locally. The useful part is making sure the files describe comparable observations before treating an absent hostname as a gap.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://crawlgraph.com" rel="noopener noreferrer"&gt;crawlgraph&lt;/a&gt;. This tutorial uses its JSON response format. The Python CSV comparator also works with compatible referring-host exports from another source, and the included synthetic example needs no account, API key or network access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a small, reproducible fixture
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://gist.github.com/pucilpet/3b5c0954af3b5c808bbb610d660ba62a" rel="noopener noreferrer"&gt;runnable Gist&lt;/a&gt; contains two standard-library Python scripts and three CSV fixtures. Download its six files into one directory.&lt;/p&gt;

&lt;p&gt;The inputs use reserved &lt;code&gt;.example&lt;/code&gt; names:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Referring hosts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;own.csv&lt;/td&gt;
&lt;td&gt;shared.example, ours.example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rival-a.csv&lt;/td&gt;
&lt;td&gt;shared.example, roundup.example, guide.example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rival-b.csv&lt;/td&gt;
&lt;td&gt;shared.example, roundup.example, review.example&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 gap_analysis.py &lt;span class="nt"&gt;--your&lt;/span&gt; own.csv &lt;span class="nt"&gt;--competitor&lt;/span&gt; rival-a.csv &lt;span class="nt"&gt;--competitor&lt;/span&gt; rival-b.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source_domain,competitor_overlap,competitors
roundup.example,2,rival-a;rival-b
guide.example,1,rival-a
review.example,1,rival-b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shared host disappears because it is already in your own set. &lt;code&gt;roundup.example&lt;/code&gt; appears in both competitor sets, so its overlap is two. Repeating it ten times in one CSV would still count as one competitor.&lt;/p&gt;

&lt;p&gt;These are test fixtures, not customer results or actual outreach prospects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Save the response before filtering it
&lt;/h2&gt;

&lt;p&gt;For a real run, keep one response per target. With your key already in an environment variable, a single request looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; noclobber
: &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CG_KEY&lt;/span&gt;:?set&lt;span class="p"&gt; CG_KEY in your shell first&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="nt"&gt;--max-time&lt;/span&gt; 30 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://crawlgraph.com/api/v1/backlinks &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CG_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"domain":"example.com","limit":1000,"sort":"authority"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; own.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example uses &lt;code&gt;example.com&lt;/code&gt;; replace it with the public target you intend to research. Save separate responses for two distinct competitors as &lt;code&gt;rival-a.json&lt;/code&gt; and &lt;code&gt;rival-b.json&lt;/code&gt;. Three successful requests use three backlink lookups. The current free allocation is 15 backlink calls per UTC month; the hosted gap-analysis endpoint requires paid core access. The local set comparison here is ordinary Python operating on files you already have.&lt;/p&gt;

&lt;p&gt;The command stops on an HTTP error and refuses to overwrite an existing output file. Keep the key out of the files you publish. No live requests are needed to run the synthetic fixture.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://crawlgraph.com/docs/api" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; explains authentication, response fields and quotas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reject mismatched or partial inputs
&lt;/h2&gt;

&lt;p&gt;Before making CSVs, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 export_hosts.py own.json rival-a.json rival-b.json &lt;span class="nt"&gt;--output-dir&lt;/span&gt; exports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The converter checks four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every response has the same &lt;code&gt;release_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The target domains and input filenames are distinct.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;returned&lt;/code&gt; matches the number of result rows and &lt;code&gt;total_linking_domains&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every row contains a valid hostname, with no duplicate &lt;code&gt;linking_domain&lt;/code&gt; rows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It validates the inputs before writing output. A reported partial response or a mixed release stops the conversion. Existing output files also stop it.&lt;/p&gt;

&lt;p&gt;Why reject partial responses? A competitor sample can supply a positive lead: “this host appears here.” But an incomplete own-site list cannot reliably support “this host is absent from our profile.” A set subtraction performed on two arbitrary top-1,000 slices can produce convincing-looking false gaps.&lt;/p&gt;

&lt;p&gt;Passing these checks means the API reports no truncation for the stored responses. Common Crawl is still an observed snapshot of the web, not a complete record of every live backlink. Keep those two limits separate.&lt;/p&gt;

&lt;p&gt;The converter writes a manifest beside the CSVs with each input filename, target domain, release and returned/total counts. Preserve the original JSON too, so another person can check how you produced the report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compute the gap locally
&lt;/h2&gt;

&lt;p&gt;Now compare the converted files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 gap_analysis.py &lt;span class="nt"&gt;--your&lt;/span&gt; exports/own.csv &lt;span class="nt"&gt;--competitor&lt;/span&gt; exports/rival-a.csv &lt;span class="nt"&gt;--competitor&lt;/span&gt; exports/rival-b.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The operation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;union(competitor hosts) - own hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each remaining host, the script records which competitor inputs contain it and sorts by competitor overlap, then hostname.&lt;/p&gt;

&lt;p&gt;Normalization is deliberately limited: lowercase names, remove trailing dots and convert internationalized names to ASCII IDNA. Subdomains remain distinct. A full source-page URL is rejected rather than silently converted into a different comparison unit.&lt;/p&gt;

&lt;p&gt;If your exports use another provider's column names, map the hostname column to &lt;code&gt;source_domain&lt;/code&gt; first. Record that provider's observation date, filters and export cap yourself; the generic CSV comparator cannot reconstruct metadata that was never exported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use overlap to choose what to inspect
&lt;/h2&gt;

&lt;p&gt;A host shared by several competitors is a useful place to begin inspection. It is not an automatic recommendation to contact that publisher.&lt;/p&gt;

&lt;p&gt;Open the relevant page, check that the link is still present, and look at the page's audience and context. A software directory, an article about a competing category and a sitewide navigation link can all enter the same set while suggesting very different next steps.&lt;/p&gt;

&lt;p&gt;The scripts handle the repeatable calculation. You still decide whether a candidate has a relevant page and a useful reason to mention your site.&lt;/p&gt;

&lt;p&gt;You can find the wider workflow in the &lt;a href="https://crawlgraph.com/blog/backlink-api-recipes" rel="noopener noreferrer"&gt;programmatic backlink research recipes&lt;/a&gt; and the underlying snapshot model in &lt;a href="https://commoncrawl.org/web-graphs" rel="noopener noreferrer"&gt;Common Crawl's web-graph documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>seo</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A site crawl alone cannot show who links to your competitors</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:54:40 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/a-site-crawl-alone-cannot-show-who-links-to-your-competitors-5ad8</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/a-site-crawl-alone-cannot-show-who-links-to-your-competitors-5ad8</guid>
      <description>&lt;p&gt;A site crawler starts with pages you choose. A backlink index starts with pages discovered across other sites. A hyperlink graph stores connections between pages, hosts, or domains. These tools share crawling technology, but they answer different questions.&lt;/p&gt;

&lt;p&gt;If you are building an SEO workflow, choosing the wrong input can produce a perfectly valid computation that answers the wrong question.&lt;/p&gt;

&lt;p&gt;Disclosure: I maintain crawlgraph, which queries Common Crawl hyperlink graphs. This article adapts our &lt;a href="https://crawlgraph.com/blog/backlink-crawling-tool" rel="noopener noreferrer"&gt;backlink crawling tool guide&lt;/a&gt;. The examples below are illustrative, not measurements of a customer's site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose the evidence before the tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your question&lt;/th&gt;
&lt;th&gt;Evidence you need&lt;/th&gt;
&lt;th&gt;Useful starting point&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Which internal pages link to a broken URL?&lt;/td&gt;
&lt;td&gt;Links extracted from your site's pages&lt;/td&gt;
&lt;td&gt;A site crawler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which hosts were observed linking to a competitor?&lt;/td&gt;
&lt;td&gt;Incoming edges in a dated index or graph&lt;/td&gt;
&lt;td&gt;A backlink index or hyperlink graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does this particular article still link to my site?&lt;/td&gt;
&lt;td&gt;The current source page and its actual link destination&lt;/td&gt;
&lt;td&gt;A page inspection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Did a publisher remove a link?&lt;/td&gt;
&lt;td&gt;Comparable earlier and current page evidence&lt;/td&gt;
&lt;td&gt;A change ledger plus verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A crawl of &lt;code&gt;example.com&lt;/code&gt; does not enumerate incoming links from the rest of the web. It can discover outgoing links on the pages it visits. Turning that into a competitor-backlink index requires discovering other sites, fetching their pages, extracting links, and storing relationships you can query in reverse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://commoncrawl.org/web-graphs" rel="noopener noreferrer"&gt;Common Crawl publishes hyperlink graphs&lt;/a&gt; that make large-scale relationship research possible without operating that whole crawl pipeline yourself. They remain dated observations with coverage limits. They are not a live check of every referring page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give every result a scope
&lt;/h2&gt;

&lt;p&gt;Before comparing two exports, write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target:&lt;/strong&gt; the exact hostname or domain you queried.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unit:&lt;/strong&gt; source pages, hosts, or registrable domains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observation:&lt;/strong&gt; the index or graph release and any known crawl date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filters:&lt;/strong&gt; exclusions, link-type rules, and grouping choices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completeness:&lt;/strong&gt; whether the returned rows were capped or paginated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, &lt;code&gt;docs.example.com&lt;/code&gt; and &lt;code&gt;www.example.com&lt;/code&gt; are different hosts. A domain-level export may group them together. Comparing its row count with a host-level export does not measure growth or loss.&lt;/p&gt;

&lt;p&gt;Likewise, a result cap is part of the dataset's meaning. A row missing from the first 1,000 results is not necessarily absent from the index. Preserve the returned total and cap indicators alongside the file, rather than throwing that context away after parsing the rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  A set difference is a research queue
&lt;/h2&gt;

&lt;p&gt;Once the scopes match, a simple difference can identify candidates worth inspecting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Synthetic host-level observations with matching scope.
# These values are examples, not live crawl results.
&lt;/span&gt;&lt;span class="n"&gt;earlier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs.example.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;journal.example.net&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;community.example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;later&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;journal.example.net&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;community.example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;news.example.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;missing_observations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;earlier&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;later&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;new_observations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;later&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;earlier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;missing_observations&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs.example.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;new_observations&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;news.example.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable names matter. &lt;code&gt;missing_observations&lt;/code&gt; does not establish &lt;code&gt;removed_links&lt;/code&gt;. The earlier graph may have included a page that the later crawl did not visit. A source may have moved, blocked access, or changed its destination. A host-level edge does not identify the exact article you need to inspect.&lt;/p&gt;

&lt;p&gt;Common Crawl's &lt;a href="https://commoncrawl.org/faq" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; describes the sampling boundary. Keep it in your output contract so the next person using your CSV does not accidentally turn a missing observation into a claim about a publisher's behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify before taking action
&lt;/h2&gt;

&lt;p&gt;For an important candidate, find the source URL and check the final page after redirects. Inspect the actual hyperlink destination, not just a text occurrence of your domain.&lt;/p&gt;

&lt;p&gt;A page can mention &lt;code&gt;example.com&lt;/code&gt; in plain text without linking to it. A successful HTTP response can contain a login screen or replacement homepage. An unsuccessful request tells you that verification failed; it does not prove that an editor deleted the link.&lt;/p&gt;

&lt;p&gt;Keep a small ledger:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source URL&lt;/th&gt;
&lt;th&gt;Checked at&lt;/th&gt;
&lt;th&gt;Final URL&lt;/th&gt;
&lt;th&gt;Link evidence&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Next action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;saved article URL&lt;/td&gt;
&lt;td&gt;UTC timestamp&lt;/td&gt;
&lt;td&gt;after redirects&lt;/td&gt;
&lt;td&gt;capture or inspected href&lt;/td&gt;
&lt;td&gt;present / absent on checked page / unresolved&lt;/td&gt;
&lt;td&gt;retain / investigate / recheck&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only label a change as a confirmed removal when you have comparable earlier evidence and a current inspection of the relevant page. Even then, the result establishes a page change, not what Google currently credits in its ranking systems.&lt;/p&gt;

&lt;p&gt;For competitor research, the same boundary applies: a host observed linking to a competitor is a prospect to qualify, not a promise that it will link to you. Read the page, assess relevance, and check editorial requirements before contacting anyone.&lt;/p&gt;

&lt;p&gt;The useful pipeline is &lt;strong&gt;discover candidates → preserve scope → inspect important pages → record a supported conclusion&lt;/strong&gt;. That pipeline works with a commercial index, an open graph, or your own crawler, provided the evidence matches the question.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>9 domains link to every major accounting tool</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Mon, 19 Oct 2026 01:47:53 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/9-domains-link-to-every-major-accounting-tool-2j89</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/9-domains-link-to-every-major-accounting-tool-2j89</guid>
      <description>&lt;p&gt;we compared 8 accounting tools in common crawl's domain-level link graph. 9 non-platform domains link to all 8, while 80% of linking domains appear for only one subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  how we pulled this
&lt;/h2&gt;

&lt;p&gt;for each subject domain, we pulled the top 2,000 referring domains by authority from common crawl release Apr-Jun 2026 (cc-main-2026-apr-may-jun). we intersected those lists, then removed platform, cdn, social, and other non-editorial domains from the clean overlap counts.&lt;/p&gt;

&lt;p&gt;the filter matters. hosting providers, cdns, url shorteners and the big social networks link to almost everything, so leaving them in would produce a universal list that is technically correct and useless for outreach. the counts below are after that filter unless a column says otherwise. everything here comes from the open common crawl webgraph, so you can reproduce it without a paid backlink tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;subject domains&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;referring domains&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;xero.com&lt;/td&gt;
&lt;td&gt;21,178&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;freshbooks.com&lt;/td&gt;
&lt;td&gt;9,916&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;waveapps.com&lt;/td&gt;
&lt;td&gt;6,408&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sage.com&lt;/td&gt;
&lt;td&gt;11,920&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;intuit.com&lt;/td&gt;
&lt;td&gt;62,108&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;odoo.com&lt;/td&gt;
&lt;td&gt;63,051&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bench.co&lt;/td&gt;
&lt;td&gt;2,152&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gnucash.org&lt;/td&gt;
&lt;td&gt;1,425&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  the overlap
&lt;/h2&gt;

&lt;p&gt;across the 8 subjects, we found 11,443 unique linking domains. the clean universal set contains 9 domains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unique linking domains&lt;/td&gt;
&lt;td&gt;11,443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to one subject&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;overlap distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;th&gt;all domains&lt;/th&gt;
&lt;th&gt;non-platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 7&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 6&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 5&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 4&lt;/td&gt;
&lt;td&gt;213&lt;/td&gt;
&lt;td&gt;209&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 3&lt;/td&gt;
&lt;td&gt;522&lt;/td&gt;
&lt;td&gt;516&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 2&lt;/td&gt;
&lt;td&gt;1,381&lt;/td&gt;
&lt;td&gt;1,374&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to just 1&lt;/td&gt;
&lt;td&gt;9,134&lt;/td&gt;
&lt;td&gt;9,122&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;the distribution is the interesting part. most linking domains sit in the bottom row: they mention one product and never come back. the rows above it are where outreach lives, because a site that already covers several products in a category has an editorial reason to cover another one. a short universal list usually means the category is covered by a handful of directories, review sites and integration hubs rather than by a broad press base. a long one means the category has real editorial coverage, and the same sites are reachable for you.&lt;/p&gt;

&lt;p&gt;the highest-authority sites linking to all of them are shopify.com, smallbiztrends.com and jotform.com. those are the pages worth reading before you pitch anything, because they already decided this category is worth covering.&lt;/p&gt;

&lt;p&gt;odoo.com carries the widest referring-domain profile of the set and gnucash.org the narrowest, which is usually a function of age and press coverage rather than product quality. the gap between them is the practical opportunity: sites that cover the widest profile but not the narrowest are demonstrably willing to write about this category.&lt;/p&gt;

&lt;h2&gt;
  
  
  the category linkers
&lt;/h2&gt;

&lt;p&gt;68 non-platform domains link to at least 6 of the 8 subjects. these repeat linkers are the sites most consistently connected to accounting tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;highest-overlap category linkers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;subjects&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;th&gt;links to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shopify.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smallbiztrends.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jotform.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;beehiiv.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uschamber.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;geekflare.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saashub.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;superagi.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;europeanbusinessreview.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hubspot.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bigcommerce.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;googleblog.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;entrepreneur.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libsyn.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dev.to&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, intuit.com, odoo.com, bench.co, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hostinger.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pymnts.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clickup.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wondershare.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, gnucash.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seo.ai&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;xero.com, freshbooks.com, waveapps.com, sage.com, intuit.com, odoo.com, bench.co&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  the full data
&lt;/h3&gt;

&lt;p&gt;download all 68 clean domains that link to at least 6 of the 8 subjects, ranked by overlap and authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-accounting-tool/dataset.csv" rel="noopener noreferrer"&gt;download csv&lt;/a&gt; | &lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-accounting-tool/dataset.json" rel="noopener noreferrer"&gt;download json&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  check any of these domains
&lt;/h3&gt;

&lt;p&gt;every domain in the tables above links to its full referring-domain profile. run your own domain to see who links to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/" rel="noopener noreferrer"&gt;look up your backlinks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  run this for your own niche
&lt;/h2&gt;

&lt;p&gt;pick your closest competitors, compare their referring domains, and keep the sites that link to several of them but not to you. sorting that gap by overlap and authority turns the same method into a specific outreach list.&lt;/p&gt;

&lt;p&gt;the ordering is what makes it usable. a site that links to most of your competitors and not to you is a gap with an obvious pitch. the observed overlap gives you a specific reason to contact each site instead of relying on domain authority alone. work down from the top of the overlap column and stop when the reasons start feeling thin, because a pitch you cannot justify in one sentence is not worth sending.&lt;/p&gt;

&lt;p&gt;one caveat worth stating plainly. common crawl is a sample of the web, not a census, so treat these counts as the shape of a link profile rather than an exact total. this study measures the Apr-Jun 2026 release, so rerun the comparison against later releases before treating any movement as a trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  find the overlap in your market
&lt;/h3&gt;

&lt;p&gt;run a backlink gap analysis on the same common crawl data used for this study.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/gap-analysis" rel="noopener noreferrer"&gt;run a free gap analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>seo</category>
      <category>web</category>
    </item>
    <item>
      <title>11 domains link to every major monitoring tool</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Mon, 12 Oct 2026 00:49:08 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/11-domains-link-to-every-major-monitoring-tool-e7h</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/11-domains-link-to-every-major-monitoring-tool-e7h</guid>
      <description>&lt;p&gt;we compared 8 monitoring and error tracking tools in common crawl's domain-level link graph. 11 non-platform domains link to all 8, while 81% of linking domains appear for only one subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  how we pulled this
&lt;/h2&gt;

&lt;p&gt;for each subject domain, we pulled the top 2,000 referring domains by authority from common crawl release Apr-Jun 2026 (cc-main-2026-apr-may-jun). we intersected those lists, then removed platform, cdn, social, and other non-editorial domains from the clean overlap counts.&lt;/p&gt;

&lt;p&gt;the filter matters. hosting providers, cdns, url shorteners and the big social networks link to almost everything, so leaving them in would produce a universal list that is technically correct and useless for outreach. the counts below are after that filter unless a column says otherwise. everything here comes from the open common crawl webgraph, so you can reproduce it without a paid backlink tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;subject domains&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;referring domains&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sentry.io&lt;/td&gt;
&lt;td&gt;13,290&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;datadoghq.com&lt;/td&gt;
&lt;td&gt;8,616&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;newrelic.com&lt;/td&gt;
&lt;td&gt;13,994&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grafana.com&lt;/td&gt;
&lt;td&gt;9,459&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dynatrace.com&lt;/td&gt;
&lt;td&gt;5,251&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;honeycomb.io&lt;/td&gt;
&lt;td&gt;1,444&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;betterstack.com&lt;/td&gt;
&lt;td&gt;5,962&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bugsnag.com&lt;/td&gt;
&lt;td&gt;1,717&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  the overlap
&lt;/h2&gt;

&lt;p&gt;across the 8 subjects, we found 11,073 unique linking domains. the clean universal set contains 11 domains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unique linking domains&lt;/td&gt;
&lt;td&gt;11,073&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to one subject&lt;/td&gt;
&lt;td&gt;81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;overlap distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;th&gt;all domains&lt;/th&gt;
&lt;th&gt;non-platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 7&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 6&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 5&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 4&lt;/td&gt;
&lt;td&gt;241&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 3&lt;/td&gt;
&lt;td&gt;468&lt;/td&gt;
&lt;td&gt;467&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 2&lt;/td&gt;
&lt;td&gt;1,081&lt;/td&gt;
&lt;td&gt;1,075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to just 1&lt;/td&gt;
&lt;td&gt;9,008&lt;/td&gt;
&lt;td&gt;8,994&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;the distribution is the interesting part. most linking domains sit in the bottom row: they mention one product and never come back. the rows above it are where outreach lives, because a site that already covers several products in a category has an editorial reason to cover another one. a short universal list usually means the category is covered by a handful of directories, review sites and integration hubs rather than by a broad press base. a long one means the category has real editorial coverage, and the same sites are reachable for you.&lt;/p&gt;

&lt;p&gt;the highest-authority sites linking to all of them are dev.to, cncf.io and linuxfoundation.org. those are the pages worth reading before you pitch anything, because they already decided this category is worth covering.&lt;/p&gt;

&lt;p&gt;newrelic.com carries the widest referring-domain profile of the set and honeycomb.io the narrowest, which is usually a function of age and press coverage rather than product quality. the gap between them is the practical opportunity: sites that cover the widest profile but not the narrowest are demonstrably willing to write about this category.&lt;/p&gt;

&lt;h2&gt;
  
  
  the category linkers
&lt;/h2&gt;

&lt;p&gt;124 non-platform domains link to at least 6 of the 8 subjects. these repeat linkers are the sites most consistently connected to monitoring and error tracking tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;highest-overlap category linkers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;subjects&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;th&gt;links to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dev.to&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cncf.io&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;linuxfoundation.org&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;opentelemetry.io&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zenn.dev&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;geekflare.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;solarwinds.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saashub.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;harness.io&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;edgedelta.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ministryoftesting.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wikimedia.org&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jetbrains.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, honeycomb.io, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libsyn.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;digitalocean.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, betterstack.com, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;go.dev&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;computerweekly.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clickup.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, betterstack.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hashicorp.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;duo.com&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;sentry.io, datadoghq.com, newrelic.com, grafana.com, dynatrace.com, honeycomb.io, bugsnag.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  the full data
&lt;/h3&gt;

&lt;p&gt;download all 124 clean domains that link to at least 6 of the 8 subjects, ranked by overlap and authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-monitoring-tool/dataset.csv" rel="noopener noreferrer"&gt;download csv&lt;/a&gt; | &lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-monitoring-tool/dataset.json" rel="noopener noreferrer"&gt;download json&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  check any of these domains
&lt;/h3&gt;

&lt;p&gt;every domain in the tables above links to its full referring-domain profile. run your own domain to see who links to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/" rel="noopener noreferrer"&gt;look up your backlinks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  run this for your own niche
&lt;/h2&gt;

&lt;p&gt;pick your closest competitors, compare their referring domains, and keep the sites that link to several of them but not to you. sorting that gap by overlap and authority turns the same method into a specific outreach list.&lt;/p&gt;

&lt;p&gt;the ordering is what makes it usable. a site that links to most of your competitors and not to you is a gap with an obvious pitch. the observed overlap gives you a specific reason to contact each site instead of relying on domain authority alone. work down from the top of the overlap column and stop when the reasons start feeling thin, because a pitch you cannot justify in one sentence is not worth sending.&lt;/p&gt;

&lt;p&gt;one caveat worth stating plainly. common crawl is a sample of the web, not a census, so treat these counts as the shape of a link profile rather than an exact total. this study measures the Apr-Jun 2026 release, so rerun the comparison against later releases before treating any movement as a trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  find the overlap in your market
&lt;/h3&gt;

&lt;p&gt;run a backlink gap analysis on the same common crawl data used for this study.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/gap-analysis" rel="noopener noreferrer"&gt;run a free gap analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>29 domains link to every major password manager</title>
      <dc:creator>Petteri Pucilowski</dc:creator>
      <pubDate>Mon, 28 Sep 2026 01:29:01 +0000</pubDate>
      <link>https://dev.to/petteri_pucilowski_7ec755/29-domains-link-to-every-major-password-manager-1l4c</link>
      <guid>https://dev.to/petteri_pucilowski_7ec755/29-domains-link-to-every-major-password-manager-1l4c</guid>
      <description>&lt;p&gt;we compared 8 password managers in common crawl's domain-level link graph. 29 non-platform domains link to all 8, while 73% of linking domains appear for only one subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  how we pulled this
&lt;/h2&gt;

&lt;p&gt;for each subject domain, we pulled the top 2,000 referring domains by authority from common crawl release Apr-Jun 2026 (cc-main-2026-apr-may-jun). we intersected those lists, then removed platform, cdn, social, and other non-editorial domains from the clean overlap counts.&lt;/p&gt;

&lt;p&gt;the filter matters. hosting providers, cdns, url shorteners and the big social networks link to almost everything, so leaving them in would produce a universal list that is technically correct and useless for outreach. the counts below are after that filter unless a column says otherwise. everything here comes from the open common crawl webgraph, so you can reproduce it without a paid backlink tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;subject domains&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;referring domains&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1password.com&lt;/td&gt;
&lt;td&gt;12,018&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bitwarden.com&lt;/td&gt;
&lt;td&gt;7,791&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dashlane.com&lt;/td&gt;
&lt;td&gt;5,498&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lastpass.com&lt;/td&gt;
&lt;td&gt;14,712&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;keepersecurity.com&lt;/td&gt;
&lt;td&gt;3,886&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nordpass.com&lt;/td&gt;
&lt;td&gt;4,745&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;roboform.com&lt;/td&gt;
&lt;td&gt;2,284&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;enpass.io&lt;/td&gt;
&lt;td&gt;722&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  the overlap
&lt;/h2&gt;

&lt;p&gt;across the 8 subjects, we found 9,672 unique linking domains. the clean universal set contains 29 domains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;metric&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;unique linking domains&lt;/td&gt;
&lt;td&gt;9,672&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to one subject&lt;/td&gt;
&lt;td&gt;73%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;overlap distribution&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;th&gt;all domains&lt;/th&gt;
&lt;th&gt;non-platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;link to all 8&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 7&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 6&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 5&lt;/td&gt;
&lt;td&gt;159&lt;/td&gt;
&lt;td&gt;158&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 4&lt;/td&gt;
&lt;td&gt;285&lt;/td&gt;
&lt;td&gt;281&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 3&lt;/td&gt;
&lt;td&gt;613&lt;/td&gt;
&lt;td&gt;603&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to 2&lt;/td&gt;
&lt;td&gt;1,423&lt;/td&gt;
&lt;td&gt;1,416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;link to just 1&lt;/td&gt;
&lt;td&gt;7,036&lt;/td&gt;
&lt;td&gt;7,024&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;the distribution is the interesting part. most linking domains sit in the bottom row: they mention one product and never come back. the rows above it are where outreach lives, because a site that already covers several products in a category has an editorial reason to cover another one. a short universal list usually means the category is covered by a handful of directories, review sites and integration hubs rather than by a broad press base. a long one means the category has real editorial coverage, and the same sites are reachable for you.&lt;/p&gt;

&lt;p&gt;the highest-authority sites linking to all of them are mozilla.org, habr.com and smallbiztrends.com. those are the pages worth reading before you pitch anything, because they already decided this category is worth covering.&lt;/p&gt;

&lt;p&gt;lastpass.com carries the widest referring-domain profile of the set and enpass.io the narrowest, which is usually a function of age and press coverage rather than product quality. the gap between them is the practical opportunity: sites that cover the widest profile but not the narrowest are demonstrably willing to write about this category.&lt;/p&gt;

&lt;h2&gt;
  
  
  the category linkers
&lt;/h2&gt;

&lt;p&gt;143 non-platform domains link to at least 6 of the 8 subjects. these repeat linkers are the sites most consistently connected to password managers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;highest-overlap category linkers&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;domain&lt;/th&gt;
&lt;th&gt;subjects&lt;/th&gt;
&lt;th&gt;cg authority&lt;/th&gt;
&lt;th&gt;links to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mozilla.org&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;habr.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smallbiztrends.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;norton.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clickup.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fidoalliance.org&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;helpnetsecurity.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sapo.pt&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;impress.co.jp&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n26.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pandasecurity.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nero.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;otto.de&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tweakers.net&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;devolutions.net&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;avg.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tenorshare.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saashub.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wikimint.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;privacy.com&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;1password.com, bitwarden.com, dashlane.com, lastpass.com, keepersecurity.com, nordpass.com, roboform.com, enpass.io&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  the full data
&lt;/h3&gt;

&lt;p&gt;download all 143 clean domains that link to at least 6 of the 8 subjects, ranked by overlap and authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-password-manager/dataset.csv" rel="noopener noreferrer"&gt;download csv&lt;/a&gt; | &lt;a href="https://crawlgraph.com/api/studies/who-links-to-every-password-manager/dataset.json" rel="noopener noreferrer"&gt;download json&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  check any of these domains
&lt;/h3&gt;

&lt;p&gt;every domain in the tables above links to its full referring-domain profile. run your own domain to see who links to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/" rel="noopener noreferrer"&gt;look up your backlinks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  run this for your own niche
&lt;/h2&gt;

&lt;p&gt;pick your closest competitors, compare their referring domains, and keep the sites that link to several of them but not to you. sorting that gap by overlap and authority turns the same method into a specific outreach list.&lt;/p&gt;

&lt;p&gt;the ordering is what makes it usable. a site that links to most of your competitors and not to you is a gap with an obvious pitch. the observed overlap gives you a specific reason to contact each site instead of relying on domain authority alone. work down from the top of the overlap column and stop when the reasons start feeling thin, because a pitch you cannot justify in one sentence is not worth sending.&lt;/p&gt;

&lt;p&gt;one caveat worth stating plainly. common crawl is a sample of the web, not a census, so treat these counts as the shape of a link profile rather than an exact total. this study measures the Apr-Jun 2026 release, so rerun the comparison against later releases before treating any movement as a trend.&lt;/p&gt;

&lt;h3&gt;
  
  
  find the overlap in your market
&lt;/h3&gt;

&lt;p&gt;run a backlink gap analysis on the same common crawl data used for this study.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crawlgraph.com/gap-analysis" rel="noopener noreferrer"&gt;run a free gap analysis&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
