Vos commerciaux suivent leurs deals dans ClickUp parce que c'est rapide et visuel. Votre équipe opérationnelle vit dans Odoo parce que c'est là que sont les données réelles : factures, stocks, comptabilité. Résultat : deux versions de la vérité, deux saisies, deux personnes qui se renvoient la balle pour savoir si la commande a été passée ou pas.
n8n résout ce problème en 30 minutes. Voici la méthode exacte qu'on déploie chez nos clients.
Le bon mental model : événements, pas synchronisation continue
Avant de toucher au moindre outil, posez le bon principe : on ne "synchronise" pas Odoo et ClickUp en permanence. On propage des événements dans les deux sens. Quand un commercial crée une tâche ClickUp avec le tag "deal-chaud", n8n crée l'opportunité Odoo correspondante. Quand le statut Odoo passe à "gagné", n8n met à jour la tâche ClickUp et crée une seconde tâche pour l'équipe livraison.
Ce mindset change tout : pas de polling toutes les 5 minutes, pas de duplication de données, juste des webhooks qui déclenchent des actions ciblées.
Étape 1 — Identifier ce qui doit vivre dans les deux outils
Tous les objets ne méritent pas d'être synchronisés. Faites la liste honnête :
- À synchroniser : opportunités commerciales, projets gagnés, tickets support critiques
- À ne PAS synchroniser : tâches internes ClickUp (revue de code, recrutement), données comptables Odoo (factures, écritures)
Règle pratique : si la donnée n'est utile qu'à une seule équipe, elle reste dans son outil. La synchro coûte en complexité — réservez-la aux objets vraiment partagés.
Étape 2 — Configurer le webhook Odoo sortant
Dans Odoo, allez dans Paramètres → Technique → Actions automatisées. Créez une nouvelle action :
- Modèle :
crm.lead(pour les opportunités) - Déclencheur : "À la création" + "À la mise à jour"
- Action : "Exécuter du code Python"
- Code : un appel
requests.post()vers votre URL webhook n8n avec les champs critiques en JSON
Le payload type ressemble à :
{
"odoo_id": 1247,
"name": "Hôtel Tahiti — refonte ERP",
"stage": "qualified",
"expected_revenue": 4500000,
"user_id": "marie@openupagency.com",
"partner_name": "Hôtel Tahiti SARL"
}
Les champs Odoo standards (référence, partenaire, montant) suffisent pour 80% des cas — pas besoin de tout exposer
Étape 3 — Configurer le workflow n8n
Dans n8n, créez un workflow avec :
- Trigger Webhook : copiez l'URL générée et collez-la dans l'action Odoo de l'étape 2
- Function node : reformatez le payload Odoo pour qu'il matche la structure ClickUp (renommer
nameentitle, convertirstageenstatus_id, etc.) - HTTP Request node : POST vers l'API ClickUp
/list/{list_id}/taskavec votre token d'API - Set node : stockez l'ID de la tâche ClickUp créée pour pouvoir la mettre à jour ensuite
Workflow n8n type — un trigger, une normalisation, un appel API, un stockage de l'ID retour
Étape 4 — Stocker la correspondance des IDs
Le piège classique : sans table de correspondance, vous ne savez plus quel objet Odoo correspond à quelle tâche ClickUp lors des mises à jour. Deux solutions :
- Champ custom dans ClickUp : ajoutez un custom field "odoo_id" sur votre liste ClickUp. À chaque création, n8n y stocke l'ID Odoo. Retrouvable instantanément.
- Champ custom dans Odoo : symétrique, ajoutez un champ
clickup_task_idsur le modèlecrm.lead.
Cette double-référence est ce qui rend la synchronisation idempotente : même si un webhook se déclenche deux fois, n8n détecte qu'une tâche existe déjà et fait un UPDATE au lieu d'un CREATE.
Étape 5 — Configurer le retour ClickUp → Odoo
Symétrique à l'étape 2-3. Dans ClickUp, activez les webhooks via l'API (Settings → Apps → Webhooks). Filtrez sur l'événement taskStatusUpdated pour ne propager que les changements de statut, pas chaque modification mineure.
Workflow n8n inverse :
- Trigger Webhook ClickUp
- Function node : extraire l'
odoo_iddu custom field - HTTP Request : appel XML-RPC ou JSON-RPC vers Odoo pour mettre à jour le
stagede l'opportunité - Slack notification (bonus) : alerter le commercial responsable
Étape 6 — Tester avec 5 scénarios réels
Avant de basculer en production, testez ces 5 cas :
- Création Odoo → tâche apparaît dans ClickUp avec les bons champs
- Modification Odoo (montant, étape) → tâche ClickUp mise à jour
- Création ClickUp (avec tag spécifique) → opportunité Odoo créée
- Changement statut ClickUp "gagné" → opportunité Odoo passe en "won"
- Suppression : décidez votre politique — soft delete, archive, ou rien
Si les 5 passent, activez en production. Sinon, débuggez en regardant les logs n8n (l'onglet Executions montre chaque payload entrant et sortant).
Les pièges qu'on a évités à force
- Boucles infinies : si un webhook Odoo déclenche une mise à jour ClickUp qui re-déclenche un webhook ClickUp qui re-met à jour Odoo... vous avez une boucle. Solution : ajoutez un flag dans le payload ("source: odoo") et ignorez-le côté retour.
- Champs obligatoires manquants : ClickUp refuse une tâche sans
name. Si Odoo n'envoie rien, mettez un fallback. - Latence : les webhooks Odoo prennent 1-3s. Si votre commercial actualise ClickUp tout de suite après, il peut ne pas voir la tâche. Acceptez la latence ou ajoutez un toast "synchronisation en cours".
Ce qu'il faut retenir
- La connexion Odoo ↔ ClickUp se fait en 30 minutes avec n8n, sans code
- Le bon modèle : événements ciblés, pas synchronisation continue
- Stockez les correspondances d'IDs des deux côtés (idempotence)
- Testez 5 scénarios réels avant de passer en production
- C'est exactement ce qu'on a déployé pour Fenua Sofa — gain : 4h/semaine et zéro information perdue
Pour aller plus loin
Si vous démarrez avec Odoo, lisez d'abord comment déployer Odoo dans une PME polynésienne. Si vous voulez d'autres idées d'automatisation, jetez un œil à nos 5 workflows n8n favoris. Et si vous préférez qu'on s'occupe de tout, demandez un audit gratuit de 30 minutes — on identifie les 3 connexions à plus fort impact pour votre activité.

