À quoi ça sert
Chaque facture et facture rectificative émise par Invocourier est conservée dans l'archive de l'application, et vous pouvez tout télécharger à tout moment. Une destination d'archive va plus loin : dès qu'un document est émis, une copie (le XML, plus le PDF le cas échéant) est envoyée vers un stockage que vous contrôlez. Vous ne dépendez jamais de l'application pour conserver vos pièces légales, et les copies continuent d'arriver sans que personne n'ait rien à faire.
Disponible aujourd'hui : un webhook signé (Zapier, Make, n8n, votre propre point de terminaison), un bucket compatible S3 (Amazon S3, Hetzner, Cloudflare R2, Scaleway, OVHcloud, Backblaze, Wasabi, DigitalOcean, MinIO) un serveur SFTP, les clouds Google Drive, Dropbox et OneDrive, et WebDAV (Nextcloud, ownCloud, Synology, Storage Box). Les copies d'archive par e-mail existent aussi et sont indépendantes de ceci.
Ces envois sont volontairement en « meilleur effort » : ils ne retardent ni ne bloquent jamais la facturation, et l'archive dans l'application reste la référence. Une destination en échec est retentée pendant plusieurs jours, puis signalée sur la page d'accueil.
Mise en place
Ouvrez l'application et allez dans Destinations d'archive (également accessible depuis les Paramètres, à côté de l'adresse e-mail d'archive).
- Sous Ajouter une destination, choisissez le type et cliquez sur Ajouter.
- Renseignez les détails de la destination (pour un webhook : l'URL du point de terminaison) et cliquez sur Enregistrer et tester.
- L'application lance aussitôt un test de connexion. S'il réussit, la destination passe en Active et reçoit chaque document émis à partir de là. S'il échoue, la réponse de la destination est affichée et rien n'est envoyé tant qu'un test n'a pas réussi.
Toute modification des détails de connexion remet la destination en Test en attente : une faute de frappe ne peut jamais envoyer des documents nulle part en silence. Mettre en pause conserve les paramètres mais arrête les envois ; Supprimer les efface.
Les identifiants et secrets sont stockés chiffrés et ne sont jamais affichés dans l'application, sauf si vous le demandez (le secret de signature du webhook).
Webhook
Un POST HTTPS par document vers l'URL que vous saisissez. Seules les URL https:// sur des hôtes publics sont acceptées. La requête est signée avec un secret généré à la création du webhook ; il reste identique si vous changez l'URL, votre récepteur n'en a donc besoin qu'une fois. Afficher le secret de signature sur le formulaire du webhook le révèle.
En-têtes
| En-tête | Valeur |
|---|---|
Content-Type | application/json |
X-Invocourier-Event | document.issued, ou ping pour le test de connexion |
X-Invocourier-Delivery | Un identifiant de cette tentative (une nouvelle tentative en reçoit un nouveau) |
X-Invocourier-Timestamp | Heure Unix en secondes au moment de la signature |
X-Invocourier-Signature | v1= suivi du HMAC en hexadécimal (voir ci-dessous) |
User-Agent | Invocourier-Webhook/1 |
Corps
{
"event": "document.issued",
"shop": "votre-boutique.myshopify.com",
"sentAt": "2026-09-09T10:15:02.000Z",
"document": {
"id": 12,
"number": "INV-12",
"type": "invoice", // ou "credit_note"
"correctsNumber": null, // facture rectificative : numéro de la facture corrigée
"orderName": "#1012",
"orderId": "gid://shopify/Order/1234567890",
"issueDate": "2026-09-09",
"profile": "peppolBis3", // peppolBis3 | xrechnung | en16931
"currency": "EUR",
"totalExclVat": "100.00",
"totalVat": "21.00",
"totalInclVat": "121.00",
"buyerName": "Buyer BV",
"buyerVatId": "BE0123456749"
},
"files": [
{ "name": "INV-12.xml", "contentType": "application/xml", "size": 4821, "content": "PD94bWwg..." },
{ "name": "INV-12.pdf", "contentType": "application/pdf", "size": 61230, "content": "JVBERi0x..." }
]
}
content est le fichier encodé en base64. Le XML est toujours présent ; le PDF uniquement pour les profils qui en produisent un (l'hybride XRechnung/Factur-X allemand et les factures PDF aux consommateurs). Le test ping ne contient que event, shop et sentAt.
Votre point de terminaison doit répondre par un statut 2xx en moins de 15 secondes. Toute autre réponse, redirection comprise, compte comme un échec et sera retentée. Répondez d'abord, traitez ensuite si votre traitement est lent.
Vérifier la signature
Recommandé dès que votre point de terminaison est accessible à n'importe qui (une simple URL n'est pas un secret). Calculez HMAC-SHA256(secret, timestamp + "." + rawBody) où timestamp est la valeur de l'en-tête et rawBody le corps exactement tel que reçu, puis comparez en temps constant avec l'hexadécimal après v1=. Rejetez les requêtes dont l'horodatage s'écarte de plus de cinq minutes de votre horloge, ce qui empêche les rejeux. En Node.js :
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(secret, headers, rawBody) {
const ts = Number(headers["x-invocourier-timestamp"]);
if (!Number.isInteger(ts) || Math.abs(Date.now() / 1000 - ts) > 300) return false;
const expected = "v1=" + createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
const given = headers["x-invocourier-signature"] ?? "";
return expected.length === given.length && timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}
Les URL « catch hook » de Zapier, Make et n8n contiennent un long jeton aléatoire connu de vous seul ; la vérification y est donc facultative.
Recettes
- Zapier : Webhooks by Zapier → Catch Hook (raw). Ajoutez un Formatter → Utilities → Base64 decode (ou une étape Code) sur
files[0].content, puis Google Drive → Upload File avec le contenu décodé etfiles[0].namecomme nom de fichier. Répétez pour le PDF. - Make : Webhooks → Custom webhook, puis Tools → Base64 decode (ou la fonction
toBinary(…; base64)) et n'importe quel module de stockage (Google Drive, Dropbox, OneDrive, SFTP, S3). - n8n : nœud Webhook (répondre immédiatement), nœud Convert to File avec « Move Base64 String to File », puis le nœud de stockage de votre choix.
- Logiciels de comptabilité : la plupart acceptent les documents par e-mail ; la copie d'archive par e-mail est alors la voie la plus simple.
Bucket compatible S3
Chaque document est envoyé comme objet nommé préfixe/AAAA/MM/INV-12.xml (et .pdf le cas échéant) : une année est un dossier, un mois un sous-dossier. Choisissez votre fournisseur et le point de terminaison, la région et le mode d'adressage sont préremplis ; vous ajoutez le nom du bucket, un préfixe de dossier facultatif et une paire de clés d'accès.
| Fournisseur | À savoir |
|---|---|
| Amazon S3 | Point de terminaison https://s3.<région>.amazonaws.com ; le champ région doit correspondre à la région du bucket. Créez un utilisateur IAM avec s3:PutObject (et s3:DeleteObject pour le nettoyage du test) sur le bucket. |
| Hetzner Object Storage | Point de terminaison par emplacement (fsn1, nbg1, hel1), région = le nom de l'emplacement, identifiants S3 depuis la Cloud Console. |
| Cloudflare R2 | Point de terminaison https://<id de compte>.r2.cloudflarestorage.com, région auto, un jeton API R2 avec lecture et écriture d'objets sur le bucket. |
| Scaleway, OVHcloud, Backblaze B2, Wasabi, DigitalOcean Spaces | Préréglages pour leurs régions européennes ; changez point de terminaison et région ensemble si votre bucket est ailleurs. Backblaze : utilisez une application key limitée au bucket, son ID comme access key ID. |
| MinIO, Garage, Ceph, autre | Saisissez le point de terminaison et la région attendus par votre serveur (souvent us-east-1) ; laissez l'adressage path-style activé. |
Seuls les points de terminaison https:// sont acceptés. Les requêtes sont signées en AWS Signature Version 4 ; l'application ne liste ni ne lit jamais votre bucket. Le test de connexion écrit invocourier-connection-test.txt sous le préfixe puis le supprime (une clé qui peut écrire mais pas supprimer réussit quand même ; le fichier reste).
Serveur SFTP
Les fichiers sont écrits dans dossier/AAAA/MM/ via SSH, avec un mot de passe ou une clé privée (format PEM ou OpenSSH, phrase secrète facultative) ; les répertoires manquants sont créés. Tout serveur SFTP convient : votre hébergeur, un NAS, une Storage Box Hetzner, un serveur à vous. Le FTP en clair n'est volontairement pas proposé.
Clé d'hôte : le premier test de connexion réussi enregistre l'empreinte de la clé du serveur et chaque envoi suivant la vérifie. Si le serveur est réinstallé et que sa clé change, les envois s'arrêtent avec une erreur explicite jusqu'à ce que vous relanciez le test de connexion, qui accepte la nouvelle clé et affiche son empreinte.
Le test de connexion se connecte, crée le dossier si besoin, y écrit invocourier-connection-test.txt puis le supprime.
Google Drive, Dropbox, OneDrive
Les clouds se connectent en un clic plutôt qu'avec des identifiants : Connecter Google Drive (ou Dropbox, OneDrive) ouvre l'écran de consentement du fournisseur en haut de votre navigateur, vous approuvez, et vous revenez dans l'application avec la destination déjà testée et active. L'accès est aussi restreint que chaque fournisseur le permet :
- Google Drive : uniquement la permission « fichiers créés par cette application ». Les documents vont dans un dossier de votre Mon Drive (par défaut Invocourier, nom à votre choix), puis
AAAA/MM. Invocourier ne peut ni voir ni lister aucun autre fichier de votre Drive. - Dropbox : la permission « dossier d'application ». Tout est écrit sous
Apps/Invocourier/(avec, si vous voulez, un sous-dossier à votre nom), puisAAAA/MM; rien en dehors de ce dossier n'est visible pour l'application. - OneDrive (personnel ou Microsoft 365) : la permission « dossier d'application » via Microsoft Graph, donc tout vit aussi sous
Apps/Invocourier/.
Le fournisseur remet à Invocourier un jeton de longue durée, stocké chiffré et renouvelé automatiquement. Si vous retirez l'accès de l'application dans les paramètres de votre compte Google, Dropbox ou Microsoft, les envois s'arrêtent avec un message explicite et Reconnecter dans l'application les rétablit. Google fait aussi expirer une connexion inutilisée pendant six mois ; une boutique qui facture régulièrement n'est jamais concernée.
Renommer ou déplacer le dossier plus tard ne pose pas de problème pour Google Drive (l'application mémorise le dossier lui-même) et n'a pas d'importance pour les dossiers d'application. Supprimer le dossier amène l'application à le recréer au document suivant.
WebDAV (Nextcloud, ownCloud, Synology, Storage Box)
Saisissez l'adresse WebDAV du dossier où les documents doivent aller, plus nom d'utilisateur et mot de passe ; les fichiers sont écrits dans AAAA/MM/ en dessous, les dossiers étant créés au besoin. Seules les adresses https:// sont acceptées.
| Serveur | URL de dossier à saisir |
|---|---|
| Nextcloud, ownCloud | https://cloud.example.com/remote.php/dav/files/UTILISATEUR/Factures/ (application Fichiers → Paramètres, en bas à gauche, affiche votre base WebDAV). Avec l'authentification à deux facteurs, créez un mot de passe d'application sous Paramètres → Sécurité et utilisez-le. |
| NAS Synology | Activez le paquet WebDAV Server (port HTTPS 5006) : https://nas.example.com:5006/Factures/, avec un utilisateur ayant accès en écriture à ce dossier partagé. |
| Storage Box Hetzner | Activez WebDAV dans le panneau Robot : https://uXXXXXX.your-storagebox.de/Factures/, nom d'utilisateur uXXXXXX. |
| IONOS HiDrive, autre | L'URL WebDAV documentée par votre fournisseur, se terminant par le dossier voulu. |
Le test de connexion vérifie le dossier (en le créant, ainsi que les parents manquants, s'il n'existe pas encore), écrit invocourier-connection-test.txt et le supprime. Un mauvais mot de passe s'affiche comme « authentication refused » ; une adresse non WebDAV comme « method not allowed ».
Nouvelles tentatives, échecs et ce que vous voyez
Chaque document est envoyé au moment de son émission. En cas d'échec, il est retenté après 5 minutes, 30 minutes, 2 heures, 12 heures, puis chaque jour, pendant environ trois jours et demi au total. Un envoi qui échoue encore après cela est marqué en échec ; la page d'accueil indique le nombre de documents concernés et la page Destinations d'archive propose un bouton Réessayer les copies en échec qui leur redonne un cycle complet une fois le récepteur réparé.
Après trois échecs d'affilée, la destination elle-même passe en En échec avec la dernière erreur ; elle repasse en Active d'elle-même au prochain envoi réussi. Chaque destination affiche combien de documents ont été copiés, sont en file et ont échoué.
Une destination en échec n'affecte jamais la facturation ni la remise à vos acheteurs, et l'archive dans l'application contient toujours chaque document.
Copier les documents existants
Une destination ne reçoit que les documents émis après son activation. Copier les documents existants met en file tout ce qui est déjà dans l'archive et que la destination n'a pas encore reçu ; les copies s'exécutent en arrière-plan, environ 50 toutes les cinq minutes, et chaque document est envoyé au plus une fois vers une destination donnée.
Protection des données
L'envoi de documents vers une destination se fait sur votre instruction documentée, vers un stockage qui vous appartient ou que vous avez contracté vous-même. Le récepteur est donc votre propre sous-traitant (ou vous-même), pas un sous-traitant ultérieur d'Invocourier ; assurez-vous que votre contrat avec ce prestataire couvre les données de facturation. Seul un transport chiffré (HTTPS) est utilisé ; le FTP en clair n'est volontairement pas proposé.
Supprimer une destination efface immédiatement ses paramètres et secrets ; les documents déjà livrés restent là où vous les avez mis. Tout est également supprimé lorsque vous désinstallez l'application.