Listas, pontuação de leads e fluxo de trabalho

AdoilsonCruz
Membro

Problema no código personalizado para validar propriedades de contato e objeto personalizado.

resolver

Olá, pessoal! Espero que estejam bem.

 

Desenvolvi um fluxo de trabalho que utiliza código personalizado para validar dados e avançar o lead para a próxima etapa do pipeline. Vou descrever brevemente como o fluxo funciona e, em seguida, explicar o problema que estou enfrentando para ver se vocês podem me ajudar.

 

  1. Formulário Enviado:
    O cliente envia um formulário que atualiza a conversão de um contato no HubSpot.
  2. Criação de Negócio:
    Um negócio é automaticamente criado na primeira etapa do pipeline chamado "Eventos".
  3. Validação de Dados:
    O fluxo utiliza uma ação de código no Operations Hub para validar se os campos "E-mail" e "ID do Sistema" do contato possuem os mesmos valores que os campos correspondentes no objeto personalizado "Conta".

    - E-mail de Contato: email
    - E-mail de Conta: e_mail
    - ID do Sistema de Contato: id_do_sistema
    - ID do Sistema de Conta: id_do_sistema

  4. Movimentação no Pipeline:
  • Se os valores forem iguais, o negócio associado ao contato deve ser movido para a etapa "Validado" do pipeline.
  • Se forem diferentes, o negócio deve permanecer na etapa "Em Validação" do pipeline.

 

Erro que Está Acontecendo:

Apesar de o código retornar os resultados esperados da API (como o objeto "Conta"), o fluxo exibe a mensagem de erro:
"Nenhuma conta correspondente encontrada."

O log mostra claramente que a API retorna resultados válidos, mas o código parece não reconhecer isso.
Mesmo quando os dados são consistentes, a validação não move o negócio para a etapa correta do pipeline.

Segue abaixo o link do código:

https://gist.github.com/AdoilsonCruz/90e3e365805821be8693f48c204c4863

0 Avaliação positiva
1 Solução aceita
Brenner
Solução
Especialista reconhecido(a)

Problema no código personalizado para validar propriedades de contato e objeto personalizado.

resolver

Olá @AdoilsonCruz , espero que você esteja bem! 

 

Segue abaixo, uma resposta um pouco longa, mas eu acredito que passamos por todas as possibilidades, dado este contexto: 

 

  1. Verifique a resposta da API de busca de contas:

    • No código, você está buscando uma "conta" usando hubspotClient.crm.objects.searchApi.doSearch(). Certifique-se de que a "conta" que você está buscando está realmente configurada como esperado no HubSpot. O nome do objeto ("conta") pode não corresponder ao nome do objeto personalizado ou ao tipo de objeto que você criou na sua conta HubSpot.
    • Você pode adicionar um console.log() para verificar o conteúdo retornado pela API.
    const searchResults = await hubspotClient.crm.objects.searchApi.doSearch("conta", {
      filterGroups: [
        {
          filters: [
            { propertyName: "id_do_sistema", operator: "EQ", value: contactProperties.id_do_sistema }
          ]
        }
      ],
      properties: ["e_mail", "id_do_sistema"]
    });
    
    console.log('Resultado da busca de conta:', searchResults.body);
    

    Isso ajudará a identificar se os dados estão sendo retornados corretamente pela API de pesquisa de contas. Se o resultado for vazio, você pode ajustar os filtros ou os parâmetros de busca.

  2. Certifique-se de que as propriedades de "id_do_sistema" estão consistentes:

    • No código, você está buscando o valor de id_do_sistema tanto no contato quanto na conta. Garanta que o nome da propriedade que você está usando no filtro (no caso, id_do_sistema) seja exatamente o mesmo tanto no objeto de contato quanto no objeto de conta no HubSpot.
    • Para verificar isso, você pode imprimir as propriedades retornadas e garantir que os dados de id_do_sistema e email estão corretos.
    console.log('Propriedades do contato:', contactProperties);
    console.log('Propriedades da conta:', accountProperties);
    
  3. Trate a busca com mais detalhes:

    • No caso de a busca retornar múltiplos resultados ou nenhum, você pode melhorar a lógica de tratamento de erros e ter mais clareza sobre o que está acontecendo.
    const results = searchResults.body?.results || [];
    if (results.length === 0) {
      callback({ outputFields: { isValid: false, message: "Conta não encontrada." } });
      console.log('Nenhuma conta encontrada com id_do_sistema:', contactProperties.id_do_sistema);
      return;
    }
    
    const account = results[0];
    
  4. Validação de valores de e-mail:

    • Se os valores de "email" do contato e "e_mail" da conta não corresponderem exatamente, a validação falhará. Verifique se não há diferenças sutis, como espaços extras, maiúsculas/minúsculas, etc.
    const isEmailValid = contactProperties.email.trim().toLowerCase() === accountProperties.e_mail.trim().toLowerCase();
    
  5. Verifique a lógica de movimentação de negócios:

    • Após a validação, você está buscando o primeiro negócio associado ao contato. Caso o negócio associado não seja encontrado, você retorna uma mensagem de erro. No entanto, se o fluxo de trabalho estiver configurado de maneira incorreta, talvez o negócio ainda não tenha sido criado ou associado ao contato de maneira adequada.
  6. Dica adicional:

    • Caso a lógica de movimentação do negócio ainda não esteja funcionando conforme o esperado, verifique se a pipeline_stage que você está utilizando ("validado") está corretamente configurada no HubSpot para que o negócio seja movido para essa etapa.

