Activate ZoomInfo firmographic data
Target high-intent accounts with a tailored message using ZoomInfo data.
In this tutorial, you will create an experience that displays personalized website content based on a visitor's firmographic data from ZoomInfo.
By the end, your website will dynamically adapt to an account's industry, company name, or employee count in real time.
Since ZoomInfo usually takes a few moments to load, the firmographic data might not be available on the first page view.
Prerequisites
Before you start, make sure you have:
- A Croct account with a workspace and application set up.
- The Croct SDK installed in your project.
- The ZoomInfo WebSights enabled on your website, with Website Personalization turned on in the domain configuration.
Send data from ZoomInfo to Croct
To personalize the experience, you first need to capture the firmographic data identified by ZoomInfo and store it in Croct's user profile.
In this tutorial, we will use Google Tag Manager (GTM) to wait for ZoomInfo to resolve the visitor and push the resulting data directly into the user's profile.
Configure a custom HTML
In Google Tag Manager, select Tags > New.
Name the tag as Send ZoomInfo data to Croct.
Set tag type to Custom HTML.
Copy and paste the following code into the HTML field:
Custom HTML tag12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455<script> (function() { // Check status from session storage var status = sessionStorage.getItem('croctUpdated'); if (status === 'true') { return; } var CROCT_MAX_ATTEMPTS = 5; var CROCT_RETRY_DELAY_MS = 1000; function tryActivate(attempt) { // Retrieve ZoomInfo data from local storage var details = localStorage.getItem('_ziVisitorInfo'); if (details === null) { console.log('ZoomInfo data not found.'); return; } var data = JSON.parse(details); if (data.status !== 'success' || !data.ziDetails) { if (attempt < MAX_ATTEMPTS) { setTimeout(function() { tryActivate(attempt + 1); }, CROCT_RETRY_DELAY_MS); } else { console.log('ZoomInfo data not found after ' + CROCT_MAX_ATTEMPTS + ' attempts.'); } return; } // Push data to Croct croct.user.edit() .set('company', data.companyName) .set('companyUrl', data.website) .set('custom.industry', data.primaryIndustry) .set('custom.employees', data.employeeCount) .set('custom.revenue', data.revenue) .set('custom.firmographic.source', 'ZoomInfo') .save(); // Track event croct.track('eventOccurred', {name: 'ZommInfoDataRetrieved'}) // Update status to prevent updates on every pageview sessionStorage.setItem('croctUpdated', 'true'); } tryActivate(1); })();</script>You can customize the patch payload to track additional data:
Add new attributes123456789croct.user.edit() .set('company', data.companyName) .set('companyUrl', data.website) .set('custom.industry', data.primaryIndustry) .set('custom.employees', data.employeeCount) .set('custom.revenue', data.revenue) .set('custom.companyFunding', data.companyFunding) .set('custom.firmographic.source', 'ZoomInfo') .save();Check the ZoomInfo WebSights documentation (page 11) for the full list of available data points, and the user reference for attributes.
Select the trigger Window Loaded to fire this on all pages.
Click Save.
Your tag should look like this:

This step assumes WebSights payload encryption is off (the default). If your domain has the Decryption Key toggle enabled, _ziVisitorInfo.ziDetails is returned as an encrypted string and must be decrypted with CryptoJS using the key from the Admin Portal before it can be read. See the ZoomInfo WebSights guide (page 15) for the decryption snippet.
Check user profiles
Once your GTM tag is published and active, you can verify that the integration is working.
Open the user profiles page in the admin app.
Filter users using the Custom attributes or Work info tags and open one profile.
Open the Attributes tab and confirm that the firmographic data has been successfully ingested.

Create experiences
Now that Croct is receiving data from ZoomInfo, you can create audiences and personalize experiences.