Your website used repeated id="lead_whatsapp" across 9 different HTML elements (buttons and links). In HTML, IDs must be unique - using the same ID multiple times is semantically incorrect and violates HTML standards, even though browsers may tolerate it.
Replaced all duplicate IDs with semantic data-whatsapp-link attributes and updated JavaScript to use modern CSS selectors.
_includes/button.html<a href="#" id="lead_whatsapp" class="btn btn-primary" ...><a href="#" data-whatsapp-link class="btn btn-primary" ...>_layouts/default.htmlid="lead_whatsapp"data-whatsapp-link attribute_includes/footer.htmlid="lead_whatsapp"data-whatsapp-link attributeblog/index.htmlid="lead_whatsapp"data-whatsapp-link attribute_servicios/administracion-redes-sociales.html (4 service package buttons)id="lead_whatsapp"data-whatsapp-link attributejs/code.js - WhatsAppModule classChange 1: Updated Selector (Line 158)
// BEFORE
const links = document.querySelectorAll("a#lead_whatsapp");
// AFTER
const links = document.querySelectorAll("[data-whatsapp-link]");
Why:
<a> tags with ID “lead_whatsapp”data-whatsapp-linkChange 2: Enhanced Tracking Function (Lines 576-595)
// BEFORE
trackWhatsAppClick() {
if (typeof gtag !== 'undefined') {
gtag('event', 'whatsapp_click', {
event_category: 'conversion',
event_label: window.location.pathname,
value: 1
});
}
}
// AFTER
trackWhatsAppClick() {
// Push event to GTM dataLayer for proper tracking
if (window.dataLayer) {
window.dataLayer.push({
event: 'whatsapp_contact',
event_category: 'engagement',
event_label: 'whatsapp_link_click',
page_path: window.location.pathname,
page_title: document.title,
timestamp: new Date().toISOString()
});
}
// Fallback for older gtag implementation
if (typeof gtag !== 'undefined') {
gtag('event', 'whatsapp_contact', {
event_category: 'engagement',
event_label: 'whatsapp_link_click',
page_path: window.location.pathname,
value: 1
});
}
}
Why:
whatsapp_contact (more semantic)All button and link functionality remains exactly the same:
The refactoring is purely structural - same behavior, better code.
dataLayer.push() methoddata-whatsapp-source)data-whatsapp-link[data-whatsapp-link]The attribute selector [data-whatsapp-link] can match:
<!-- Works with any element -->
<a data-whatsapp-link>Link</a>
<button data-whatsapp-link>Button</button>
<div data-whatsapp-link>Div</div>
<!-- With any value (ours has no value, but could) -->
<a data-whatsapp-link="header">Header Link</a>
<a data-whatsapp-link="footer">Footer Link</a>
<!-- With classes, styles, or other attributes -->
<a href="#" data-whatsapp-link class="btn btn-primary">Contact</a>
Your JavaScript now pushes:
{
event: 'whatsapp_contact', // Event name for GTM
event_category: 'engagement', // User interaction type
event_label: 'whatsapp_link_click', // Specific action
page_path: '/servicios/', // Current page
page_title: 'Servicios - Since', // Page title
timestamp: '2025-12-12T14:30:45.123Z' // When it happened
}
This structure is perfect for GTM variables and GA4 event parameters.
# Look for any remaining id="lead_whatsapp" (should find 0)
grep -r 'id="lead_whatsapp"' .
# Should find 9 instances of data-whatsapp-link
grep -r 'data-whatsapp-link' .
console.log(dataLayer) (last 5 entries)whatsapp_contact event with all datawhatsapp_contact eventsdata-whatsapp-source attributes for advanced trackingTo revert changes, simply:
data-whatsapp-link back to id="lead_whatsapp"[data-whatsapp-link] to a#lead_whatsappHowever, this is not recommended as the new approach is better.
Refer to:
GTM_ANALYTICS_SETUP_GUIDE.mdRefactoring Date: December 12, 2025
Status: ✅ Complete and Ready for Deployment