Magento is widely regarded as one of the most challenging ecommerce platforms from an SEO perspective, due to the complexity of it’s rewrite engine, reliance on dynamic content and complex codebase (compared to other PHP platforms), amongst other things. I’ve seen countless experienced SEOs get stuck when it comes to Magento, purely because it’s so different to other systems. That said, all of the SEO issues associated with the Magento platform can be resolved, it’s just a case of knowing what needs to be done – which is why I wrote this article.
Over the last few years, I’ve consulted for Magento retailers from all over the world and have worked on a host of large Magento websites. During this time I’ve faced (and resolved) pretty much every technical Magento SEO issue imaginable, so I thought I’d document some of the more common issues in this article.
There are quite a lot of considerations around configuring your Magento implementation, purely because of the level of complexity with the platform. Here are some of the key areas that need to be factored into your Magento Community or Enterprise implementation.
In the back-end of Magento there are options to set the canonical tag to appear on product and category pages, which will ensure that the canonical tag points to the primary version of the page at all times. This ‘should’ help to prevent issues with dynamic variants of categories being indexed, however it doesn’t in most cases. Unless you’re adding a bespoke canonical tag implementation, I’d suggest enabling both of these options, which can be found in the configuration section of the Magento admin interface.
You will also need to add the canonical tag to your homepage, however this will need to be done manually. In more recent versions of Magento CE and EE, Magento automatically uses the canonical tag to canonicalise the hierarchical product URLs (with category path) to the top-level URLs.
Product title tag conventions
Another consideration is the way that Magento assigns product title tags, which is usually simply the name of the product. I’d suggest either setting a convention to include variables based on characteristics (eg gender, colour etc) or manually assigning them, which is always going to be the preference.
Magento has a tendency to use headings incorrectly, most commonly by assigning H2 tags to product listings on category pages. I’d suggest just checking this as I’ve also seen implementations with multiple H1s on different pages types and no headings at all. This is a minor consideration compared to some of the other points listed in this article and it can be a result of using a theme / template.
I’d suggest setting your Magento implementation to use top-level product URLs, rather than selecting the option to include category path in the URLs. I cover this in more detail later on.
There’s an option in the back-end of Magento to set permanent redirects if the URL is changed – I’d suggest setting this to yes, although just be aware of potential rewrite issues if you’re making changes to URL keys regularly or are doing CSV uploads incorrectly. Again, this is covered in more detail later on.
Layered / faceted navigation issues
It is very common for layered or faceted navigation to cause duplicate content issues with Magento, as filters that create new URLs will often get indexed by search engines. Magento out of the box appends query string filter parameters, but a number of non-proprietary modules also use directories and various other conventions, which still lead to the same outcome.
One of the biggest mistakes I see retailers make in ecommerce SEO is simply changing the dynamic convention that the URLs and meta titles are based on – so effectively making the URL look clean and making the title tag slightly more targeted. This is not a good idea as, due to the volume of low quality pages being indexed, it leaves a website susceptible to Google Panda, which specifically targets websites with high levels of indexable pages with very little unique content.
Prevent search engines from accessing the pages
Most of the time, when I’ve dealt with websites that have faced this issue, I’ve opted to apply meta robots rules (noindex, follow) to tell search engines not to index the pages. You can use either meta robots tags or x robots tags to do this, they will both meet the requirements for removal requests in Google Webmaster Tools and ultimately serve the same message to search engines.
I would recommend using the noindex, follow tag, as this tells search engines not to index the page but to continue crawling the website. If you already have lots of these filter pages in the index, this will help you to either remove them (in Google Webmaster Tools) or tell search engines to stop indexing the pages.
This can be achieved by using the MageSEO plugin (which is a joint project between me and a Magento development agency), which allows you to assign manual meta robots rules, gives you greater control over the canonical tag and also allows you to edit the robots.txt file from the Magento back-end.
If you’re using the multi-select option on your layered navigation, I’d suggest using the robots.txt to block these URLs (with wild card rules for the query strings or directories), as this can cause crawl budget issues.
Use the canonical tag
The canonical tag can be a very good solution for preventing these pages from being indexed, by canonicalising back to the parent category page (this will also pass value back to the page). I do have a couple of reservations with the canonical tag – the first is that I’ve seen many occasions where search engines have ignored the canonical tag if the dynamic pages have links and appear authoritative. The second is that if you already have the pages in the index (and you need to resolve the issue fast) it can take a long time for Google and other search engines to adapt to the change. You also won’t be able to manually remove the pages as they won’t meet Google removal guidelines.
Parameter handling in Google Webmaster Tools
I’ve always suggested that the parameter handling resource in Google Webmaster Tools isn’t overly effective, especially with faceted navigation duplicate content issues – however, I’ve heard lots of very good SEOs saying it’s got a lot better.
Like the canonical tag, I’d recommend implementing this even if you’re using other solutions.
I also wrote this comparative guide to all SEO options for dealing with faceted navigation in Magento.
Catalogue search pages
Another very annoying issue with Magento is when catalogue search pages get indexed by Google, as generally there will be thousands. In order to prevent this, I would simply recommend disallowing the assigning noindex, follow meta robots tags to the search page and the children queries contained within the directory. If you’re having issues with crawl budget, I’d suggest using the robots.txt file instead of meta robots tags.
Magento is known for being pretty rubbish when it comes to creating XML sitemaps, as it just provides the option of creating one, standalone sitemap which often contains pages that you don’t want to be indexed / accessed by search engines.
I usually suggest creating two XML sitemaps, one for products and one for category and content pages – this allows for better visibility of indexation of pages (via Google Webmaster Tools) and also makes it easier for Google to access all of your pages if you have a large site. For very large websites, I usually suggest splitting products out by brand or type, again providing more insight into indexation. You would then reference the different sitemaps in an index sitemap.
This can be either by done by your developers or you can use a third party module.
It’s really common for secure pages to be indexed by Google (for non-secure websites), which can be very annoying from a duplicate content perspective. For these pages, I would recommend adding a separate robots.txt file for https pages, although it’s fundamental that you ensure that this file isn’t pushed onto the http pages. You can either disallow your selected pages or choose to disallow all pages, but it’s key that the changes aren’t reflected on http pages.
You can also use the canonical tag to point to the preferred version, be it the http or https version of the page. This will resolve the issue and can be achieved by using a plugin that I’m releasing soon.
Duplicate product page content because of hierarchical URLs (including category path within URLs)
If you’re using hierarchical URLs, which will include the category name name within the product page URL path, you’re setting yourself up to have duplicate variations of a product within multiple categories. For this reason, I would strongly recommend using top-level product URLs, as this will prevent issues like this and allow you to have one single representative version of a product.
If you’re already using category paths within your product URLs, make sure you’re using the canonical tag to point to the primary version of each product – this will also resolve the issue, although top-level products would be the best option.
Also, if you’re switching to top-level products, make sure you get your developer to create a rewrite rule to redirect old product URLs, as by default, Magento will not redirect them.
Issues with URL rewriting
Another surprisingly common issue with Magento is URL rewriting, which can cause either category or products page URLs to revert back to the original /catalog/ URLs, which do not write them based on the title of the page or for these URLs to run in parallel.
I would recommend blocking these URLs and just keeping an eye on them, as I’ve had issues in the past (caused by issues with refreshing) where all of the URLs have been reverted back to the old structure without 301 redirects being applied.
Another issue with Magento rewrites is when Magento appends a number to the end of product and category URLs, so -1, -2, -3 for example. This happens when an existing URL path is already being used and the rewrites are replacing the original URL without changing it. This can be a huge issue and usually requires development resource to resolve. If you have any questions about this – feel free to drop me an email.
Another cause for the number being added to the URL comes from updating products via a CSV file – when this happens you simply need to ask your developer to remove the rewrites from the rewrite table, although this should be tested extensively before being applied to your live site.
Magento category and sub-category pages will generally serve large numbers of products via different pages (pagination), which will mean the same content is being used on different variations of the same page. These pages should really use the rel next and prev tag, which was introduced by Google in 2011 to help webmasters illustrate that they are paginated pages.
The tag, which can be added to the pagination links or via the <head> would look like this:
<link rel=”next” href=”http://website.com/clothing?p=6″ />
<link rel=”prev” href=”http://website.com/clothing?p=4″ />
Session IDs / SIDs
Sessions ID pages are used to record a user’s session, commonly when they move from one domain to another. These pages can cause all kinds of duplicate content issues if they are indexed and there’s no limit to the amount of URLs that can be generated.
If you do have an issues with session IDs, I’d suggest using either the robots.txt file or meta robots tags to prevent the pages from being indexed. This will also allow you to submit removal requests if the pages are indexed.
Ensure that 301 redirects are being used
By default, Magento is set to use 302 redirects, which will prevent redirects and rewrite rules from passing value. I would strongly recommend ensuring that your redirects are set to 301 to ensure that you’re making the most of your link value.
International targeting with Magento
For one reason or another, Magento merchants seem to really struggle with international store implementations from an SEO perspective. The most common configuration I see is merchants using one catalog and using an extension to add additional back-end fields (meaning the rest of the page remains the same) or using multi-store and making the mistake of using the same URLs, meta data, copy (in some places) and just creating variants for different countries they want to target.
The first of those two options (international extension) also usually serves the pages via odd query string URLs, as it’s as a variant of the original page. Also, if pages don’t have content usually these pages will have the content of the original page – which is bad from a panda perspective, as this means you’re going to have duplicates of the original pages.
I would suggest using multi-store, noindexing pages until they have unique content and also using the hreflang tag, which I’ve provided more detail on below. You can choose to do this via a sub-directory or separate CCtlds. The href-lang tag should be implemented so that the equivalent URL is referenced from other stores on a page-level basis – I see too many sites that just reference the homepage on every page of the site.
Using the hreflang tag with Magento
The rel=”alternate” hreflang=”x” tag helps users to tell Google that you have an alternative international version of a given page and is a fundamental part of international SEO. The hreflang tag will help to ensure that the right version of a site or individual page is served in the right regional version of Google. I see lots of Magento retailers implement the hreflang tag incorrectly, by not linking the pages properly or only using the homepage for example.
There are a few modules available, however I’ve not tested any of them, so I’d suggest using your development resource to implement it. The implementation itself will differ dependant on if you’re using multi-store or implementing international pages via a plugin or custom fields. Here’s an example (using different CCtlds) of how it should look if implemented correctly on the page (can also be done via your Sitemap).
<link rel=”alternate” hreflang=”x-default” href=”http://www.example.com”>
<link rel=”alternate” hreflang=”en-gb” href=”http://www.example.co.uk”>
<link rel=”alternate” hreflang=”en-au” href=”http://www.example.com.au”>
<link rel=”alternate” hreflang=”fr-fr” href=”http://www.example.fr”>
If you’re doing it on the same domain, it’d look like this (this uses a product example):
<link rel=”alternate” hreflang=”x-default” href=”http://www.example.com/example-product-1″>
<link rel=”alternate” hreflang=”en-gb” href=”http://www.example.co.uk/example-product-1″>
<link rel=”alternate” hreflang=”en-au” href=”http://www.example.com.au/example-product-1″>
<link rel=”alternate” hreflang=”fr-fr” href=”http://www.example.fr/example-product-1″>
I did a project for a mid-sized furniture retailer around a year ago – they were using an extension and around 20% of the pages had unique content, the rest served the content from the original page (so English). They had no hreflang tag and lots of low quality pages in the index. I implemented the hreflang tag, removed lots of pages (until we’d published new content) and paid lots of students to write localised content for products and category pages) – they saw an increase in organic visibility of over 350% over the next year, including serious improvements for international phrases.
Feed-related duplicate content
If you’re using your feed to send content to affiliate websites or resellers, this can cause a huge amount of issues with duplicate content. This is one of the most common causes of Panda penalties and can have a significant impact on your organic visibility.
I’d suggest having two feeds, one for your website and one for third party websites, as this will eliminate the risk of your visibility being impacted as a result.
If you have any questions about anything I’ve mentioned in this blog post or anything else related to Magento, please feel free to drop me a message via this form (or email firstname.lastname@example.org). I also provide Magento SEO audits and consultancy for large Magento projects, as well as Magento code audits.