Archiefbestemmingen: een kopie van elke factuur in opslag die van u is

Invocourier-hulp - e-facturatie voor Shopify. | Terug naar invocourier.com

Andere talen: English | Français | Deutsch

Wat dit doet

Elke factuur en creditfactuur die Invocourier uitgeeft, blijft in het archief van de app en u kunt alles op elk moment downloaden. Een archiefbestemming gaat een stap verder: zodra een document is uitgegeven, wordt een kopie (de XML, plus de PDF waar die bestaat) naar opslag gestuurd die u beheert. U bent nooit afhankelijk van de app om uw wettelijke administratie te bewaren, en de kopieën blijven aankomen zonder dat iemand iets hoeft te doen.

Vandaag beschikbaar: een ondertekende webhook (Zapier, Make, n8n, eigen eindpunt), een S3-compatibele bucket (Amazon S3, Hetzner, Cloudflare R2, Scaleway, OVHcloud, Backblaze, Wasabi, DigitalOcean, MinIO) een SFTP-server, de clouddiensten Google Drive, Dropbox en OneDrive, en WebDAV (Nextcloud, ownCloud, Synology, Storage Box). Automatische archiefkopieën per e-mail bestaan ook en staan hier los van.

Overdrachten zijn bewust „best effort”: ze vertragen of blokkeren het factureren nooit, en het archief in de app blijft de gezaghebbende bron. Een bestemming die faalt, wordt meerdere dagen opnieuw geprobeerd en daarna op de startpagina getoond.

Instellen

Open de app en ga naar Archiefbestemmingen (ook gelinkt vanuit Instellingen, naast het archief-e-mailadres).

  1. Kies onder Bestemming toevoegen het type en klik op Toevoegen.
  2. Vul de gegevens van de bestemming in (voor een webhook: de eindpunt-URL) en klik op Opslaan en testen.
  3. De app voert meteen een verbindingstest uit. Slaagt die, dan toont de bestemming Actief en ontvangt ze vanaf dan elk uitgegeven document. Mislukt die, dan wordt het antwoord van de bestemming getoond en wordt er niets verstuurd totdat een test slaagt.

Elke wijziging van de verbindingsgegevens zet de bestemming terug op Test in afwachting, zodat een typefout nooit stilletjes documenten nergens heen stuurt. Pauzeren bewaart de instellingen maar stopt het versturen; Verwijderen wist ze.

Inloggegevens en geheimen worden versleuteld opgeslagen en nooit in de app getoond, behalve als u erom vraagt (het ondertekeningsgeheim van de webhook).

Webhook

Eén HTTPS-POST per document naar de URL die u invoert. Alleen https://-URL's op publieke hosts worden aanvaard. Het verzoek is ondertekend met een geheim dat is aangemaakt bij het aanmaken van de webhook; het blijft hetzelfde als u de URL wijzigt, dus uw ontvanger heeft het maar één keer nodig. Ondertekeningsgeheim tonen op het bewerkingsformulier van de webhook laat het zien.

Headers

HeaderWaarde
Content-Typeapplication/json
X-Invocourier-Eventdocument.issued, of ping voor de verbindingstest
X-Invocourier-DeliveryEen identificatie van deze poging (een nieuwe poging krijgt een nieuwe)
X-Invocourier-TimestampUnix-tijd in seconden op het moment van ondertekenen
X-Invocourier-Signaturev1= gevolgd door de HMAC in hexadecimaal (zie hieronder)
User-AgentInvocourier-Webhook/1

Body

{
  "event": "document.issued",
  "shop": "uw-winkel.myshopify.com",
  "sentAt": "2026-09-09T10:15:02.000Z",
  "document": {
    "id": 12,
    "number": "INV-12",
    "type": "invoice",              // of "credit_note"
    "correctsNumber": null,         // creditfacturen: nummer van de gecorrigeerde factuur
    "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 is het bestand, base64-gecodeerd. De XML is er altijd; de PDF alleen bij profielen die er een maken (de Duitse XRechnung/Factur-X-hybride en PDF-facturen aan consumenten). De ping-test bevat alleen event, shop en sentAt.

Uw eindpunt moet binnen 15 seconden antwoorden met een 2xx-status. Al het andere, ook een redirect, telt als een mislukking en wordt opnieuw geprobeerd. Antwoord eerst en verwerk daarna als uw verwerking traag is.

De handtekening controleren

Aanbevolen zodra uw eindpunt voor iedereen bereikbaar is (een gewone URL is geen geheim). Bereken HMAC-SHA256(secret, timestamp + "." + rawBody), waarbij timestamp de headerwaarde is en rawBody de body precies zoals ontvangen, en vergelijk in constante tijd met de hexadecimale waarde na v1=. Weiger verzoeken waarvan de tijdstempel meer dan vijf minuten van uw klok afwijkt; dat voorkomt replays. In 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));
}