Sugestão de alteração no código:

Aqui está uma versão levemente ajustada com base nas sugestões:

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

exports.main = async (event, callback) => {
  const hubspotClient = new hubspot.Client({ accessToken: process.env.HUBSPOT_API_KEY });

  try {
    const contactId = event.object.objectId;

    console.log(`Buscando contato com ID: ${contactId}`);

    // Buscar dados do contato
    const contact = await hubspotClient.crm.contacts.basicApi.getById(contactId, ["id_do_sistema", "email"]);

    if (!contact || !contact.properties) {
      callback({ outputFields: { isValid: false, message: "Contato inválido ou ausente." } });
      return;
    }

    const contactProperties = contact.properties;

    // Buscar conta relacionada
    const searchResults = await hubspotClient.crm.objects.searchApi.doSearch("conta", {
      filterGroups: [
        {
          filters: [
            { propertyName: "id_do_sistema", operator: "EQ", value: contactProperties.id_do_sistema }
          ]
        }
      ],
      properties: ["e_mail", "id_do_sistema"]
    });

    console.log('Resultado da busca de conta:', searchResults.body);

    const results = searchResults.body?.results || [];
    if (results.length === 0) {
      callback({ outputFields: { isValid: false, message: "Conta não encontrada." } });
      return;
    }

    const account = results[0];
    const accountProperties = account.properties;

    // Validar os valores
    const isEmailValid = contactProperties.email.trim().toLowerCase() === accountProperties.e_mail.trim().toLowerCase();
    const isIdValid = contactProperties.id_do_sistema === accountProperties.id_do_sistema;

    if (isEmailValid && isIdValid) {
      // Buscar negócios associados ao contato
      const deals = await hubspotClient.crm.objects.associationsApi.getAll("contacts", contactId, "deals");
      if (deals.body.results.length === 0) {
        callback({ outputFields: { isValid: false, message: "Nenhum negócio associado encontrado." } });
        return;
      }

      const dealId = deals.body.results[0].id;

      // Atualizar etapa do pipeline para "Validado"
      await hubspotClient.crm.deals.basicApi.update(dealId, {
        properties: { pipeline_stage: "validado" }
      });

      callback({
        outputFields: {
          isValid: true,
          message: "Dados consistentes e negócio movido para a etapa 'Validado'."
        }
      });
    } else {
      callback({
        outputFields: {
          isValid: false,
          message: "Dados inconsistentes. Negócio mantido na etapa 'Em Validação'."
        }
      });
    }
  } catch (e) {
    callback({ outputFields: { isValid: false, message: `Erro: ${e.message}` } });
  }
};

