POST /customers pour créer un client dans Pennylane. Réponse : 404. L'endpoint n'existe pas.
C'est la première chose qui m'est arrivée en ouvrant la doc de l'API Pennylane V2, et ça donne le ton de ce qui a suivi. L'API fonctionne. La doc est correcte. Mais entre ce que la doc dit et ce qu'on écrit d'instinct quand on vient du monde CRM, il y a un fossé qui se paie en 422 et en heures perdues.
J'ai traversé ce fossé pour construire 3 workflows n8n qui automatisent la facturation de bout en bout. Voici ce que j'ai trouvé de l'autre côté.
Pennylane et n8n : pourquoi il n'existe aucun template
Avant de commencer, j'ai vérifié. La bibliothèque n8n compte plus de 9 000 workflows communautaires. Le repo awesome-n8n-templates sur GitHub en référence 280+. Lead gen, chatbots, content, CRM, tout y passe. Pennylane : rien. Pas un seul template publié. La plateforme comptable la plus utilisée par les PME françaises, et personne dans l'écosystème n8n n'avait publié un workflow fonctionnel pour créer une facture.
En creusant, j'ai compris pourquoi. Ce n'est pas un problème de demande. C'est un problème de friction technique.
Update — avril 2026. Ce constat n'est plus tout à fait vrai. Les 3 workflows présentés dans cet article ont depuis été soumis à la bibliothèque officielle n8n et acceptés. Ils sont publiés. Détails et liens en bas de page.
API Pennylane V2 : les endpoints qui piègent les automatiseurs
Reprenons. Pour créer un client, le bon endpoint est POST /company_customers. Pas /customers, qui sert uniquement à la recherche. Premier piège.
L'objet billing_address exige quatre champs : address, postal_code, city, et country_alpha2. Pas country. Il m'a fallu un 400 "additional property not supported" pour le découvrir, parce que country est le nom utilisé dans à peu près tous les autres outils que j'ai croisés en 10 ans d'intégrations.
Pour chercher un client par email, le filtre attend le champ emails (au pluriel) avec l'opérateur in (pas eq). J'ai fait deux appels avec des réponses vides avant de comprendre. Le filtre est correct dans la doc. Mais la doc ne dit pas que eq ne marche pas, elle dit juste que in est supporté. Le genre de nuance qui coûte 30 minutes.
Récapitulatif des pièges qui font perdre du temps :
| Piège | Symptôme | Solution |
|---|---|---|
POST /customers n'existe pas |
404 | Utiliser POST /company_customers |
Champ country refusé |
400 "additional property" | Utiliser country_alpha2 |
Filtre email avec eq |
Réponse vide | Utiliser l'opérateur in sur le champ emails |
| Montant numérique | 422 | Passer raw_currency_unit_price en string ("1500.00") |
external_reference réutilisé |
422 + facture finalisée | Générer une référence unique par facture |
| Envoi email trop rapide | 409 Conflict | Attendre 30s (node Wait) avant send_by_email |
Factures en retard : filtrer sans filtre côté API
J'avais besoin de récupérer les factures en retard de paiement. En logique, un paramètre status=overdue ou paid=false. Sauf que l'API Pennylane ne supporte ni l'un ni l'autre. Les seuls champs filtrables côté serveur sur /customer_invoices sont id, date, invoice_number, customer_id, draft, et external_reference.
Le champ draft accepte un filtre, mais uniquement en string. Passer un booléen natif ne fonctionne pas, et l'URL-encoding de n8n ajoute des guillemets parasites. J'ai fini par abandonner tout filtrage côté API et par tout ramener dans un node Code. Quelques lignes de JavaScript qui classent chaque facture en "payée", "en retard" ou "à venir" à partir des champs paid et deadline. C'est pragmatique. C'est aussi le seul moyen fiable.
Envoi par email : le piège asynchrone du PDF Pennylane
La facture est créée, draft: false, numéro attribué. Je veux l'envoyer par email au client. POST /customer_invoices/{id}/send_by_email. Réponse : 409 Conflict.
Pennylane génère le PDF de manière asynchrone. Si on appelle l'endpoint d'envoi trop vite après la création, le fichier n'existe pas encore et l'API refuse. La solution : un node Wait de 30 secondes entre la création et l'envoi. Ce n'est pas élégant. Il n'y a pas d'alternative propre sans polling en boucle.
Autre piège qui m'a coûté du temps : les montants. Le champ raw_currency_unit_price doit être une string. 1500 retourne un 422. "1500.00" passe. Et les external_reference doivent être uniques à travers toutes les factures du compte. En réutiliser une par accident pendant un test sur le sandbox, c'est un 422 et une facture finalisée qu'on ne peut pas supprimer via l'API.
3 workflows n8n pour automatiser la facturation Pennylane
Trois workflows. Le premier reçoit des données de deal par webhook, gère le client (recherche ou création), construit la facture avec lignes et TVA, l'envoie optionnellement par email, et notifie l'équipe sur Slack et par Gmail avec un récapitulatif HTML (template officiel sur n8n.io). Le deuxième tourne toutes les 15 minutes et signale les factures payées ou en retard (template officiel sur n8n.io). Le troisième tourne chaque matin à 9h et relance les impayés de plus de 7 jours (template officiel sur n8n.io).
Chaque workflow est documenté visuellement dans n8n avec des Sticky Notes sur chaque section, les endpoints utilisés, les formats attendus, les pièges. Les conventions de nommage suivent un système de préfixes (PL pour Pennylane, SL pour Slack, IF pour les conditions, Code pour le JavaScript) qui rend le workflow lisible en 30 secondes sans ouvrir un seul node.
Le mode draft: true est disponible pour ceux qui préfèrent un filet de sécurité. La facture est créée comme brouillon, l'équipe reçoit la notification, vérifie dans Pennylane, finalise manuellement. Une seule ligne à changer dans le workflow.
Le repo open source, et si vous voulez aller plus loin
J'ai publié le tout en open source sur GitHub. Les JSON sont nettoyés de toute donnée personnelle, prêts à importer. Il y a des exemples de payloads, un guide sandbox, un guide de dépannage, et toute la section "API learnings" que vous venez de lire, directement dans le README.
github.com/Gauthier-Huguenin/n8n-pennylane-auto-invoicing
Bibliothèque officielle n8n
Les 3 workflows sont également disponibles sur la bibliothèque de templates n8n, importables en un clic depuis l'éditeur :
- Create and send Pennylane invoices from webhook data with Slack and Gmail alerts
- Track Pennylane invoice payment status with Slack notifications
- Send overdue invoice reminders from Pennylane to Slack
Si vous avez une instance n8n et un compte Pennylane, tout est là. Importez, branchez vos credentials, testez.
Si le sujet c'est plutôt "on a 6 processus manuels qui nous coûtent des heures chaque semaine et on ne sait pas par où commencer", c'est ce que je fais au quotidien. Audit, architecture, déploiement, sur n8n et sur les outils que vous utilisez déjà. Un premier échange de 30 minutes suffit pour voir ce qui est automatisable.
Si vous voulez comprendre comment j'aborde un projet d'automatisation & workflows de A à Z, j'ai une page dédiée à ce sujet. hgnn.io
FAQ
Comment créer un client dans l'API Pennylane avec n8n ?
Le bon endpoint est POST /company_customers, pas /customers (qui est réservé à la recherche). L'objet billing_address exige exactement quatre champs : address, postal_code, city et country_alpha2.
Comment récupérer les factures en retard de paiement avec l'API Pennylane ?
L'API Pennylane ne supporte pas de filtre status=overdue ni paid=false. La seule approche fiable est de récupérer toutes les factures et de les classifier côté client avec un node Code JavaScript basé sur les champs paid et deadline.
Pourquoi l'envoi de facture par email échoue avec une erreur 409 dans Pennylane ?
Pennylane génère les PDFs de manière asynchrone. Appeler POST /customer_invoices/{id}/send_by_email trop vite après la création retourne un 409 Conflict. La solution : insérer un node Wait de 30 secondes entre la création et l'envoi.
Existe-t-il un template n8n pour Pennylane ?
Oui — 3 templates officiels sont désormais publiés dans la bibliothèque n8n : un pour créer et envoyer une facture depuis un webhook (avec alertes Slack et Gmail), un pour suivre les statuts de paiement avec notifications Slack, et un pour relancer les factures impayées sur Slack. Ils sont issus du repo open source n8n-pennylane-auto-invoicing et ont été soumis et acceptés par l'équipe n8n.
Questions ? Vous pouvez me joindre sur LinkedIn ou utiliser le formulaire de contact.