De „catch hook”-URL's van Zapier, Make en n8n bevatten een lang willekeurig token dat alleen u kent; daar is controle optioneel.

Recepten

S3-compatibele bucket

Elk document wordt geüpload als object met de naam prefix/JJJJ/MM/INV-12.xml (en .pdf waar die bestaat): een jaar is één map, een maand één submap. Kies uw aanbieder en het eindpunt, de regio en de adresseringsstijl worden ingevuld; u voegt de bucketnaam, een optionele mapprefix en een sleutelpaar toe.

AanbiederGoed om te weten
Amazon S3Eindpunt https://s3.<regio>.amazonaws.com; het regioveld moet overeenkomen met de regio van de bucket. Maak een IAM-gebruiker met s3:PutObject (en s3:DeleteObject voor het opruimen van de test) op de bucket.
Hetzner Object StorageEindpunt per locatie (fsn1, nbg1, hel1), regio = de locatienaam, S3-inloggegevens uit de Cloud Console.
Cloudflare R2Eindpunt https://<account-id>.r2.cloudflarestorage.com, regio auto, een R2-API-token met lees- en schrijfrechten op objecten in de bucket.
Scaleway, OVHcloud, Backblaze B2, Wasabi, DigitalOcean SpacesVoorinstellingen voor hun Europese regio's; wijzig eindpunt en regio samen als uw bucket ergens anders staat. Backblaze: gebruik een application key beperkt tot de bucket, met de key-ID als access key ID.
MinIO, Garage, Ceph, andereVoer het eindpunt en de regio in die uw server verwacht (vaak us-east-1); laat path-style adressering aan.

Alleen https://-eindpunten worden aanvaard. Verzoeken worden ondertekend met AWS Signature Version 4; de app leest of doorzoekt uw bucket nooit. De verbindingstest schrijft invocourier-connection-test.txt onder de prefix en verwijdert het weer (een sleutel die mag schrijven maar niet verwijderen slaagt toch; het bestand blijft staan).

SFTP-server

Bestanden worden via SSH naar map/JJJJ/MM/ geschreven, met een wachtwoord of een privésleutel (PEM- of OpenSSH-formaat, optionele wachtwoordzin); ontbrekende mappen worden aangemaakt. Elke SFTP-server werkt: uw webhoster, een NAS, een Hetzner Storage Box, een eigen server. Onversleutelde FTP wordt bewust niet aangeboden.

Hostsleutel: de eerste geslaagde verbindingstest onthoudt de vingerafdruk van de serversleutel en elke latere upload controleert die. Wordt de server opnieuw geïnstalleerd en verandert de sleutel, dan stoppen de uploads met een duidelijke fout totdat u de verbindingstest opnieuw uitvoert; die aanvaardt de nieuwe sleutel en toont de vingerafdruk.

De verbindingstest logt in, maakt de map aan als die ontbreekt, schrijft er invocourier-connection-test.txt en verwijdert het weer.

Google Drive, Dropbox, OneDrive

De clouddiensten verbinden met één klik in plaats van met inloggegevens: Google Drive verbinden (of Dropbox, OneDrive) opent het toestemmingsscherm van de aanbieder bovenaan in uw browser, u keurt goed en u komt terug in de app met de bestemming al getest en actief. De toegang is zo beperkt als elke aanbieder toelaat:

