[Customer Pixel] Configure Google Ads Conversion Tracking for Add Contact Info Events on Shopify

Learn how to set up Google Ads conversion tracking for add contact info events on your Shopify store using Google Tag Manager and a customer pixel. Improve your customer tracking data.

Shahzada Ali Hassan

1 min read

View full size

Check your site's tracking

Enter your website to see how good its tracking is, and whether Meta is likely restricting it.

Run a free audit
add_contact_info.js
1// Initialize the dataLayer 2window.dataLayer = window.dataLayer || []; 3(function (w, d, s, l, i) { 4 w[l] = w[l] || []; 5 w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" }); 6 var f = d.getElementsByTagName(s)[0], 7 j = d.createElement(s), 8 dl = l != "dataLayer" ? "&l=" + l : ""; 9 j.async = true; 10 j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; 11 f.parentNode.insertBefore(j, f); 12})(window, document, "script", "dataLayer", "GTM-XXXXX"); 13// Function to log event to console with enhanced visibility 14function logEventToConsole(dataLayerEvent) { 15 const customStyle01 = 16 "color: #FFFF00; background-color: #000000; font-size: 10px; font-weight: bold; padding: 2px 0;"; 17 console.log("%cDataLayer Event: add_contact_info ", customStyle01, dataLayerEvent); 18} 19// Subscribe to contact info submitted events 20analytics.subscribe("checkout_contact_info_submitted", (event) => { 21 const getEventData = (obj, path, fallback = "") => { 22 return ( 23 path.split(".").reduce((acc, part) => { 24 if (acc && part.includes("[")) { 25 const [key, index] = part.replace("]", "").split("["); 26 return acc[key] ? acc[key][index] : undefined; 27 } 28 return acc ? acc[part] : undefined; 29 }, obj) || fallback 30 ); 31 }; 32 // Prepare data objects with safe fallbacks 33 const page_data = { 34 hostname: getEventData(event, "context.document.location.hostname"), 35 location_query_string: getEventData(event, "context.document.location.href"), 36 path: getEventData(event, "context.document.location.pathname"), 37 referrer: getEventData(event, "context.document.referrer"), 38 page_title: getEventData(event, "context.document.title"), 39 url: getEventData(event, "context.document.location.href"), 40 }; 41 const user_data = { 42 id: getEventData(event, "data.checkout.order.customer.id") || event.clientId, 43 phone: getEventData(event, "data.checkout.shippingAddress.phone"), 44 email: getEventData(event, "data.checkout.email"), 45 address: { 46 city: getEventData(event, "data.checkout.shippingAddress.city"), 47 address: getEventData(event, "data.checkout.shippingAddress.address1"), 48 state: getEventData(event, "data.checkout.shippingAddress.state"), 49 country: getEventData(event, "data.checkout.shippingAddress.country"), 50 postal_code: getEventData(event, "data.checkout.shippingAddress.zip"), 51 first_name: getEventData(event, "data.checkout.shippingAddress.firstName"), 52 last_name: getEventData(event, "data.checkout.shippingAddress.lastName"), 53 }, 54 language: getEventData(event, "context.navigator.language"), 55 userAgent: getEventData(event, "context.navigator.userAgent"), 56 }; 57 const event_data = { 58 timestamp: event.timestamp || "", 59 id: event.id || "", 60 }; 61 // E-commerce data 62 const ecommerce_data = { 63 currency: getEventData(event, "data.checkout.currencyCode"), 64 value: getEventData(event, "data.checkout.totalPrice.amount"), 65 shipping: getEventData(event, "data.checkout.shippingLine.price.amount"), 66 tax: getEventData(event, "data.checkout.totalTax.amount"), 67 coupon: getEventData(event, "data.checkout.discountApplications[0].code", ""), 68 items: event.data.checkout.lineItems.map((item, index) => ({ 69 item_id: getEventData(item, "variant.product.id"), 70 item_name: getEventData(item, "variant.product.title"), 71 item_brand: getEventData(item, "variant.product.vendor"), 72 item_category: getEventData(item, "variant.product.type"), 73 price: getEventData(item, "variant.price.amount"), 74 item_variant: 75 getEventData(item, "variant.title") || getEventData(item, "variant.untranslatedTitle"), 76 item_list_name: "Checkout", 77 index: index + 1, 78 product_id: getEventData(item, "variant.id"), 79 product_image: getEventData(item, "variant.image.src"), 80 product_url: getEventData(item, "variant.product.url"), 81 product_untranslatedTitle: getEventData(item, "variant.product.untranslatedTitle"), 82 product_sku: getEventData(item, "variant.sku"), 83 quantity: getEventData(item, "quantity"), 84 })), 85 }; 86 // Combine all data into a single object 87 const dataLayerEvent = { 88 event: "gtm_custom_event", 89 datalayer_event_name: "add_contact_info", 90 user_data: user_data, 91 event_data: event_data, 92 ecommerce: ecommerce_data, 93 page_data: page_data, 94 }; 95 // Push the event to dataLayer 96 window.dataLayer.push(dataLayerEvent); 97 // Log the event with styled console output 98 logEventToConsole(dataLayerEvent); 99});

Set up in about 5 minutes. Events in Events Manager within about 30.

~5 min setupwithin ~30 min
Setting up
  • 7-day free trialon every eligible domain, one per domain
  • $297/moper subdomain
  • We set up the first domain with youfounder included
  • 30-day money-back guaranteeand cancel any time in the trial
  • We keep working with youuntil it is fixed

Payment method required at checkout. One trial per domain. The 30 minutes start once tracking is installed and events fire; it is visibility in Events Manager, not same-day ROAS.