diff --git a/web/content/marketing/library/backlink-audit.mdx b/web/content/marketing/library/backlink-audit.mdx new file mode 100644 index 000000000..33ef7d0f4 --- /dev/null +++ b/web/content/marketing/library/backlink-audit.mdx @@ -0,0 +1,108 @@ +--- +title: "The backlink audit: sort by first seen, then by relevance" +description: "The three newest links to a real site were from a casino domain and two link sellers, with spam scores of 45 to 70. Underneath them were the links that count. How to tell the two apart in an hour, and why relevance beats every third-party score." +--- + +## What is a backlink audit for? + +Two things, and they pull in different directions. The first is to find out which links are doing anything for the site, so you can get more like them. The second is to find out whether anything pointed at the site is a liability. Use the audit to identify links worth reading and target pages worth repairing. + +Here is what the newest links to seoarcade.com, a small SEO consultancy site, looked like on the day this was written, sorted by the date they were first seen: + +![OpenSEO backlinks table for seoarcade.com sorted by first seen: the three newest links come from a link seller, a PBN reseller and a casino domain with spam scores of 45, 60 and 70, followed by links from a marketing blog, a podcast recap and a related site with spam scores of 0 to 5](/library/link-building/backlink-profile-newest-links-openseo.png "Newest backlinks in OpenSEO") + +The three newest are from a link seller, a "premium PBN network service" and a casino domain, with spam scores of 45, 60 and 70 and anchor text that is an advert for buying links. Nobody at the site asked for them. The three below are a marketing blog citing a resource guide, a related site linking a services page, and a podcast recap. Spam scores 0 to 5, anchor text that describes the page. + +That is the whole audit in six rows. The junk arrives on its own and announces itself. The links that matter look like someone chose to make them. + +## The score is not the audit + +Every backlink tool carries an authority number for the linking domain. OpenSEO shows DataForSEO's domain rank alongside a spam score. They are useful for sorting. They are not the verdict. + +Bradley Benner, who builds links for a living and tests what works on his own sites, is blunt about what he learned: + +> it's not some stupid third party metric like DA or DR or trust flow or anything else that matters about whether a link is valuable or not. What matters is whether it's relevant. + +![A quote card reading: It's not some stupid third party metric like DA or DR or trust flow or anything else that matters about whether a link is valuable or not. What matters is whether it's relevant. Attributed to Bradley Benner of Semantic Mastery and Semantic Links, from The Unscripted SEO Interview Podcast.](/library/link-building/quote-whether-its-relevant.png "Bradley Benner on relevance over metrics") + +His episode on relevance over DR is [on the Unscripted SEO podcast](https://unscriptedseo.com/bradley-benner-on-relevance-over-dr/). The point holds in the table above: the casino domain has a domain rank of 40, higher than every legitimate link visible beneath it. Sort by rank and the worst link on the page floats to the top. + +So the audit has two passes. The first uses the scores to sort. The second reads the rows. + +## Pass one: sort and bucket + +Start with one page of the profile, using one row per referring domain. Turn off the spam filter so you can see the rows you are sorting. Then make four buckets. + +**Obvious junk.** Spam score above 30, or anchor text that is an advert, or a source domain whose name has nothing to do with anything. On the profile above, that bucket was three of the newest six and a long tail of `/all/2585/6.html`-shaped URLs on throwaway domains. You will recognise the pattern after ten rows. + +**Broken targets.** The overview for the site above reported 17 broken backlinks and 47 broken pages. Open the target URLs to check what is wrong. Restore a missing page or redirect it to a relevant replacement where one exists. This profile request returns live backlinks, so it is not a list of lost links. + +**Nofollow and syndication.** Podcast directories, aggregators, social profiles. Real, harmless, and not what you build a strategy on. Count them so they do not inflate the total in your head. + +**Everything else.** This is the bucket you audit properly. + +## Pass two: read the links that might matter + +For each row in the last bucket, the question is not "how strong is this domain" but "would a person on that page have a reason to click through." Jeremy Moser, who runs a link building agency, describes what his team looks for before the anchor text even comes up: whether the linking site is a real business with real traffic, and whether the page is about the same thing yours is. His words on where local businesses get the most from links: + +> The typical plays that we see working well for local is definitely more local publication. + +His episode is [here](https://unscriptedseo.com/jeremy-moser-it-was-always-just-good-seo/). A link from a town newspaper to a plumber is worth more than a link from a DR 70 marketing blog to the same plumber, and no score will tell you that. The row will, if you open it. + +Read the anchor and the surrounding text. Read what the linking page is about. Note whether your link is the only outbound link or one of two hundred. Twenty rows takes twenty minutes and tells you more than any composite. + +## Run this with the OpenSEO MCP + +Connect the [OpenSEO MCP](/docs/mcp). The overview costs about 50 credits for a domain and each page of 100 backlink rows about 30, so a full audit of a small site is a few hundred credits. The [link-prospecting](/docs/skills/link-prospecting) skill packages the outreach side of this. + +```text +Using the OpenSEO MCP on project [name], audit the backlinks for +[domain]: + +1. Call get_backlinks_overview with scope "domain". Report backlinks, + referring domains, rank, spam score, broken backlinks and broken + pages. + +2. Call get_backlinks_profile with scope "domain", mode + one_per_domain, hideSpam false, sorted by firstSeen descending, + page 1, 100 rows. Bucket every row for review: suspected junk + (spam score over 30 or advert-style anchor text), broken targets, + nofollow, or worth reading. Scores are sorting aids, not verdicts. + +3. For the "worth reading" bucket, list source domain, source page + title, anchor text and target page. Flag any target page that + returns an error. + +4. Start a new get_backlinks_profile request with scope "domain", + mode as_is, page 1, 100 rows, filters maxSpamScore 10 and + minDomainRank 20. In this sample, list domains linking to more + than one distinct target page. Say that other links may be absent + from the sample. + +5. Give me two lists: broken target pages to investigate for repair + or a relevant redirect, and ten linking pages to read in full. +``` + +Step 3 is the one that matters and the one an agent cannot finish for you. It can list the rows. Reading them is the audit. + +## The audit is a reading exercise + +A backlink profile is a list of decisions other people made about your site. The scores help you sort the list. They do not tell you what anyone decided or why. An hour with the rows does, and it ends with two things you can act on this week: the broken pages to investigate, and a short list of sites that already chose to link to you, which is where [more links usually come from](/library/link-building/how-to-get-backlinks). + +## Backlink audit FAQ + +### How do I do a backlink audit? + +Start with a page of backlink rows, one per referring domain, sorted by first seen, with spam filtering off. Sort them into suspected junk, broken targets, nofollow, and worth reading. Check broken pages before restoring them or choosing a relevant redirect. Read the remaining rows and decide whether a person on the source page would have a reason to click through. + +### What is a toxic backlink? + +A link from a page that exists only to sell or host links: link seller listings, PBN adverts, casino and pharmacy domains, and pages with hundreds of unrelated outbound links. They tend to have high spam scores and anchor text that reads like an advert. Google generally ignores them. + +### Is domain rank or DA a good measure of a backlink? + +It is a sorting aid, not a verdict. A spam domain can carry a higher rank than a relevant small site. Use the score to order the list, then judge each link on whether the linking page is about the same thing as yours and whether a real site published it. + +### Does OpenSEO show broken backlinks? + +The overview reports broken backlinks and broken target pages. Profile rows include broken status, dofollow or nofollow, domain rank, spam score and first-seen date. The profile request used here returns live backlinks, so it cannot list lost links. The free backlink checker shows the summary and top 15 links without an account. diff --git a/web/content/marketing/library/how-to-get-backlinks.mdx b/web/content/marketing/library/how-to-get-backlinks.mdx new file mode 100644 index 000000000..c0645b8d4 --- /dev/null +++ b/web/content/marketing/library/how-to-get-backlinks.mdx @@ -0,0 +1,142 @@ +--- +title: "How to get backlinks: start from the pages that already earn them" +description: "On one site a free traffic calculator has links from 17 domains and a page about park cleanups has 270 backlinks from 29. Neither was pitched. How to read your own top pages before you write an outreach email, and the four plays that earned links on tape." +--- + +## Where do backlinks come from? + +Mostly from things that already exist. Before you plan an outreach campaign, look at which of your pages have earned links without one. The backlinks tool lists them, and the list is usually a surprise. + +Here is seoarcade.com, a small SEO consultancy site, by pages that attract links: + +![OpenSEO top pages by backlinks for seoarcade.com: the homepage with 710 backlinks from 151 referring domains, a park cleanup services page with 270 from 29, two podcast service pages, then a free SEO traffic estimate calculator with 34 backlinks from 17 domains, and a partner reports page with 30 from 22](/library/link-building/top-pages-by-backlinks-openseo.png "Top pages by backlinks in OpenSEO") + +Two rows stand out once you skip the homepage. A page describing a local park-cleanup service has 270 backlinks from 29 domains, more than any article on the site. And a free calculator that gives a rough estimate of potential SEO traffic has 34 backlinks from 17 domains, more referring domains than any piece of long-form content on the site. + +Neither page was the subject of an outreach campaign. One is an event that gave local sites a reason to mention it. The other is a tool. That is the pattern across most profiles: the pages that earn links are the ones that do something for the linking site's reader, and the pages that get pitched are the ones that do something for you. + +## Four plays that earned links on tape + +Guests on the Unscripted SEO podcast have described what worked for them with enough specificity to copy. Four of them, in rough order of effort. + +### 1. Build a tool instead of a post + +Christopher Gimmer built a SaaS company on this and says it without hedging: + +> people are more willing and likely to link out to a really good tool that actually solves a problem versus a yet another blog post with a wall of text. + +![A quote card reading: People are more willing and likely to link out to a really good tool that actually solves a problem versus yet another blog post with a wall of text. Attributed to Christopher Gimmer, founder of Snappa and GoodMetrics, from The Unscripted SEO Interview Podcast.](/library/link-building/quote-link-out-to-a-tool.png "Christopher Gimmer on linkable tools") + +His episode is [on the podcast](https://unscriptedseo.com/christopher-gimmer-bootstrapped-saas-ai-overviews/). The calculator in the table above is the small version of that idea. Steven Schneider, whose agency builds calculators for clients, adds the test that keeps it honest: + +> can a client rank for this keyword and can they actually find value in the calculator? Because, you know, there's tons of calculator keywords out there. + +His episode on calculators as link assets is [here](https://unscriptedseo.com/seo-calculators-assets-steven-schneider/). A tool nobody searches for earns links from nobody. Check the demand for the tool's name before building it; [keyword research](/library/keyword-research) covers how. + +### 2. Do something in the real world and let the web report it + +The park-cleanup page did not earn 270 backlinks by being well written. The business ran cleanups, and the city, the chamber of commerce, event listings and local news mentioned them. The site's owner described the mechanism on air: + +> we got a few links from City Hall and Chamber of Commerce, and we also walked away with multiple bags of trash from that park, and that felt good. + +Sponsorships, memberships, events and community work produce links from the sites that report on them, and those sites are exactly the local, relevant sources that [a backlink audit](/library/link-building/backlink-audit) says count for most. The link is a by-product. That is why it works. + +### 3. Map the businesses that share your customer + +Jeremy Rivera, the podcast's host, has a document he asks every client to write before any outreach, described here to Greg Digneo of Content Guppy: + +> I can recommend this SOP to sit down and create a Nexus document. And you can do it with Claude, but you're basically going to brainstorm out every non-direct competitor that wants to reach your same audience that has a a marketing budget. + +Greg's episode is [here](https://unscriptedseo.com/greg-digneo-on-building-an-audience-you-actually-own/). The nexus is every business that reaches your customer and does not compete with you. A realtor's nexus is inspectors, painters, movers and lenders. A SaaS company's is the tools its customers already pay for, the consultants who set them up, the newsletters they read. Each one is a site with a reason to mention you, because you are useful to their reader, and each mention is a link from a relevant domain. + +Write the list before you write a single email. The email to a nexus business is short, because you can name the reason the link helps their reader. The email to a random blog is long, because there is no reason. + +### 4. Make it personal enough that nobody else could have sent it + +The podcast's host built links for a software company the slow way, years ago, and told Mike Montague how it went: + +> I got 10 links for Raven Tools by writing 10 letters. + +Ten for ten. Handwritten, on paper, to people whose work he had read. Mike, who runs a human-first AI marketing practice, on why that still works: + +> nobody gets a printed book in the mail, nobody gets a handwritten note, and nobody understands their business well enough + +His episode is [here](https://unscriptedseo.com/mike-montague-ai-iron-man-not-terminator/). The lesson is not the postage. It is that ten letters to ten right people beat a thousand emails to a list, and the emails cost more once you count the reputation they spend. + +Katie Wagner, who spent fifteen years as a journalist before opening an agency, describes the receiving end of a pitch: + +> if you make it easier for them, that is a welcome thing + +Her episode is [here](https://unscriptedseo.com/katie-wagner-seo-journalism-are-the-answer-to-llms-and-google-too/). A pitch that includes the quote, the data and the image, so the writer has to do nothing but paste, gets used. A pitch that asks them to look at your site does not. + +## What to skip + +Buying links from the people who email you about buying links. The [backlink audit](/library/link-building/backlink-audit) shows what those look like on a real profile: casino domains and "premium PBN network" anchors, with spam scores in the 60s, that Google is built to ignore. Patrick Stox, formerly of Ahrefs and now consulting on his own, raised the newer risk when talking about AI search systems: + +> How long will they hold a grudge against you? Um, so I think you gotta be a little careful on that kind of stuff too. + +His episode is [here](https://unscriptedseo.com/patrick-stox-on-building-in-the-geo-era/). Google eventually forgave a cleaned-up profile. There is no evidence yet that the AI systems that now cite sources will. + +## Run this with the OpenSEO MCP + +Connect the [OpenSEO MCP](/docs/mcp). The [link-prospecting](/docs/skills/link-prospecting) skill packages the competitor side of this; the prompt below starts from your own profile, which is cheaper and usually better. + +In OpenSEO, open Backlinks, choose Top Pages, and sort by referring domains, highest first. Copy the first ten rows, including each URL and its referring-domain count, into your assistant with this prompt. + +```text +Using the OpenSEO MCP on project [name], find where my next links +should come from, for [domain]: + +1. Use the Top Pages rows I pasted to list my ten leading pages by + referring domains. Read each page and classify it as a tool, an + event or service page, an article, or a company page. Mark any + unreadable page as unverified. If I have not supplied the rows, + ask for them before continuing. + +2. Call get_backlinks_profile for the two non-homepage URLs with the + most referring domains in that list, using scope "page", + mode one_per_domain, hideSpam true. Read the linking pages and + suggest why each linked: cited data, used a tool, reported an + event, listed a partner, or something else. Mark uncertain reasons + as hypotheses and unreadable pages as unverified. + +3. From those reasons, tell me which of my pages could earn more of + the same kind of link, and what would have to be true for it to. + +4. Pull Search Console performance by query for the last 3 months and + list any query containing "calculator", "template", "checklist", + "tool" or "estimate" where I have impressions. Those are tools + people already want from me. + +5. Give me a list of 20 businesses that share my customer and do not + compete with me, from the referring domains I already have and the + domains linking to my two closest competitors. +``` + +Step 5 is the nexus document. Step 2 is what makes the outreach email short. + +## Earn the first ten before you pitch the hundredth + +The profile you already have tells you what people link to on your site and why. Build more of that: a tool someone searches for, a thing you did that a local site can report, a list of the businesses that share your customer, and ten personal notes to ten right people. Then count [referring domains](/library/link-building/referring-domains), not backlinks, and read the linking pages to understand why they chose to mention you. + +## Getting backlinks FAQ + +### How do I get backlinks for a new website? + +Start with the businesses that share your customer and do not compete with you: partners, suppliers, the tools your customers use, the communities they belong to. Ask for a mention where it helps their reader. Then build one thing worth linking to, a tool or a piece of data, and tell the ten people most likely to use it. + +### What is a linkable asset? + +A page that does something for another site's reader that a paragraph of prose cannot: a calculator, a template, a dataset, a checklist, a tool. On the site above, a traffic calculator has links from 17 domains; no article on the site has more than 10. + +### Does link building outreach still work? + +Personal outreach to a short list works. The podcast's host once got ten links from ten handwritten letters. Mass email to a purchased list mostly produces replies from people selling links, and those are the links that show up in an audit with spam scores in the 60s. + +### Should I buy backlinks? + +No. The sellers who email you produce links from casino and PBN domains that search engines ignore and that make your profile look manufactured. Practitioners on the podcast also warn that AI search systems may not forgive a manipulated profile the way Google eventually did. + +### How does OpenSEO help with link building? + +The backlinks tool shows which of your pages attract links and from where, which is the starting point above. It shows the same for any competitor, so you can list the domains that link to them and not to you. Use the app’s Top Pages table to compare referring-domain counts by page; the MCP provides backlink summaries and individual backlink rows. The link-prospecting skill packages the competitor workflow. diff --git a/web/content/marketing/library/referring-domains.mdx b/web/content/marketing/library/referring-domains.mdx new file mode 100644 index 000000000..134eae43d --- /dev/null +++ b/web/content/marketing/library/referring-domains.mdx @@ -0,0 +1,112 @@ +--- +title: "Referring domains, not backlinks: the count that moves rankings" +description: "One site shows 2,393 backlinks and 308 referring domains, and 872 of those backlinks come from a single domain its owner also runs. How to report the number of distinct sources and spot a profile dominated by a few sites." +--- + +## What is a referring domain? + +A website that links to yours at least once. The backlink count is every individual link; the referring domain count is how many different sites those links come from. A site with 2,000 backlinks from 20 domains has 20 votes, cast repeatedly. A site with 300 backlinks from 300 domains has 300 votes. + +Here is the difference on a real site. seoarcade.com shows 2,393 backlinks and 308 referring domains. The top referring domain, unscriptedseo.com, accounts for 872 of those backlinks on its own, and the site's owner runs both: + +![OpenSEO referring domains table for seoarcade.com: unscriptedseo.com 872 backlinks from 831 pages, castos.com 515, semanticjuice.com 145, jeremyriveraseo.com 80, then a long tail of podcast directories and partner sites, each with rank, spam score and first-seen date](/library/link-building/referring-domains-openseo.png "Referring domains in OpenSEO") + +The first four domains supply 1,612 backlinks, two thirds of the total. Two of the four are the owner's own properties and one is the podcast host. A report that says "2,393 backlinks" is describing a site with a few hundred real endorsements and a lot of repetition. That is normal and it is not a problem. It only becomes one when the big number is the one that gets reported. + +## Why count distinct sources? + +Referring-domain count helps distinguish broad coverage from repeated links on a few sites. It is useful context, but it does not tell you how much any individual link helps rankings. Look at who is linking and why before treating an increase as progress. + +Rob Bonham puts the endpoint of that logic plainly: + +> whoever has the bigger footprint and the more people talking about them across the web in a positive way, that is the ultimate and all be all of winning and dominating the SERPs. + +![A quote card reading: Whoever has the bigger footprint and the more people talking about them across the web in a positive way, that is the ultimate and all be all of winning and dominating the SERPs. Attributed to Rob Bonham, fractional SEO consultant, from The Unscripted SEO Interview Podcast.](/library/link-building/quote-bigger-footprint.png "Rob Bonham on footprint") + +His episode on SEO in the agentic age is [on the Unscripted SEO podcast](https://unscriptedseo.com/rob-bonham-seo-agentic-age/). Footprint is a count of places, not a count of links. + +## Which referring domains count for more + +Not all 308 are equal, and the difference is not the domain's authority score. The idea that comes up most on the podcast is distance to seed: how many links stand between a site and the sites Google trusts most in its field. Jeremy Rivera, the podcast's host, explains it to guests the same way each time, here to Christopher Gimmer of Snappa: + +> if you are truly in that niche, then you are connected to them by one, two or three hops. You know, like it's a like Kevin Bacon for for backlinks. + +Christopher's read on what that produced across the last two years of updates: + +> anyone who's had like a legitimate product within a a specific space tend to be doing much better than just a a pure content site. + +His episode is [here](https://unscriptedseo.com/christopher-gimmer-bootstrapped-saas-ai-overviews/). Google keeps a set of trusted sites per field, and a link counts for more the fewer hops it is from one. A referring domain that is itself linked from the trade press in your industry is close. A referring domain with a high score earned in an unrelated field is far away, whatever its number says. + +You cannot see the seed list. You can see, in the referring domains table, which of your linking sites are themselves the kind of site people in your field cite. Those rows are worth more than their rank column shows. + +## What to do with the table + +Three things, in this order. + +**Report referring domains, not backlinks.** In the monthly report, the line is "308 referring domains, up from 290" and not "2,393 backlinks". Then add one row: how many of the new domains are ones you had nothing to do with. + +**Find the concentration.** Sort by backlinks and look at the top five. If they are your own properties, your host, or a directory that lists every page, they are context, not endorsements. The site above has three of the four in that category. Knowing that stops you from reading a jump in backlinks as a jump in authority when it was a new template link on a site you own. + +**Check first-seen dates.** In the referring-domains table, the date describes the domain. In backlink rows, it describes that individual link; a recent backlink does not prove a domain is new. The growth chart on the overview shows both lines over a year; on this site, backlinks climbed from around 1,900 to 2,393 over the year while referring domains went from around 110 to 308, most of that in the last two months, which is a different story from the backlink line alone. When the two lines diverge, the referring domains line is the one that describes what changed. + +![OpenSEO backlinks overview for seoarcade.com: 2,393 backlinks, 308 referring domains, 2,137 referring pages, rank 41, spam score 5.0, 17 broken backlinks and 47 broken pages, with a year of backlink and referring-domain growth and a new-versus-lost chart](/library/link-building/backlink-overview-openseo.png "Backlinks overview in OpenSEO") + +## Run this with the OpenSEO MCP + +Connect the [OpenSEO MCP](/docs/mcp). The overview is about 50 credits per domain and includes the referring domain breakdown; a page of 100 backlink rows is about 30. + +```text +Using the OpenSEO MCP on project [name], report on referring domains +for [domain]: + +1. Call get_backlinks_overview with scope "domain". Give me backlinks, + referring domains, and the ratio between them. + +2. From the top referring domains in that response, list the top 10 + by backlink count with their share of total backlinks. Flag any + that are my own properties, my hosting or podcast platform, or a + directory. + +3. Call get_backlinks_profile with scope "domain", mode + one_per_domain, sorted by firstSeen descending, page 1, 100 rows, + hideSpam true. List the domains represented by backlinks first + discovered in the last 30 days in this sample, with anchor text + and target page. Do not call them newly acquired domains: the + date belongs to the selected backlink, not the domain. + +4. For each sampled domain, check whether its linking page is about + the same topic as its target. Mark any you cannot verify. + +5. Report the current referring-domain total, then the number of + sampled domains with recent backlinks that appear relevant. Label + the sample size and filters. Do not infer a monthly acquisition + count from this sample. +``` + +Step 5 is the number the business should see. Step 2 is what stops you from over-reading it. + +## One number, and the story behind it + +A backlink total goes up when you add a link to your own footer. A referring domain total goes up when someone new decides your page is worth pointing at. Report the second, know what the top of the list is made of, and spend the link building effort on [sites that have not linked to you yet](/library/link-building/how-to-get-backlinks). + +## Referring domains FAQ + +### What is the difference between backlinks and referring domains? + +A backlink is one link from one page. A referring domain is one website that links to you, however many times. Two thousand backlinks can come from twenty sites. Referring domains is the count of distinct sources and the better measure of how many sites endorse yours. + +### How many referring domains do I need? + +Enough to match the pages that outrank you for the terms you want, from sites in the same field. Check the competitors' profiles for the number; a [backlink gap analysis](/library/competitive-analysis/backlink-gap-analysis) shows the domains that link to them and not to you. + +### Are links from my own other websites worth anything? + +A little, and less each time. They are real links, but a search engine can see common ownership and hosting, and the diversity that moves rankings comes from sites you do not control. Count them separately so they do not inflate the total. + +### What is distance to seed? + +The number of link hops between a site and the sites a search engine trusts most in a field. A link from a site that is itself cited by the industry's authorities is close to the seed and counts for more than a link from a high-scoring site in an unrelated field. You cannot see the seed list; you can judge whether a linking site is one your industry cites. + +### Does OpenSEO show referring domains? + +Yes. The backlinks overview reports the referring domain count and the top referring domains with their backlink count, rank, spam score and first-seen date, and the growth chart shows backlinks and referring domains over the last year. The free backlink checker shows the summary without an account. diff --git a/web/public/library/link-building/backlink-overview-openseo.png b/web/public/library/link-building/backlink-overview-openseo.png new file mode 100644 index 000000000..ce0d38ba1 Binary files /dev/null and b/web/public/library/link-building/backlink-overview-openseo.png differ diff --git a/web/public/library/link-building/backlink-profile-newest-links-openseo.png b/web/public/library/link-building/backlink-profile-newest-links-openseo.png new file mode 100644 index 000000000..422ad6c47 Binary files /dev/null and b/web/public/library/link-building/backlink-profile-newest-links-openseo.png differ diff --git a/web/public/library/link-building/quote-bigger-footprint.png b/web/public/library/link-building/quote-bigger-footprint.png new file mode 100644 index 000000000..89e3adcf2 Binary files /dev/null and b/web/public/library/link-building/quote-bigger-footprint.png differ diff --git a/web/public/library/link-building/quote-link-out-to-a-tool.png b/web/public/library/link-building/quote-link-out-to-a-tool.png new file mode 100644 index 000000000..90d6e16c0 Binary files /dev/null and b/web/public/library/link-building/quote-link-out-to-a-tool.png differ diff --git a/web/public/library/link-building/quote-whether-its-relevant.png b/web/public/library/link-building/quote-whether-its-relevant.png new file mode 100644 index 000000000..e3ed38d30 Binary files /dev/null and b/web/public/library/link-building/quote-whether-its-relevant.png differ diff --git a/web/public/library/link-building/referring-domains-openseo.png b/web/public/library/link-building/referring-domains-openseo.png new file mode 100644 index 000000000..dca3faa0d Binary files /dev/null and b/web/public/library/link-building/referring-domains-openseo.png differ diff --git a/web/public/library/link-building/top-pages-by-backlinks-openseo.png b/web/public/library/link-building/top-pages-by-backlinks-openseo.png new file mode 100644 index 000000000..ef127cb71 Binary files /dev/null and b/web/public/library/link-building/top-pages-by-backlinks-openseo.png differ diff --git a/web/src/lib/feature-pages.ts b/web/src/lib/feature-pages.ts index 1fde83c23..3a8710b62 100644 --- a/web/src/lib/feature-pages.ts +++ b/web/src/lib/feature-pages.ts @@ -312,6 +312,35 @@ export const featurePages = { "Self-host or adapt backlink reporting for your team's workflow.", "MCP support lets an AI agent pull backlink context during SEO research.", ], + guides: { + title: "The Link Building Strategy Library", + description: + "Practitioner strategies for reading a backlink profile and earning links that count. Each guide includes a full walkthrough and a copy-paste MCP prompt.", + items: [ + { + label: "The backlink audit", + description: + "Sort by first seen, bucket the junk, read the rows that matter.", + href: "/library/link-building/backlink-audit", + }, + { + label: "Referring domains, not backlinks", + description: + "The count to report, and what the top of the list is made of.", + href: "/library/link-building/referring-domains", + }, + { + label: "How to get backlinks", + description: + "Start from the pages that already earn them. Four plays from the podcast.", + href: "/library/link-building/how-to-get-backlinks", + }, + ], + cta: { + label: "Browse all link building strategies", + href: "/library/link-building", + }, + }, featuredLink: { title: "Free backlink checker", description: diff --git a/web/src/lib/strategy-libraries.ts b/web/src/lib/strategy-libraries.ts index 7dc4ac47f..08e58763b 100644 --- a/web/src/lib/strategy-libraries.ts +++ b/web/src/lib/strategy-libraries.ts @@ -175,3 +175,29 @@ export const aiAgentSeoStrategies: StrategyLibraryItem[] = [ href: "/library/ai-agent-seo/skills-memory-and-the-trace", }, ]; + +export const LINK_BUILDING_LIBRARY = { + name: "Link Building", + path: "/library/link-building", +}; + +export const linkBuildingStrategies: StrategyLibraryItem[] = [ + { + title: "The backlink audit: sort by first seen, then by relevance", + description: + "The three newest links to a real site were a casino domain and two link sellers. Underneath them were the links that count. How to tell them apart in an hour.", + href: "/library/link-building/backlink-audit", + }, + { + title: "Referring domains, not backlinks: the count that moves rankings", + description: + "2,393 backlinks, 308 referring domains, 872 from one site the owner also runs. Why the second number is the one to report.", + href: "/library/link-building/referring-domains", + }, + { + title: "How to get backlinks: start from the pages that already earn them", + description: + "A free calculator with links from 17 domains, a park-cleanup page with 270 backlinks. Neither was pitched. Four plays that earned links on tape.", + href: "/library/link-building/how-to-get-backlinks", + }, +]; diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts index ebea88824..3157d9373 100644 --- a/web/src/routeTree.gen.ts +++ b/web/src/routeTree.gen.ts @@ -43,6 +43,7 @@ import { Route as MarketingFeaturesAiSearchPromptsRouteImport } from './routes/_ import { Route as MarketingFeaturesAiBrandVisibilityRouteImport } from './routes/_marketing/features/ai-brand-visibility' import { Route as MarketingLibrarySiteAuditIndexRouteImport } from './routes/_marketing/library/site-audit/index' import { Route as MarketingLibraryRankTrackingIndexRouteImport } from './routes/_marketing/library/rank-tracking/index' +import { Route as MarketingLibraryLinkBuildingIndexRouteImport } from './routes/_marketing/library/link-building/index' import { Route as MarketingLibraryKeywordResearchIndexRouteImport } from './routes/_marketing/library/keyword-research/index' import { Route as MarketingLibraryCompetitiveAnalysisIndexRouteImport } from './routes/_marketing/library/competitive-analysis/index' import { Route as MarketingLibraryAiAgentSeoIndexRouteImport } from './routes/_marketing/library/ai-agent-seo/index' @@ -53,6 +54,9 @@ import { Route as MarketingLibraryRankTrackingWhichKeywordsToTrackRouteImport } import { Route as MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRouteImport } from './routes/_marketing/library/rank-tracking/search-console-vs-rank-tracker' import { Route as MarketingLibraryRankTrackingLocalRankTrackingRouteImport } from './routes/_marketing/library/rank-tracking/local-rank-tracking' import { Route as MarketingLibraryRankTrackingKeywordRankingReportRouteImport } from './routes/_marketing/library/rank-tracking/keyword-ranking-report' +import { Route as MarketingLibraryLinkBuildingReferringDomainsRouteImport } from './routes/_marketing/library/link-building/referring-domains' +import { Route as MarketingLibraryLinkBuildingHowToGetBacklinksRouteImport } from './routes/_marketing/library/link-building/how-to-get-backlinks' +import { Route as MarketingLibraryLinkBuildingBacklinkAuditRouteImport } from './routes/_marketing/library/link-building/backlink-audit' import { Route as MarketingLibraryKeywordResearchSeedFromConversationRouteImport } from './routes/_marketing/library/keyword-research/seed-from-conversation' import { Route as MarketingLibraryKeywordResearchSearchIntentMappingRouteImport } from './routes/_marketing/library/keyword-research/search-intent-mapping' import { Route as MarketingLibraryKeywordResearchPositioningToDemandRouteImport } from './routes/_marketing/library/keyword-research/positioning-to-demand' @@ -252,6 +256,12 @@ const MarketingLibraryRankTrackingIndexRoute = path: '/library/rank-tracking/', getParentRoute: () => MarketingRoute, } as any) +const MarketingLibraryLinkBuildingIndexRoute = + MarketingLibraryLinkBuildingIndexRouteImport.update({ + id: '/library/link-building/', + path: '/library/link-building/', + getParentRoute: () => MarketingRoute, + } as any) const MarketingLibraryKeywordResearchIndexRoute = MarketingLibraryKeywordResearchIndexRouteImport.update({ id: '/library/keyword-research/', @@ -312,6 +322,24 @@ const MarketingLibraryRankTrackingKeywordRankingReportRoute = path: '/library/rank-tracking/keyword-ranking-report', getParentRoute: () => MarketingRoute, } as any) +const MarketingLibraryLinkBuildingReferringDomainsRoute = + MarketingLibraryLinkBuildingReferringDomainsRouteImport.update({ + id: '/library/link-building/referring-domains', + path: '/library/link-building/referring-domains', + getParentRoute: () => MarketingRoute, + } as any) +const MarketingLibraryLinkBuildingHowToGetBacklinksRoute = + MarketingLibraryLinkBuildingHowToGetBacklinksRouteImport.update({ + id: '/library/link-building/how-to-get-backlinks', + path: '/library/link-building/how-to-get-backlinks', + getParentRoute: () => MarketingRoute, + } as any) +const MarketingLibraryLinkBuildingBacklinkAuditRoute = + MarketingLibraryLinkBuildingBacklinkAuditRouteImport.update({ + id: '/library/link-building/backlink-audit', + path: '/library/link-building/backlink-audit', + getParentRoute: () => MarketingRoute, + } as any) const MarketingLibraryKeywordResearchSeedFromConversationRoute = MarketingLibraryKeywordResearchSeedFromConversationRouteImport.update({ id: '/library/keyword-research/seed-from-conversation', @@ -461,6 +489,9 @@ export interface FileRoutesByFullPath { '/library/keyword-research/positioning-to-demand': typeof MarketingLibraryKeywordResearchPositioningToDemandRoute '/library/keyword-research/search-intent-mapping': typeof MarketingLibraryKeywordResearchSearchIntentMappingRoute '/library/keyword-research/seed-from-conversation': typeof MarketingLibraryKeywordResearchSeedFromConversationRoute + '/library/link-building/backlink-audit': typeof MarketingLibraryLinkBuildingBacklinkAuditRoute + '/library/link-building/how-to-get-backlinks': typeof MarketingLibraryLinkBuildingHowToGetBacklinksRoute + '/library/link-building/referring-domains': typeof MarketingLibraryLinkBuildingReferringDomainsRoute '/library/rank-tracking/keyword-ranking-report': typeof MarketingLibraryRankTrackingKeywordRankingReportRoute '/library/rank-tracking/local-rank-tracking': typeof MarketingLibraryRankTrackingLocalRankTrackingRoute '/library/rank-tracking/search-console-vs-rank-tracker': typeof MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRoute @@ -471,6 +502,7 @@ export interface FileRoutesByFullPath { '/library/ai-agent-seo/': typeof MarketingLibraryAiAgentSeoIndexRoute '/library/competitive-analysis/': typeof MarketingLibraryCompetitiveAnalysisIndexRoute '/library/keyword-research/': typeof MarketingLibraryKeywordResearchIndexRoute + '/library/link-building/': typeof MarketingLibraryLinkBuildingIndexRoute '/library/rank-tracking/': typeof MarketingLibraryRankTrackingIndexRoute '/library/site-audit/': typeof MarketingLibrarySiteAuditIndexRoute } @@ -522,6 +554,9 @@ export interface FileRoutesByTo { '/library/keyword-research/positioning-to-demand': typeof MarketingLibraryKeywordResearchPositioningToDemandRoute '/library/keyword-research/search-intent-mapping': typeof MarketingLibraryKeywordResearchSearchIntentMappingRoute '/library/keyword-research/seed-from-conversation': typeof MarketingLibraryKeywordResearchSeedFromConversationRoute + '/library/link-building/backlink-audit': typeof MarketingLibraryLinkBuildingBacklinkAuditRoute + '/library/link-building/how-to-get-backlinks': typeof MarketingLibraryLinkBuildingHowToGetBacklinksRoute + '/library/link-building/referring-domains': typeof MarketingLibraryLinkBuildingReferringDomainsRoute '/library/rank-tracking/keyword-ranking-report': typeof MarketingLibraryRankTrackingKeywordRankingReportRoute '/library/rank-tracking/local-rank-tracking': typeof MarketingLibraryRankTrackingLocalRankTrackingRoute '/library/rank-tracking/search-console-vs-rank-tracker': typeof MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRoute @@ -532,6 +567,7 @@ export interface FileRoutesByTo { '/library/ai-agent-seo': typeof MarketingLibraryAiAgentSeoIndexRoute '/library/competitive-analysis': typeof MarketingLibraryCompetitiveAnalysisIndexRoute '/library/keyword-research': typeof MarketingLibraryKeywordResearchIndexRoute + '/library/link-building': typeof MarketingLibraryLinkBuildingIndexRoute '/library/rank-tracking': typeof MarketingLibraryRankTrackingIndexRoute '/library/site-audit': typeof MarketingLibrarySiteAuditIndexRoute } @@ -585,6 +621,9 @@ export interface FileRoutesById { '/_marketing/library/keyword-research/positioning-to-demand': typeof MarketingLibraryKeywordResearchPositioningToDemandRoute '/_marketing/library/keyword-research/search-intent-mapping': typeof MarketingLibraryKeywordResearchSearchIntentMappingRoute '/_marketing/library/keyword-research/seed-from-conversation': typeof MarketingLibraryKeywordResearchSeedFromConversationRoute + '/_marketing/library/link-building/backlink-audit': typeof MarketingLibraryLinkBuildingBacklinkAuditRoute + '/_marketing/library/link-building/how-to-get-backlinks': typeof MarketingLibraryLinkBuildingHowToGetBacklinksRoute + '/_marketing/library/link-building/referring-domains': typeof MarketingLibraryLinkBuildingReferringDomainsRoute '/_marketing/library/rank-tracking/keyword-ranking-report': typeof MarketingLibraryRankTrackingKeywordRankingReportRoute '/_marketing/library/rank-tracking/local-rank-tracking': typeof MarketingLibraryRankTrackingLocalRankTrackingRoute '/_marketing/library/rank-tracking/search-console-vs-rank-tracker': typeof MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRoute @@ -595,6 +634,7 @@ export interface FileRoutesById { '/_marketing/library/ai-agent-seo/': typeof MarketingLibraryAiAgentSeoIndexRoute '/_marketing/library/competitive-analysis/': typeof MarketingLibraryCompetitiveAnalysisIndexRoute '/_marketing/library/keyword-research/': typeof MarketingLibraryKeywordResearchIndexRoute + '/_marketing/library/link-building/': typeof MarketingLibraryLinkBuildingIndexRoute '/_marketing/library/rank-tracking/': typeof MarketingLibraryRankTrackingIndexRoute '/_marketing/library/site-audit/': typeof MarketingLibrarySiteAuditIndexRoute } @@ -648,6 +688,9 @@ export interface FileRouteTypes { | '/library/keyword-research/positioning-to-demand' | '/library/keyword-research/search-intent-mapping' | '/library/keyword-research/seed-from-conversation' + | '/library/link-building/backlink-audit' + | '/library/link-building/how-to-get-backlinks' + | '/library/link-building/referring-domains' | '/library/rank-tracking/keyword-ranking-report' | '/library/rank-tracking/local-rank-tracking' | '/library/rank-tracking/search-console-vs-rank-tracker' @@ -658,6 +701,7 @@ export interface FileRouteTypes { | '/library/ai-agent-seo/' | '/library/competitive-analysis/' | '/library/keyword-research/' + | '/library/link-building/' | '/library/rank-tracking/' | '/library/site-audit/' fileRoutesByTo: FileRoutesByTo @@ -709,6 +753,9 @@ export interface FileRouteTypes { | '/library/keyword-research/positioning-to-demand' | '/library/keyword-research/search-intent-mapping' | '/library/keyword-research/seed-from-conversation' + | '/library/link-building/backlink-audit' + | '/library/link-building/how-to-get-backlinks' + | '/library/link-building/referring-domains' | '/library/rank-tracking/keyword-ranking-report' | '/library/rank-tracking/local-rank-tracking' | '/library/rank-tracking/search-console-vs-rank-tracker' @@ -719,6 +766,7 @@ export interface FileRouteTypes { | '/library/ai-agent-seo' | '/library/competitive-analysis' | '/library/keyword-research' + | '/library/link-building' | '/library/rank-tracking' | '/library/site-audit' id: @@ -771,6 +819,9 @@ export interface FileRouteTypes { | '/_marketing/library/keyword-research/positioning-to-demand' | '/_marketing/library/keyword-research/search-intent-mapping' | '/_marketing/library/keyword-research/seed-from-conversation' + | '/_marketing/library/link-building/backlink-audit' + | '/_marketing/library/link-building/how-to-get-backlinks' + | '/_marketing/library/link-building/referring-domains' | '/_marketing/library/rank-tracking/keyword-ranking-report' | '/_marketing/library/rank-tracking/local-rank-tracking' | '/_marketing/library/rank-tracking/search-console-vs-rank-tracker' @@ -781,6 +832,7 @@ export interface FileRouteTypes { | '/_marketing/library/ai-agent-seo/' | '/_marketing/library/competitive-analysis/' | '/_marketing/library/keyword-research/' + | '/_marketing/library/link-building/' | '/_marketing/library/rank-tracking/' | '/_marketing/library/site-audit/' fileRoutesById: FileRoutesById @@ -1041,6 +1093,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MarketingLibraryRankTrackingIndexRouteImport parentRoute: typeof MarketingRoute } + '/_marketing/library/link-building/': { + id: '/_marketing/library/link-building/' + path: '/library/link-building' + fullPath: '/library/link-building/' + preLoaderRoute: typeof MarketingLibraryLinkBuildingIndexRouteImport + parentRoute: typeof MarketingRoute + } '/_marketing/library/keyword-research/': { id: '/_marketing/library/keyword-research/' path: '/library/keyword-research' @@ -1111,6 +1170,27 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof MarketingLibraryRankTrackingKeywordRankingReportRouteImport parentRoute: typeof MarketingRoute } + '/_marketing/library/link-building/referring-domains': { + id: '/_marketing/library/link-building/referring-domains' + path: '/library/link-building/referring-domains' + fullPath: '/library/link-building/referring-domains' + preLoaderRoute: typeof MarketingLibraryLinkBuildingReferringDomainsRouteImport + parentRoute: typeof MarketingRoute + } + '/_marketing/library/link-building/how-to-get-backlinks': { + id: '/_marketing/library/link-building/how-to-get-backlinks' + path: '/library/link-building/how-to-get-backlinks' + fullPath: '/library/link-building/how-to-get-backlinks' + preLoaderRoute: typeof MarketingLibraryLinkBuildingHowToGetBacklinksRouteImport + parentRoute: typeof MarketingRoute + } + '/_marketing/library/link-building/backlink-audit': { + id: '/_marketing/library/link-building/backlink-audit' + path: '/library/link-building/backlink-audit' + fullPath: '/library/link-building/backlink-audit' + preLoaderRoute: typeof MarketingLibraryLinkBuildingBacklinkAuditRouteImport + parentRoute: typeof MarketingRoute + } '/_marketing/library/keyword-research/seed-from-conversation': { id: '/_marketing/library/keyword-research/seed-from-conversation' path: '/library/keyword-research/seed-from-conversation' @@ -1262,6 +1342,9 @@ interface MarketingRouteChildren { MarketingLibraryKeywordResearchPositioningToDemandRoute: typeof MarketingLibraryKeywordResearchPositioningToDemandRoute MarketingLibraryKeywordResearchSearchIntentMappingRoute: typeof MarketingLibraryKeywordResearchSearchIntentMappingRoute MarketingLibraryKeywordResearchSeedFromConversationRoute: typeof MarketingLibraryKeywordResearchSeedFromConversationRoute + MarketingLibraryLinkBuildingBacklinkAuditRoute: typeof MarketingLibraryLinkBuildingBacklinkAuditRoute + MarketingLibraryLinkBuildingHowToGetBacklinksRoute: typeof MarketingLibraryLinkBuildingHowToGetBacklinksRoute + MarketingLibraryLinkBuildingReferringDomainsRoute: typeof MarketingLibraryLinkBuildingReferringDomainsRoute MarketingLibraryRankTrackingKeywordRankingReportRoute: typeof MarketingLibraryRankTrackingKeywordRankingReportRoute MarketingLibraryRankTrackingLocalRankTrackingRoute: typeof MarketingLibraryRankTrackingLocalRankTrackingRoute MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRoute: typeof MarketingLibraryRankTrackingSearchConsoleVsRankTrackerRoute @@ -1272,6 +1355,7 @@ interface MarketingRouteChildren { MarketingLibraryAiAgentSeoIndexRoute: typeof MarketingLibraryAiAgentSeoIndexRoute MarketingLibraryCompetitiveAnalysisIndexRoute: typeof MarketingLibraryCompetitiveAnalysisIndexRoute MarketingLibraryKeywordResearchIndexRoute: typeof MarketingLibraryKeywordResearchIndexRoute + MarketingLibraryLinkBuildingIndexRoute: typeof MarketingLibraryLinkBuildingIndexRoute MarketingLibraryRankTrackingIndexRoute: typeof MarketingLibraryRankTrackingIndexRoute MarketingLibrarySiteAuditIndexRoute: typeof MarketingLibrarySiteAuditIndexRoute } @@ -1329,6 +1413,12 @@ const MarketingRouteChildren: MarketingRouteChildren = { MarketingLibraryKeywordResearchSearchIntentMappingRoute, MarketingLibraryKeywordResearchSeedFromConversationRoute: MarketingLibraryKeywordResearchSeedFromConversationRoute, + MarketingLibraryLinkBuildingBacklinkAuditRoute: + MarketingLibraryLinkBuildingBacklinkAuditRoute, + MarketingLibraryLinkBuildingHowToGetBacklinksRoute: + MarketingLibraryLinkBuildingHowToGetBacklinksRoute, + MarketingLibraryLinkBuildingReferringDomainsRoute: + MarketingLibraryLinkBuildingReferringDomainsRoute, MarketingLibraryRankTrackingKeywordRankingReportRoute: MarketingLibraryRankTrackingKeywordRankingReportRoute, MarketingLibraryRankTrackingLocalRankTrackingRoute: @@ -1348,6 +1438,8 @@ const MarketingRouteChildren: MarketingRouteChildren = { MarketingLibraryCompetitiveAnalysisIndexRoute, MarketingLibraryKeywordResearchIndexRoute: MarketingLibraryKeywordResearchIndexRoute, + MarketingLibraryLinkBuildingIndexRoute: + MarketingLibraryLinkBuildingIndexRoute, MarketingLibraryRankTrackingIndexRoute: MarketingLibraryRankTrackingIndexRoute, MarketingLibrarySiteAuditIndexRoute: MarketingLibrarySiteAuditIndexRoute, diff --git a/web/src/routes/_marketing/library/index.tsx b/web/src/routes/_marketing/library/index.tsx index f92f1f0a3..2b0a76e59 100644 --- a/web/src/routes/_marketing/library/index.tsx +++ b/web/src/routes/_marketing/library/index.tsx @@ -4,18 +4,20 @@ import { aiAgentSeoStrategies, competitiveAnalysisStrategies, keywordResearchStrategies, + linkBuildingStrategies, rankTrackingStrategies, siteAuditStrategies, } from "@/lib/strategy-libraries"; const PATH = "/library"; const description = - "Browse practical SEO strategies for finding search demand, sizing up competitors, auditing a site, tracking rankings, running SEO through an AI agent, mapping intent, and planning pages."; + "Browse practical SEO strategies for finding search demand, sizing up competitors, auditing a site, tracking rankings, building links, running SEO through an AI agent, mapping intent, and planning pages."; const featuredStrategies = [ ...keywordResearchStrategies.slice(0, 2), ...competitiveAnalysisStrategies.slice(0, 1), ...siteAuditStrategies.slice(0, 1), ...rankTrackingStrategies.slice(0, 1), + ...linkBuildingStrategies.slice(0, 1), ...aiAgentSeoStrategies.slice(0, 1), ]; @@ -118,6 +120,23 @@ function StrategyLibraryIndexPage() {

+ +

+ Link Building +

+

+ Read a backlink profile without trusting the score, report the + number that moves rankings, and earn links from the pages that + already get them. +

+

+ View all {linkBuildingStrategies.length} strategies{" "} + +

+
({ + "@type": "Question", + name: faq.question, + acceptedAnswer: { "@type": "Answer", text: faq.answer }, + })), +}; + +export const Route = createFileRoute( + "/_marketing/library/link-building/backlink-audit", +)({ + head: () => + buildPageSeo({ + title: "The Backlink Audit: Sort by First Seen, Then by Relevance", + description: frontmatter.description, + path: PATH, + titleSuffix: "OpenSEO Library", + ogType: "article", + }), + component: () => ( + + +