De aanbieder geeft Invocourier een langlevend token dat versleuteld wordt opgeslagen en automatisch wordt vernieuwd. Trekt u de toegang van de app in via de instellingen van uw Google-, Dropbox- of Microsoft-account, dan stoppen de uploads met een duidelijke melding en herstelt Opnieuw verbinden in de app ze. Google laat een zes maanden ongebruikte verbinding ook verlopen; een winkel met regelmatige facturen komt daar nooit aan toe.

De map later hernoemen of verplaatsen is voor Google Drive geen probleem (de app onthoudt de map zelf) en voor de app-mappen niet van belang. Verwijdert u de map, dan maakt de app die bij het volgende document opnieuw aan.

WebDAV (Nextcloud, ownCloud, Synology, Storage Box)

Voer het WebDAV-adres in van de map waar de documenten naartoe moeten, plus gebruikersnaam en wachtwoord; bestanden worden daaronder naar JJJJ/MM/ geschreven, mappen worden aangemaakt waar nodig. Alleen https://-adressen worden aanvaard.

ServerIn te voeren map-URL
Nextcloud, ownCloudhttps://cloud.example.com/remote.php/dav/files/GEBRUIKER/Facturen/ (Bestanden-app → Instellingen linksonder toont uw WebDAV-basis). Met tweefactorauthenticatie maakt u onder Instellingen → Beveiliging een app-wachtwoord aan en gebruikt u dat.
Synology NASSchakel het pakket WebDAV Server in (HTTPS-poort 5006): https://nas.example.com:5006/Facturen/, met een gebruiker die schrijfrechten heeft op die gedeelde map.
Hetzner Storage BoxSchakel WebDAV in via het Robot-paneel: https://uXXXXXX.your-storagebox.de/Facturen/, gebruikersnaam uXXXXXX.
IONOS HiDrive, andereDe WebDAV-URL die uw aanbieder documenteert, eindigend op de gewenste map.

De verbindingstest controleert de map (en maakt die, met ontbrekende bovenliggende mappen, aan als ze nog niet bestaat), schrijft invocourier-connection-test.txt en verwijdert het weer. Een verkeerd wachtwoord verschijnt als „authentication refused”; een niet-WebDAV-adres als „method not allowed”.

Nieuwe pogingen, fouten en wat u ziet

Elk document wordt verstuurd op het moment van uitgifte. Mislukt dat, dan wordt het opnieuw geprobeerd na 5 minuten, 30 minuten, 2 uur, 12 uur en daarna dagelijks, in totaal ongeveer drieënhalve dag. Een overdracht die daarna nog steeds mislukt, wordt als mislukt gemarkeerd; de startpagina toont hoeveel documenten getroffen zijn en de pagina Archiefbestemmingen heeft een knop Mislukte kopieën opnieuw proberen die ze een nieuwe ronde geeft zodra u de ontvanger hebt hersteld.

Na drie mislukkingen op rij toont de bestemming zelf Faalt met de laatste fout; bij de volgende geslaagde overdracht wordt ze vanzelf weer Actief. Elke bestemming toont hoeveel documenten gekopieerd zijn, in de wachtrij staan en mislukt zijn.

Een falende bestemming heeft nooit invloed op het factureren of de aflevering bij uw kopers, en het archief in de app bevat altijd elk document.

Bestaande documenten kopiëren

Een bestemming ontvangt alleen documenten die na haar activering zijn uitgegeven. Bestaande documenten kopiëren zet alles in de wachtrij wat al in het archief staat en wat de bestemming nog niet heeft ontvangen; de kopieën lopen op de achtergrond, ongeveer 50 per vijf minuten, en elk document wordt hoogstens één keer naar een bepaalde bestemming gestuurd.

Gegevensbescherming

Het versturen van documenten naar een bestemming gebeurt op uw gedocumenteerde instructie, naar opslag die van u is of die u zelf hebt gecontracteerd. De ontvanger is dus uw eigen verwerker (of uzelf), geen subverwerker van Invocourier; zorg dat uw overeenkomst met die aanbieder factuurgegevens dekt. Alleen versleuteld transport (HTTPS) wordt gebruikt; onversleutelde FTP wordt bewust niet aangeboden.

Een bestemming verwijderen wist meteen haar instellingen en geheimen; al afgeleverde documenten blijven waar u ze hebt gezet. Alles wordt ook verwijderd wanneer u de app deïnstalleert.