| Rule | Meaning | Severity | Count |
|---|---|---|---|
from-invalid | Source missing or not a path | error | 2 |
to-invalid | Target missing or invalid | error | 1 |
conflict | Same source, different targets | error | 1 |
self-redirect | Redirects to itself | error | 1 |
loop | Redirect loop | error | 5 |
target-404 | Target is not a live URL (will 404) | error | 2 |
duplicate | Exact duplicate row | warning | 1 |
chain | Redirect chain | warning | 3 |
from-live | Source is a live page (redirect will not fire) | warning | 1 |
external-target | Target is on another domain | warning | 1 |
old-no-redirect | Old URL has no redirect | warning | 3 |
homepage-target | Target is the homepage | info | 6 |
from-format | Source has a query string, capitals, spaces or unencoded characters | info | 4 |
| Severity | Rule | Row | From | To | Explanation and suggested fix |
|---|---|---|---|---|---|
| error | from-invalid | 15 | old-page-no-slash | /pages/about | The source does not start with "/". Shopify requires a path. Fix: Add a leading slash, for example "/old-page-no-slash". |
| error | from-invalid | 16 | | /pages/about | The "Redirect from" value is empty. Fix: Fill in the old path, for example /old-page, or delete the row. |
| error | to-invalid | 17 | /no-target | | The "Redirect to" value is empty. Fix: Fill in the target path or URL, or delete the row. |
| error | conflict | 18 rows 18, 19 | /summer-sale | /collections/new-arrivals | /collections/mugs | The same source appears 2 times with different targets (rows 18, 19). Shopify keeps only one, and which one is not something you should rely on. Fix: Decide which target is correct and delete the other rows. This tool leaves conflicting rows unchanged. |
| error | self-redirect | 21 | /sample-self | /sample-self | The source and target are the same, so visitors would be sent back to the same URL forever. Fix: Delete this row or point it to the correct target. The fixed CSV removes it. |
| error | loop | 22 | /loop-a | /loop-b | Part of a redirect loop of 2: /loop-a → /loop-b → /loop-a. Browsers stop with "too many redirects". Fix: Break the loop by deleting or correcting one of these rows. The fixed CSV removes all rows in the loop and lists them in the removed-rows CSV. |
| error | loop | 23 | /loop-b | /loop-a | Part of a redirect loop of 2: /loop-b → /loop-a → /loop-b. Browsers stop with "too many redirects". Fix: Break the loop by deleting or correcting one of these rows. The fixed CSV removes all rows in the loop and lists them in the removed-rows CSV. |
| error | loop | 24 | /ring-1 | /ring-2 | Part of a redirect loop of 3: /ring-1 → /ring-2 → /ring-3 → /ring-1. Browsers stop with "too many redirects". Fix: Break the loop by deleting or correcting one of these rows. The fixed CSV removes all rows in the loop and lists them in the removed-rows CSV. |
| error | loop | 25 | /ring-2 | /ring-3 | Part of a redirect loop of 3: /ring-2 → /ring-3 → /ring-1 → /ring-2. Browsers stop with "too many redirects". Fix: Break the loop by deleting or correcting one of these rows. The fixed CSV removes all rows in the loop and lists them in the removed-rows CSV. |
| error | loop | 26 | /ring-3 | /ring-1 | Part of a redirect loop of 3: /ring-3 → /ring-1 → /ring-2 → /ring-3. Browsers stop with "too many redirects". Fix: Break the loop by deleting or correcting one of these rows. The fixed CSV removes all rows in the loop and lists them in the removed-rows CSV. |
| error | target-404 | 30 | /old-shop/brass-hook | /products/brass-hook-v2 | The target is an internal path that is not in your live URL list, so visitors will land on a 404 page. Fix: Check the spelling of the target, add the missing page or product to the store, or redirect to the closest live page. |
| error | target-404 | 31 | /discontinued/teapot | /products/teapot | The target is an internal path that is not in your live URL list, so visitors will land on a 404 page. Fix: Check the spelling of the target, add the missing page or product to the store, or redirect to the closest live page. |
| warning | duplicate | 20 | /old-shop/blue-mug | /products/blue-mug | Same source and target as row 2. Fix: Delete this row. The fixed CSV does this for you. |
| warning | chain | 27 | /legacy/oak-tray | /old-shop/oak-tray | Redirect chain of 2 hops: /legacy/oak-tray → /old-shop/oak-tray → /products/oak-tray. Each hop adds a request and delays the page. Fix: Point /legacy/oak-tray straight to /products/oak-tray. The fixed CSV does this. |
| warning | chain | 28 | /v1/blue-mug | /legacy-blue-mug | Redirect chain of 3 hops: /v1/blue-mug → /legacy-blue-mug → /old-shop/blue-mug → /products/blue-mug. Each hop adds a request and delays the page. Fix: Point /v1/blue-mug straight to /products/blue-mug. The fixed CSV does this. |
| warning | chain | 29 | /legacy-blue-mug | /old-shop/blue-mug | Redirect chain of 2 hops: /legacy-blue-mug → /old-shop/blue-mug → /products/blue-mug. Each hop adds a request and delays the page. Fix: Point /legacy-blue-mug straight to /products/blue-mug. The fixed CSV does this. |
| warning | from-live | 32 | /pages/faq | /pages/contact | A page already exists at this path on the new store. Shopify serves the page and ignores the redirect, so it will never fire. Fix: Delete the row if the page should stay, or change the page's URL handle if you want the redirect to apply. |
| warning | external-target | 33 | /partners/studio | https://partner-studio.example/shop | The target is on another domain (partner-studio.example). Fix: Confirm this is intended. If the domain is your own store, add it to the store domains field. |
| warning | old-no-redirect | old list #4 | /old-shop/teapot-set | | This old URL has no redirect and is not live on the new store, so it will 404 after launch. Fix: Add a redirect to the closest matching page. |
| warning | old-no-redirect | old list #5 | /old-shop/linen-apron | | This old URL has no redirect and is not live on the new store, so it will 404 after launch. Fix: Add a redirect to the closest matching page. |
| warning | old-no-redirect | old list #9 | https://example-store.com/old-category/jugs | | This old URL has no redirect and is not live on the new store, so it will 404 after launch. Fix: Add a redirect to the closest matching page. |
| info | homepage-target | 35 rows 35, 36, 37, 38, 39, 40 | (6 rows) | / | 6 rows redirect to the homepage (rows 35, 36, 37, 38, 39, 40). Redirecting many old URLs to the homepage is usually treated as a soft 404 by Google, and visitors lose the page they were looking for. Fix: Redirect to the closest matching product, collection or page instead. |
| info | from-format | 41 | /Old-Shop/Wool-Throw?ref=nav | /products/wool-throw | The source contains a query string, uppercase letters. Shopify can match query strings, so this redirect only fires for URLs with exactly this query. Confirm that is what you want. Paths are compared case-insensitively here and on Shopify, so capitals are harmless. Fix: Clean up the source if the extra parts are not intended. |
| info | from-format | 42 | /old shop/wool throw | /products/wool-throw | The source contains spaces. Percent-encode these characters (a space is %20) so the import and the browser agree. Fix: Clean up the source if the extra parts are not intended. |
| info | from-format | 43 | /old-shop/café-mug | /products/blue-mug | The source contains characters that are not URL-encoded. Percent-encode these characters (a space is %20) so the import and the browser agree. Fix: Clean up the source if the extra parts are not intended. |
| info | from-format | 44 | /search?q=mug,bowl | /collections/mugs | The source contains a query string. Shopify can match query strings, so this redirect only fires for URLs with exactly this query. Confirm that is what you want. Fix: Clean up the source if the extra parts are not intended. |
Chains collapsed to the final target (3), exact duplicates, self-redirects and loops removed (7). Nothing else was changed.
| Row | From | Old target | New target | Hops |
|---|---|---|---|---|
| 27 | /legacy/oak-tray | /old-shop/oak-tray | /products/oak-tray | 2 |
| 28 | /v1/blue-mug | /legacy-blue-mug | /products/blue-mug | 3 |
| 29 | /legacy-blue-mug | /old-shop/blue-mug | /products/blue-mug | 2 |
| Original row | From | To | Reason |
|---|---|---|---|
| 20 | /old-shop/blue-mug | /products/blue-mug | Exact duplicate of row 2 |
| 21 | /sample-self | /sample-self | Self-redirect (loop of length 1) |
| 22 | /loop-a | /loop-b | Part of a redirect loop (2 rows) |
| 23 | /loop-b | /loop-a | Part of a redirect loop (2 rows) |
| 24 | /ring-1 | /ring-2 | Part of a redirect loop (3 rows) |
| 25 | /ring-2 | /ring-3 | Part of a redirect loop (3 rows) |
| 26 | /ring-3 | /ring-1 | Part of a redirect loop (3 rows) |
1 conflict(s): the same source has different targets. These rows are kept as they are in the fixed CSV and must be resolved by hand (rows 18, 19).