Com isso, você deve conseguir depurar melhor o que está acontecendo. Verifique as respostas da API e a correspondência dos dados.

 

Obrigado, @BérangèreL pela menção aqui no post



Brenner Natal



HubSpot Consultant | Inbound Marketer



--------------------------------------------------


Se a minha resposta te ajudou, por gentileza, clique no botão: " Aceitar como solução ".
Ainda com dúvidas? Responda a minha postagem para que possamos continuar te ajudando!
Obrigado por postar na comunidade da HubSpot! .



Exibir solução no post original

2 Respostas 2
Brenner
Solução
Especialista reconhecido(a)

Problema no código personalizado para validar propriedades de contato e objeto personalizado.

resolver

Olá @AdoilsonCruz , espero que você esteja bem! 

 

Segue abaixo, uma resposta um pouco longa, mas eu acredito que passamos por todas as possibilidades, dado este contexto: 

 

  1. Verifique a resposta da API de busca de contas:

    • No código, você está buscando uma "conta" usando hubspotClient.crm.objects.searchApi.doSearch(). Certifique-se de que a "conta" que você está buscando está realmente configurada como esperado no HubSpot. O nome do objeto ("conta") pode não corresponder ao nome do objeto personalizado ou ao tipo de objeto que você criou na sua conta HubSpot.
    • Você pode adicionar um console.log() para verificar o conteúdo retornado pela API.
    const searchResults = await hubspotClient.crm.objects.searchApi.doSearch("conta", {
      filterGroups: [
        {
          filters: [
            { propertyName: "id_do_sistema", operator: "EQ", value: contactProperties.id_do_sistema }
          ]
        }
      ],
      properties: ["e_mail", "id_do_sistema"]
    });
    
    console.log('Resultado da busca de conta:', searchResults.body);
    

    Isso ajudará a identificar se os dados estão sendo retornados corretamente pela API de pesquisa de contas. Se o resultado for vazio, você pode ajustar os filtros ou os parâmetros de busca.

  2. Certifique-se de que as propriedades de "id_do_sistema" estão consistentes:

    • No código, você está buscando o valor de id_do_sistema tanto no contato quanto na conta. Garanta que o nome da propriedade que você está usando no filtro (no caso, id_do_sistema) seja exatamente o mesmo tanto no objeto de contato quanto no objeto de conta no HubSpot.
    • Para verificar isso, você pode imprimir as propriedades retornadas e garantir que os dados de id_do_sistema e email estão corretos.
    console.log('Propriedades do contato:', contactProperties);
    console.log('Propriedades da conta:', accountProperties);
    
  3. Trate a busca com mais detalhes:

    • No caso de a busca retornar múltiplos resultados ou nenhum, você pode melhorar a lógica de tratamento de erros e ter mais clareza sobre o que está acontecendo.
    const results = searchResults.body?.results || [];
    if (results.length === 0) {
      callback({ outputFields: { isValid: false, message: "Conta não encontrada." } });
      console.log('Nenhuma conta encontrada com id_do_sistema:', contactProperties.id_do_sistema);
      return;
    }
    
    const account = results[0];
    
  4. Validação de valores de e-mail:

    • Se os valores de "email" do contato e "e_mail" da conta não corresponderem exatamente, a validação falhará. Verifique se não há diferenças sutis, como espaços extras, maiúsculas/minúsculas, etc.
    const isEmailValid = contactProperties.email.trim().toLowerCase() === accountProperties.e_mail.trim().toLowerCase();
    
  5. Verifique a lógica de movimentação de negócios:

    • Após a validação, você está buscando o primeiro negócio associado ao contato. Caso o negócio associado não seja encontrado, você retorna uma mensagem de erro. No entanto, se o fluxo de trabalho estiver configurado de maneira incorreta, talvez o negócio ainda não tenha sido criado ou associado ao contato de maneira adequada.
  6. Dica adicional:

    • Caso a lógica de movimentação do negócio ainda não esteja funcionando conforme o esperado, verifique se a pipeline_stage que você está utilizando ("validado") está corretamente configurada no HubSpot para que o negócio seja movido para essa etapa.

