Guide

How to bulk-fix broken internal links across Shopify articles

By Axel Antas-Bergkvist Published May 7, 2026 Updated May 30, 2026

Internal links rot. You changed your domain. You restructured collections. You deleted a handful of articles last quarter. A product URL changed because the handle was renamed. Each of those events leaves a trail of dead links scattered through the rest of your blog, and the longer the archive, the more of them there are.

You can find them one at a time using a crawler and fix them one at a time in the Shopify admin — opening each article, locating the bad link, editing it, saving. For a hundred broken links across an archive that’s hours of repetitive clicking. This guide covers handling the whole sweep at once.

The common breakage patterns

A few specific situations that produce a flood of internal 404s on a Shopify store:

  • Domain change. Old links written as full URLs (https://old-domain.com/blogs/news/...) instead of relative paths. After the cutover they all 404 — or worse, redirect through a 302.
  • Collection restructure. You merged /collections/coffee-beans and /collections/whole-bean into /collections/coffee, and every article that linked to one of the old collections is broken.
  • Deleted articles. An article you cited from five other articles is gone, and the links to it are dead.
  • Product handle changes. A product was renamed (/products/v60-dripper/products/v60-pourover-dripper). Spectersync doesn’t read or edit products, but every article body that links to the old product URL is text it very much can edit.
  • Theme path changes. Pages moved (/pages/about-us/pages/about) and the old paths now 404.

All of these are find-and-replace problems at heart. They’re miserable in the Shopify admin because it has no global find-and-replace across articles. They’re trivial when the whole blog is in one workspace.

Step 1: connect your store

Connect your Shopify store in the browser and every article in every blog lands in your workspace as clean content. The links in each body are plain markdown — [text](url) — searchable and editable like any other text, and the AI can see the whole archive at once.

Two approaches, depending on how thorough you want to be.

Quick: list the known-bad URLs. If you know the specific things that broke — old domain, old collection paths, deleted article URLs — you already have your find/replace pairs. Hand them straight to the recipe.

Thorough: crawl, then map. Run a link checker against your live site (linkchecker, wget --spider, or an online service) to get a complete list of internal links that currently 404. Use the resulting list as the input to your sweep.

Either approach gives the same shape of input: a list of “find this URL, replace with that URL” pairs.

Step 3: run the swap as a recipe

Run an AI recipe across your connected articles, with the whole blog as context. A recipe that works:

For every article in this blog, find every markdown link [text](url) whose URL matches any of these old URLs, and rewrite it:

  • https://old-domain.com/... → the corresponding relative path (drop the domain and protocol).
  • /collections/coffee-beans and /collections/whole-bean/collections/coffee.
  • /products/v60-dripper/products/v60-pourover-dripper.
  • /blogs/news/discontinued-article-handle → no replacement; remove the link but keep the link text inline.

Do not modify any other links. Do not change link text (except where instructed to remove a link). Do not modify the frontmatter or any other body content.

The instructions to not modify anything else matter a lot here. AI left to its own devices will helpfully “improve” links you weren’t asking about, change anchor text, or “fix” links it thinks look wrong but actually work. Constrain the job tightly. Browsing and reviewing are free; only the AI run spends credits, and every workspace opens with 500 free.

Step 4: review the diff before it touches Shopify

Before anything ships, the workspace shows you a dry-run diff — article by article, exactly which ones will be updated and the body diff for each. For a link-fix sweep done right, you’ll see only the URL strings inside link syntax changing — anchor text untouched, surrounding paragraphs untouched, metadata untouched.

If you see anything else — rewritten sentences, edited headings, modified meta descriptions — send it back. That’s drift, and the whole point of the review is catching it before it lands. When the diff is clean, publish. Spectersync sends the updates to Shopify over the Admin API, batched and rate-limited, with a snapshot behind the publish so you can roll back.

Step 5: re-check after the publish

Once the publish completes, re-run your link checker. Anything that still 404s is either a link you missed in the map or a genuinely external link you can’t fix from here. The first you handle with a second sweep using the missed pairs; the second you handle by removing or replacing the link manually.

Shopify has a redirect feature (Settings → Apps → URL redirects) that redirects old URLs to new ones at the server level. That’s the right answer for visitor traffic — anyone hitting an old URL ends up at the new page automatically.

But redirects don’t fix the links in your article bodies. The link still points to the old URL, still consumes a redirect hop, and still shows up as “broken” in some link checkers. For a clean archive you want both: Shopify-level redirects to catch inbound traffic, and link-rewrites in the article bodies so the source of truth is correct.

This guide handles the second half. The first is a Shopify admin job and stays outside Spectersync’s scope — it operates only on articles, blogs, and pages. Full breakdown is in the permissions guide, and the broader bulk toolkit is in the bulk-SEO guide.

The point of this workflow isn’t “automate link maintenance forever.” It’s removing the friction that makes you skip a sweep entirely. A clean internal-link graph helps both readers and crawlers; the only reason most blogs don’t have one is the admin makes it tedious. Operating on the whole archive at once makes it a one-evening job instead of a one-week one.

Prefer to run it locally?

If you’d rather pull every article to a folder of .md files and run grep, sed, or your own AI against it with the engine on your Mac, the same link-fixing workflow is covered for the desktop and open-source edition. Subscribe now →