ZoomInfo, is a popular data enrichment provider used by CaliberMind customers. The most common use case is to append personal and firmographic data into the CTM via contact or account enrichment.

However, CaliberMind customers using ZoomInfo’s WebSights product can get additional benefit from this data. WebSights identifies visitors on the website by IP address. CaliberMind can sync this data up in the warehouse to deanonymize visitors still unknown to CaliberMind. This pertains specifically to visitor that have not ever “filled out a form”. So while we may not know their email, using ZoomInfo’s data we can still track this event under a given CRM account to flag them as surging. Using this data, we can help improve account prioritization for sales and marketing by targeting account already interested in our website.

Step 1 – Verify the ZoomInfo WebSights data is live in the browser’s “localStorage”.

  • Log into the ZoomInfo admin portal, enable the website personalization setting.
  • Open up the developer tools in your browser
  • While In the console mode type “localStorage”
  • Expand the result– to check to see if the “_ziVisitorInfo” section is showing

If this section is not populating work with your web team and ZoomInfo technical support to enable this feature.

  • If you’re seeing this populate, you’re ready to move on to step 2

Step 2 – Verify the CaliberMind “Page” Call is firing on your site

  1. If you do not have Analytics.JS installed on your site, please refer to the installation guide found here.
  2. To test the installation please see this article: Checking your AnalyticsJS Installation.

Step 3 – Install an additional JavaScript Listener

You’re finally ready to pull in ZoomInfo data into an Analytics “group” call. This will send the company info to the warehouse for matching.

That’s it.. You are now enriching visitors in your web tracker and you’re ready for anonymous scoring and attribution!

Here’s a sample code to implement an AnalyticsJS listener for ZoomInfo

<!-- ZoomInfo to MetaRouter Group Listener -->
<!-- Paste this script tag anywhere on your page after analytics.js loads, e.g. at the bottom of your page just above the </body> tag. -->

<script>
(function() {
  'use strict';

  // Function to send ZoomInfo data to MetaRouter
  function sendZoomInfoToMetaRouter() {
    try {
      // Check if analytics is available
      if (typeof analytics === 'undefined') {
        console.warn('MetaRouter analytics object not found');
        return;
      }

      // Retrieve ZoomInfo data from localStorage
      const ziData = localStorage.getItem('_ziVisitorInfo');
      
      if (!ziData) {
        console.log('No ZoomInfo visitor data found in localStorage');
        return;
      }

      // Parse the JSON data
      const parsedData = JSON.parse(ziData);
      
      // Check if we have valid data with company information
      if (!parsedData || !parsedData.ziDetails || !parsedData.ziDetails.companyName) {
        console.log('ZoomInfo data missing company details');
        return;
      }

      // Extract relevant fields from ZoomInfo data
      const ziDetails = parsedData.ziDetails;
      const companyName = ziDetails.companyName;
      
      // Strip www. from website domain
      let companyDomain = ziDetails.website;
      if (companyDomain && companyDomain.startsWith('www.')) {
        companyDomain = companyDomain.substring(4);
      }
      
      // Prepare the group traits with all fields
      const groupTraits = {
        payload: ziData, // The entire JSON blob as a string
        datasource: 'ZoomInfo',
        company_domain: companyDomain,
        company_size: ziDetails.employeeCount ? String(ziDetails.employeeCount) : null,
        company_revenue: ziDetails.revenue ? String(ziDetails.revenue) : null,
        company_name: companyName
      };

      // Send to MetaRouter using the group method
      analytics.group(companyName, groupTraits);
      
      console.log('ZoomInfo data sent to MetaRouter for company:', companyName);
      console.log('Group traits:', groupTraits);
      
    } catch (error) {
      console.error('Error sending ZoomInfo data to MetaRouter:', error);
    }
  }

  // Wait for analytics to be ready and then send data
  if (typeof analytics !== 'undefined' && analytics.ready) {
    analytics.ready(function() {
      sendZoomInfoToMetaRouter();
    });
  } else {
    // Fallback: try after a short delay if analytics isn't ready yet
    setTimeout(sendZoomInfoToMetaRouter, 1000);
  }

  // Optional: Listen for changes to localStorage (if ZoomInfo updates the data)
  window.addEventListener('storage', function(e) {
    if (e.key === '_ziVisitorInfo' && e.newValue) {
      sendZoomInfoToMetaRouter();
    }
  });

})();
</script>

Step 4 – Validate in CaliberMind

After the above steps have been confirmed, contact your CSM or technical support to do a final validation of your system tables. Once validated, you’ll see additional touchpoints on the buyer journey on surging accounts. Your CaliberMind Engagement scores will contain additional surges, bubbling up and scoring accounts to target. Scores are updated nightlyinitial data may take up to 24hrs to show up in CaliberMind.