Sugestão de alteração no código:

Aqui está uma versão levemente ajustada com base nas sugestões:

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

exports.main = async (event, callback) => {
  const hubspotClient = new hubspot.Client({ accessToken: process.env.HUBSPOT_API_KEY });

  try {
    const contactId = event.object.objectId;

    console.log(`Buscando contato com ID: ${contactId}`);

    // Buscar dados do contato
    const contact = await hubspotClient.crm.contacts.basicApi.getById(contactId, ["id_do_sistema", "email"]);

    if (!contact || !contact.properties) {
      callback({ outputFields: { isValid: false, message: "Contato inválido ou ausente." } });
      return;
    }

    const contactProperties = contact.properties;

    // Buscar conta relacionada
    const searchResults = await hubspotClient.crm.objects.searchApi.doSearch("conta", {
      filterGroups: [
        {
          filters: [
            { propertyName: "id_do_sistema", operator: "EQ", value: contactProperties.id_do_sistema }
          ]
        }
      ],
      properties: ["e_mail", "id_do_sistema"]
    });

    console.log('Resultado da busca de conta:', searchResults.body);

    const results = searchResults.body?.results || [];
    if (results.length === 0) {
      callback({ outputFields: { isValid: false, message: "Conta não encontrada." } });
      return;
    }

    const account = results[0];
    const accountProperties = account.properties;

    // Validar os valores
    const isEmailValid = contactProperties.email.trim().toLowerCase() === accountProperties.e_mail.trim().toLowerCase();
    const isIdValid = contactProperties.id_do_sistema === accountProperties.id_do_sistema;

    if (isEmailValid && isIdValid) {
      // Buscar negócios associados ao contato
      const deals = await hubspotClient.crm.objects.associationsApi.getAll("contacts", contactId, "deals");
      if (deals.body.results.length === 0) {
        callback({ outputFields: { isValid: false, message: "Nenhum negócio associado encontrado." } });
        return;
      }

      const dealId = deals.body.results[0].id;

      // Atualizar etapa do pipeline para "Validado"
      await hubspotClient.crm.deals.basicApi.update(dealId, {
        properties: { pipeline_stage: "validado" }
      });

      callback({
        outputFields: {
          isValid: true,
          message: "Dados consistentes e negócio movido para a etapa 'Validado'."
        }
      });
    } else {
      callback({
        outputFields: {
          isValid: false,
          message: "Dados inconsistentes. Negócio mantido na etapa 'Em Validação'."
        }
      });
    }
  } catch (e) {
    callback({ outputFields: { isValid: false, message: `Erro: ${e.message}` } });
  }
};

Com isso, você deve conseguir depurar melhor o que está acontecendo. Verifique as respostas da API e a correspondência dos dados.

 

Obrigado, @BérangèreL pela menção aqui no post



Brenner Natal



HubSpot Consultant | Inbound Marketer



--------------------------------------------------


Se a minha resposta te ajudou, por gentileza, clique no botão: " Aceitar como solução ".
Ainda com dúvidas? Responda a minha postagem para que possamos continuar te ajudando!
Obrigado por postar na comunidade da HubSpot! .



BérangèreL
Gerente da Comunidade
Gerente da Comunidade

Problema no código personalizado para validar propriedades de contato e objeto personalizado.

resolver

Olá @AdoilsonCruz, obrigada pela sua pergunta.

Vamos consultar nossos especialistas para ver se eles têm alguma sugestão para você.

Olá @angelopublio, @caiodonald, @Brenner, vocês por acaso têm alguma ideia que possa ajudar @AdoilsonCruz com seu objetivo?

Obrigada a todos por contribuir.
Bérangère


Saviez-vous que la Communauté est disponible en Français ?
Rejoignez les discussions francophones en changeant votre langue dans les paramètres !

Did you know that the Community is available in other languages?
Join regional conversations by changing your language settings!