HubSpot Operations Hub enrichir /
avec l'API SIREN

29/08/2023

Enrichir son CRM HubSpot en se basant sur le SIRET

Le registre du commerce à beaucoup d’informations sur vos clients, le SIRET peut vous aider à les récupérer et enrichir votre CRM.

Depuis le numéro SIRET, vous pouvez notamment récupérer la raison sociale exacte d’une entreprise son effectif ou encore son adresse postale.

Concept et démonstration

Concept de l’appel à une API via Operations Hub

Le principe est assez simple, un WorkFlow utilisera un block Custom Code pour envoyer une requête à l’API de l’INSEE pour demander des infos.
Si l’API de l’INSEE renvoie les informations, alors nous les sauvegardons dans l’objet entreprise. Rien de plus simple.

Démonstration de l’intégration

Mieux qu’un long discours, j’ai enregistré une courte vidéo qui montre cette intégration en fonctionnement. Dans cette video je vais montrer les informations que renvoie l’API à HubSpot.

Pourquoi ne peut on pas trouver le numéro SIRET d’une entreprise ?

En fait l’API SIREN le propose, mais le soucis se trouve sur la clé de recherche.Je m’explique, si vous cherchez un numéro de SIRET en se basant sur nom de l’entreprise, vous allez avoir énormement de réponses… Et que faire avec 25, 30… SIRET, comment décider celui qui correspond à l’entreprise que vous avez dans le CRM ?.. C’est compliqué, il faudrait rafiner la data.
De ce fait je n’aborderais pas ce point dans l’article.

Prérequis

Pour mettre en place cette intégration, il vous faudra Operations Hub pro, car nous allons utiliser le block custom code. Vous allez aussi avoir besoin de créer un compte sur le site de l’INSEE pour récupérer un accès à l’API.

Il va aussi vous fallour une propriété SIREN dans vos entrerprises ou contacts

Créer un compte api.insee.fr

Il vous faut un compte INSEE, rendez-vous sur cette URL pour ce faire.

Cliquez sur créer son compte

Remplissez le formulaire :

Souscrivez à l’API SIREN

Générez un jeton d’accès

J’ai mis en place un jeton d’accès qui n’expire jamais en metant la valeur la plus élevée possible, j’ai mis : 3875820019684211 secondes.

Mettre en place le workflow

Créez un WorkFlow qui se base sur entreprise ou autre.

Le trigger du WorkFlow

Installez le custom code

Séléctionnez le language

Ici notre Custom Coded Action est écrite en JavaScript il vous faut donc séléctionner Node.js comme language.

Insérez votre jetons d’accès comme secret

Nommez votre secret apiInseeToken attention de en pas rajouter ou d’enlever des majuscules ou des espaces.

Ajoutez une variable SIRET

La variable siret correspond à la porpriété qui cotient le numéro SIRET.

Ajoutez-la comme ce-ci :

Collez le code suivant :


