If you’re constantly working with Google Tag Manager, you’ve probably started noticing some repetitions, each project requires checking the same set of things/settings/data over and over again: Have you double-checked whether all required Enhanced E-commerce data is in place? What about custom dimensions? The list could go on and on.

After implementing GTM on various projects, I’ve started writing down a list of things I need to check in different stages of implementation. Today, I’m sharing it with you (well, most of it). So without further ado, here’s a Google Tag Manager checklist which contains 68 things you should keep in mind before, during and after the GTM setup is launched.

In the past, I’ve used a GTM checklist prepared by Lunametrics but then I gradually started noticing that some list items never applied in my projects, while others were always missing. As a result, I’ve updated their list, by removing irrelevant items (just my opinion) and adding new ones.

All items in the GTM checklist are split into several categories:

  • Planning
  • Preparing the website and installation of Google Tag Manager
  • Instructing your team about the Data Layer
  • Preloading the Data Layer with user data
  • Preloading the Data Layer with E-commerce data
  • Other page information
  • Tags, trigger, variables
  • Google Analytics E-commerce
  • Miscellaneous

Keep in mind that a lot of these items are optional and vastly depend on the complexity and structure of the project you’re working on, e.g. not all websites need an e-commerce tracking, especially the enhanced one.

Feel free to download the GTM checklist (as PDF) by entering your email address in the form below or here. Only new subscribers will get the email with download link. Current Analytics Mania subscribers can find a PDF download link in Analytics Mania’s weekly newsletters, sent after Nov. 21st.


#1. Think of the account/container structure, ownership, permissions. How many websites does the client/company have? Should they all use the same container or should they be separated? Which permissions should you assign to whom? I always try to answer these questions before I start working on GTM.

#2. Prepare tag implementation plan. Prepare a sheet with all tags you plan to publish. It will enable you to think everything through before taking actions, therefore you’ll be able to foresee possible roadblocks and avoid/solve them more easily. Julian from MeasureSchool has shared his sheet template which I’m also regularly using. Just make a copy of it and you’re good to go.


Preparing the website and installation of Google Tag Manager

#3. Add unique IDs to very important web elements. By having those IDs you will be able to track interactions much easier (Click ID and Form ID variables will become your best friends).

#4. Make forms friendlier for tracking with Google Tag Manager. There are several options you could ask your developers for:

  • Forms should dispatch only valid submit events. If there are errors, the event should not be initiated.
  • If the form is built with AJAX, ask a developer to return a clear response which can be used as a trigger rule. Learn more about AJAX form tracking.
  • Or ask a developer to fire a dataLayer.push event when the form was successfully submitted. You can later catch it with a Custom Event Trigger. Here’s an example of the code a developer should fire:

#5. Use “data-” prefix for additional information and fetch it with variables in Google Tag Manager.

If possible, ask a developer to add additional and useful information to your website’s elements – e.g. id or  “data-id=123” to elements you need to identify for tracking. Let me show you an example:

I work at a startup, called Omnisend. We offer an email marketing platform which can be easily integrated with popular e-commerce platforms (Shopify, Bigcommerce, etc.). In the older version of our website, we displayed various logos of e-commerce vendors (we call them platforms), some of them redirected visitors to app stores (where they could install Omnisend).

Inspect shopify logo

So I was interested which vendors were the most popular among website visitors and asked a developer to add data-platform attribute to each logo. Later, with the help of auto-event variable, I could pass that data to Google Analytics. You can also access that attribute with the DOM Element variable.

#6. If you can’t figure out how to track an interaction by yourself, ask a developer to fire a dataLayer.push event. Actually, the “dataLayer.push first” approach is recommended because it’s more robust than, for example, DOM scraping.

#7. Single-page websites should use URL Fragments (the part of web address which comes after a hash mark #). That way you’ll be able to track different sections of the page and fire virtual pageviews (with help of History Change Trigger and its variables).

#8. One part of GTM container snippet should be placed in <head> and the second part right after the opening of the <body> tag. If that’s not possible, place both codes as high as possible in website’s <body>. Never ever place the <noscript> part of GTM code in website’s <head>. Learn more about how to properly install Google Tag Manager.

