Why Shopify product URLs drop out of Google the week before a sale
A product URL that was ranking on Monday can miss the SERP on Thursday while the store still looks live. The week before a sale is when handles get rewritten, inventory is zeroed, themes get swapped, Hide from search engines gets ticked “just until launch,” and apps start sending out-of-stock products to the homepage with a 301. Google does not wait for your sale date to reclassify those signals.
People ask why Shopify product URLs drop out of Google the week before a sale and get a robots.txt.liquid lecture. That file matters. It is not the only gate. Hidden-product noindex, collection canonicals to /products/handle, sitemap rows that vanish, and out-of-stock 200s all move faster than a merchant stand-up. Common write-ups skip the hop log that disagrees with Search Console’s label, and they skip the soft-404 path where a 200 looks like an error page with no advertised drop clock.
A 301 to the homepage is not a 200. A 404 is a removal signal. Neither belongs in an indexing campaign. If the product URL now 404s, restore it or stop. If it still 200s and Google has tagged it a soft 404, the repair is the body and the status code, not a recrawl of the same empty template.
The useful artifact is a hop log: curl -I -L, every status, every Location, then robots and canonical. Compare that log to the GSC coverage label.
From the robots.txt myth to a hop log you can defend in a stand-up
Myth. If product URLs vanish the week of a promo, robots.txt.liquid was edited and Googlebot is blocked. Sister myths: the Google channel app just needs a sync, or a Request Indexing click will put the product back before Friday.
Reframing. Robots can block a path. Most pre-sale drops are per-URL: unpublished product, seo.hidden, handle 301, an app that redirects sold-out products to /, a “Sold out” 200, a collection URL that canonicalizes away from /products/handle. A 404 or 410 should drop. A 301 passes attention to the target, including a useless homepage. A 200 remains eligible until noindex, canonical, or error-like content says otherwise.
Proof. Google’s Google HTTP status codes documentation splits 2xx (may be indexed if other signals allow), 3xx (the target is the document of record), 404/410 (the URL should come out), and 5xx (temporary). A 301 is not a 200. Soft 404 is the extra class: the server says 200, the page looks empty, and Google may classify it as a 404 equivalent. Public Search Advocate comments, as covered in industry recaps of Google office hours, treat the timing as unset. An out-of-stock 200 can be classed as a soft 404, with no advertised number of days before that URL leaves the index.
Setup. Pick the ten product URLs that must rank on sale morning. Dump hops with curl -I -L, read seo.hidden / canonical, check sitemap_products_1.xml, then write the Inspection label next to the hop log. 404 or 410: restore. 301 to /: kill the app rule. 200 plus noindex: unhide. Empty OOS 200: fix the template or return 404/410 on purpose. Only a clean, indexable 200 that is absent is a crawl-timing problem.
Why a missing product URL costs more the week you advertise it
Paid social, email, and shopping ads still point at /products/old-handle while Google has already dropped that URL or consolidated it to the homepage. Organic goes quiet in the week you can least afford it.
Merchandising teams treat “hide until Thursday” as a merchandising toggle. Google treats noindex and unpublished as removal inputs. Hiding can drop a URL faster than unhiding puts it back. A recrawl request does not mint a ranking, and it does not override a 404.
"If the product URL is 404, 410, or 451, do not put it in a crawl campaign. Restore the handle or stop. We would rather refund a URL that never had a chance than fetch a dead Shopify path the week of your sale."
— the SpeedyIndex team
Use a 404 errors checker on the sale list before you spend ads on those URLs. SpeedyIndex belongs after the hop log says 200 and indexable, not as a patch on a homepage redirect.
A pre-sale hop log that separates a 404 from a soft 404
Nine steps. Run them on the products that must survive sale week.
-
Freeze the URL Google already knows. Action: copy the product URL from Search Console Pages or
/sitemap_products_1.xml. Tool: GSC export or the products sitemap. Setting: scheme, host, handle as stored. Observable output: hrefs that used to rank. When to look: 7–10 days before the sale, then 48 hours before. Success:/products/blue-mugmatches last month’s result. Failure: admin now shows/products/blue-mug-sale— Shopify 301s the old handle; test both in step 2. -
Dump every hop. Action: request headers with redirect following. Tool:
curl -I -L. Setting: print each status andLocation. Observable output: an ordered hop list. When to look: before you trust a GSC label. Success: one200on/products/blue-mug. Failure:404or410— restore or stop; this URL does not go into an indexing campaign. Failure:301to/— disable the OOS-app redirect. Do not call the 301 a 200. -
Read
X-Robots-Tagand robots.txt.liquid. Action: inspect headers and GET/robots.txt. Tool: hop output plus the published robots file. Setting:User-agent: Googlebot, then the product path. Observable output: allow or disallow. When to look: right after hops. Success:/products/allowed. Failure:Disallow: /products/— revert robots.txt.liquid before any Request Indexing. -
Detect
seo.hiddenand meta robots. Action: GET the 200 body and search fornoindex. Tool: view-source. Setting: Hide from search engines maps toseo.hidden. Observable output: indexable versusnoindex. When to look: on every 200. Success:index,followor no robots meta. Failure:noindexon a product hid until the sale — clear the checkbox, then recrawl. -
Compare collection URL versus product canonical. Action: open
/collections/sale/products/blue-mugand/products/blue-mug. Tool: view-source on both. Setting: default canonical is usually/products/handle. Observable output: both canonicals. When to look: if ads use collection paths. Success: both point at/products/blue-mug. Failure: canonical aimed at the collection — restore product-canonical Liquid. -
Confirm sitemap membership. Action: fetch the products sitemap. Tool: browser or curl. Setting: unpublished and
seo.hiddenproducts often leave it. Observable output: handle present or absent. When to look: after admin edits. Success: the handle is listed. Failure: missing after unpublish — a discovery hint, not proof of deindex. Do not submit a URL omitted because it 404s. -
Open Search Console Inspection on the same URL. Action: paste the exact hop-log URL. Tool: URL Inspection. Setting: live test and last crawl. Observable output: GSC label. When to look: after the hop log. Success: hop log 200 indexable, Inspection says on Google. Failure: hop log 200, GSC says soft 404 — Google last classified the stored document as an error. Fix the template. Read what is a soft 404 for the classification. It is not a reason to submit a 404.
-
Judge out-of-stock 200s on purpose. Action: pull inventory to zero on a test product and fetch again. Tool: Shopify inventory plus curl. Setting: “continue selling when out of stock” off, then on. Observable output: status code and sold-out template. When to look: before an OOS app hits the sale catalog. Success: 200 with a real product body. Failure: 200 with a near-empty “not available” page — a soft 404 with no published drop clock. Alternate failure: app 301 to homepage. Pick one policy. Do not mix them the week of a sale.
-
Decide crawl versus restore. Action: sort URLs into restore / unhide / kill redirect / fix template / eligible for recrawl. Tool: the sheet. Setting: 404, 410, 451, and
noindexnever enter a crawl campaign. Observable output: clean 200s that Inspection still says are absent. When to look: 48 hours before ads fire. Success: two URLs, both 200, both indexable, both missing. Failure: homepage 301s still sit in the recrawl column. Pull them out. SpeedyIndex is a crawl request for the clean remainder, identified as Googlebot Smartphone, without Search Console verification. It is not a patch forseo.hidden.
Seven ways people explain a Shopify drop, scored the same way
Robots, seo.hidden, collection canonicals, sitemap membership, OOS redirects, hop logs, and GSC labels all get blamed the week before a sale. Score each method with the same four criteria, in this order: best for / speed / risk / skip when.
-
robots.txt.liquid inspection. Best for a sudden sitewide miss after a theme deploy. Speed: minutes. Risk: you change robots while the bug is
seo.hidden. Skip when/products/is already allowed. -
seo.hidden/ Hide from search engines. Best for products hidden from search until Thursday. Speed: minutes in admin plus a fetch. Risk: unhiding does not put the URL back on a clock you control. Skip when the hop log is already 404. -
Collection path versus
/products/handlecanonical. Best for ads that use/collections/.../products/.... Speed: two view-source checks. Risk: you edit the collection URL Google is not storing. Skip when both paths already canonical to/products/handle. -
Products sitemap membership. Best for catching unpublish and hide. Speed: one sitemap fetch. Risk: absence is not deindex. Skip when you already have a 404 hop.
-
OOS app 301 to homepage. Best for the inventory-hit-zero pattern. Speed: one
curl -I -L. Risk: you request indexing of a handle that now 301s to/. Skip when the hop log is a clean 200. -
curl -I -Lhop log versus GSC label. Best for the week-before-sale argument in Slack. Speed: two minutes per URL. Risk: you treat a stale GSC label as current HTTP. Skip when you have not fetched in the last hour. -
Soft-404 reading on a 200 OOS template. Best for empty sold-out pages that never 404. Speed: body check plus Inspection. Risk: you wait for a timeframe Google does not publish. Skip when the status is already 404.
Takeaway: robots and seo.hidden are real. The hop log tells you which URL still exists. GSC tells you how Google last classified it. A 200 can still be a soft 404. A 301 to / is a different URL.
When GSC says crawled not indexed and the store still returns 200
Hop log 404, GSC still says URL is on Google. GSC is stale. Restore the product or accept the drop. Do not Request Indexing.
Hop log 200, GSC says not found (404). Google’s last crawl saw a missing page. Wait for recrawl after you restore.
Hop log 301 to /, GSC says page with redirect. Kill the app redirect. A 301 is not a 200.
Hop log 200 + noindex. Clear seo.hidden. Recrawl after the directive is gone.
Hop log 200 with a thin sold-out body, GSC says soft 404. There is no official number of days until the URL leaves the index. Change the template or the status code. Recrawling the same empty 200 repeats the classification.
Theme swap the night before the sale. Re-fetch canonical and robots meta. Liquid can inject noindex without touching robots.txt.liquid.
Field notes from stores that only changed a theme
Illustrative scenario — not a real customer. A fashion shop hid 80 sale SKUs from search engines on Monday so Thursday would “feel like a launch.” By Wednesday, Inspection showed excluded by noindex. Unhiding Thursday morning did not restore weekend rankings.
Illustrative scenario — not a real customer. A kitchen-goods store’s out-of-stock app 301’d quantity-zero products to /. A delayed shipment zeroed the hero SKU two days before Black Friday. curl -I -L ended on / with 301. The team requested indexing anyway. Google kept the homepage as the target.
Illustrative scenario — not a real customer. A beauty brand returned 200 on sold-out kits with a three-line “not available” template. Search Console moved those URLs to soft 404 over an unstated interval. Inventory returned; the template stayed empty; the URLs did not.
Illustrative model based on typical conditions for an ecommerce merchandising team.
Assume 40 product URLs that must hold rankings through a 72-hour sale. Ten days out, hop-log all 40. Fix hidden, unpublished, handle-changed, or OOS-redirected rows as merchandising bugs. Forty-eight hours out, hop-log again and diff GSC labels. Recrawl candidates still 200, still indexable, still absent. Soft-404 200s go to template work. Homepage 301s go to app settings. 404s go to restore or removal. This is a workflow model under typical Shopify admin churn, not a measured client result.
Questions stores ask the week a hero SKU vanishes
Q: Is robots.txt.liquid the usual reason product URLs vanish before a sale?
A: It is a common guess. Per-URL state — seo.hidden, unpublish, handle 301, OOS redirect, soft-404 200 — shows up more often when only some products drop.
Q: Can an out-of-stock product that returns 200 stay in Google?
A: Yes, if the page still looks like a real product. A thin 200 can be classed as a soft 404, with no advertised drop clock.
Q: Should I submit a 404 product URL for indexing so it comes back faster after I restock?
A: No. A 404 never goes into an indexing campaign. Restore the product to a 200, then recrawl if it is still absent.
Q: GSC says page with redirect. The product looks fine in the admin. Who is right?
A: The hop log. Run curl -I -L. If you land on /, a redirect is live.
Q: We changed the product handle for a cleaner sale URL. Will Google keep the old one?
A: Shopify usually 301s the old handle to the new one. Ads that still use the old URL depend on that 301.
Q: Collection URLs were ranking, product URLs were not. Is that a drop?
A: Often it is canonicalization. If both point at /products/handle, Google may store only that URL.
Q: Does a missing row in sitemap_products_1.xml mean the URL left the index?
A: No. Confirm with a hop log and Inspection.
Q: Request Indexing did nothing the day before the sale. Why?
A: Those requests are queued and capped. They do not override noindex, 404, or a 301 to the homepage.
Q: Is a 301 to the homepage almost as good as a 200 on the product URL?
A: No. A 301 names a different URL of record.
Q: When is a crawl product the right move on Shopify?
A: After the hop log is 200 and indexable, seo.hidden is off, and Inspection still says the URL is not on Google.
What pre-sale drops look like as Google leans on soft 404s
Empty 200s will keep getting classed as errors. Shopify themes that print a sold-out husk without changing the status code will keep losing URLs on a clock nobody publishes. The artifact that survives a stand-up is curl -I -L plus the GSC label on the same URL, dated.
Ten-minute action: pick the five product URLs in this week’s ads. Run curl -I -L on each. Note final status and Location. View-source for noindex and canonical. Open Inspection. If you see 404, restore or stop. If you see 301 to /, disable the OOS redirect. If you see 200 plus noindex, unhide. If you see 200 plus a husk body, fix the template. Only a clean 200 that is absent is a recrawl candidate.
The previous note in this series covers the step before this one: How to check if one competitor guest-post URL is indexed without Search Console. Read that first if you landed here on a related long tail.
About SpeedyIndex
SpeedyIndex sells crawl requests on a Pay-per-Result basis. One indexed URL costs 100 tokens.
A Google URL is rechecked on Day 7. A Yandex URL is rechecked on Day 15. If the URL is not indexed at recheck, tokens return automatically.
Campaign types are Standard and Drip-Feed. An optional precheck can drop 404, 410, and 451 responses, robots or noindex blocks, and URLs already indexed.
The crawler identifies as Googlebot Smartphone. Search Console verification is not required.
A trial allotment is 200 tokens. Indexing is the search engine’s decision. A paid request is a crawl attempt, not a ranking promise and not an inclusion guarantee.