CMS Development

GKostadinova
Participant | Elite Partner
Participant | Elite Partner

Dedupe Contacts with Programmable Automations

Hi,
I am trying to set up a workflow with custom code to automatically deduplicate and merge contacts. See my code below. However, for some reason I am getting an error: " ERROR Unhandled Promise Rejection{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"TypeError: Cannot read properties of undefined (reading 'properties')"

 

 

 

const DEDUPE_PROPERTY = 'firstname';
const hubspot = require('@hubspot/api-client');

exports.main = (event, callback) => {
  // Make sure to add your API key under "Secrets" above.
  const hubspotClient = new hubspot.Client({
    accessToken: process.env.secretName
  });

  hubspotClient.crm.contacts.basicApi
    .getById(event.object.objectId, [DEDUPE_PROPERTY])
    .then(contactResult => {
      let dedupePropValue = contactResult.body.properties[DEDUPE_PROPERTY];

      console.log(`Looking for duplicates based on ${DEDUPE_PROPERTY} = ${dedupePropValue}`);
      hubspotClient.crm.contacts.searchApi
        .doSearch({
          filterGroups: [{
            filters: [{
              propertyName: DEDUPE_PROPERTY,
              operator: 'EQ',
              value: dedupePropValue
            }]
          }]
        })
        .then(searchResults => {
          let idsToMerge = searchResults.body.results
            .map(object => object.id)
            .filter(vid => Number(vid) !== Number(event.object.objectId));

          if (idsToMerge.length == 0) {
            console.log('No matching contact, nothing to merge');
            return;
          } else if (idsToMerge.length > 2) {
            console.log(`Found multiple potential contact IDs ${idsToMerge.join(', ')} to merge`);
            throw new Error("Ambiguous merge; more than one matching contact");
          }

          let idToMerge = idsToMerge[0];
          console.log(`Merging enrolled contact id=${event.object.objectId} into contact id=${idToMerge}`);
          hubspotClient
            .apiRequest({
              method: 'POST',
              path: `/contacts/v1/contact/merge-vids/${idToMerge}`,
              body: {
                vidToMerge: event.object.objectId
              }
            })
            .then(mergeResult => {
              console.log('Contacts merged!');
            });
        });
    });
};

 

 

 

2 Replies 2
himanshurauthan
Thought Leader | Elite Partner
Thought Leader | Elite Partner

Dedupe Contacts with Programmable Automations

Hello @GKostadinova 

The error you're seeing suggests that the contactResult.body object is undefined, which means that there is no properties property to read from it. This could happen if the contactResult object is not properly formed, or if the API call to hubspotClient.crm.contacts.basicApi.getById is failing for some reason.

One possible solution is to add error handling to your code to catch any errors that occur during the API calls.

You can do this by adding a .catch() block to each of your API calls, like this:

hubspotClient.crm.contacts.basicApi
    .getById(event.object.objectId, [DEDUPE_PROPERTY])
    .then(contactResult => {
        // ...
    })
    .catch(err => {
        console.error('Error getting contact by ID:', err);
        callback(err);
    });

 

This will log any errors that occur to the console and pass the error back to the calling function using the callback function.

You can add similar error handling to the other API calls in your code to make it more robust and easier to debug.

Digital Marketing & Inbound Expert In Growth Hacking Technology
GKostadinova
Participant | Elite Partner
Participant | Elite Partner

Dedupe Contacts with Programmable Automations

Thanks for your suggestion. I did add the error handliong code and it does show the error:

TypeError: Cannot read properties of undefined (reading 'properties')
0 Upvotes