#9. Check if Google Tag Manager code is added to all pages. For this task, you should use a web crawler, for example, Screaming Frog, a solution which can be configured to crawl the entire website and look for https://www.googletagmanager.com/gtm.js in website’s source code. This URL is used by Google Tag Manager container. If it’s somewhere missing, the frog will report it.

#10. Use Tag Assistant to check if GTM is added successfully. Also, try enabling Preview and Debug mode: if it appears, that’s a good sign.


Instructing your team about the Data Layer

If you want to access custom data and then pass it to Google Analytics or other tracking tools, you should ask a developer to preload the dataLayer with that information. First, make sure that developers know what they’re doing.

#11. If needed, introduce the concept of the Data Layer to developers. Here are several resources you could start from:

#12. Data Layer snippet must be above Google Tag Manager’s container <script>. There are no exceptions. Why? Otherwise, you’ll end up breaking GTM. From what I’ve seen, one of the most common outcomes is a malfunctioned Pageview trigger.

#13. It’s recommended to prefix the dataLayer with window. As a result, all snippets should use window.dataLayer. According to Simo, this will help you avoid conflicts with any locally scoped structures that use the same name. P.S. yes, I know that my older blog posts still don’t use window. I just did not have the motivation to fix it, hoping to update them soon *sigh*

#14. It’s better to use push (window.dataLayer.push) even when the page loads. According to Google’s documentation, it’s sufficient to place this dataLayer snippet above the Google Tag Manager container script (keys and values are just an example):

But after reading multiple sources (including Simo Ahava’s blog), the recommended approach should be different. Never use the syntax which I’ve posted above. If this command is executed after the GTM container snippet or after you’ve already established a dataLayer object, you will end up overwriting the existing object with this newly initialized structure. This might end up breaking GTM.

The solution? use dataLayer.push, instead. The code snippet should look like this:

P.S. yes, I know that my older blog posts still use dataLayer = [{}]. I just did not have the motivation to fix it, hoping to update them soon.

#15. Do not define an empty dataLayer if there is no data to be preloaded. What’s the point, anyway? If you or your developers have nothing to add, just don’t. By default, Google Tag Manager initiates a dataLayer object whenever GTM container snippet is loaded so there’s no need to define it manually.


If you want to download a PDF version of this checklist, enter your email address in the form below. Only new subscribers will get the email with download link. Current Analytics Mania subscribers can find a PDF download link in Analytics Mania’s weekly newsletters, sent after Nov. 21st.



Now, that your team is introduced to what the Data Layer is and how to work with it, let’s preload it with some valuable data.

#16. Is user logged in? You can create certain triggers based on it, e.g. display a popup for users who aren’t logged in. This is also a valuable custom dimension in Google Analytics.

#17. Pricing plan/membership status. Is the user using Free or Premium plan?

#18. User ID. 

#19. IP address. This is really useful for those who want to filter out the internal traffic and block tags from firing.

#20. Satisfaction/Net Promoter Score. If you’re collecting data regarding customers’ satisfaction score or NPS, this could be used as a custom dimension in Google Analytics. See how both satisfied and unhappy users are using your website or web app. You definitely find what to improve!

#21. Demographic information, including age, gender, etc.

#22. A number of payments/purchases. 

#23. Number of sessions.

#24. Total spend. How much did this customer spend on your products/services?

#25. User preferences. Use of favorites, wish list, or other options you may offer that allow visitors to personalize their view of your site.



Here’s the data that’s crucial for businesses who want to implement Google Analytics Standard or Enhanced E-commerce tracking. Also, this data might be useful for other tracking tools.

#26. Transaction ID.

#27. Transaction subtotal.

#28. Transaction Total.

#29. Store or affiliation from which this transaction occurred (e.g. Google Store).

#30. Currency code.

#31. Product ID (or SKU).

#32. Product price.

#33. Product quantity.

#34. Tax and shipping.

#35. Product name.

#36. Product category. The category to which the product belongs (e.g. Apparel). Use / as a delimiter to specify up to 5-levels of hierarchy (e.g. Apparel/Men/T-Shirts).

#37. Product brand.

#38. Product variant, e.g. black.

#39. Product position in a list or collection, e.g. 2.

