{"id":69,"date":"2025-10-06T14:21:54","date_gmt":"2025-10-06T12:21:54","guid":{"rendered":"https:\/\/dhaker-trabelsi.com\/wordpress\/?p=69"},"modified":"2025-10-14T15:55:07","modified_gmt":"2025-10-14T13:55:07","slug":"%f0%9f%9a%80-integration-jobphoning-%e2%86%94-nocrm-io","status":"publish","type":"post","link":"https:\/\/dhaker-trabelsi.com\/blog\/%f0%9f%9a%80-integration-jobphoning-%e2%86%94-nocrm-io\/","title":{"rendered":"\ud83d\ude80 Int\u00e9gration JobPhoning \u2194 noCRM.io"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Int\u00e9gration automatis\u00e9e entre une plateforme d\u2019appels (JobPhoning) et noCRM.io<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde0 Contexte du projet<\/h3>\n\n\n\n<p>Dans le cadre d\u2019un projet d\u2019automatisation commerciale, j\u2019ai d\u00e9velopp\u00e9 une int\u00e9gration permettant de <strong>synchroniser automatiquement<\/strong> les donn\u00e9es issues d\u2019une plateforme d\u2019appels sortants (type <em>JobPhoning<\/em>) avec le CRM <strong>noCRM.io<\/strong>.<\/p>\n\n\n\n<p>L\u2019objectif \u00e9tait simple :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Lorsqu\u2019un t\u00e9l\u00e9op\u00e9rateur marque un appel comme \u201cProjet d\u00e9tect\u00e9\u201d, une <strong>opportunit\u00e9 se cr\u00e9e automatiquement<\/strong> dans le CRM, sans action manuelle.<\/p>\n<\/blockquote>\n\n\n\n<p>Ce projet m\u2019a permis de travailler sur :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La gestion et la validation de <strong>webhooks entrants<\/strong> en PHP,<\/li>\n\n\n\n<li>Le <strong>traitement et nettoyage de donn\u00e9es JSON<\/strong> complexes,<\/li>\n\n\n\n<li>L\u2019\u00e9criture de <strong>fichiers CSV de suivi<\/strong>,<\/li>\n\n\n\n<li>Et l\u2019<strong>int\u00e9gration via API REST<\/strong> vers noCRM.io.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 Architecture technique<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd38 1. Webhook PHP<\/h4>\n\n\n\n<p>La plateforme d\u2019appels envoie une requ\u00eate <strong>HTTP POST<\/strong> contenant un JSON complet vers un script PHP :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;example.com\/jobphoningtonocrm\/receive_json.php\n<\/code><\/pre>\n\n\n\n<p>Le webhook re\u00e7oit des structures JSON de ce type :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"Client\": {\n    \"Nom\": \"Dupont\",\n    \"Societe\": \"Entreprise Test\",\n    \"TelephoneFixe\": \"+33123456789\"\n  },\n  \"HistoriqueAppel\": &#91;\n    {\n      \"Etat\": \"Projet d\u00e9tect\u00e9\",\n      \"DateAppel\": \"2025-07-02 15:00:00\",\n      \"Teleoperateur\": { \"Login\": \"Yohan\" },\n      \"Commentaire\": \"Client int\u00e9ress\u00e9 par un devis.\"\n    }\n  ]\n}\n<\/code><\/pre>\n\n\n\n<p>Le script a pour r\u00f4le de :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Lire la requ\u00eate et enregistrer les donn\u00e9es brutes,<\/li>\n\n\n\n<li>Enregistrer <strong>tous les appels<\/strong> dans un CSV global (<code>webhook_output_all.csv<\/code>),<\/li>\n\n\n\n<li>Enregistrer <strong>uniquement les projets d\u00e9tect\u00e9s<\/strong> dans un autre CSV (<code>webhook_output_projet_detecte.csv<\/code>),<\/li>\n\n\n\n<li>D\u00e9clencher la cr\u00e9ation d\u2019un <strong>lead<\/strong> dans noCRM.io lorsque <code>Etat = \"Projet d\u00e9tect\u00e9\"<\/code>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd38 2. Traitement et stockage des donn\u00e9es<\/h4>\n\n\n\n<p>Les donn\u00e9es sont nettoy\u00e9es, format\u00e9es et enrichies avant \u00e9criture.<br>Chaque ligne du CSV repr\u00e9sente un appel et contient :<\/p>\n\n\n\n<p>| timestamp | ip | client_id | nom | societe | siret | adresse | ville | code_postal | activit\u00e9 | t\u00e9l\u00e9phone | email | \u00e9tat_appel | dur\u00e9e | date_appel | t\u00e9l\u00e9op\u00e9rateur | commentaire |<\/p>\n\n\n\n<p>Les fichiers CSV servent de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Journal d\u2019audit<\/strong> pour retracer chaque appel,<\/li>\n\n\n\n<li><strong>Source de secours<\/strong> en cas d\u2019erreur r\u00e9seau,<\/li>\n\n\n\n<li><strong>Support de monitoring<\/strong> pour le suivi d\u2019int\u00e9gration.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd38 3. Int\u00e9gration avec l\u2019API noCRM.io<\/h4>\n\n\n\n<p>D\u00e8s qu\u2019un appel est identifi\u00e9 comme \u201cProjet d\u00e9tect\u00e9\u201d, le script envoie une requ\u00eate POST \u00e0 l\u2019API noCRM.io :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST https:\/\/example.nocrm.io\/api\/v2\/leads\n<\/code><\/pre>\n\n\n\n<p><strong>Authentification :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>X-API-KEY: &#91;masqu\u00e9e]\n<\/code><\/pre>\n\n\n\n<p><strong>Corps de la requ\u00eate :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"title\": \"Entreprise Test\",\n  \"description\": \"Client : M. Dupont - T\u00e9l\u00e9phone : +33123456789 - Commentaire : Client int\u00e9ress\u00e9\",\n  \"tags\": &#91;\"Projet d\u00e9tect\u00e9\", \"JobPhoning\"],\n  \"step\": \"Infos OK\"\n}\n<\/code><\/pre>\n\n\n\n<p>R\u00e9sultat : une <strong>opportunit\u00e9<\/strong> appara\u00eet automatiquement dans le pipeline \u201cInfos OK\u201d du CRM, associ\u00e9e au commercial correspondant.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2699\ufe0f Stack et environnement<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9l\u00e9ment<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong>Langage<\/strong><\/td><td>PHP 8.2<\/td><\/tr><tr><td><strong>Serveur<\/strong><\/td><td>Nginx + PHP-FPM (Debian)<\/td><\/tr><tr><td><strong>Authentification API<\/strong><\/td><td><code>X-API-KEY<\/code> (cl\u00e9 noCRM.io)<\/td><\/tr><tr><td><strong>Format de stockage<\/strong><\/td><td>CSV<\/td><\/tr><tr><td><strong>Journalisation<\/strong><\/td><td>Logs d\u00e9taill\u00e9s avec IP et horodatage<\/td><\/tr><tr><td><strong>S\u00e9curit\u00e9<\/strong><\/td><td>Validation JSON + filtrage d\u2019adresses IP JobPhoning<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddea Tests &amp; validation<\/h3>\n\n\n\n<p>Pour valider la bonne int\u00e9gration, j\u2019ai utilis\u00e9 <strong>cURL<\/strong> pour simuler les requ\u00eates envoy\u00e9es par la plateforme d\u2019appels :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST https:\/\/example.com\/jobphoningtonocrm\/receive_json.php \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"Client\": {\"Nom\": \"Dupont\", \"Societe\": \"Entreprise Test\"},\n    \"HistoriqueAppel\": &#91;{\"Etat\": \"Projet d\u00e9tect\u00e9\"}]\n  }'\n<\/code><\/pre>\n\n\n\n<p>\u2705 R\u00e9sultats attendus :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>webhook_output_all.csv<\/code> \u2192 enregistrement complet,<\/li>\n\n\n\n<li><code>webhook_output_projet_detecte.csv<\/code> \u2192 ajout du lead,<\/li>\n\n\n\n<li>Cr\u00e9ation automatique d\u2019une <strong>opportunit\u00e9 CRM<\/strong> visible dans noCRM.io.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc8 R\u00e9sultat final<\/h3>\n\n\n\n<p><strong>Avant<\/strong> : Les t\u00e9l\u00e9op\u00e9rateurs notaient manuellement les prospects d\u00e9tect\u00e9s et les commerciaux les saisissaient ensuite dans le CRM.<br><strong>Apr\u00e8s<\/strong> : Les appels \u201cProjet d\u00e9tect\u00e9\u201d sont automatiquement transform\u00e9s en opportunit\u00e9s <strong>en temps r\u00e9el<\/strong>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u23f1 Temps de traitement : moins d\u2019une seconde entre la fin de l\u2019appel et l\u2019apparition dans noCRM.io.<\/p>\n<\/blockquote>\n\n\n\n<p>Ce projet a permis :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un gain de productivit\u00e9 significatif,<\/li>\n\n\n\n<li>Une meilleure tra\u00e7abilit\u00e9 des appels,<\/li>\n\n\n\n<li>Et une int\u00e9gration fiable sans t\u00e2che manuelle.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddf0 Exemple de code (extrait simplifi\u00e9)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>if (mb_strtolower($appel&#91;'Etat']) === 'projet d\u00e9tect\u00e9') {\n    $leadData = &#91;\n        'title' =&gt; $client&#91;'Societe'] ?? 'Prospect',\n        'description' =&gt; sprintf(\n            \"Nom: %s\\nT\u00e9l\u00e9phone: %s\\nCommentaire: %s\",\n            $client&#91;'Nom'] ?? '',\n            $client&#91;'TelephoneFixe'] ?? '',\n            $appel&#91;'Commentaire'] ?? ''\n        ),\n        'tags' =&gt; &#91;'Projet d\u00e9tect\u00e9', 'JobPhoning'],\n        'step' =&gt; 'Infos OK'\n    ];\n\n    $ch = curl_init('https:\/\/example.nocrm.io\/api\/v2\/leads');\n    curl_setopt_array($ch, &#91;\n        CURLOPT_RETURNTRANSFER =&gt; true,\n        CURLOPT_POST =&gt; true,\n        CURLOPT_HTTPHEADER =&gt; &#91;\n            \"X-API-KEY: &#91;masqu\u00e9e]\",\n            \"Content-Type: application\/json\"\n        ],\n        CURLOPT_POSTFIELDS =&gt; json_encode($leadData),\n        CURLOPT_SSL_VERIFYPEER =&gt; true\n    ]);\n\n    $response = curl_exec($ch);\n    curl_close($ch);\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd17 Ressources et code source<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83e\uddf1 <strong>Code complet sur GitHub<\/strong> :<br><a href=\"https:\/\/github.com\/dtrabelsi\/Int-gration-JobPhoning-noCRM.io\">https:\/\/github.com\/dtrabelsi\/Int-gration-JobPhoning-noCRM.io<\/a><\/li>\n\n\n\n<li>\ud83c\udf10 <strong>Mon portfolio d\u00e9veloppeur<\/strong> :<br><a href=\"https:\/\/dhaker-trabelsi.com\">https:\/\/dhaker-trabelsi.com<\/a><\/li>\n\n\n\n<li>\ud83e\uddf0 <strong>Technos cl\u00e9s<\/strong> :<br>PHP \u00b7 REST API \u00b7 JSON \u00b7 Webhooks \u00b7 cURL \u00b7 Automation \u00b7 noCRM.io API<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcac Conclusion<\/h3>\n\n\n\n<p>Ce projet illustre une int\u00e9gration <strong>temps r\u00e9el<\/strong> entre un outil de prospection et un CRM, permettant de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatiser la conversion des leads qualifi\u00e9s,<\/li>\n\n\n\n<li>Centraliser les informations de contact,<\/li>\n\n\n\n<li>Et fluidifier le passage entre \u00e9quipes marketing et commerciales.<\/li>\n<\/ul>\n\n\n\n<p>Une automatisation simple, robuste et efficace \u2014 enti\u00e8rement r\u00e9alis\u00e9e en <strong>PHP natif<\/strong> et <strong>API REST<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\ude80 Int\u00e9gration automatis\u00e9e entre une plateforme d\u2019appels (JobPhoning) et noCRM.io \ud83e\udde0 Contexte du projet Dans le cadre d\u2019un projet d\u2019automatisation commerciale, j\u2019ai d\u00e9velopp\u00e9 une int\u00e9gration permettant de synchroniser automatiquement les donn\u00e9es issues d\u2019une plateforme d\u2019appels sortants (type JobPhoning) avec le CRM noCRM.io. L\u2019objectif \u00e9tait simple : Lorsqu\u2019un t\u00e9l\u00e9op\u00e9rateur marque un appel comme \u201cProjet d\u00e9tect\u00e9\u201d, une [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":119,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-69","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-_developpement-web"],"_links":{"self":[{"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/posts\/69","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/comments?post=69"}],"version-history":[{"count":4,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/posts\/69\/revisions"}],"predecessor-version":[{"id":159,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/posts\/69\/revisions\/159"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/media\/119"}],"wp:attachment":[{"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/media?parent=69"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/categories?post=69"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhaker-trabelsi.com\/blog\/wp-json\/wp\/v2\/tags?post=69"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}