Troubleshooting

Chat Widget Tracking Not Working on WordPress

3 min read··By the TrackingCoder team
🔧

Common reasons chat-widget tracking doesn’t fire

  1. GTM container not published - You imported the container but didn’t click Submit → Publish.
  2. GTM snippet not installed on your site - The GTM code needs to be in your site’s <head> and <body>.
  3. Chat widget loads in a cross-origin iframe - Intercom, Drift, Crisp, Tidio, LiveChat - all render their UI inside iframes hosted on their own domains. GTM on your page cannot see clicks, opens, or message-sends inside the iframe. You need the vendor’s JS API.
  4. Widget loads asynchronously after DOM Ready - Most chat scripts are loaded with defer or via setTimeout to avoid hurting page-speed scores. A GTM listener attached on DOM Ready often fires before the widget exists. Wait for the widget’s init event or poll window.Intercom / window.drift until defined.
  5. Multiple chat widgets on the same page - Common during a vendor migration (e.g., adding Drift while leaving Intercom in place for legacy users). Both widgets emit events, your trigger fires twice, and your reports double-count.
  6. Vendor’s own analytics integration is already active - Intercom/Drift have built-in GA4 integrations. If those are on AND your GTM tag is on, you log every event twice. Pick one.

Step-by-step debugging checklist

  1. Verify GTM is installed - Visit your site, right-click → View Page Source, search for “GTM-”. If you don’t see it, GTM isn’t installed.
  2. Check GTM Preview mode - In GTM, click Preview. Navigate your site and trigger the event. Look for your tag in the Tags Fired section.
  3. Check the trigger - If the tag shows as “Not Fired”, click on it to see which trigger conditions aren’t met.
  4. Identify the vendor - Right-click the chat icon → Inspect. Look at the iframe’s src attribute or the page’s window globals (window.Intercom, window.drift, window.$crisp, etc.).
  5. Hook the vendor’s callback API - Intercom: Intercom('onShow', () => ...). Drift: drift.on('chatOpen', ...). Crisp: $crisp.push(['on', 'chat:opened', ...]). Use a Custom HTML tag in GTM that pushes to dataLayer when the callback fires.
  6. Test in GTM Preview - Open the chat. You should see your dataLayer event in the timeline. If not, the callback wasn’t hooked - most likely because the vendor’s script loaded later than your GTM tag.

How to verify it’s working

  1. Open GTM Preview/Debug mode
  2. Navigate to your site
  3. Trigger the event (open the chat widget and send a test message)
  4. Check the GTM debug panel - your tag should appear under “Tags Fired”
  5. Check GA4 DebugView (GA4 → Admin → DebugView) to confirm the event arrived

Still didn’t work?

Our team can help. Describe what’s happening and we’ll get back to you within 24 hours.

Still didn't work? Report this issue

Fill in the details below and our team will review it within 3-5 business days. We aren't obliged to refund - but if we genuinely can't make it work, we may credit you back. Either way, your credits remain usable on a different event or site.

No need to type https:// - we'll add it for you.

Min 20 characters (0/20).

Context automatically included: chat widget tracking on wordpress

Skip the manual setup

TrackingCoder detects your CMS and plugins automatically, then generates ready-to-use tracking code. No more adapting generic tutorials - get code tailored to your exact setup in under 2 minutes.

Try TrackingCoder Free →

2 free credits on signup. No card required.