Toxic backlinks can silently destroy your search rankings. Spammy sites linking to you, negative SEO attacks, or leftover links from old marketing campaigns — Google might associate your site with that low-quality neighborhood. The Disavow Links tool is your escape hatch.
I recently went through this process for my own site and want to share exactly what I did.
What Is the Disavow Links Tool?
Google’s Disavow Links tool tells Google: “Please ignore these backlinks when evaluating my site.” It does not remove the links — it tells Google’s algorithm to discount them.
When to use it:
- You have spammy or unnatural links pointing to your site
- You received a manual action for “unnatural links to your site”
- You see a pattern of low-quality domains linking to you
- A negative SEO attack flooded your backlink profile
When NOT to use it:
- Your backlink profile is clean — do not disavow everything “just in case”
- The linking site is legitimate but low-authority — Google already ignores most low-quality links
- You have not actually checked if the links are causing problems
Step 1: Audit Your Backlink Profile
Using Google Search Console
- Go to Google Search Console
- Select your property
- Navigate to Links in the left sidebar
- Click Top linking sites under “External links”
- Export the full list (CSV or Google Sheets)
GSC shows your top ~1,000 linking domains. For a complete picture, you need a third-party tool.
Using Ahrefs
Ahrefs gives you the most comprehensive backlink data:
- Go to Site Explorer and enter your domain
- Click Backlinks in the left menu
- Filter by Link type: dofollow (these matter most)
- Sort by Domain Rating (DR) ascending — the lowest-rated domains appear first
- Export the full list
Red flags to look for:
| Signal | What It Means |
|---|---|
| DR 0-5 with exact-match anchor text | Likely spam or PBN |
| Hundreds of links from one domain | Sitewide footer/sidebar spam |
| Foreign language gambling/pharma sites | Classic negative SEO |
| Domains with no organic traffic | Probably exists only for link schemes |
| Redirected domains linking to you | Old expired domains repurposed as spam |
Using Semrush Backlink Audit
Semrush has an automated toxic score:
- Go to Backlink Audit tool
- Enter your domain
- Set up the project
- Semrush assigns a Toxic Score (0-100) to each linking domain
- Review domains with Toxic Score above 60
Step 2: Investigate Before Disavowing
Do not blindly disavow everything with low DR. Check each suspicious domain:
For each suspicious linking domain:
1. Visit the actual page linking to you
2. Is the content relevant to your niche?
3. Is the site obviously spam (auto-generated, keyword-stuffed)?
4. Does the site have any real traffic? (Check in Ahrefs)
5. Is the anchor text manipulative (exact-match commercial keywords)?Classify into three buckets:
- Disavow — clearly spam, no legitimate reason to link to you
- Request removal — legitimate site but link is from a guest post or paid campaign you want removed
- Keep — low DR but genuine, relevant content
Request Removal First
Before disavowing, try to get the link removed:
Subject: Link Removal Request — [your domain]
Hi,
I noticed your site [their-domain.com] links to my website
[your-domain.com] from the page [URL].
Could you please remove this link? It appears to be
[spam/from an old campaign/unrelated to my content].
Thank you,
[Your name]Keep records of removal requests. Google likes to see you tried manual removal before using the disavow tool.
Step 3: Build the Disavow File
The disavow file is a plain text file with a specific format:
# Disavow file for lucaberton.com
# Generated: 2026-04-04
# Last audit: Ahrefs + Google Search Console
# Spam domains - auto-generated content
domain:spamsite1.com
domain:spamsite2.net
domain:keyword-stuffed-blog.org
# Negative SEO - gambling/pharma links
domain:casino-links-xyz.com
domain:cheap-pharma-online.net
# PBN (Private Blog Network) domains
domain:seo-links-network-1.com
domain:seo-links-network-2.com
# Specific URLs (when only one page on a domain is problematic)
https://legitimate-site.com/spammy-guest-post-with-my-link
https://forum.example.com/thread/spam-thread-12345Format Rules
- One URL or domain per line
- Use
domain:example.comto disavow all links from a domain (recommended) - Use the full URL to disavow a specific page only
- Lines starting with
#are comments — use them to document your reasoning - File must be UTF-8 or 7-bit ASCII
- Maximum file size: 2 MB
- Maximum entries: 100,000
My Disavow File Structure
I organize mine by category with dates:
# =============================================
# Disavow file for lucaberton.com
# Last updated: 2026-04-04
# Total domains: 47
# =============================================
# --- Spam domains (identified 2026-01-15) ---
domain:spam-example-1.com
domain:spam-example-2.net
# --- Negative SEO (identified 2026-02-20) ---
domain:attack-domain-1.com
# --- Old campaign links (requested removal 2026-03-01) ---
# Removal request sent, no response after 30 days
domain:old-campaign-site.com
# --- Auto-generated / scraped content ---
domain:auto-blog-1.xyz
domain:auto-blog-2.xyzStep 4: Submit the Disavow File
- Go to Google Disavow Links Tool
- Select your property (must be verified in GSC)
- Click Upload Disavow List
- Select your
.txtfile - Confirm the submission
Important notes:
- Processing takes 2-4 weeks as Google recrawls the disavowed links
- You can update the file at any time — the new file replaces the old one completely
- There is no “undo” button — to remove a disavow, upload a new file without those entries
Step 5: Monitor the Results
After submitting, track these metrics weekly:
In Google Search Console
- Performance → watch for ranking changes on your target keywords
- Links → check if the disavowed domains still appear (they will for a while)
- Manual Actions → if you had one, check if it gets lifted
In Ahrefs
- Backlink profile → toxic ratio should improve over time
- Organic keywords → watch for ranking improvements
- Domain Rating → may increase as toxic links are discounted
Expected Timeline
| Week | What Happens |
|---|---|
| 1-2 | Google processes the file, starts recrawling |
| 3-4 | Disavowed links begin to be discounted |
| 4-8 | Ranking changes become visible |
| 8-12 | Full effect — reassess and update if needed |
Common Mistakes
1. Disavowing Too Aggressively
Do not disavow every low-DR link. Many legitimate small sites, personal blogs, and niche forums have low DR but provide genuine, relevant links. Disavowing these hurts you.
2. Forgetting to Update
Your disavow file is not “set and forget.” New spam links appear constantly. Audit quarterly:
Quarterly backlink audit checklist:
[ ] Export new backlinks from Ahrefs (last 90 days)
[ ] Filter for DR 0-10 with suspicious patterns
[ ] Investigate each new suspicious domain
[ ] Update disavow file if needed
[ ] Re-upload to GSC3. Using Disavow Instead of Fixing Real Problems
If you are getting spammy links because your site was hacked, fix the hack first. If you are getting links from a link-building campaign, stop the campaign. Disavow is cleanup, not prevention.
4. Not Documenting Your Decisions
Always add comments to your disavow file explaining why each domain is there. Future you (or your SEO colleague) will thank you.
Automated Monitoring Script
For sites with large backlink profiles, automate the detection:
#!/usr/bin/env python3
"""
Backlink health monitor.
Checks new backlinks against known spam patterns.
"""
import csv
import re
SPAM_PATTERNS = [
r"casino|gambling|poker|slots",
r"pharma|viagra|cialis|pills",
r"payday|loan|credit-repair",
r"seo-link|backlink-service|link-building",
r"\d{6,}", # domains with long number strings
]
def is_suspicious(domain: str, anchor: str) -> list[str]:
"""Check domain and anchor text against spam patterns."""
flags = []
for pattern in SPAM_PATTERNS:
if re.search(pattern, domain, re.IGNORECASE):
flags.append(f"Domain matches spam pattern: {pattern}")
if re.search(pattern, anchor, re.IGNORECASE):
flags.append(f"Anchor matches spam pattern: {pattern}")
return flags
def audit_backlinks(csv_file: str) -> None:
"""Audit exported backlinks CSV from Ahrefs."""
suspicious = []
with open(csv_file) as f:
reader = csv.DictReader(f)
for row in reader:
domain = row.get("Referring Domain", "")
anchor = row.get("Anchor", "")
dr = int(row.get("DR", 0))
flags = is_suspicious(domain, anchor)
if flags or dr < 5:
suspicious.append({
"domain": domain,
"dr": dr,
"anchor": anchor,
"flags": flags,
})
print(f"Found {len(suspicious)} suspicious backlinks:\n")
for item in suspicious:
print(f" {item['domain']} (DR {item['dr']})")
for flag in item["flags"]:
print(f" ⚠ {flag}")
print()
if __name__ == "__main__":
import sys
audit_backlinks(sys.argv[1])Real Numbers from My Site
When I audited my own backlink profile:
- Total referring domains: 202
- Suspicious (DR under 5, spam patterns): 23
- Actually disavowed after investigation: 12
- Legitimate low-DR sites kept: 11
The key takeaway: most “suspicious” links turned out to be harmless small blogs or aggregator sites. Only disavow what is clearly toxic.
Related Resources
- Root cause analysis for SEO issues
- Ahrefs site audit and health score
- Google Search Console guide
- Technical SEO checklist
About the Author
I am Luca Berton, AI and Cloud Advisor. I manage SEO for multiple technical websites and have gone through the disavow process hands-on. Book a consultation to audit your backlink profile.