# Review website migration redirects in Google Sheets Check a migration map with hundreds of old → new URL pairs and write evidence beside each row. Each pass requires a permanent first-hop redirect (301/308), the expected target, and a destination returning 2xx without another redirect. Import `workflow.json` into self-hosted n8n. No community nodes or npm packages are required. 1. Create a sheet with headers `old_url,new_url,status_code,location,destination_status,result,note,checked_at`. Fill the first two columns with absolute HTTP(S) URLs. 2. Set the document ID and tab in **Sheet settings**. Add the exact old/new origins in **Map settings**, without trailing slashes. Empty origin settings block HTTP checks. 3. Select your Google Sheets credential in both Sheets nodes and run **Check sheet now**. Keep rows unchanged during execution; updates match sheet row numbers. 4. Review **Run summary** and all non-pass rows. Enable the disabled daily trigger when needed. For CSV, disable both Sheets nodes and enable **Upload CSV map**. Upload a UTF-8 comma-separated CSV with `old_url,new_url` headers. Download the results from **Export results CSV** in the execution; the form acknowledges receipt immediately. Protect that form before exposing it. Checks pause 300 ms per row, use GET without following redirects, and retry network failures once. Bodies are ignored; Range requests ask for one byte, but servers may return more. Duplicates remain as flagged rows, including conflicting targets. Notes preserve multiple failures; a row’s result shows the first blocking category. Tested on n8n 2.43.7 with 300 rows through the CSV form. The workflow checks the first redirect hop and the destination status; full redirect chains, page content and search indexing need a separate review. Address comparison normalises scheme, host and default ports. Relative Location headers are supported; headers containing `..` return `review` for manual inspection. The checker does not resolve dot segments. No Code-node module allowance is needed.