{"id":419,"date":"2021-04-13T12:23:39","date_gmt":"2021-04-13T11:23:39","guid":{"rendered":"https:\/\/organicdigital.co\/blog\/?p=419"},"modified":"2026-09-23T01:23:23","modified_gmt":"2026-09-23T00:23:23","slug":"how-to-do-dynamic-product-meta-data-in-magento-using-gtm","status":"publish","type":"post","link":"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/","title":{"rendered":"Magento SEO Case Study: Dynamic Product Meta Data Using GTM"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>TL;DR:<\/strong><br>Optimising product metadata manually isn\u2019t practical across tens of thousands of ecommerce product pages. For Heritage Parts Centre, I used Google Tag Manager to dynamically generate product title tags and meta descriptions using data including the product name, SKU, price, sale price, store region and regional USPs. This case study explains how I implemented the system across multiple international Magento stores and the subsequent increase in product-page search visibility and organic traffic.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Why_I_needed_to_generate_Magento_product_metadata_dynamically\" >Why I needed to generate Magento product metadata dynamically<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#The_Magento_product_metadata_problem\" >The Magento product metadata problem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Implementing_hreflang_across_the_Magento_stores\" >Implementing hreflang across the Magento stores<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#The_Pre-Optimisation_Meta_Data\" >The Pre-Optimisation Meta Data<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Product_Not_On_Offer_%E2%80%93_Fuel_Tank\" >Product Not On Offer \u2013 Fuel Tank<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Product_On_offer_%E2%80%93_Door_Hinge_Kit_for_Left_or_Right\" >Product On offer &#8211; Door Hinge Kit for Left or Right<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Product_metadata_requirements\" >Product metadata requirements<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Extracting_Magento_product_data_with_GTM_variables\" >Extracting Magento product data with GTM variables<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_Store_Region\" >How To Configure Store Region<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_Product_Name\" >How To Configure Product Name<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_Product_SKU\" >How To Configure Product SKU<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_A_Formatted_Product_SKU\" >How To Configure A Formatted Product SKU<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_Current_Price\" >How To Configure Current Price<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Check_If_On_Offer_And_Configure_Old_New_Price\" >How To Check If On Offer And Configure Old &amp; New Price<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Configure_USP_Unique_To_Store_Region\" >How To Configure USP Unique To Store Region<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#Summary_Of_Configured_Variables\" >Summary Of Configured Variables<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Create_A_Product_Page_Trigger\" >How To Create A Product Page Trigger<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Create_Custom_HTML_Tag_For_Dynamic_Meta_Data\" >How To Create Custom HTML Tag For Dynamic Meta Data<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#How_To_Analyse_Product_Page_Performance\" >How To Analyse Product Page Performance<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/daveashworth.co\/blog\/how-to-do-dynamic-product-meta-data-in-magento-using-gtm\/#The_End_Result\" >The End Result<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Why_I_needed_to_generate_Magento_product_metadata_dynamically\"><\/span>Why I needed to generate Magento product metadata dynamically<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Optimising product titles and meta descriptions individually isn&#8217;t practical when you&#8217;re working with an ecommerce website containing tens of thousands of products across multiple international stores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the problem I encountered while working with Heritage Parts Centre, a large Magento 2 website selling classic VW and Porsche parts across the UK, US, Australia and several European markets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The site contained around <strong>250,000 URLs<\/strong>, with more than <strong>60,000 products<\/strong> across multiple regional stores. We wanted to improve product page title tags and meta descriptions at scale, while dynamically incorporating information such as the product name, SKU, price, sale price, store region and regional USPs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than waiting for a large Magento development project, I built a solution using <strong>Google Tag Manager, DOM variables, lookup tables and JavaScript<\/strong> to dynamically generate product metadata across the site.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a case study of how that implementation worked, including how the product data was extracted, how the title tags and meta descriptions were constructed for different regions and languages, and what happened to organic product visibility after the changes were introduced.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This isn&#8217;t a guide to Magento&#8217;s old <code>meta keywords<\/code> field.<\/strong> The optimisation here concerns the HTML <code>&lt;title&gt;<\/code> element and meta description used on Magento product pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_Magento_product_metadata_problem\"><\/span>The Magento product metadata problem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As part of my work as an <a href=\"https:\/\/daveashworth.co\/skills\/ecommerce-seo-consultant\/\">Ecommerce SEO consultant<\/a>, I was working with <a href=\"https:\/\/www.heritagepartscentre.com\/\" target=\"_blank\" rel=\"noopener\">Heritage Parts Centre<\/a>, a global supplier of spare parts and accessories for classic VW and Porsche vehicles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The website operates separate stores for the UK, US, Australia, Germany, Spain and Italy, alongside an EU store serving other European countries. With more than 60,000 parts and accessories across over 40 vehicle models, the XML sitemap contained around <strong>250,000 URLs<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In summary: <strong>it is a big site.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I originally came on board following a rebrand and <a href=\"https:\/\/daveashworth.co\/services-and-consultancy\/website-migrations-consultant\/\">website migration<\/a> from Magento 1 to <a href=\"https:\/\/daveashworth.co\/skills\/ecommerce-seo-consultant\/magento\/\">Magento 2<\/a>, after which organic traffic had fallen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/daveashworth.co\/services-and-consultancy\/website-seo-audits-consultant\/\">initial SEO audit<\/a> identified several priorities. The first was sorting out redirects from the old website, including accurate mappings across approximately 57,000 legacy URLs covering products, categories and regional stores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once those migration issues had been addressed, attention moved towards improving on-page optimisation across the site. Product pages presented one of the biggest opportunities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Magento 2 allows you to configure aspects of product metadata within the admin, including title and meta description templates, prefixes and suffixes. The challenge was that we wanted considerably more control over how the metadata was constructed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We wanted to dynamically incorporate product-specific information such as <strong>product names, SKUs, prices and sale prices<\/strong>, while also changing the content according to the visitor&#8217;s regional store and language.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Doing all of that through Magento development would have meant raising development tickets whenever we wanted to implement, test or refine the templates. That&#8217;s understandable when developers have much larger functionality priorities, but it isn&#8217;t particularly agile when you&#8217;re trying to optimise metadata across tens of thousands of product pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is where <a href=\"https:\/\/daveashworth.co\/skills\/google-tag-manager-consultant\/\">Google Tag Manager<\/a> became useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using GTM variables, lookup tables, triggers, Custom HTML and JavaScript, I could extract information already available on each Magento product page and use it to dynamically construct the title tag and meta description.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More importantly for this particular website, the templates could vary by region and language. That made the solution part of the wider <a href=\"https:\/\/daveashworth.co\/skills\/international-seo-consultant\/\">international SEO strategy<\/a> rather than simply a way of changing a few title tags.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementing_hreflang_across_the_Magento_stores\"><\/span>Implementing hreflang across the Magento stores<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before tackling the product metadata, another important part of the international SEO work was making sure Google understood the relationship between the different regional and language versions of the product pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The site hadn&#8217;t previously implemented alternate language tags, so we introduced <strong>hreflang annotations<\/strong> across the regional stores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this, we used the <a href=\"https:\/\/www.magmodules.eu\/magento2-alternate-hreflang-tags.html\" target=\"_blank\" rel=\"noopener\">Alternate Language Tags extension from Magmodules<\/a>, which handled the Magento 2 hreflang implementation across the different stores.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"917\" height=\"107\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/alternate_language_tags.png\" alt=\"Alternate Language Tags plugin by Magmodules\" class=\"wp-image-420\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/alternate_language_tags.png 917w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/alternate_language_tags-300x35.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/alternate_language_tags-150x18.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/alternate_language_tags-768x90.png 768w\" sizes=\"(max-width: 917px) 100vw, 917px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With the relationships between the international stores established, the next step was improving the title tags and meta descriptions being generated across the individual product pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_Pre-Optimisation_Meta_Data\"><\/span>The <strong>Pre-Optimisation Meta Data<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before building the dynamic metadata templates, I reviewed how title tags and meta descriptions were currently being generated across the different regional stores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The title tags already included regional suffixes, but the meta descriptions were much less consistent. Some contained little more than the product name, others used generic regional copy, and some were pulling HTML directly from the product description.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The examples below show the existing metadata for two products across the different international stores, one at its standard price and another on special offer.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Product_Not_On_Offer_%E2%80%93_Fuel_Tank\"><\/span>Product <strong>Not On Offer \u2013 Fuel Tank<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html<\/a><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Region<\/td><td>Title<\/td><td>Description<\/td><\/tr><tr><td>AU<\/td><td>Fuel Tank | Heritage Parts Centre AU<\/td><td>Fuel tank&lt;br&gt;<\/td><\/tr><tr><td>DE<\/td><td>Kraftstofftank | Heritage Parts Centre DE<\/td><td>Wir haben unsere Marke umbenannt, liefern aber immer noch eine gro\u00dfe Auswahl an Teilen und Zubeh\u00f6r f\u00fcr klassische VW- und Porsche-Modelle<\/td><\/tr><tr><td>ES<\/td><td>Deposito de combustible | Heritage Parts Centre ES<\/td><td>Hemos cambiado de marca, pero a\u00fan almacenamos y suministramos una amplia gama de piezas y accesorios para los modelos cl\u00e1sicos de VW y Porsche.<\/td><\/tr><tr><td>EU<\/td><td>Fuel Tank | Heritage Parts Centre EU<\/td><td>Fuel tank&lt;br&gt;<\/td><\/tr><tr><td>IT<\/td><td>Serbatoio carburante | Heritage Parts Centre IT<\/td><td>Abbiamo rinominato ma ancora immagazziniamo e forniamo una vasta gamma di parti e accessori per i modelli classici VW e Porsche<\/td><\/tr><tr><td>UK<\/td><td>Fuel Tank | Heritage Parts Centre UK<\/td><td>Fuel tank&lt;br&gt;<\/td><\/tr><tr><td>US<\/td><td>Fuel Tank | Heritage Parts Center US<\/td><td>Fuel tank&lt;br&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Product_On_offer_%E2%80%93_Door_Hinge_Kit_for_Left_or_Right\"><\/span>Product On offer &#8211; Door Hinge Kit for Left or Right<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heritagepartscentre.com\/uk\/90153103120-door-hinge-kit-for-left-or-right.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heritagepartscentre.com\/uk\/90153103120-door-hinge-kit-for-left-or-right.html<\/a><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Region<\/td><td>Title<\/td><td>Description<\/td><\/tr><tr><td>AU<\/td><td>Door Hinge Kit for Left or Right | Heritage Parts Centre AU<\/td><td>&lt;p&gt;Door hinge kit for left or right.&lt;\/p&gt;&lt;p&gt;&lt;br&gt;Set includes both hinges for one door, does not include mounting bolts.&lt;\/p&gt;<\/td><\/tr><tr><td>DE<\/td><td>T\u00fcrscharnier-Set, ohne Schrauben\/Bolzen, pro T\u00fcr | Heritage Parts Centre DE<\/td><td>T\u00fcrscharnierset zur Montage an der linken oder rechten T\u00fcr.<br>Der Satz enth\u00e4lt alle Scharniere mit Ausnahme der Bolzen zum Aufh\u00e4ngen der T\u00fcr.&lt;\/div&gt;<\/td><\/tr><tr><td>ES<\/td><td>Kit bisagra puerta. Para 1 puerta | Heritage Parts Centre ES<\/td><td>&lt;p&gt;Kit bisagra puerta para lado derecho o izquierdo.&lt;\/p&gt;&lt;p&gt;&lt;br&gt;&lt;\/p&gt;&lt;p&gt;El kit incluye todas los herrajes excepto los tornillos para colgar la puerta.&lt;br&gt;&lt;\/p&gt;&lt;p&gt;&lt;br&gt;&lt;\/p&gt;&lt;p&gt;&lt;br&gt;&lt;\/p&gt;<\/td><\/tr><tr><td>EU<\/td><td>Door Hinge Kit for Left or Right | Heritage Parts Centre EU<\/td><td>&lt;p&gt;Door hinge kit for left or right.  Set includes both hinges for one door, does not include mounting bolts.&lt;\/p&gt;<\/td><\/tr><tr><td>IT<\/td><td>Kit cerniere porta per guida a dx | Heritage Parts Centre IT<\/td><td>Abbiamo rinominato ma ancora immagazziniamo e forniamo una vasta gamma di parti e accessori per i modelli classici VW e Porsche<\/td><\/tr><tr><td>UK<\/td><td>Door Hinge Kit for Left or Right | Heritage Parts Centre UK<\/td><td>&lt;p&gt;Door hinge kit for left or right. Set includes both hinges for one door, does not include mounting bolts.&lt;\/p&gt;<\/td><\/tr><tr><td>US<\/td><td>Door Hinge Kit Excluding bolts to Hang One Door | Heritage Parts Center US<\/td><td>&lt;p&gt;Door hinge kit to fit the left or right door.&lt;br&gt;Set includes all hinges excluding bolts to hang one door.&lt;\/P&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At this scale, manually writing metadata for every product and every regional store wasn&#8217;t realistic. We needed a repeatable template that could use the information already available on each product page while still allowing the output to vary by product, region, language and whether the item was on offer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Product_metadata_requirements\"><\/span><strong>Product metadata requirements<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Based on the existing product pages, I drew up a set of requirements for the new dynamic metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The title tags needed to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>be unique across the different regional stores<br><\/li>\n\n\n\n<li>include the product name<br><\/li>\n\n\n\n<li>include both the original and formatted product SKU, where appropriate, because customers searched using different variations of the part numbers<br><\/li>\n\n\n\n<li>identify the relevant regional store<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The meta descriptions needed to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>be generated specifically for each product rather than pulled from the product description<br><\/li>\n\n\n\n<li>use the appropriate language and sentence structure for each regional store<br><\/li>\n\n\n\n<li>include the current product price<br><\/li>\n\n\n\n<li>change when a product was on special offer<br><\/li>\n\n\n\n<li>include a relevant regional USP, such as the applicable delivery proposition<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To generate all of that dynamically, I needed GTM to extract or calculate several pieces of information from each Magento product page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Extracting_Magento_product_data_with_GTM_variables\"><\/span>Extracting Magento product data with GTM variables<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The information required to build the title tags and meta descriptions was already available either within the product page or from the URL. The next step was to turn that information into variables that could be reused within GTM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For each product, I needed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>store region<br><\/li>\n\n\n\n<li>product name<br><\/li>\n\n\n\n<li>product SKU<br><\/li>\n\n\n\n<li>formatted product SKU<br><\/li>\n\n\n\n<li>current price<br><\/li>\n\n\n\n<li>old and new prices when the product was on offer<br><\/li>\n\n\n\n<li>a USP specific to the regional store<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">I could then combine those variables later to dynamically construct the required metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_Store_Region\"><\/span>How To <strong>Configure Store Region<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Whilst the regions are already in the title tags, as we are creating new titles, and for other purposes, we wanted to set a custom variable that captured the region.&nbsp; As each store is within a subfolder named for that region \u2013 e.g. \/uk\/ \u2013 we can do this by extracting it from the URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To do this we configure a URL of type \u201cCustom JavaScript\u201d that gets the current URL and splits it into an array via the slashes \u2013 and we know the region will always be in the 3<sup>rd<\/sup> array element:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"733\" height=\"364\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/configure_store_region.png\" alt=\"Custom JavaScript variable\" class=\"wp-image-422\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/configure_store_region.png 733w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/configure_store_region-300x149.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/configure_store_region-150x74.png 150w\" sizes=\"(max-width: 733px) 100vw, 733px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So on this URL:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">the region is set as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"546\" height=\"32\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/store_region-1.png\" alt=\"Store Region\" class=\"wp-image-424\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/store_region-1.png 546w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/store_region-1-300x18.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/store_region-1-150x9.png 150w\" sizes=\"(max-width: 546px) 100vw, 546px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Whilst we could just use a JavaScript function to convert this to uppercase, we used a lookup table based up the variable to set the region, as this will give us greater flexibility further down the line if we wish to amend the region name in the title tag \u2013 e.g. USA instead of US<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"726\" height=\"531\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/vlookup_title_tag_region.png\" alt=\"VLOOKUP Title Tag Region\" class=\"wp-image-425\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/vlookup_title_tag_region.png 726w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/vlookup_title_tag_region-300x219.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/vlookup_title_tag_region-150x110.png 150w\" sizes=\"(max-width: 726px) 100vw, 726px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Which is then set as follows on the above URL:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"546\" height=\"31\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/title_tag_region-1.png\" alt=\"Title Tag Region\" class=\"wp-image-427\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/title_tag_region-1.png 546w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/title_tag_region-1-300x17.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/title_tag_region-1-150x9.png 150w\" sizes=\"(max-width: 546px) 100vw, 546px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This can now be used in our tags and triggers by referring to {{Title Tag Region}}<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_Product_Name\"><\/span>How To <strong>Configure Product Name<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">All the product data we need is within the page content, so we can use CSS selectors to pull in each variable:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" width=\"602\" height=\"80\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_html.png\" alt=\"page title wrapper\" class=\"wp-image-428\" style=\"width:602px;height:80px\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_html.png 602w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_html-300x40.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_html-150x20.png 150w\" sizes=\"(max-width: 602px) 100vw, 602px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So in this case, we grab the contents of <em>.page-title .base<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"731\" height=\"363\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_variable.png\" alt=\"DOM Element variable config\" class=\"wp-image-429\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_variable.png 731w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_variable-300x149.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name_variable-150x74.png 150w\" sizes=\"(max-width: 731px) 100vw, 731px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Which we can refer to using {{Product Name}}:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" width=\"547\" height=\"32\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name.png\" alt=\"Product Name\" class=\"wp-image-430\" style=\"width:547px;height:32px\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name.png 547w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name-300x18.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_name-150x9.png 150w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_Product_SKU\"><\/span>How To <strong>Configure Product SKU<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Like above, the SKU is also in a uniquely named div:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"547\" height=\"85\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_html.png\" alt=\"Product SKU HTML\" class=\"wp-image-431\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_html.png 547w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_html-300x47.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_html-150x23.png 150w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So, the variable is set as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"602\" height=\"294\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_variable.png\" alt=\"Product SKU Variable\n\" class=\"wp-image-432\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_variable.png 602w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_variable-300x147.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku_variable-150x73.png 150w\" sizes=\"(max-width: 602px) 100vw, 602px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Which we can refer to using {{Product SKU}}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"547\" height=\"32\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku.png\" alt=\"Product SKU\" class=\"wp-image-433\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku.png 547w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku-300x18.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_sku-150x9.png 150w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_A_Formatted_Product_SKU\"><\/span>How To <strong>Configure A Formatted Product SKU<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, the SKU contains \/ and \u2013 for example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">170-201-075\/J<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some users will search with these characters, some without \u2013 so we wanted to include both.&nbsp; By using a custom JavaScript variable, we can pass the SKU then remove the \/ and \u2013 and return the formatted SKU.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I apologise for what looks like horribly inefficient code, but the replace function wasn\u2019t working how I anticipated, so I just hacked this together to remove up to 4 instances of each character:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see, it passes in the previously captured SKU, works its \u201cmagic\u201d, then sends back a nicely formatted SKU:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"731\" height=\"582\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/code_to_format_product_sku.png\" alt=\"Code To Format Product SKU\" class=\"wp-image-434\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/code_to_format_product_sku.png 731w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/code_to_format_product_sku-300x239.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/code_to_format_product_sku-150x119.png 150w\" sizes=\"(max-width: 731px) 100vw, 731px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Again, sorry about that code, but anyway, we can now refer to this using {{Product SKU Formatted}}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"547\" height=\"31\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/formated_product_sku.png\" alt=\"Formatted Product SKU\" class=\"wp-image-435\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/formated_product_sku.png 547w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/formated_product_sku-300x17.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/formated_product_sku-150x9.png 150w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_Current_Price\"><\/span>How To <strong>Configure Current Price<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If the product is not on offer, the price can be found here:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"759\" height=\"252\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_html.png\" alt=\"Product Price HTML\" class=\"wp-image-436\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_html.png 759w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_html-300x100.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_html-150x50.png 150w\" sizes=\"(max-width: 759px) 100vw, 759px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Again, we use a CSS selector to grab this value:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"729\" height=\"511\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_variable.png\" alt=\"Product Price Variable\" class=\"wp-image-437\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_variable.png 729w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_variable-300x210.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price_variable-150x105.png 150w\" sizes=\"(max-width: 729px) 100vw, 729px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">And this is called using {{Product Price}}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"547\" height=\"31\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price.png\" alt=\"Product Price\" class=\"wp-image-438\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price.png 547w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price-300x17.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_price-150x9.png 150w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Check_If_On_Offer_And_Configure_Old_New_Price\"><\/span>How To <strong>Check If On Offer And Configure Old &amp; New Price<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If a product is on offer, the prices appear as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"520\" height=\"147\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer.png\" alt=\"Product On Offer\" class=\"wp-image-439\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer.png 520w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-300x85.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-150x42.png 150w\" sizes=\"(max-width: 520px) 100vw, 520px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">These appear in the classes <em>.old-price<\/em> and <em>.special-price<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"755\" height=\"360\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_offer_html.png\" alt=\"Product Offer HTML\" class=\"wp-image-440\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_offer_html.png 755w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_offer_html-300x143.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_offer_html-150x72.png 150w\" sizes=\"(max-width: 755px) 100vw, 755px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So, we set them accordingly:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"720\" height=\"368\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_old_price.png\" alt=\"Product Old Price\" class=\"wp-image-441\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_old_price.png 720w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_old_price-300x153.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_old_price-150x77.png 150w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"730\" height=\"365\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_new_price.png\" alt=\"Product New Price\" class=\"wp-image-442\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_new_price.png 730w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_new_price-300x150.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_new_price-150x75.png 150w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As the <em>.special-price<\/em> only appears on product pages which are on offer, we can set a variable called \u201cProduct On Offer\u201d of type \u201cElement Visibility\u201d which is set to true or false depending on if this element is on the page:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"727\" height=\"421\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer_variable.png\" alt=\"Product On Offer Variable\" class=\"wp-image-443\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer_variable.png 727w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer_variable-300x174.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer_variable-150x87.png 150w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">We then have 3 more potential variables we can use:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{{Product On Offer}}<br>{{Product Old Price}}<br>{{Product New Price}}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the product is not on offer, we see:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"592\" height=\"123\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_not_on_offer.png\" alt=\"Product Not On Offer\" class=\"wp-image-444\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_not_on_offer.png 592w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_not_on_offer-300x62.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_not_on_offer-150x31.png 150w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Whereas if it is, these are populated accordingly:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"592\" height=\"124\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-1.png\" alt=\"Product On Offer\" class=\"wp-image-445\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-1.png 592w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-1-300x63.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_on_offer-1-150x31.png 150w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">(I am not sure why they appear as \u201cnull\u201d and \u201cfalse\u201d, when they should be \u201cfalse\u201d and \u201ctrue\u201d \u2013 I must look into this)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Configure_USP_Unique_To_Store_Region\"><\/span>How To <strong>Configure USP Unique To Store Region<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We want to include a USP within the meta to encourage the click through from the SERPs.&nbsp; The delivery price is different in each region whilst DE, IT and ES need to be translated.&nbsp; As we already have the region as a variable, the USP can be set via a look up table taking {{Store Region}} as the input:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"725\" height=\"592\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp_variable.png\" alt=\"Product USP Variable\" class=\"wp-image-446\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp_variable.png 725w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp_variable-300x245.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp_variable-150x122.png 150w\" sizes=\"(max-width: 725px) 100vw, 725px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This is called using {{Product USP}}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"592\" height=\"34\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp.png\" alt=\"Product USP\" class=\"wp-image-447\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp.png 592w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp-300x17.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_usp-150x9.png 150w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Summary_Of_Configured_Variables\"><\/span><strong>Summary Of Configured Variables<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For each product we now have a set of variables we can use to create our unique meta data:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heritagepartscentre.com\/uk\/170201075j-fuel-tank.html<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"592\" height=\"249\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/fuel_tank_variables.png\" alt=\"Fuel Tank Variables\" class=\"wp-image-448\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/fuel_tank_variables.png 592w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/fuel_tank_variables-300x126.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/fuel_tank_variables-150x63.png 150w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heritagepartscentre.com\/es\/90153103120-kit-bisagra-puerta-para-1-puerta.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.heritagepartscentre.com\/es\/90153103120-kit-bisagra-puerta-para-1-puerta.html<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"592\" height=\"263\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/door_variables.png\" alt=\"Door Variables\" class=\"wp-image-449\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/door_variables.png 592w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/door_variables-300x133.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/door_variables-150x67.png 150w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Create_A_Product_Page_Trigger\"><\/span>How To <strong>Create A Product Page Trigger<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before we create our custom tag, we need a trigger that will allow us to identify if we are on a product page, or not.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are several variables available to us, so we chose {{Product SKU}} \u2013 if this is not null, we know we are on a product page, so set up the trigger accordingly:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"727\" height=\"310\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_page_trigger.png\" alt=\"Product Page Trigger\" class=\"wp-image-450\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_page_trigger.png 727w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_page_trigger-300x128.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/product_page_trigger-150x64.png 150w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Create_Custom_HTML_Tag_For_Dynamic_Meta_Data\"><\/span>How To Create Custom HTML Tag For Dynamic Meta Data<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, on to the good stuff.&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this we use a custom HTML tag that will contain JavaScript and utilise jQuery to manipulate the key elements within the page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, we need to create the variables we will use and set these according to the custom variables set up previously:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var p_name = \"{{Product Name}}\";\nvar p_sku = \"{{Product SKU}}\";\nvar p_sku_formatted = \"{{Product SKU Formatted}}\";\nvar p_region = \"{{Title Tag Region}}\";\nvar p_on_offer = \"{{Product On Offer}}\";\nvar p_price = \"{{Product Price}}\";\nvar p_old_price = \"{{Product Old Price}}\";\nvar p_new_price = \"{{Product New Price}}\";\nvar p_product_usp = \"{{Product USP}}\"; <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To set the title tag, we want to append the product name, formatted SKU and insert the brand followed by the region:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var p_title = p_name + \": \" + p_sku_formatted + \" | Heritage Parts Centre \" + p_region;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We then use jquery to remove the existing title tag, and create a new one populated with the text above:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jQuery('title').remove();\nvar p_title_tag = document.createElement('title');\np_title_tag.text = p_title;\njQuery('head').append(p_title_tag);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Whilst I prefer the syntax of JQuery, the following more efficient code wil also work and supports sites that don&#8217;t utilise JQeuery:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>document.title = p_title;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For the meta description, we have differing formats depending on whether the product is on offer, and then different languages depending on the region.&nbsp;&nbsp; We will translate for DE, IT and ES, whilst AU, US, EU and UK will all use the same text.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The format we decided on in English was:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Buy the <em>product_name<\/em> (<em>product_SKU<\/em>) online for <em>product_price<\/em>.  <em>Product_usp<\/em><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">e.g.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Buy the Fuel Tank (170-201-075\/J) online for \u00a3236.95.  Free delivery on orders over \u00a350, express next day delivery available.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the product is on offer, the wording is as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Buy the <em>product_name<\/em> (<em>product_SKU<\/em>) online.  Was <em>old_price<\/em>, now <em>new_price<\/em>.  Product_usp<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">e.g.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Buy the Door Hinge Kit for Left or Right (901-531-031-20) online. Was \u00a3102.95, now \u00a392.95.  Free delivery on orders over \u00a350, express next day delivery available.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We also have the flexibility to change the structure of the sentences depending on the language.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To do this, we used the following code which utilises and if statement to determine if the product is on offer, and then  switch statements to set to description according to the region &#8211; DE, ES and IT, or default English for AU, EU, UK and US &#8211; if we want to have specific descritpions for any English regions at any point, we just add in a further case:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (p_on_offer == \"null\")\n{\n\tswitch(p_region) \n\t{\n\t\tcase \"DE\":\n\t\t\tvar p_desc = \"Bestellen Sie \" + p_name + \" (\" + p_sku + \") auf unserer Webseite f\u00fcr \" + p_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tcase \"ES\":\n\t\t\tvar p_desc = p_name + \" (\" + p_sku + \") disponible en l\u00ednea por \" + p_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tcase \"IT\":\n\t\t\tvar p_desc = \"Acquista \" + p_name + \" (\" + p_sku + \") online per \" + p_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tdefault:\n\t\t\tvar p_desc = \"Buy the \" + p_name + \" (\" + p_sku + \") online for \" + p_price + \".  \" + p_product_usp;\n\t}\n}\nelse\n{\n\tswitch(p_region) \n\t{\n\t\tcase \"DE\":\n\t\t\tvar p_desc = \"Bestellen Sie \" + p_name + \" (\" + p_sku + \") auf unserer Webseite.  Regul\u00e4rer Preis \" + p_old_price + \" - Sonderpreis \" + p_new_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tcase \"ES\":\n\t\t\tvar p_desc = p_name + \" (\" + p_sku + \") disponible en l\u00ednea.  Precio inicial \" + p_old_price + \" - Precio rebajado \" + p_new_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tcase \"IT\":\n\t\t\tvar p_desc = \"Acquista \" + p_name + \" (\" + p_sku + \") online.  Prezzo originale \" + p_old_price + \" - Prezzo scontato \" + p_new_price + \".  \" + p_product_usp;\n\t\t\tbreak;\n\t\t\n\t\tdefault:\n\t\t\tvar p_desc = \"Buy the \" + p_name + \" (\" + p_sku + \") online.  Was \" + p_old_price + \" - Now \" + p_new_price + \".  \" + p_product_usp;\n\t}\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And add this to the page as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jQuery('meta&#91;name=\"description\"]').remove();\nvar p_meta_desc = document.createElement('meta');\np_meta_desc.name = 'description';\np_meta_desc.content = p_desc;\njQuery('head').append(p_meta_desc);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or, again, without JQuery go with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>document.getElementsByTagName('meta')&#91;\"description\"].content = p_desc;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And that is it \u2013 the Custom HTML tag is set up containing the code above to be fired by the product page trigger:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"728\" height=\"869\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/dynamic_product_meta_data_tag.png\" alt=\"Dynamic Product Meta Data Tag\" class=\"wp-image-451\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/dynamic_product_meta_data_tag.png 728w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/dynamic_product_meta_data_tag-251x300.png 251w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/dynamic_product_meta_data_tag-126x150.png 126w\" sizes=\"(max-width: 728px) 100vw, 728px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">And the good news is, the dynamically generated code is crawled, parsed and indexed by Google.&nbsp; Bing doesn\u2019t.&nbsp; But so what.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We can see this using the site query operator to look for the SKU:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"770\" height=\"262\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_door.png\" alt=\"Site Operator: Door\" class=\"wp-image-452\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_door.png 770w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_door-300x102.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_door-150x51.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_door-768x261.png 768w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"773\" height=\"253\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_fuel_tank.png\" alt=\"Site Operator: Fuel Tank\" class=\"wp-image-453\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_fuel_tank.png 773w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_fuel_tank-300x98.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_fuel_tank-150x49.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/site_operator_fuel_tank-768x251.png 768w\" sizes=\"(max-width: 773px) 100vw, 773px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_To_Analyse_Product_Page_Performance\"><\/span>How To Analyse Product Page Performance<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The amends had a significant impact on the organic visibility and traffic generated by the product pages on the site.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s easy to just say that, but, in the name of a comprehensive case study, I&#8217;m going to prove it.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whilst one of my favourite SEO tools, the performance data in Google Search Console is limited to 1000 pages at a time, however, there are ways of getting a more definitive overview of your site&#8217;s search data.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For those with budget, I highly recommend <a href=\"https:\/\/en.ryte.com\/\" target=\"_blank\" rel=\"noopener\">Ryte<\/a> which has a <a href=\"https:\/\/en.ryte.com\/product\/search-success\/\" target=\"_blank\" rel=\"noopener\">comprehensive Search Success module<\/a> which allows you to see ALL your site&#8217;s URL search data within any given time frame:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"879\" height=\"615\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/ryte.png\" alt=\"ryte screenshot\" class=\"wp-image-455\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/ryte.png 879w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/ryte-300x210.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/ryte-150x105.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/ryte-768x537.png 768w\" sizes=\"(max-width: 879px) 100vw, 879px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Or, if on a budget and you want the same thing for free, <a href=\"https:\/\/www.aleydasolis.com\/en\/search-engine-optimization\/using-google-data-studio-actionable-search-console-performance-report\/\" target=\"_blank\" rel=\"noopener\">Alyeda Solis has created a Google Data Studio Dashboard<\/a> that basically does the same thing, that being, the ability to download all your search data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once we had this data month by month, we then used <a href=\"https:\/\/www.screamingfrog.co.uk\/seo-spider\/\" target=\"_blank\" rel=\"noopener\">Screaming Frog SEO Spider<\/a> and it&#8217;s custom extraction tool to crawl the URLs and identify which were products via the SKU code being in place on the page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To do this, right click on the SKU in the web page and select &#8220;Inspect&#8221;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"622\" height=\"303\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/inspect_element.png\" alt=\"inspect tool\" class=\"wp-image-456\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/inspect_element.png 622w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/inspect_element-300x146.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/inspect_element-150x73.png 150w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then, from within the code, select the element containing the text you want to extract and right click then select &#8220;Copy -&gt; Copy Selector&#8221; to get the CSS path:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"298\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector-1024x298.png\" alt=\"inspect html\" class=\"wp-image-472\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector-1024x298.png 1024w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector-300x87.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector-150x44.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector-768x224.png 768w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/copy_selector.png 1260w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Which gives you the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#maincontent &gt; div.columns &gt; div &gt; div.full-width.top.wrapper &gt; div.product-info-main &gt; div.product.attribute.sku &gt; div<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Within Screaming Frog, we can then paste in all the URLs into list mode after we&#8217;ve set &#8220;Configuration -&gt; Custom -&gt; Extraction&#8221; and set this to your CSS path:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"104\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction-1024x104.png\" alt=\"custom extraction\" class=\"wp-image-457\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction-1024x104.png 1024w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction-300x30.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction-150x15.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction-768x78.png 768w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/custom_extraction.png 1076w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This will then crawl all your URLs and where the SKU is in place, this will be flagged in the custom extractor field:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"905\" height=\"364\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/sku_data.png\" alt=\"extracted data\" class=\"wp-image-458\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/sku_data.png 905w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/sku_data-300x121.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/sku_data-150x60.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/sku_data-768x309.png 768w\" sizes=\"(max-width: 905px) 100vw, 905px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If Screaming Frog isn&#8217;t your thing, you can also <a href=\"https:\/\/sitebulb.com\/documentation\/content-extraction-search\/how-to-perform-website-content-extraction\/\" target=\"_blank\" rel=\"noopener\">use Sitebulb for website content extraction<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Either way, export the data, put the original search console export data in one excel tab, your crawl data in another, use a VLOOKUP to match and flag the product URLs with an SKU in place, which you then filter to obtain just product page data:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"224\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data-1024x224.png\" alt=\"GSC Data\" class=\"wp-image-460\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data-1024x224.png 1024w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data-300x66.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data-150x33.png 150w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data-768x168.png 768w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/gsc_data.png 1298w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Optimisation work began on the site on October covering fundmental tech SEO actions such as crawl rate optimisation and <a href=\"https:\/\/daveashworth.co\/blog\/how-to-implement-breadcrumb-list-schema-mark-up-and-why\/\">breadcrumb schema optimisation<\/a> &#8211; this had a positive impact, but more so on the category landing pages across the site.  The product meta optimisation described above was implemented in December, and as you can see, it did good in terms of unique product pages and keyword generating impressions, clicks and click through rate:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>OCT<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>NOV<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>DEC<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>JAN<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>FEB<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>MAR<\/strong><\/td><\/tr><tr><td><strong>Unique Pages<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">14,448<\/td><td class=\"has-text-align-center\" data-align=\"center\">15,414<\/td><td class=\"has-text-align-center\" data-align=\"center\">16,033<\/td><td class=\"has-text-align-center\" data-align=\"center\">21,750<\/td><td class=\"has-text-align-center\" data-align=\"center\">32,996<\/td><td class=\"has-text-align-center\" data-align=\"center\">34,113<\/td><\/tr><tr><td><strong>Unique Keywords<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">34,898<\/td><td class=\"has-text-align-center\" data-align=\"center\">39,008<\/td><td class=\"has-text-align-center\" data-align=\"center\">35,969<\/td><td class=\"has-text-align-center\" data-align=\"center\">35,073<\/td><td class=\"has-text-align-center\" data-align=\"center\">50,428<\/td><td class=\"has-text-align-center\" data-align=\"center\">49,572<\/td><\/tr><tr><td><strong>Total Impressions<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">224,703<\/td><td class=\"has-text-align-center\" data-align=\"center\">239,396<\/td><td class=\"has-text-align-center\" data-align=\"center\">241,611<\/td><td class=\"has-text-align-center\" data-align=\"center\">218,841<\/td><td class=\"has-text-align-center\" data-align=\"center\">324,858<\/td><td class=\"has-text-align-center\" data-align=\"center\">354,877<\/td><\/tr><tr><td><strong>Total Clicks<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">2,580<\/td><td class=\"has-text-align-center\" data-align=\"center\">2,976<\/td><td class=\"has-text-align-center\" data-align=\"center\">2,768<\/td><td class=\"has-text-align-center\" data-align=\"center\">3,028<\/td><td class=\"has-text-align-center\" data-align=\"center\">3,585<\/td><td class=\"has-text-align-center\" data-align=\"center\">5,150<\/td><\/tr><tr><td><strong>Click Through Rate<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\">1.15%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.24%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.14%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.38%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.10%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.45%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The same data, but in a graph:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"480\" height=\"289\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/mom_product_page_performance.png\" alt=\"Month On Month Product Page Performance\n\" class=\"wp-image-461\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/mom_product_page_performance.png 480w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/mom_product_page_performance-300x181.png 300w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/mom_product_page_performance-150x90.png 150w\" sizes=\"(max-width: 480px) 100vw, 480px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Whilst Ryte allows us to see new keywords this year to date which includes a lot of product part IDs due to them now being in the title tag and meta description:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"559\" height=\"839\" src=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/new_keywords-2.png\" alt=\"product ID data\" class=\"wp-image-465\" srcset=\"https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/new_keywords-2.png 559w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/new_keywords-2-200x300.png 200w, https:\/\/daveashworth.co\/blog\/wp-content\/uploads\/2021\/04\/new_keywords-2-100x150.png 100w\" sizes=\"(max-width: 559px) 100vw, 559px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_End_Result\"><\/span>The End Result<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enhanced Visibilty = More Long Tail Organic Traffic = More Reveune = Happy Client<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But don&#8217;t just take my word for it:<\/p>\n\n\n\n<!-- testimonial wrapper  -->\n\t\t\t\t\t\t<div class=\"testimonial-wrapper\">\n\t\t\t\t\t\t  <!-- left  -->\n\t\t\t\t\t\t  <div class=\"testimonial-left\">\n\t\t\t\t\t\t\t<p class=\"testimonial-content\">\n\t\t\t\t\t\t\t  Heritage Parts Centre started working with Dave mid-2020, presenting to him a number of challenges following a website migration earlier in the year. What Dave provided saw a number of quick wins (that quickly and drastically stabilised our organic traffic), and subsequently worked through some more strategic technical SEO optimisations that has seen a tremendous improvement in our SEO performance. It has been refreshing to work with Dave who have been genuinely excited by the unique challenges that our market presents, and look forward to continue our work with him. His direct, professional, pragmatic and creative problem solving and optimisation methods continue to make a positive difference to our business, and I recommend him highly.\n\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t<!-- icon wrapper  -->\n\t\t\t\t\t\t\t<img decoding=\"async\" class=\"testimonial-icon\" src=\"https:\/\/daveashworth.co\/assets\/images\/arrow-top.svg\" alt=\"icon\" \/>\n\t\t\t\t\t\t\t<img decoding=\"async\" class=\"testimonial-icon is-bottom\" src=\"https:\/\/daveashworth.co\/assets\/images\/arrow-bottom.svg\" alt=\"icon\" \/>\n\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t  <!-- left end -->\n\t\t\t\t\t\t  <!-- right  -->\n\t\t\t\t\t\t  <div class=\"testimonial-right\">\n\t\t\t\t\t\t\t<div class=\"testimonial-author-image-wrapper\">\n\t\t\t\t\t\t\t  <div class=\"testimonial-image\">\n\t\t\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t  <source srcset=\"https:\/\/daveashworth.co\/assets\/images\/testimonials\/rob-tickner.jpg.webp\" type=\"image\/webp\">\n\t\t\t\t\t\t\t\t  <img decoding=\"async\" class=\"w-full max-w-[8.75rem]\" src=\"https:\/\/daveashworth.co\/assets\/images\/testimonials\/rob-tickner.jpg\" alt=\"Rob Tickner\" width=\"200\" height=\"200\">\n\t\t\t\t\t\t\t\t<\/picture>\n\t\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"testimonial-devider\"><\/div>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t  <a href=\"https:\/\/www.linkedin.com\/in\/robtickner\/\" target=\"_blank\" rel=\"noopener\">Rob Tickner<\/a><br \/>\n\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.heritagepartscentre.com\/\" target=\"_blank\" rel=\"noopener\">heritagepartscentre.com<\/a>\n\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t  <!-- right end -->\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<!-- testimonial wrapper end -->\n\t\t\t\t\t\t<!-- testimonial wrapper  -->\n\t\t\t\t\t\t<div class=\"testimonial-wrapper\">\n\t\t\t\t\t\t  <!-- left  -->\n\t\t\t\t\t\t  <div class=\"testimonial-left\">\n\t\t\t\t\t\t\t<p class=\"testimonial-content\">\n\t\t\t\t\t\t\t  Have been working with Dave for 6 months now and very impressed with the technical SEO work that he has carried out particularly around GTM. His reports and roadmap are clear and concise and the work is returning good results.\n\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t<!-- icon wrapper  -->\n\t\t\t\t\t\t\t<img decoding=\"async\" class=\"testimonial-icon\" src=\"https:\/\/daveashworth.co\/assets\/images\/arrow-top.svg\" alt=\"icon\" \/>\n\t\t\t\t\t\t\t<img decoding=\"async\" class=\"testimonial-icon is-bottom\" src=\"https:\/\/daveashworth.co\/assets\/images\/arrow-bottom.svg\" alt=\"icon\" \/>\n\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t  <!-- left end -->\n\t\t\t\t\t\t  <!-- right  -->\n\t\t\t\t\t\t  <div class=\"testimonial-right\">\n\t\t\t\t\t\t\t<div class=\"testimonial-author-image-wrapper\">\n\t\t\t\t\t\t\t  <div class=\"testimonial-image\">\n\t\t\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t\t  <source srcset=\"https:\/\/daveashworth.co\/assets\/images\/testimonials\/barney-dines.jpg.webp\" type=\"image\/webp\">\n\t\t\t\t\t\t\t\t  <img decoding=\"async\" class=\"w-full max-w-[8.75rem]\" src=\"https:\/\/daveashworth.co\/assets\/images\/testimonials\/barney-dines.jpg\" alt=\"Barney Dines\" width=\"200\" height=\"200\">\n\t\t\t\t\t\t\t\t<\/picture>\n\t\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"testimonial-devider\"><\/div>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t  <a href=\"https:\/\/www.linkedin.com\/in\/barney-dines-33458677\/\" target=\"_blank\" rel=\"noopener\">Barney Dines<\/a><br \/>\n\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.letsgocamperhire.com\/\" target=\"_blank\" rel=\"noopener\">letsgocamperhire.com<\/a>\n\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t  <\/div>\n\t\t\t\t\t\t  <!-- right end -->\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<!-- testimonial wrapper end -->\n\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A case study to show how to implement unique, formatted meta data across a large M2 product database which is also then translated for various regions for international SEO purposes.<\/p>\n","protected":false},"author":1,"featured_media":466,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,11,7,13,16],"tags":[],"class_list":["post-419","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tag-manager","category-magento","category-international-seo","category-on-page-seo","category-analysis"],"_links":{"self":[{"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/posts\/419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/comments?post=419"}],"version-history":[{"count":0,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/posts\/419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/media\/466"}],"wp:attachment":[{"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/media?parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/categories?post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daveashworth.co\/blog\/wp-json\/wp\/v2\/tags?post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}