Google Tag Manager Audit Example

Some of the Clients We’ve Helped

SUMMARY

1. Requirements

  • Set-up accurate Visit-to-Sale tracking.
  • Set-up macro goal conversion funnels.
  • Set-up micro form field conversion funnels.
  • Display all relevant data on dashboards

2. Issues

  • Cross-domain tracking not working.
  • Transaction counts not matching CRM system.
  • Revenue not matching CRM system.
  • Goal funnel steps were broken.
  • Marketing Channel & cmpID not recording

3. Solutions

  • Audit and resolve GTM issues.
  • Audit and resolve GA issues.
  • Link Adwords.
  • Link GoogleWebmasterTools.
  • Add GA everywhere via Adobe DTM.

4. Next Steps

  • Phone Call Tracking.
  • SEO optimisation.
  • Adwords Optimisation.
  • CRO & A/B Testing.

40 hours of SEO Analysis Within Minutes!

Fast. Secure. Free.

GTM Fixes

This audit has 3 classifications…

Audit Score

Findings & recommendations…

Good stuff

  1. Basic Naming conventions for Tags in use.
  2. GA transactions are enabled.
  3. dataLayer enabled on QuoteSummary & Thankyou pages
  4. 2 of 25 tags are in Templates
  5. Publish account access is well controlled

1. Process issues:

  • No separation of DEV vs LIVE environments in GTM hence 59% of revenue and 18% of transactions are Test orders from acturis.com in November
  • Tag Templates for GA & DC not used! (effects 92% of tags)
  • Trigger naming conventions not clear.
  • Tag & Version notes not being used.
  • ContainerVersion number not being stored in GA.
  • No evidence of Tag Taint Testing or  Auto-QA testing.

2. Code issues:

  • Direct Debit revenue showing as £0 as dataLayer.annualRevenue not populated(and patch for dataLayer.monthlyRevenue >> dataLayer.annualRevenue not present).
  • annualRevenue is too high as -10% Loyalty bonus not removed
  • ProductCategory script has a malformed JS statement on productVariations.match(‘Professionals’)===true
  • eFilling script has JS error when no value was set.
  • Unstable method used for determining virtualPageview using {{PageTitle}}. Changed to {{quoteStep}} or {{pageName}} which is much more stable!
  • {{Page URL}} used rather than {{quoteStep}} hence DEV (digidev2.Client.com) will behave differently to LIVE (www.chirchill.com) as absolute hostname used
  • Inline DataLayer reset, should be change to DataLayer append.
  • Unnecessary jQuery dependency used in customVariable – Native GTM CSS selector is safer.
  • JS errors should never be disabled using Try {} Catch{}, unless the Catch also outputs to dataLayer error listener.

3. Human errors in Tool usage:

  • Van Q&B; funnel had double-pageview causing 0% Bounce rate & 0sec AvgTimeOnPage.
  • DC tags were blocked on mobile version of Chrome – as document.write accidentally ticked on all 20 DC tags!
  • [dl_startDate] entered rather than {{dl_startDate}}
  • Safer method of using cross-domain not enabled.
  • No script tags were loaded within a

Feature Usage

  1. Critical DC & Adwords Conversion patch for Safari not enabled (called ConversionLinker).
  2. Native GTM auto-events not enabled
    – JS error tracking not enabled – hence parse error not detected
    – PDF download, mailto, tap-to-call
    – 30sec heartbeat on landing pages
    – Scroll tracking etc on blog/news pages
  1. Not utilising   5 contentGrouping
  2. Not utilising 20 customDimensions
  3. Not utilising 20 customMetrics
  4. Adwords Dynamic Remarketing not enabled.
  5. Bing Conversion Tracking missing.
  6. Facebook remarketing & SessionCam not enabled.

Missing Data Capture

Adobe cmpid / CampaignCode
Adobe Test & Target user-cohort versions
pageType (Adword required field)
quoteID (cartID)
annualQuote (cartTotal)
monthlyQuote (cartTotal)
annualRevenue (tranTotal)
monthlyRevenue (tranTotal)
quoteStep
brandName
productName

