Guides · Shopify redirects
Fix “Target can't redirect to another redirect” in a Shopify redirect import
You imported a redirect CSV and some rows did not make it. The summary says the target can't redirect to another redirect. Here is what that means and how to fix the file.
What Shopify checks
When Shopify creates a redirect, it looks at the target. If that path is already the "Redirect from" of another redirect in the store, Shopify refuses to create the new one.
The admin form does the same. Under Content, Menus, URL redirects, the message appears below the "Redirect to" field and the redirect is not saved.
In a CSV import the row is skipped and the rest of the file goes in.
Where the message shows up
The import does not stop. The skipped rows are reported afterwards in an email titled "Import URL Redirect Summary". This is the one we received after importing eleven rows into a development store on 14 November 2026:
Import complete with errors 9 redirects have been added to your store. 2 redirects contain errors and couldn't be imported to your store. Line 2: (/labels-2024, /old-label-roll) - Target can't redirect to another redirect Line 5: (/ribbon-b, /ribbon-a) - Target can't redirect to another redirect
In that email the line numbers counted redirect rows. "Line 2" was the second redirect in the file, which is the third line of the CSV once you count the header.
Why the first row failed
These were the first two redirects in the file:
Redirect from,Redirect to /old-label-roll,/products/50-mm-label-roll /labels-2024,/old-label-roll
The first row made /old-label-roll a redirect. The second row then pointed at /old-label-roll, so Shopify skipped it. Anyone who opens /labels-2024 gets a 404.
Why the second one failed
/ribbon-a,/ribbon-b /ribbon-b,/ribbon-a
This is a loop. Shopify accepted the first row and skipped the second, because its target was now a redirect. The loop never formed. The cost is that /ribbon-b has no redirect, and /ribbon-a points at a path that leads nowhere.
Row order changes the result
Shopify checks the target at the moment a redirect is created. It does not look again later.
In the same store we then created /labels-2024 pointing at a product. Shopify accepted it, even though /labels-2023 already pointed at /labels-2024. The store now held a two-hop chain: /labels-2023 to /labels-2024 to the product.
So the same redirects can go in fully in one order and lose a row in another. A clean import summary does not mean the store has no chains.
How to fix the file
Point every row at the page where the visitor should end up. No target in the file should also appear as a source.
Redirect from,Redirect to /old-label-roll,/products/50-mm-label-roll /labels-2024,/products/50-mm-label-roll
For a loop, someone has to decide where the addresses should go. Correct the row that is wrong, or remove both.
Then check the file against the redirects already in the store. Under Content, Menus, URL redirects, choose Export. If a target in your file appears in the "Redirect from" column of that export, the row will be skipped. Point it at the exported row's target.
Finding these rows by hand
In a spreadsheet, add a column with a COUNTIF that counts how often each "Redirect to" value appears in the "Redirect from" column. Any row above zero has a target that is also a source.
Two things get past this. Paths that differ only by capitals or a trailing slash are the same address to a visitor and different text to COUNTIF. Full URLs and bare paths do not match each other until you strip the domain.
Check your own file
Rowmill Redirect Check finds every chain and loop in a Shopify redirect CSV or a Matrixify Redirects sheet, and tells you which rows to change. It works on the file, so compare against your store's export as well. It is free, it runs in your browser, and your file is never uploaded.
Open the checker