Category: SEO

  • The redirects nobody sees, including the forty on my own site

    The redirects nobody sees, including the forty on my own site

    TL;DR

    In August I found forty links in my own site’s header and footer that each fired a redirect. The site strips trailing slashes and every navigation link had been written with one. Nothing was broken and nothing looked wrong. Internal links pointing at redirects is the real cost and the cheapest fix.

    In August I found forty links in my own site’s header and footer that were each firing a redirect.

    The site strips trailing slashes, so /seo-audit/ 301s to /seo-audit, and every navigation link had been written with the slash. So every page on the site was linking to forty URLs that immediately bounced somewhere else. Nothing was broken. Nothing looked wrong. I had been looking at that menu for months.

    That is the whole character of this problem. Redirects do not fail loudly. They work, which is why nobody looks at them.

    It belongs to the same family as everything else a site accumulates without anyone deciding: individually harmless, never surfaced by a tool as urgent, and only visible to somebody who went looking.

    What actually costs you

    Let me separate the real from the folklore, because this topic attracts a lot of the second.

    • Internal links pointing at redirects. The real one, and the cheapest to fix. Every internal link to a URL that redirects is a link you placed deliberately at an address you have decided is not the right one. Google follows it and consolidates, so nothing dramatic happens, but you are spending crawl on the round trip and pointing your own votes at a URL you have deprecated. On my site it was forty links on every page.
    • Chains of three or more hops. Each hop is another request and another chance for something in the middle to break. Google will follow a reasonable number and then give up, and the pages at the end of long chains are the ones that quietly stop being visited.
    • Redirect loops. Rare, fatal, usually created by two well-intentioned rules meeting.
    • Redirects to irrelevant destinations. The one that actually loses value. Pointing forty retired product URLs at the home page is not consolidation. Google is likely to treat those as soft 404s, because the destination does not answer what the original did. The nearest sensible category is the right target, and if there is no sensible category the honest answer is a 410.

    Google describes that outcome directly in its documentation on soft 404s: a URL returning a success code while the content signals the page does not exist. A redirect to a home page that has nothing to do with the request produces exactly that mismatch, which is why the tidy-looking fix so often shows up later as a new row in the indexing report.

    What does not cost you much

    A single clean 301. It is the correct tool and it does its job. There is no meaningful penalty for having redirects, and a site with a long history should have plenty.

    The “link equity loss” figure. People still quote a percentage lost per hop. I would not build a business case on it. The measurable costs are crawl waste, latency and breakage, and those are enough of an argument without inventing a number.

    The one that takes a site down

    HTTP to HTTPS, done incompletely.

    On an agency site I audited, http://www.example.com/ was not redirecting to the https version at all. The site was running as two sites, and had been for years, with no one noticing because everyone typed or clicked their way to the secure one.

    The 2025 Web Almanac found 91.5% of mobile pages served over HTTPS, so roughly one in twelve still is not, more than a decade after Google called it a signal. The ones I find are rarely sites that never migrated. They are sites that migrated and left something behind: a canonical on http, one host variant unredirected, an internal link hard-coded in a template.

    Reading it in a crawl

    Look at the proportion, not the count. One crawl I ran on a small manufacturer’s site returned 174 URLs, of which 68 were redirects and 16 were broken. Sixty-eight redirects on a large site is housekeeping. Sixty-eight out of 174 is a site that has been rebuilt more than once with nobody cleaning up after.

    Then check two things specifically: the maximum chain length, and how many internal links point at redirecting URLs. The second number is the actionable one and most reports bury it.

    Fixing it

    Update the internal links to the final destination. Do this first. It is free, it is safe, and on most sites it is a find-and-replace in a template rather than a project. It also removes most of the crawl cost immediately.

    Collapse chains to a single hop. A→B→C becomes A→C and B→C. Keep both rules. Deleting the middle one breaks anything still linking to B.

    Do not delete old redirects to tidy up. They are load-bearing. A redirect from 2019 is carrying whatever links that URL earned, and removing it converts a working page into a 404 for no benefit.

    Check the host and protocol variants once, properly. With and without www, http and https, trailing slash and not. Five minutes, and it is the check that catches the serious version.

    The short version

    1. Redirects do not fail loudly. I had forty on every page of my own site.
    2. Internal links pointing at redirects is the real cost and the cheapest fix.
    3. Redirecting everything to the home page is not consolidation. Expect soft 404s.
    4. A single clean 301 costs you nothing. Ignore the per-hop equity percentages.
    5. Incomplete HTTPS migration is the version that hurts. One page in twelve still is not on HTTPS.
    6. Read the proportion. 68 redirects in 174 URLs is a different finding from 68 in 20,000.
    7. Never delete old redirects to be tidy. They are carrying something.

    If a site should be ranking and it isn’t, that’s the work I do. Technical SEO covers redirects, canonicals and the crawl layer. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Core Web Vitals: ranking factor, or conversion problem?

    Core Web Vitals: ranking factor, or conversion problem?

    TL;DR

    Both a ranking factor and a conversion problem, but not equally, and the honest ordering is the opposite of how it gets sold. Forty-eight per cent of mobile origins pass all three, so half the web fails and ranks fine. It is a real signal and a weak one. The conversion case is the stronger one.

    Short answer: both, but not equally, and the honest ordering is the opposite of how it usually gets sold.

    It is a real ranking signal and a weak one. It is a strong conversion factor. Most of the pitches I see reverse that, because “Google will rank you higher” closes better than “fewer people will leave.”

    The number that settles the ranking question

    HTTP Archive’s 2025 Web Almanac found that as of June 2025, 48% of mobile origins pass all three Core Web Vitals: 62% good on LCP, 81% on CLS, 77% on INP. On desktop it is 56%.

    So more than half the mobile web fails, and a great deal of it ranks perfectly well, including plenty of sites sitting above you right now. That is not an argument for ignoring it. It is an argument against believing it is the reason you are invisible.

    If a site is not ranking and its vitals are poor, the vitals are rarely the cause. They are usually one symptom of a site nobody has maintained, which is the actual finding.

    Where it does decide things

    Two situations, and they are narrower than the pitch suggests.

    As a tiebreaker. Between two pages Google considers comparably relevant, page experience can be the thing that separates them. That is a real effect and it is small. It matters most in competitive commercial results where the top few are genuinely close.

    When it is catastrophic rather than mediocre. There is a difference between an LCP of 3.1 seconds and one of 11 seconds. The first is a number on a report. The second is a page most people never see, because they left.

    The conversion case, which is stronger

    This is the argument I actually make to clients, and it does not need Google in it at all.

    A person who leaves before your page renders did not evaluate your offer. They are not a lost ranking, they are a lost sale, and you paid for them to arrive whether the traffic was organic or not. On an ecommerce store the arithmetic is direct enough that you do not need a study. Put the number of sessions next to the bounce rate on your slowest template and it makes itself.

    CLS is the one I would push hardest on and it is usually treated as the least important. A layout that shifts under someone’s thumb as they tap is not a metric problem, it is a person tapping the wrong button on a checkout.

    What the platform data tells you about effort

    The Almanac’s CMS chapter puts mobile Core Web Vitals pass rates at 45% for WordPress, 74% for Wix and 85% for Duda.

    WordPress is not slower by nature. It is slower by accumulation. It is the platform where you can install anything, so people do, and roughly 60% of WordPress sites are running a page builder on top. The pass rate is what years of additive changes add up to.

    Which tells you where the effort goes. On a managed platform, performance work is mostly image handling and third-party scripts. On WordPress it is those plus a real audit of what has accumulated, and that second part is the bigger number.

    What I would do, in order

    • Use field data, not lab scores. Search Console’s Core Web Vitals report and the Chrome UX Report describe real visitors. Lighthouse describes a simulated device in a data centre and will happily give you a score that has nothing to do with your customers.
    • Fix by template, not by page. One product template covers every product.
    • Start with images and third-party scripts. Between them they are most of the problem on most sites, and neither needs a developer.
    • Then stop. Getting from poor to good is worth doing. Getting from good to excellent is a hobby, and there is almost always something on the site costing more.

    The short version

    1. 48% of mobile origins pass all three. Half the web fails and ranks fine.
    2. It is a real ranking signal and a weak one: a tiebreaker between comparable pages.
    3. Catastrophic is different from mediocre. Eleven seconds is a lost visitor, not a metric.
    4. The conversion argument is stronger and does not need Google in it.
    5. CLS is under-rated. A shifting layout is someone tapping the wrong button.
    6. WordPress passes 45%, Duda 85%. That gap is accumulation, not the platform.
    7. Field data, fix by template, images and scripts first, then stop.

    If a site should be ranking and it isn’t, that’s the work I do. Technical SEO covers rendering, performance and the layer underneath them. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Shopify is fast. Your apps are not.

    Shopify is fast. Your apps are not.

    TL;DR

    The received wisdom is that Shopify stores are slow. HTTP Archive found 76 per cent of Shopify sites passing Core Web Vitals on desktop against 33 per cent for WooCommerce. The platform is not your problem. Your apps are, and uninstalling one does not always remove the code it left behind.

    The received wisdom is that Shopify stores are slow. The data says the opposite, and the gap between those two things is where the actual problem lives.

    HTTP Archive’s 2025 Web Almanac found 76% of Shopify sites passing Core Web Vitals on desktop: 92% good on LCP, 99% on INP. WooCommerce managed 33%. Shopify is one of the better-performing platforms on the web, by a wide margin, and it is doing that with a hosting stack and a CDN you do not have to think about.

    So when a Shopify store is slow, the platform is usually not the reason. Something was added.

    How the debt accumulates

    Every app you install is entitled to inject scripts into your theme. Reviews widget, upsell popup, currency switcher, live chat, back-in-stock notifier, loyalty points, a second analytics tool because marketing wanted one, a cookie banner to manage the rest.

    Each one, on its own, is a defensible decision made by a sensible person. None of them was a mistake. The trouble is that installing is a two-click operation and removing is a decision nobody is responsible for making, so the set only ever grows.

    This is the same shape as page builder debt on WordPress: an additive tool, used over years by several people, with nothing pruning it. The platform differs and the mechanism is identical.

    The part that surprises people

    Uninstalling an app does not always remove its code.

    Apps that edit theme.liquid or inject a snippet frequently leave it behind when removed. So a store can be carrying scripts from apps that were cancelled two years ago, still loading, still costing, still being paid for in page weight if not in subscription.

    I would check this before assuming your current app list is your actual app list. Search the theme files for the vendor names of apps you no longer use.

    What the weight actually looks like

    The Almanac’s page weight data, drawn from 16.2 million sites, puts the median mobile home page at 632 KB of JavaScript against 22 KB of HTML, roughly twenty-eight times more script than document.

    On a store carrying a dozen apps you are comfortably above that median, and the scripts are mostly third-party, which means they load from someone else’s server on someone else’s schedule and you cannot optimise them. You can only decide whether to have them.

    The audit I would run

    • List every app and name what it earns. Not what it does. What it earns. Most stores find two or three that nobody can justify, usually installed for a campaign that ended.
    • Grep the theme for orphaned snippets. Vendor names of removed apps. This is the step that finds the surprises.
    • Count third-party requests on a product page. Your own store, in an incognito window, network tab open. The number is usually higher than anyone in the business expects.
    • Check what loads before anything visible. A chat widget or a popup script blocking the first render is the most common single win, and it is usually a loading-order change rather than a removal.
    • Remove one and measure. Not five. One, then measure, so you know what each is worth.

    The honest limit

    This is a conversion argument more than a ranking one, and I would rather say that than oversell it. A store that goes from a poor LCP to a good one is unlikely to see rankings move on that alone. What it will see is fewer people leaving before the page appears, and on a store that is the number that matters.

    I would also not remove an app that is genuinely earning because it costs 40 KB. Reviews on a product page are worth their weight. The apps to remove are the ones nobody can explain.

    The short version

    1. Shopify passes Core Web Vitals on 76% of sites. WooCommerce manages 33%. The platform is not your problem.
    2. Apps inject scripts, installing is easy, removing is nobody’s job.
    3. Uninstalling does not always remove the code. Search the theme for old vendor names.
    4. The median mobile page already ships 632 KB of JavaScript. A dozen apps puts you well past it.
    5. Audit by what each app earns, not what it does.
    6. Remove one at a time and measure.
    7. This is a conversion argument, not a ranking one.

    If a site should be ranking and it isn’t, that’s the work I do. Shopify SEO covers the theme, the apps and the platform’s defaults. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • What you cannot change in Shopify URLs, and why it does not matter

    What you cannot change in Shopify URLs, and why it does not matter

    TL;DR

    Shopify forces /products/ and /collections/ into your URLs and will not let you remove them. Clients are told constantly that this is holding them back. It is not. The cost is cosmetic and the cost of changing it would not be. This post exists to stop you spending money on it.

    Shopify forces /products/, /collections/, /pages/ and /blogs/ into your URLs and will not let you remove them. This comes up in almost every Shopify conversation I have, usually as something the client has been told is holding them back.

    It is not. Leave it alone. This post exists to stop you spending money on it.

    What Google actually says about URLs

    Read Google’s URL structure documentation and notice what is absent from it. The guidance is about crawlability and human readability. It warns that “overly complex URLs, especially those containing multiple parameters, can cause problems for crawlers by creating unnecessarily high numbers of URLs that point to identical or similar content” and recommends using as few parameters as you can.

    There is no claim anywhere on that page that a descriptive word in a URL path improves ranking. The document is about not creating crawl problems.

    /collections/mugs creates no crawl problem. It is one clean, static, readable path per collection. It is precisely the sort of URL that page is asking for.

    The real cost of the segment

    Honestly assessed: a few characters of length, and a word in the path that describes the platform rather than the product.

    That is it. Against that, consider what changing it would involve if you could: every URL on the store redirected, every internal link updated, every backlink now pointing through a redirect, and a period of instability while Google works out what happened. You would be taking real risk to remove a cosmetic imperfection.

    Which is the whole argument. Not that the segment is good, but that the ratio of cost to benefit is terrible, and the effort has better places to go.

    Where I do recommend changing URL structure, and why that is different

    I should be consistent about this, because I have given the opposite advice.

    On a WordPress site I audited, 1,082 blog posts carried a /blog/ segment in their URLs and I recommended removing it. Same cosmetic issue, opposite recommendation. The difference is not the segment. It is that on WordPress it is a permalink setting and a redirect rule: cheap, reversible, and done in an afternoon by one person.

    On Shopify it is not available at any price. So the question never gets to a cost-benefit calculation; it stops at “you cannot.”

    The general principle underneath both: URL tidiness is worth doing when it is nearly free and never worth a migration.

    What actually deserves the attention instead

    On Shopify stores, in rough order of how much they cost:

    • The URLs the platform generates that you did not ask for. Tag pages, 659 on one store I audited, plus filter combinations and sort parameters. That is a real URL problem with real volume, and unlike the path segment it is something you can decide about.
    • Collection pages that are bare grids. The page most likely to rank, usually with nothing on it.
    • Whatever the theme is doing to your headings. On one store every product name in the grid was an H2 and 1,562 URLs had no H1 at all.

    Any one of those is worth more than the entire URL question.

    None of this is niche, either. The 2025 Web Almanac found ecommerce on 19.2% of mobile sites and Shopify at 25.3% of those, so the platform’s defaults are shaping a meaningful share of the commercial web, and the defaults worth arguing with are the ones generating URLs, not the ones printing a word in the path.

    The slug you can change, and should

    One clarification, because “you cannot change Shopify URLs” is not quite true.

    The part after the segment, the product or collection handle, is yours. That one is worth getting right at creation, because it is the descriptive part, it is free to set, and changing it later means a redirect. Set it deliberately when you create the product and then leave it alone.

    The short version

    1. You cannot remove /products/ or /collections/. Stop trying.
    2. Google’s URL guidance is about crawlability, not ranking words. A clean static path is what it asks for.
    3. The cost is cosmetic. The cost of changing it would not be.
    4. I do recommend removing /blog/ on WordPress, because there it is a setting, not a migration.
    5. URL tidiness is worth it when nearly free, never worth a migration.
    6. The handle is yours. Set it deliberately at creation, then leave it.
    7. Tags, filters, collections and headings all matter more.

    If a site should be ranking and it isn’t, that’s the work I do. Shopify SEO covers what the platform lets you change and what it doesn’t. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Collections are your category pages, and most of them are grids

    Collections are your category pages, and most of them are grids

    TL;DR

    On a Shopify store the collection page has the best chance of ranking, and on most stores it is a grid of products with a heading above it and nothing else. That is the biggest structural miss I find. It is not a word count problem. Nobody ever decided the collection was a page.

    On a Shopify store the collection page is the one with the best chance of ranking, and on most stores it is a grid of products with a heading above it and nothing else.

    That is the single biggest structural miss I find on Shopify sites, and it is not really a content problem. It is that nobody decided the collection was a page.

    Why the collection outranks the product

    Almost nobody searches for your individual products by name. They search for the category, the thing rather than the specific item, and the page that answers a category query is the collection.

    The product page’s job is different: convert the person who has arrived. It is competing with the manufacturer, with Amazon, and often with four hundred other stores listing the identical supplied description. Most product pages cannot realistically rank and it is more useful to say so than to keep optimising them.

    So the writing goes on the collection. One page, not four hundred.

    Which makes it worth knowing what else the platform is putting in the way. On the store above, 659 tag pages were competing with the collections for the same queries: auto-generated, nobody’s decision, and thinner than the pages they were competing against.

    What a collection page needs, and it is not a word count

    Here I have changed my mind, and it is worth being explicit because the older version is in my own audits.

    On a Shopify homeware store I audited I wrote: almost all collection pages have very little content… add at least 700 words to each of the collection pages. The instinct was right and the instruction was wrong, for the same reason “add 500 words to every product page” is wrong. It is a number rather than a job, and a number gets you seven hundred words of padding above a grid.

    What a collection page actually needs is enough to answer the query and somewhere to link from. In practice that is two or three paragraphs doing specific work:

    • Say what the category is and who it is for, in the words a customer would use. This is where the relevance comes from.
    • Answer the question the category term implies. Somebody searching a category is usually choosing between options: sizes, materials, use cases. Two sentences of genuine buying guidance beats six paragraphs of restated keywords.
    • Link out contextually. To the subcategories, and to the two or three products you have actually decided to compete on. A grid with no copy has nowhere to put a deliberate link, so every link on the page is template-generated and ranked by whatever the theme defaults to.

    Benchmarking against the web will mislead you here. The 2024 Web Almanac put the median mobile home page at 364 words, so two paragraphs on a collection page already puts you above the median page on the internet, and the median page on the internet is not who you are competing with.

    The heading problem that comes with the grid

    Worth checking while you are in there. On that same store, every product name in the grid was wrapped in an <h2>, so a collection listing forty products had forty second-level headings before anything a human wrote. The store also had 1,562 URLs with a missing or empty H1.

    Strip everything but the headings and the page read: Shop. About. Blue Ceramic Mug. Grey Ceramic Mug. That is not a description of a category. Replace the tag, keep the appearance. The page looks identical afterwards.

    Where the copy should go on the page

    A practical point people get wrong: burying all the text below the grid is the safe-feeling choice and it wastes it.

    A short intro above the grid, two or three sentences, and the rest below is the arrangement I recommend. The intro does the relevance work and the customer scrolls past it in half a second, which is fine. Nobody bounces because a category page had two sentences on it.

    Which collections deserve this

    Not all of them. A store with ninety collections does not need ninety written pages, and trying produces ninety thin ones.

    Pick the collections that match real search demand, that you would back with internal links, and that will still exist next year. Usually somewhere between five and fifteen. The rest keep the template baseline and that is a complete answer.

    Spreading the effort thinner does not help. Ahrefs examined 14 billion pages and found 96.55% get zero traffic from Google. Writing ninety mediocre category intros adds ninety pages to that number. Ten good ones is a different outcome, and it is the same afternoon’s work.

    The short version

    1. The collection is the page that can rank. The product converts.
    2. It is not a word count. I recommended 700 words once and I would not now.
    3. Three jobs: say what the category is, answer the buying question, link out deliberately.
    4. A grid with no copy has nowhere to put a chosen link.
    5. Check whether product names in the grid are H2s. Forty of them is a template problem.
    6. Short intro above the grid, the rest below.
    7. Five to fifteen collections, not ninety.

    If a site should be ranking and it isn’t, that’s the work I do. Shopify SEO covers collections, products and the platform’s defaults. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Shopify filters and the crawl paths nobody chose

    Shopify filters and the crawl paths nobody chose

    TL;DR

    Every filter you switch on in a Shopify collection is a URL generator, and customers can select more than one at a time. Nobody decides this. Most of those URLs never get indexed, which is the system working. The real costs are dilution and a Search Console report too noisy to read.

    Every filter you switch on in a Shopify collection is a URL generator. Not one URL. A combination space, because customers can select more than one at a time and Google can follow the links.

    Nobody decides this. You add filters because the store needs them, which it does, and the URLs arrive as a side effect.

    What Shopify actually produces

    Native filtering appends parameters to the collection path, one per selected value, stacking as more are chosen. Sort orders add another. Pagination adds another on top of that.

    So a collection with five filters, a sort control and eight pages of products is not one URL. It is a large multiple of one, and every one of them returns a 200 and renders a page.

    The store owner sees a collection. The crawler sees an address space.

    Why this is not automatically a crisis

    I want to be careful here, because the standard treatment of this is alarmist.

    Filtered URLs mostly do not get indexed. Google crawls a lot of them, decides they are near-identical to the unfiltered collection, and leaves them out. That is the system working. On the store where I found 659 indexed tag pages, Search Console reported 479 pages indexed against 6,540 not indexed, and the vast majority of that 6,540 was exactly this: URLs Google had looked at and correctly declined.

    It also is not, for most stores, a crawl budget problem. Google’s own guidance puts that conversation at a million pages updating weekly or ten thousand daily. A store with four hundred products is not there.

    What it does cost you is dilution and attention: internal links spread across combinations, and a Search Console report so full of noise that a real problem can sit in it unnoticed for a year.

    The decision, per filter

    This is the same judgement as faceted navigation on any platform, and the answer is per filter rather than per store.

    Filters that match how people search, meaning brand, a core product attribute, sometimes size or material, describe real demand. Those filtered views can be legitimate landing pages, and on some catalogues they are better ones than the collection above them.

    Filters that describe your warehouse, meaning sort order, products per page and availability, are navigation. Nobody searches them.

    Most stores have one or two of the first kind and the rest of the second. Working out which is an afternoon with somebody who knows the products, and there is no shortcut through it.

    The mechanism to use, and the one to avoid

    Use noindex on the filtered views you do not want indexed, and let them stay crawlable so Google can still reach the products through them.

    The Almanac data suggests almost nobody does this. The 2025 Web Almanac found meta robots tags present on 47.9% of mobile pages but an actual noindex directive on only 2.4%. Half the web ships the tag and almost nobody uses it to make a decision.

    Do not reach for a robots.txt block instead. Blocking the filter paths stops Google reading anything on those URLs, including the noindex, so already-indexed ones stay indexed indefinitely, and you may cut the only crawl path to products that are hard to reach otherwise.

    What I would do first

    Count them before deciding anything. Export the URL list, group by parameter, and see which filters are actually producing the volume. On most stores two or three account for nearly all of it, and dealing with just those gets you most of the benefit without a strategy document.

    The short version

    1. Filters generate a combination space, not a handful of pages.
    2. Most filtered URLs never get indexed. Google declining them is the system working.
    3. It is rarely a crawl budget problem at store scale.
    4. The real costs are dilution and a Search Console report too noisy to read.
    5. Decide per filter. One or two match real demand; the rest describe your warehouse.
    6. Noindex, crawlable. Only 2.4% of pages use noindex. It is the right tool and it is barely used.
    7. Never block filters in robots.txt.

    If a site should be ranking and it isn’t, that’s the work I do. Shopify SEO covers filters, collections and the URLs the platform makes for you. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Every Shopify product has two URLs. That is usually fine.

    Every Shopify product has two URLs. That is usually fine.

    TL;DR

    Every Shopify product sits at two URLs, and on a store with twenty collections one product can have twenty-one. This gets found in a crawl, panic follows, and somebody proposes a project. No project is needed. The canonical already handles it. Check yours survived the theme, then fix the internal links.

    Open any Shopify store and the same product is reachable at two addresses: /products/thing and /collections/whatever/products/thing. On a store with twenty collections, one product can have twenty-one URLs.

    This gets discovered in a crawl, panic follows, and somebody proposes a project. In most cases no project is needed, and I would rather explain why than sell one.

    Shopify already handles it

    The /collections/…/products/… version carries a canonical tag pointing at the clean /products/… URL. That is the default behaviour, it has been for years, and it is the correct configuration. Google consolidates the duplicates and indexes the one you want.

    Which puts Shopify ahead of most of the web on this. HTTP Archive’s 2025 Web Almanac found a canonical tag on only 67% of mobile pages, so a third of the web has none at all. A platform that ships correct canonicals on a duplication pattern it created itself is not the problem you should be spending the quarter on.

    When it does become a problem

    Three ways, and they are worth checking because each is real.

    A theme or app broke the canonical. Custom themes edit theme.liquid, and the canonical line is in there. I have seen it removed, hard-coded to the home page, and left pointing at a staging domain. Check the raw source of a product page reached through a collection and confirm the canonical points at the clean product URL. Two minutes.

    Your internal links all point at the long version. This is the common one. Collection templates often link products as /collections/x/products/y, so every internal link on the site points at a URL that is not the canonical. Google follows those links, crawls the duplicate, reads the canonical, and consolidates. It works, but you are spending crawl on the wrong address and passing your internal links to a page that is explicitly not the one you want ranking.

    Search and filter parameters on top. Sort orders and filters stack onto collection paths and multiply. That one is a separate decision per facet and it is the version of this that actually generates volume.

    What I would actually do

    • Confirm the canonical is intact on a product page reached through a collection. If it is, you are done with the duplication question.
    • Change the collection template to link products at the clean URL. One template edit. It does not change what a customer sees and it stops the whole site voting for the wrong address.
    • Do not add a robots.txt block on /collections/. It is tempting and it is the wrong instrument. A blocked URL cannot be read, so Google never sees the canonical, and the consolidation you were relying on stops happening. You would also be blocking the path to products only reachable through a collection.
    • Do not try to remove the pattern. You cannot, and that is fine.

    The number that is worth worrying about instead

    On one Shopify store I audited, Search Console showed 479 pages indexed and 6,540 not indexed. The duplicate product URLs were a rounding error in that. What filled it was tag pages, filter combinations and a theme setting nobody had revisited. 659 tag pages alone, none of which anybody had decided to create.

    That is the shape of nearly every Shopify audit I do. The alarming-looking duplication is handled by the platform. The unhandled part is everything the platform generates when you tag a product or add a filter, and it does not announce itself.

    Which is worth knowing given how many stores this describes. HTTP Archive’s 2025 Web Almanac found ecommerce software on 19.2% of mobile sites, with Shopify accounting for 25.3% of those. Roughly one site in twenty on the mobile web is a Shopify store running these same defaults, so if this pattern were as damaging as it looks in a crawl, a very large slice of the web would be in trouble. It is not.

    The short version

    1. Two URLs per product is Shopify’s default and the canonical already handles it.
    2. A third of the web has no canonical at all. Shopify shipping one correctly is not your problem.
    3. Check the canonical survived your theme. Two minutes, occasionally alarming.
    4. Fix the internal links to use the clean URL. One template edit, whole catalogue.
    5. Never block /collections/ in robots.txt. It stops the canonical being read.
    6. The volume problem is tags and filters, not the product path.

    If a site should be ranking and it isn’t, that’s the work I do. Shopify SEO covers the platform’s own quirks. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Service area businesses: drawing an area you can actually rank in

    Service area businesses: drawing an area you can actually rank in

    TL;DR

    If you go to the customer, Google lets you hide your address and declare a service area instead. It is the right setting for those businesses, and people draw the area far too big. A service area is a claim about where you work, not a fact about where you are.

    If you go to the customer rather than the customer coming to you, Google lets you hide your address and declare a service area instead. Plumbers, mobile therapists, roofers, cleaners, most trades.

    It is the right setting for those businesses and it produces a specific set of problems, because a service area is a claim about where you work rather than a fact about where you are, and people draw them far too big.

    The temptation, and why it backfires

    The service area field will accept a large region. So the instinct is to put the whole metro in, on the reasoning that you would happily drive there for the right job.

    Declaring an area does not make you rank in it. Distance is still one of Google’s three local factors, measured from where you actually are, and the service area setting does not overwrite that. What a huge declared area does is tell Google your business is diffuse: relevant to everywhere and specific to nowhere.

    Google sets this out plainly in its local ranking guidance: relevance, distance and prominence, with distance defined as “how far each business is from the customer who’s searching.” Nothing in that list is a field you fill in. The same page adds that there is “no way to request or pay for a better local ranking on Google”, which covers the service area box as much as anything else.

    The businesses I see doing well are usually the ones with a tighter area than they could technically justify.

    How I would draw it

    • Start from where the work actually came from. Not where you would go. Pull twelve months of jobs and look at the postcodes. Most trades businesses discover that eighty per cent of the work came from a much smaller area than they describe to people.
    • Then ask where you would still be profitable. Travel time is a cost. An area you serve at a loss is not a service area, it is an occasional favour, and it should not be in the field.
    • Then cut the edges. If a town is at the boundary and produces two jobs a year, leaving it out costs you almost nothing and makes the rest of the claim more credible.

    What actually moves the needle for a SAB

    Since you have hidden the address, the levers are narrower than for a storefront.

    The primary category. Still the largest relevance input, still wrong on a meaningful share of profiles, still a thirty-second check.

    Real pages for the areas that matter. Not one per town. One per area you genuinely work in, with content that could only have been written about that place. Different landmarks, different housing stock, different problems. Four of those beat forty spun ones, and forty spun ones are a doorway risk that can drag down the four.

    On one med spa audit the business named four specific areas it served. Four honest pages was an afternoon’s work. A page per suburb in the metro would have been a month and a liability.

    Reviews that mention places. You cannot script this and should not try, but customers naturally say where they are, and a profile whose reviews name the towns you serve is doing something no settings field can.

    They are also doing the work of persuading. BrightLocal’s 2026 survey found 97% of consumers read reviews for local businesses and 74% want them from the last three months, so for a trades business with a quiet season, the gap in the review timeline is visible to every customer who looks, regardless of how good the total is.

    Consistency about who you are. A SAB has no shopfront to anchor it, so the entity rests entirely on the profile, the site and the citations agreeing. This matters more for a SAB than for a storefront, not less.

    The hybrid case

    Some businesses have both: premises customers visit and work done at customers’ homes. A clinic that also does home visits, a garage with a mobile fitting service.

    You can show an address and a service area, and generally should if the premises is genuinely open to customers. What you should not do is hide a real, visitable address to look bigger, or invent one to look local somewhere you are not. That is the version of this that gets profiles suspended, and it is not worth it.

    The short version

    1. A service area is a claim about where you work, not a fact about where you are.
    2. Declaring a bigger area does not make you rank in it. Distance still applies from your real location.
    3. Draw it from twelve months of actual jobs, then cut the unprofitable edges.
    4. Primary category is still the biggest relevance lever.
    5. Four real area pages beat forty spun ones, and the forty can drag down the four.
    6. Entity consistency matters more for a SAB, because there is no shopfront anchoring it.
    7. Do not hide a real address or invent one. That is how profiles get suspended.

    If a site should be ranking and it isn’t, that’s the work I do. Local SEO covers profiles, service areas and the pack. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • The footer that linked to somebody else’s business

    The footer that linked to somebody else’s business

    TL;DR

    On a med spa audit the footer address, the contact page address and the Instagram icon all belonged to a different company. Nobody had noticed, because nobody reads their own footer. That is not a NAP error. It is the site telling everyone who arrives that you are somebody else.

    On a med spa audit, the address in the footer belonged to a different company. So did the address on the contact page. So did the Instagram icon in the header.

    Three separate places on the site, all pointing at a business that was not the client. Nobody in the business had noticed, because nobody reads their own footer.

    The cause was mundane. The site had been adapted from an existing build, a common enough thing to do, and the previous business’s details came along with it. Someone changed the visible copy and nobody went through the furniture.

    Why this is worse than it looks

    Google is trying to answer one question about you: which real-world business is this?

    It has your website, your Business Profile, your social accounts, whatever directories have scraped you over the years, and any citation your last agency built. From that pile it has to decide that all of it describes one entity. When the pile contains contradictions, it resolves them without asking you, and you do not get told what it decided.

    A wrong suite number is a small contradiction. A footer, a contact page and a social link all describing a different company is not a NAP inconsistency. It is the site arguing that you are somebody else.

    That is why I run this as an identity check rather than a spelling check, and why the whole procedure starts with the question of who the site says you are.

    Google names three things that decide local ranking, relevance, distance and prominence, and prominence is the one an identity split damages directly. Reviews, mentions and links accumulating against two half-brands rather than one whole business means neither reaches the threshold. The same page notes there is “no way to request or pay for a better local ranking”, so there is no route round it either.

    The legitimate version of two identities

    Now the more interesting case, because it is not always a mistake.

    Plenty of businesses genuinely operate as two things at one address. A chiropractic clinic with a med spa in the same building. A dental practice with a separate cosmetic brand. A garage that also sells cars. The owner is one person, the lease is one lease, and the two offerings have different customers, different price points and often different names.

    The question is whether that is one entity or two, and the honest answer is: it depends on whether they are genuinely separable, and you have to pick one and commit.

    Treat it as one business when the services are bought by the same people in the same visit, when the staff overlap, and when there is one phone number. One profile, one site, one identity, with the second offering as a service rather than a brand. This is the right answer more often than owners expect, because two thin identities beat neither.

    Treat it as two when they have separate entrances, separate phone numbers, separate staff and separate reception. Google’s own guidance on distinct businesses at a shared address turns on exactly that kind of separation. Then you need two profiles, and realistically two sites, and twice the work. Do not do this because the second brand sounds good. Do it because the businesses are actually different.

    What half-committing looks like

    This is the failure mode I actually find, and it is worse than either choice.

    One website with two logos. A profile in one name and a footer in the other. A booking system branded for the second business embedded in a page belonging to the first. Reviews split across two profiles so neither has enough. Two Instagram accounts, one dormant.

    The result is that neither identity accumulates prominence, and Google has to guess which one the address belongs to. Whichever it picks, half your signals are attached to the other one.

    Reviews are where that hurts most, because they are the signal customers actually read. BrightLocal’s 2026 Local Consumer Review Survey found 97% of consumers read reviews for local businesses and 31% will only use a business rated 4.5 or higher. Two profiles with nine reviews each present very differently from one with eighteen, and the split is invisible to the customer deciding against you.

    The twenty-minute check

    • Open the footer and read it as a stranger. Name, address, phone. Does it describe the business the rest of the page describes?
    • Open the contact page. Same test. These two disagree surprisingly often, because they were built at different times.
    • Click every social icon. Not look at. Click. This is where the med spa’s was wrong, and an icon is the last thing anybody audits.
    • Search your own phone number. See whose name comes back.
    • Check the embedded map. Is it your profile, a plain map, or someone else’s pin?
    • Then decide, in writing, whether you are one business or two, and make every one of the above agree with that decision.

    The short version

    1. A footer, contact page and social icon pointing at another company is not a NAP error. It is the site saying you are somebody else.
    2. It usually comes from a site adapted from an existing build and nobody auditing the furniture.
    3. Two identities at one address can be legitimate, but you must pick one model and commit.
    4. One business when customers, staff and phone are shared. Two only with separate entrances, phones and staff.
    5. Half-committing is the worst outcome. Neither identity accumulates anything.
    6. Click the social icons. Nobody ever does.

    If a site should be ranking and it isn’t, that’s the work I do. Local SEO covers the profile, the citations and the entity. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.

  • Why you cannot rank across a whole city

    Why you cannot rank across a whole city

    TL;DR

    The request arrives in the same words every time: we want to be in the map pack for the whole city. You cannot, and the reason is not competitive or budgetary. Distance is one of Google’s three local factors and no amount of work moves your building. The realistic target is a zone.

    The request comes in roughly the same words every time. We want to be in the map pack for the whole city.

    You cannot, and the reason is not competitive or budgetary. It is that one of the three things deciding the result is your physical address, and no amount of work changes where your building is.

    What Google actually says

    It is unusually direct. Google’s local ranking documentation lists three factors, relevance, distance and prominence, and defines the second as “how far each business is from the customer who’s searching.”

    The same page adds: “There’s no way to request or pay for a better local ranking on Google.”

    So the map pack is partly a geometry problem. Two of the three inputs are yours to work on. The third is fixed the day you sign the lease.

    What this looks like in practice

    Run the same search from four points around a city and you get four different packs. Near the centre you might be first; four miles out you are not in the list at all, and the businesses that replaced you are not better than you. They are nearer.

    This is also why the gaps I find in local audits are so consistent. Across three clinic audits in one year the same five things were missing every time, and none of them was distance, because distance is not a gap you can leave, it is a constraint you work inside.

    This is why checking your ranking from your own desk is close to worthless. Your desk is at the business. You are standing at the one location where distance is working maximally in your favour, and the result you see is the best one that exists anywhere.

    It is also why two competitors can both be honestly told they rank first, and both be right.

    The consequence for how you plan

    Stop treating the city as the target. The realistic unit is the area where you are the closest sensible answer, plus a margin where relevance and prominence can outweigh a competitor’s distance advantage.

    That margin is real. Distance is one factor of three, not a hard cutoff, and it is where the actual work lives. A business with a strong profile, the right primary category and steady reviews will hold positions further out than a nearer competitor with none of those. But it is a margin, not a licence to cover a metro.

    Prominence is the half of that margin most people under-invest in, and it has a shelf life. BrightLocal’s 2026 survey of 1,002 US consumers found 74% look for reviews written in the last three months, and 32% want something from the last fortnight. A profile with two hundred reviews and nothing since last year is not as prominent as its total suggests, which is why velocity beats count when you are trying to hold ground further from the door.

    So the plan for a single-location business is: dominate the near zone, compete in the middle zone, and use the website for everything beyond it. The website has no distance constraint. That is the whole reason the two results behave differently.

    The thing people try instead, and why it fails

    The standard workaround is a page per suburb. Forty pages, place name swapped, the rest identical.

    This does not affect the pack at all, because the pack is ranking your profile rather than your pages, and it fails on the organic side too, because Google names doorway pages specifically as spam. Worse, it tends to fail as a set: a batch of near-identical pages drags down the two or three that would have been fine on their own.

    Genuinely different location pages, for areas you genuinely serve, with genuinely different content, meaning different landmarks, different parking, different clinicians and different local context, are a real asset. Forty spun ones are a liability with an admin cost.

    What I would do instead

    • Check the pack from several points in the catchment. A grid tool, or just your phone in different parts of town. This is the single most clarifying thing you can do and it takes twenty minutes.
    • Work on the two factors you own. Primary category, secondary categories, services listed, the profile description, review velocity, and whether the site and the profile agree.
    • Be honest about the near zone. If you are already winning within two miles and losing at five, the five-mile problem is not a marketing problem. It may be a second-location problem, which is a business decision rather than an SEO one.
    • Put the wide-catchment ambition on the website, where it can actually be met.

    The short version

    1. Distance is one of Google’s three local factors and you cannot change it.
    2. Checking rankings from your own desk is worthless, because you are standing where distance most favours you.
    3. The realistic target is a zone, not a city.
    4. Relevance and prominence buy you a margin beyond the near zone, not a metro.
    5. Forty spun location pages do nothing for the pack and are a doorway risk organically.
    6. Wide catchment belongs on the website, which has no distance constraint.

    If a site should be ranking and it isn’t, that’s the work I do. Local SEO covers the profile, the pack and the catchment. If you’re not sure which of several plausible problems is costing you, that’s what an SEO audit is for.