GA clientId
CRM userId
CRM loginStatus
CRM insurerPolicyNumber
mainTrade
premiumType
tradeStatus
tradeType
startDate (for Policy)
GTM event
GTM containerVersion
GTM containerID

Detail GTM usage

23 versions with 14 tags Edited 6 months ago on 6th June

Detail GTM GTM fix/change frequency…

Phils GTM changes…

  1. Clean-up existing GTM container
  2. Enabled JS error listener
  3. Enabled Enhanced Bounce Rate
  4. Enabled FormField tracking
  5. Fixed _eFilling JS error with JSON.parse error
  6. Fixed GTM bug with JS compiler on productVariation.match(“Professionals”).
  7. Standardises cross-domain tracking.
  8. Added transRevenue for DirectDebit
  9. Added 15% interest to DirectDebit TotalRevenue
  10. Added PaymentType=DirectDebit | Annual tracking
  11. Added cmpid >> utm_id tracking
  12. Added GA classic seamless migration event
  13. Added QuoteID & startDate to CustomDimensions
  14. Added QuoteValue CustomMetric
  1. Updated formFields with sequential number to make reporting easier
  2. Updated formFields tracking for ContactTitle (missing in first iteration)
  3. Updated FormField trigger to also invoke on Trademen Form
  4. Updated EE StepNo from CurrentStep to quoteStep
  5. Updated Triggers to use quoteStep as primary method
  6. Updated CurrentStep to fallback to quoteStep  or dl_pageName
  7. Updated ProductTarget to fallback to  dl_productName
  8. Updated File download trigger to copy method used by Adobe DTM
  9. Deleted inactive tags
  10. Deleted hash dependency

Native GTM auto-events enabled

  1. ERROR JS tracking
  2. ERROR 404 tracking
  3. Click on Mailto
  4. Tap to Call
  5. Click to Outbound
  6. Click to Download PDF
  1. Click on Map link
  2. Click to App download
  3. Click to Social
  4. Heartbeat after 30sec
  5. AJAX and Tab tracking
  6. YouTube Tracking

Process safeguards

Why is it crucial to separate DEV  vs LIVE?

1. Impossible to accidently publish to LIVE(i.e DEV is sandboxed)
2. Allows for code peer review process, before to approve pushing from DEV >> LIVE.
3. Full control over user-access levels (e.g. marketing restricted access on LIVE)
4. Still allows the possibly of using workspaces in DEV container – for merging changes.
5. DEV  vs LIVE is same methodology as Adobe DTM

Example of DEV vs LIVE

Inline code change for separating DEV vs LIVE…

Recommended inline code change for DEV vs LIVE…

Tag naming conventions

(BEFORE)

(AFTER)

DataLayer Planning

Critical DataLayers Variable inconsistencies

Note: Javascript is CASE sensitive

  1. Use camelCase for variable names:(e.g. productName NOT ProductName)
  2. Ideally, try to use lowercase variable values:(e.g. xxxx not XXXX ) except currency which must be capitals “GBP”

Tags functioning… Variables effect Triggers & Tags

Existing Variables…

More DataLayers Variable inconsistencies

dataLayer = [{

    ‘quoteStep’: ‘Quote Summary’,

    areaCode‘: ‘BR1 1DP

}];

dataLayer = [{

    ‘quoteStep’: ‘Quote Summary’,

    areaCode‘: ‘BR1’

}];

// Should be BR1‘ shortPostcode not fullPostcode

  • www.insurancecompany.com/Quote/YourQuote2/ (correct)
  • quotes.business-insurance.Client.com/AWE/Container.aspx?CurrentStep=QuoteSummary&ProductTarget;=PropertyOwners (wrong)

Human Erorrrs

NO script tags wont work in Custom HTML tags…

USE templates for DoubleClick DONT use customHTML for these

USE templates for DoubleClick DONT use customHTML for these

NO script tags wont work in Custom HTML tags…

Adwords conversion revenue not enabled = ROAS bidding not possible

Bing conversion not enabled = CPA bidding not possible