Le problème
Un devis de micro-entrepreneur traverse sept étapes avant d’être payé : rédaction, PDF, envoi, relance, deuxième relance, facture d’acompte, facture de solde. Chacune se fait à la main. Chacune est un endroit où un numéro se duplique ou une date se trompe.
Et la numérotation des factures doit rester chronologique et continue. Une erreur là-dessus se répare en expliquant à l’administration pourquoi il existe deux fois le numéro 007.
Ce qui change au quotidien
Vous saisissez un devis en deux minutes, et le reste suit tout seul. Le PDF est fabriqué, numéroté, archivé. La relance part à 10 jours, puis à 20. La facture d’acompte se déclenche à l’acceptation, celle de solde à la livraison.
Rien ne part chez un client sans que vous l’ayez lu. Un modèle de langage rédige le mail d’accompagnement, et il attend votre validation. C’est la contrainte qui a le plus pesé sur la conception, et elle n’a pas bougé.
Une facture générée portait la date de la veille. Je l’ai trouvée en relisant. C’est la meilleure raison que je connaisse de ne rien laisser partir sans le lire. Le détail technique est plus bas.
Chaque document garde une photographie des mentions légales en vigueur le jour de son émission. Ça paraît excessif jusqu’à ce qu’on regarde le calendrier : au 1ᵉʳ septembre 2026, la mention de franchise de TVA change d’article et de code, l’ordonnance de décembre 2025 déplaçant ces règles du Code général des impôts vers le Code des impositions sur les biens et services. Réimprimez une facture dans deux ans, elle ressort avec la mention qui s’appliquait à sa date.
Le tout tourne sur une machine, sans abonnement. Un seul appel réseau en sort, celui du modèle de langage, et il reste facultatif : sans clé, les mails partent avec un texte de repli sobre.
Comment ça marche
Trois automatisations enchaînées, dans Docker, sur la machine de l’utilisateur. Aucun serveur, aucun nom de domaine, aucune facture mensuelle.
La première prend les lignes du devis dans un formulaire, attribue un numéro, fabrique le PDF, l’enregistre, et demande la validation du mail avant qu’il parte. La deuxième relance, chaque relance repassant par la même validation. La troisième produit les deux factures, acompte puis solde.
Les règles d’intégrité vivent dans la base de données. Un clic malheureux ne peut pas émettre deux factures au même numéro, ni facturer un solde avant son acompte : la base refuse, quoi qu’on lui demande.
Le composant qui fabrique les PDF est enfermé dans un réseau sans aucune route vers Internet. Ça se vérifie en une commande, et l’échec est le résultat attendu :
docker compose exec gotenberg curl -m 5 https://example.com
Ses limites
Ce dépôt ne fait ni PDF/A, ni Factur-X, ni relance sur facture impayée, ni sauvegarde automatique. Savoir recevoir une facture électronique devient obligatoire en septembre 2026. Savoir en émettre une, un an plus tard. C’est le chantier suivant, et il est daté.
Un seul composant est réellement coupé du réseau, celui qui fabrique les PDF. La base et la boîte mail locale, elles, pourraient techniquement sortir. Docker refuse de publier un port depuis un réseau isolé, et il a fallu choisir. Aucune des deux n’initie de connexion, et leurs ports n’écoutent que sur la machine. « Rien ne peut sortir » vaut donc pour un composant, pas pour l’installation entière.
C’est mon propre outil. Il est né de mon besoin, pas d’un cas inventé, ce qui est sa force et sa limite : j’en parle sans extrapoler.
Aucune facture réelle n’est encore passée dedans. Mon activité redémarre, et les premiers devis sont devant moi. La vérification s’est faite sur des documents d’essai : DEV-2026-005 émis le 3 août 2026, FAC-2026-005 en acompte de 360 € sur 900, dates identiques dans la base et sur le PDF.
La facture fausse dont il est question plus haut était une facture d’essai. Trouvée sur celle d’un client, elle aurait été trouvée trop tard.
Sous le capot
Pour le développeur qui vous accompagne, s’il y en a un.
Les contraintes d’intégrité vivent dans PostgreSQL, ce qui les rend
inviolables depuis n8n comme depuis psql. Le réseau du convertisseur HTML
vers PDF est déclaré internal: true, d’où la commande de vérification
ci-dessus.
Les dates sont mises en forme en SQL et jamais en JavaScript. Les nœuds Code de
n8n s’exécutent dans un processus séparé qui n’hérite pas du fuseau horaire :
une colonne DATE en ressortait décalée d’un jour, alors que les timestamptz
étaient justes. Une facture datée de la veille est un défaut de forme, pas un
détail.
Corrigé à la source, là où le fuseau du serveur fait foi. Les aides de conversion JavaScript ont été supprimées des deux workflows plutôt que laissées en place, pour qu’elles ne réintroduisent pas le problème.
PostgreSQL a été retenu pour ses transactions, dont dépend la sûreté de la numérotation, et parce que n8n le pilote nativement. Le dépôt en chiffre la contrepartie : environ 200 Mo d’image en plus.
L’essayer
Le dépôt se clone et se lance en une commande. Lisez d’abord le tableau des choix techniques du README : chacun y porte sa contrepartie assumée, ce qui est plus instructif que la liste des fonctionnalités.
Puis lancez la commande de vérification du réseau ci-dessus. Elle échoue, et c’est le résultat attendu.