const axios = require('axios'); const axiosConfig = { headers: { authorization: `Bearer ${process.env.apiInseeToken}` } }; exports.main = async (event, callback) => { const siret = event.inputFields.siret; if (!siret) throw new Error('siret is not set, are you sure you put siret in the "properties to include in code" ? '); const siretInfos = await getInfosFromSiret(siret).catch(axiosErrorHandler) if (!siretInfos.data) throw new Error(`We couldn't grab your siretInfos`); /** * * Etablissement DATA * **/ const { etablissement } = siretInfos.data; if (!etablissement) throw new Error(`Couldn't get the etablissement data`); const { siren, nic, statutDiffusionEtablissement, dateCreationEtablissement, trancheEffectifsEtablissement, anneeEffectifsEtablissement, activitePrincipaleRegistreMetiersEtablissement, dateDernierTraitementEtablissement, etablissementSiege, nombrePeriodesEtablissement, } = etablissement; /** * * Etablissement Unite Legale * **/ let etatAdministratifUniteLegale = null; let statutDiffusionUniteLegale = null; let dateCreationUniteLegale = null; let categorieJuridiqueUniteLegale = null; let denominationUniteLegale = null; let sigleUniteLegale = null; let denominationUsuelle1UniteLegale = null; let denominationUsuelle2UniteLegale = null; let denominationUsuelle3UniteLegale = null; let sexeUniteLegale = null; let nomUniteLegale = null; let nomUsageUniteLegale = null; let prenom1UniteLegale = null; let prenom2UniteLegale = null; let prenom3UniteLegale = null; let prenom4UniteLegale = null; let prenomUsuelUniteLegale = null; let pseudonymeUniteLegale = null; let activitePrincipaleUniteLegale = null; let nomenclatureActivitePrincipaleUniteLegale = null; let identifiantAssociationUniteLegale = null; let economieSocialeSolidaireUniteLegale = null; let societeMissionUniteLegale = null; let caractereEmployeurUniteLegale = null; let trancheEffectifsUniteLegale = null; let anneeEffectifsUniteLegale = null; let nicSiegeUniteLegale = null; let dateDernierTraitementUniteLegale = null; let anneeCategorieEntreprise = null; if (typeof etablissement.uniteLegale !== "undefined") { etatAdministratifUniteLegale = etablissement.uniteLegale.etatAdministratifUniteLegale; statutDiffusionUniteLegale = etablissement.uniteLegale.statutDiffusionUniteLegale; dateCreationUniteLegale = etablissement.uniteLegale.dateCreationUniteLegale; categorieJuridiqueUniteLegale = etablissement.uniteLegale.categorieJuridiqueUniteLegale; denominationUniteLegale = etablissement.uniteLegale.denominationUniteLegale; sigleUniteLegale = etablissement.uniteLegale.sigleUniteLegale; denominationUsuelle1UniteLegale = etablissement.uniteLegale.denominationUsuelle1UniteLegale; denominationUsuelle2UniteLegale = etablissement.uniteLegale.denominationUsuelle2UniteLegale; denominationUsuelle3UniteLegale = etablissement.uniteLegale.denominationUsuelle3UniteLegale; sexeUniteLegale = etablissement.uniteLegale.sexeUniteLegale; nomUniteLegale = etablissement.uniteLegale.nomUniteLegale; nomUsageUniteLegale = etablissement.uniteLegale.nomUsageUniteLegale; prenom1UniteLegale = etablissement.uniteLegale.prenom1UniteLegale; prenom2UniteLegale = etablissement.uniteLegale.prenom2UniteLegale; prenom3UniteLegale = etablissement.uniteLegale.prenom3UniteLegale; prenom4UniteLegale = etablissement.uniteLegale.prenom4UniteLegale; prenomUsuelUniteLegale = etablissement.uniteLegale.prenomUsuelUniteLegale; pseudonymeUniteLegale = etablissement.uniteLegale.pseudonymeUniteLegale; activitePrincipaleUniteLegale = etablissement.uniteLegale.activitePrincipaleUniteLegale; nomenclatureActivitePrincipaleUniteLegale = etablissement.uniteLegale.nomenclatureActivitePrincipaleUniteLegale; identifiantAssociationUniteLegale = etablissement.uniteLegale.identifiantAssociationUniteLegale; economieSocialeSolidaireUniteLegale = etablissement.uniteLegale.economieSocialeSolidaireUniteLegale; societeMissionUniteLegale = etablissement.uniteLegale.societeMissionUniteLegale; caractereEmployeurUniteLegale = etablissement.uniteLegale.caractereEmployeurUniteLegale; trancheEffectifsUniteLegale = etablissement.uniteLegale.trancheEffectifsUniteLegale; anneeEffectifsUniteLegale = etablissement.uniteLegale.anneeEffectifsUniteLegale; nicSiegeUniteLegale = etablissement.uniteLegale.nicSiegeUniteLegale; dateDernierTraitementUniteLegale = etablissement.uniteLegale.dateDernierTraitementUniteLegale; anneeCategorieEntreprise = etablissement.uniteLegale.anneeCategorieEntreprise; } /* * * Adresse Etablissement * */ let complementAdresseEtablissement = null; let numeroVoieEtablissement = null; let indiceRepetitionEtablissement = null; let typeVoieEtablissement = null; let libelleVoieEtablissement = null; let codePostalEtablissement = null; let libelleCommuneEtablissement = null; let libelleCommuneEtrangerEtablissement = null; let distributionSpecialeEtablissement = null; let codeCommuneEtablissement = null; let codeCedexEtablissement = null; let libelleCedexEtablissement = null; let codePaysEtrangerEtablissement = null; let libellePaysEtrangerEtablissement = null; if (typeof etablissement.adresseEtablissement !== "undefined") { complementAdresseEtablissement = etablissement.adresseEtablissement.complementAdresseEtablissement; numeroVoieEtablissement = etablissement.adresseEtablissement.numeroVoieEtablissement; indiceRepetitionEtablissement = etablissement.adresseEtablissement.indiceRepetitionEtablissement; typeVoieEtablissement = etablissement.adresseEtablissement.typeVoieEtablissement; libelleVoieEtablissement = etablissement.adresseEtablissement.libelleVoieEtablissement; codePostalEtablissement = etablissement.adresseEtablissement.codePostalEtablissement; libelleCommuneEtablissement = etablissement.adresseEtablissement.libelleCommuneEtablissement; libelleCommuneEtrangerEtablissement = etablissement.adresseEtablissement.libelleCommuneEtrangerEtablissement; distributionSpecialeEtablissement = etablissement.adresseEtablissement.distributionSpecialeEtablissement; codeCommuneEtablissement = etablissement.adresseEtablissement.codeCommuneEtablissement; codeCedexEtablissement = etablissement.adresseEtablissement.codeCedexEtablissement; libelleCedexEtablissement = etablissement.adresseEtablissement.libelleCedexEtablissement; codePaysEtrangerEtablissement = etablissement.adresseEtablissement.codePaysEtrangerEtablissement; libellePaysEtrangerEtablissement = etablissement.adresseEtablissement.libellePaysEtrangerEtablissement; } /* * * Adresse Etablissement 2 * */ let complementAdresse2Etablissement = null; let numeroVoie2Etablissement = null; let indiceRepetition2Etablissement = null; let typeVoie2Etablissement = null; let libelleVoie2Etablissement = null; let codePostal2Etablissement = null; let libelleCommune2Etablissement = null; let libelleCommuneEtranger2Etablissement = null; let distributionSpeciale2Etablissement = null; let codeCommune2Etablissement = null; let codeCedex2Etablissement = null; let libelleCedex2Etablissement = null; let codePaysEtranger2Etablissement = null; let libellePaysEtranger2Etablissement = null; if (typeof etablissement.adresse2Etablissement !== "undefined") { complementAdresse2Etablissement = etablissement.adresse2Etablissement.complementAdresse2Etablissement; numeroVoie2Etablissement = etablissement.adresse2Etablissement.numeroVoie2Etablissement; indiceRepetition2Etablissement = etablissement.adresse2Etablissement.indiceRepetition2Etablissement; typeVoie2Etablissement = etablissement.adresse2Etablissement.typeVoie2Etablissement; libelleVoie2Etablissement = etablissement.adresse2Etablissement.libelleVoie2Etablissement; codePostal2Etablissement = etablissement.adresse2Etablissement.codePostal2Etablissement; libelleCommune2Etablissement = etablissement.adresse2Etablissement.libelleCommune2Etablissement; libelleCommuneEtranger2Etablissement = etablissement.adresse2Etablissement.libelleCommuneEtranger2Etablissement; distributionSpeciale2Etablissement = etablissement.adresse2Etablissement.distributionSpeciale2Etablissement; codeCommune2Etablissement = etablissement.adresse2Etablissement.codeCommune2Etablissement; codeCedex2Etablissement = etablissement.adresse2Etablissement.codeCedex2Etablissement; libelleCedex2Etablissement = etablissement.adresse2Etablissement.libelleCedex2Etablissement; codePaysEtranger2Etablissement = etablissement.adresse2Etablissement.codePaysEtranger2Etablissement; libellePaysEtranger2Etablissement = etablissement.adresse2Etablissement.libellePaysEtranger2Etablissement; } callback({ outputFields: { siren, nic, siret, statutDiffusionEtablissement, dateCreationEtablissement, trancheEffectifsEtablissement, anneeEffectifsEtablissement, activitePrincipaleRegistreMetiersEtablissement, dateDernierTraitementEtablissement, etablissementSiege, nombrePeriodesEtablissement, etatAdministratifUniteLegale, statutDiffusionUniteLegale, dateCreationUniteLegale, categorieJuridiqueUniteLegale, denominationUniteLegale, sigleUniteLegale, denominationUsuelle1UniteLegale, denominationUsuelle2UniteLegale, denominationUsuelle3UniteLegale, sexeUniteLegale, nomUniteLegale, nomUsageUniteLegale, prenom1UniteLegale, prenom2UniteLegale, prenom3UniteLegale, prenom4UniteLegale, prenomUsuelUniteLegale, pseudonymeUniteLegale, activitePrincipaleUniteLegale, nomenclatureActivitePrincipaleUniteLegale, identifiantAssociationUniteLegale, economieSocialeSolidaireUniteLegale, societeMissionUniteLegale, caractereEmployeurUniteLegale, trancheEffectifsUniteLegale, anneeEffectifsUniteLegale, nicSiegeUniteLegale, dateDernierTraitementUniteLegale, anneeCategorieEntreprise, complementAdresseEtablissement, numeroVoieEtablissement, indiceRepetitionEtablissement, typeVoieEtablissement, libelleVoieEtablissement, codePostalEtablissement, libelleCommuneEtablissement, libelleCommuneEtrangerEtablissement, distributionSpecialeEtablissement, codeCommuneEtablissement, codeCedexEtablissement, libelleCedexEtablissement, codePaysEtrangerEtablissement, libellePaysEtrangerEtablissement, complementAdresse2Etablissement, numeroVoie2Etablissement, indiceRepetition2Etablissement, typeVoie2Etablissement, libelleVoie2Etablissement, codePostal2Etablissement, libelleCommune2Etablissement, libelleCommuneEtranger2Etablissement, distributionSpeciale2Etablissement, codeCommune2Etablissement, codeCedex2Etablissement, libelleCedex2Etablissement, codePaysEtranger2Etablissement, libellePaysEtranger2Etablissement } }); } const getInfosFromSiret = async (siret) => { if (!siret || siret === "") throw new Error('Siret is missing'); const endpoint = `https://api.insee.fr/entreprises/sirene/V3/siret/${siret}`; return axios.get(endpoint, axiosConfig); } const searchSiret = async (query) => { const endpoint = `https://api.insee.fr/entreprises/sirene/V3/siren?q=periode(denominationUniteLegale:${query})`; return axios.get(endpoint, axiosConfig); } /** * Handles errors thrown by axios requests and logs relevant information. * * @param {Error} e - The error object thrown by axios. */ const axiosErrorHandler = e => { console.log("The : ", e.config.method, " call on", e.config.url, "failed"); console.log("error code retuned ", e.code); console.log("error data returned ", e.response.data); }

Configurez la sortie ( output function )

Sauvegarder le resultat dans le CRM

Pour sauvegarder les infos dans la fiche entreprise il suffit d’utiliser le block copy property value rien de plus simple. Il suffit de deux clics pour convertir ce que l’on a configuré dan le « data output » en propriété du CRM.