Shopify makes changing a product URL easy. Edit the URL handle, leave the redirect box ticked, save. The old address now forwards to the new one, and nothing appears broken.
Do that a few times over a product's life (a rename for SEO, a rebrand, a seasonal tweak, a typo fix) and something quieter happens. The redirects start pointing at other redirects. A shopper clicking a two-year-old Pinterest pin or email link goes from handle A to handle B to handle C before seeing the product. That's a redirect chain, and Shopify stores accumulate them without anyone noticing.
This guide explains how chains form in Shopify specifically, what they cost, and a safe process to find and flatten them.
How product handles and redirects work in Shopify
Every product has a handle, the last part of its URL: /products/trail-runner-4. Shopify generates it from the product title when you create the product. You can edit it in the product's Search engine listing section.
When you change a handle in the admin, Shopify offers a "Create a URL redirect" checkbox so the old URL forwards to the new one, as described in a Shopify Community answer. The redirect appears in Content → Menus → View URL redirects, alongside any you create manually (Shopify Help: URL redirects).
Shopify's own product help includes a caution worth repeating: you can edit the handle, "but don't edit it too often or the product might not display in search engine results" (Shopify Help: Adding and updating products).
Three rules from Shopify's redirect documentation explain most of the surprises store owners run into:
- Redirects only work from broken URLs. "You can redirect only from broken URLs… If the URL still loads a valid webpage, then the URL redirect won't work."
- Reactivating content deletes redirects. If a hidden collection is made visible again, "the URL redirect is automatically deleted because redirects only work for URLs that return 404 errors". Shopify notes the same behaviour applies to products set to Draft or removed from sales channels.
- 301s are cached. "301 redirects are cached by browsers and search engines. If you remove a redirect after customers have accessed it, then the redirect might continue to work in their browsers until the cache expires."
How a chain forms
Here's a typical product history:
| Date | Change | Redirects in admin |
|---|---|---|
| Jan | Created as /products/trail-shoe
|
none |
| Apr | Renamed for SEO → /products/waterproof-trail-running-shoe
|
trail-shoe → waterproof-trail-running-shoe
|
| Sep | New version, renamed → /products/trail-runner-4
|
waterproof-trail-running-shoe → trail-runner-4
|
Now anyone following an old link to /products/trail-shoe goes:
/products/trail-shoe →301→ /products/waterproof-trail-running-shoe →301→ /products/trail-runner-4
Two hops. Add a domain change (http:// → https://, or the myshopify.com domain → your custom domain) or a www redirect in front, and it's three or four.
Other common ways chains appear in Shopify:
- Imported redirects from a previous platform that point at URLs you later changed again
- Redirect apps layering their own rules on top of the native redirect list
- Collection handle changes where internal links, menus or old redirects still use the older handle
-
Old campaign redirects (
/spring-sale→ a collection) whose target collection was later renamed
Why chains matter
Speed
Each redirect is another round trip before the page can load. Lighthouse notes that a redirect "can delay the loading of the resource by hundreds of milliseconds" and fails a page that has two or more redirects (Lighthouse: Avoid multiple page redirects). web.dev's LCP guide adds that a common cause of slow Time to First Byte "for an otherwise fast site is visitors arriving through multiple redirects, such as from advertisements or shortened links" (Optimize LCP). Ads, emails and social posts are exactly where old product URLs live.
Fragility
Every link in a chain is a point of failure. If someone deletes or edits the middle redirect while tidying up, or the middle URL becomes a live page again (Shopify then deletes that redirect, per the rule above), the chain breaks. Old links then land on a 404 or the wrong page.
Search signals
Google follows redirects, and its documentation describes permanent redirects as a strong signal that the target should be canonical (Redirects and Google Search). Google can follow several hops, but there's no benefit in making it. Shorter paths are simpler for crawlers and leave fewer chances for something to go wrong.
Step 1: Export your redirect list
In Content → Menus → View URL redirects, use Export to download your redirects as CSV (Shopify Help). You'll get two columns: Redirect from and Redirect to. Save a copy before making changes; that's your rollback.
Step 2: Find chains in the export
A chain exists wherever a Redirect to value also appears as a Redirect from value. A short script finds them and calculates each URL's final destination:
import csv
rows = list(csv.DictReader(open("redirects.csv", newline="", encoding="utf-8")))
# Adjust these names to match your export's header row
src_col, dst_col = "Redirect from", "Redirect to"
m = {r[src_col].strip(): r[dst_col].strip() for r in rows}
def resolve(path, seen=None):
seen = seen or []
if path in seen:
return None, seen + [path] # loop
if path not in m:
return path, seen
return resolve(m[path], seen + [path])
for src in m:
final, path = resolve(src)
if final is None:
print("LOOP:", " -> ".join(path))
elif len(path) > 1:
print(f"CHAIN ({len(path)} hops): {' -> '.join(path)} -> {final}")
This covers your native redirect list. It won't see redirects from apps or domain-level rules, so verify live URLs too.
Step 3: Verify against the live store
Check what visitors actually experience, including domain and protocol hops:
while read -r url; do
curl -s -o /dev/null -L -w "%{num_redirects} hops %{http_code} %{url_effective} <- $url\n" "$url"
done < old-urls.txt
Build old-urls.txt from the Redirect from paths (with your domain added), plus a few old links from emails, ads and social posts. Anything with more than one hop, or ending in a 404, needs attention.
Step 4: Flatten the chains
For each chain, edit the first redirect (and every intermediate one) so it points straight at the final URL:
| Redirect from | Before | After |
|---|---|---|
/products/trail-shoe |
/products/waterproof-trail-running-shoe |
/products/trail-runner-4 |
/products/waterproof-trail-running-shoe |
/products/trail-runner-4 |
/products/trail-runner-4 (unchanged) |
Keep the intermediate redirects. Other links may point at the middle URL, and it still needs to resolve, just in one hop. Shopify lets you edit redirects one at a time or in bulk, and import a corrected CSV (Shopify Help). For bulk changes, test the import on a handful of rows first.
Loops (A → B → A) are urgent: those URLs fail outright. Decide the correct final page and point both at it.
Step 5: Update your own links
Redirects exist for links you can't change. For links you can, point straight at the current URL:
- Navigation menus and footer links
- Homepage sections, banners and featured product blocks
- Collection descriptions and blog posts
- Email templates, automations and saved campaign links
- Ads, social profile links and anything in your own control
A crawl of your storefront will list internal links that pass through redirects. Fix those at the source and only old external links will ever touch a redirect.
Step 6: Change handles less often, and more deliberately
- Decide the handle at launch. Short, descriptive, stable, without years or version numbers unless the product genuinely is versioned.
- Don't rename for small SEO tweaks. Shopify's own warning about editing handles too often applies. Improve the page title and description instead; those don't change the URL.
- When you must rename, tick the redirect box, then immediately check whether the old handle was itself the target of an earlier redirect, and repoint that.
- Successor products: for a genuinely new model, consider a new product with its own URL, and redirect the old product to it only when the old one is retired. I covered those decisions in Product Page 404s and Out-of-Stock URLs: An Ecommerce Guide.
Step 7: Recheck regularly
Chains come back as the catalogue evolves. A quarterly export-and-script check, plus a crawl after any bulk catalogue change, keeps them under control. For the broader Shopify link clean-up, including broken links and missing images, see How to Find and Fix Broken Links on a Shopify Store.
Disclosure: I build Uchik, which can automate the crawling part. Uchik checks your store every day with read-only GET requests (it never adds to cart or places orders) and emails a report of broken links, missing images and redirect problems, each tied to the page and HTML element where the link appears. How it works explains how it follows redirects one hop at a time and records each hop; the features page lists the checks and the sample report shows a redirect finding. Two honest limits: its redirect-chain warning is aimed at longer chains (more than three hops), so the export-and-script check above is still the best way to catch two-hop chains in your redirect list. It also reads server-delivered HTML, so links added only by JavaScript or apps may be missed. It isn't a Shopify app; it checks your public pages from outside. You can sign up for free.
Checklist
- [ ] Redirect list exported and backed up
- [ ] Chains and loops found with a script
- [ ] Old URLs (including emails, ads, social) tested live for hop count
- [ ] Every redirect points straight at the final URL; intermediates kept
- [ ] Loops fixed first
- [ ] Menus, banners, collections, blog posts and email templates link to current URLs
- [ ] Handle changes rare and deliberate; redirect box ticked and earlier redirects repointed
- [ ] Quarterly recheck and a crawl after bulk catalogue changes
One redirect is good housekeeping. Three in a row is housekeeping that needs doing again.
Top comments (0)