#40. Coupon code associated with a product, e.g. BLACK_FRIDAY30.

#41. Promotion ID, e.g. BFCM_1234.

#42. Promotion name, e.g. Black Friday Sale.

#43. Promotion creative, e.g. black_friday_banner2.

#44. Promotion position. The position of the creative, e.g. banner_slot_1.


Other Page Information

#45. Number of reviews and the final score (the data related to the Product Page).

#46. Number of words in a blog post/article. This way you can see how the length of the post correlates with user behavior. You can also ask a developer to push ranges of article length. For example, short posts could be assigned to the range, called 0-500 words, while others could be 501-1000, 1001-1500 words, etc.

#47. Blog post/article author.

#48. Publication date.

#49. Number of comments. 

#50. Number of upvotes, downvotes, the final score.

#51. Article/blog post category, tags.


Tags, Triggers, Variables

I hope to add more items to this section because right now there are only two of them, one related to triggers and the other one to variables.

#52. Use Google Analytics Settings Variable. I can’t believe I have to add this item to the list but I still sometimes see others launching new projects without this variable.

#53. Use Regular Expressions in triggers instead of creating multiple triggers and add them to one tag.


Google Analytics E-commerce Tracking

After a developer has preloaded the Data Layer with e-commerce data, you need to create Universal Analytics tags which would automatically fetch the data and send it to Google Analytics.

#54. Standard E-commerce Tracking – create a Universal Analytics tag (type: Transaction) which fetches the data from the Data Layer. Learn more about it in Google’s documentation.

#55. Enhanced E-commerce – Send Product Impression data with a Universal Analytics Tag (if applicable).

#56. Enhanced E-commerce – Send Product Click with a Universal Analytics Tag (if applicable).

#57. Enhanced E-commerce – Send Product Detail Impression with a Universal Analytics Tag (if applicable).

#58. Enhanced E-commerce – Send Add / Remove from the cart with a Universal Analytics Tag (if applicable).

#59. Enhanced E-commerce – Send Promotion Impressions with a Universal Analytics Tag (if applicable).

#60. Enhanced E-commerce – Send Promotion Clicks with a Universal Analytics Tag (if applicable).

#61. Enhanced E-commerce – Send Checkout data with a Universal Analytics Tag (if applicable).

#62. Enhanced E-commerce – Send Purchases with a Universal Analytics Tag (if applicable).

#63. Triple-check whether all Enhanced E-commerce data is syntactically flawless. Learn more about it.



#64. Check if Cross-Domain Tracking in Google Analytics is set up correctly: Enable Linker, set Auto Link domains, update Referral Exclusion List in Google Analytics Property.

#65. Move <noscript> parts away from custom HTML tags and use Custom Image tags, instead. The only tag that works when JS is disabled in a web browser is a Custom Image tag.

#66. Found some tracking scripts online and used them in GTM? Show those scripts to developers, first. There’s always a possibility that a little script will break your website or put it at risk. Showing a script to a programmer will take less than 5 minutes and might save your ass.

#67. Do the final test and say one last prayer before the deployment. I’m not a religious person but any measure can help now 🙂  Working with Enhanced E-commerce or iFrames? Say two prayers, then.

Pray gif

#68. After the deployment. Are there any JavaScript errors on the console? Use TrackJS or any other tool of your choice to check.


Google Tag Manager Checklist – Final Words

I hope you found at least some parts of this Google Tag Manager checklist useful. Make sure you bookmark the page for the future use.

If you want to access this list offline, sign up to Analytics Mania mailing list and get it straight to your inbox. If you’re already a subscriber, check the latest newsletter you’ve received. There’s a download link down there.

Did I miss anything else regarding the list? If yes, let me know in the comments as well.

Feel free to download the GTM checklist (as PDF) by entering your email address in the form below or hereOnly new subscribers will get the email with download link. Current Analytics Mania subscribers can find a PDF download link in Analytics Mania’s weekly newsletters, sent after Nov. 21st.

Julius Fed

Head of Developer Operations at Omnisend. I am highly interested in Google Tag Manager, Google Analytics, Adwords, Email marketing, Email Deliverability, Digital Marketing in general. You can follow me on Twitter.