Invoice Pilot
Invoice Pilot breidt WooCommerce uit met country-aware facturatie voor de 27 EU-lidstaten. Het vangt de juiste billing-velden af bij de checkout (Italiaanse SDI / PEC-codes, Franse SIRET, Duitse Leitweg-ID, Poolse NIP, Roemeense CUI, enzovoort) en geeft vervolgens immutable PDF- en XML-facturen, creditnota’s, proforma’s en offertes uit vanuit de order. De PDF wordt gerenderd met mPDF; de XML-envelope wordt automatisch gekozen op basis van het land van de koper en dekt elf nationale profielen waaronder FatturaPA (IT), XRechnung (DE), KSeF FA(2) (PL), Factur-X (FR), CIUS_RO (RO), Facturae (ES) en UBL 2.1 / PEPPOL BIS 3.0 als de generieke fallback.
Naast de document-engine levert Invoice Pilot first-class integraties met zes accounting-providers — SmartBill (Roemenië), Fatture in Cloud (Italië), Xero, QuickBooks Online, Fortnox (Zweden) en Sage — een BTW-validator die de Europese VIES-service raadpleegt met een per-land formaat-fallback, een dashboard met KPI-kaarten en trend-charts, en een optionele multi-provider AI-laag (Anthropic Claude, OpenAI, Google Gemini, DeepSeek, Grok xAI) voor checkout smart-fill, compliance pre-flight, line translation en natural-language document search. De plugin ondersteunt ook WordPress Multisite met tabellen per site en een network-wide overview-pagina.
Voordelen
- WooCommerce-gedreven document-lifecycle voor facturen, creditnota’s, proforma’s en offertes, met reserved numbering series, een clean issue / regenerate / reissue / void / credit-note flow, en per-document-type styling (disclaimer banner op niet-fiscale documenten, “Valid until”-labels op offertes, “Refund total” op creditnota’s, betalingsblok verborgen op offerte en creditnota).
- EU-27 country-specifieke billing-velden geregistreerd tegen zowel de legacy shortcode-checkout als de WooCommerce 8.6+ block-checkout (via de Additional Checkout Fields API).
- PDF-rendering via mPDF met één van drie meegeleverde templates (Minimal, Classic, Modern), met picker voor accent-kleur, tekstkleur, font family en seller logo.
- Elf XML-writers, automatisch gedispatcht op basis van het land van de koper: FatturaPA (IT), Factur-X / CII (FR), XRechnung 3.0 (DE), KSeF FA(2) (PL), CIUS_RO 1.0.0 (RO), Facturae 3.2.2 (ES), SAF-T PT (PT), OIOUBL (DK), Finvoice 3.0 (FI), ebInterface 6.1 (AT), myDATA InvoicesDoc (GR / EL), met UBL 2.1 / PEPPOL BIS 3.0 als universele fallback.
- BTW-validation-chain die de Europese VIES SOAP-service combineert met offline regex-validatie per land, een DB-backed cache en een hourly cron die stale entries opnieuw valideert.
- Zes accounting-integraties — SmartBill, Fatture in Cloud, Xero, QuickBooks Online, Fortnox en Sage — elk met encrypted credentials, push / status / void operations en een retry-queue. De Integrations settings-tab gebruikt een sticky provider selector zodat het paneel dat je aan het configureren was open blijft over saves heen.
- Optionele AI-laag met vijf providers (Anthropic, OpenAI, Google Gemini, DeepSeek, Grok xAI) die smart-fill, compliance check, line translation en natural-language search dekken; de plugin werkt volledig zonder API key.
- Dashboard met period selector, vijf KPI-kaarten en twee trend- charts; een aparte Integration Log registreert elke push en failure.
- WordPress Multisite-support — elke sub-site heeft zijn eigen tabellen, settings en numbering counters, met een network admin page die statistieken aggregeert.
Vereisten
| Component | Minimum |
|---|---|
| WordPress | 5.8 (getest tot 7.0) |
| PHP | 8.0 |
| WooCommerce | 7.0 |
| Database | MySQL 5.7 of MariaDB 10.2 (de dashboard SQL gebruikt JSON_EXTRACT / JSON_UNQUOTE tegen de immutable snapshot-kolom) |
De block-checkout-integratie is geregistreerd tegen de WooCommerce
Additional Checkout Fields API (geïntroduceerd in WooCommerce 8.6). Op
oudere WooCommerce-versies voegt de legacy woocommerce_billing_fields-
filter nog steeds BTW-, fiscale-code- en country-specifieke velden toe
aan de shortcode-checkout, dus de plugin degradeert gracieus.
Installatie
- Download de laatste Invoice Pilot ZIP van de GitHub Releases pagina.
- Open in WordPress Plugins → Nieuwe plugin → Plugin uploaden.
- Kies de ZIP en klik op Nu installeren.
- Klik op Plugin activeren.
- Open Invoice Pilot → Settings om de seller, numbering series en optionele integraties te configureren.
Activatie maakt de database-tabellen van de plugin aan, installeert de
default settings en seedt vijf numbering series (één per document type):
INV (invoice, default), REC (receipt), CN (credit note), PRO
(proforma) en Q (quote), allemaal met het patroon YYYY-NNNN en een
jaarlijkse reset. Vier cron-jobs worden ook ingepland: daily log
cleanup, vijftien-minuten retry van failed integration pushes, hourly
VIES-revalidatie en daily Fatture in Cloud token refresh.
Op WordPress Multisite draait dezelfde per-site bootstrap automatisch
wanneer een nieuwe sub-site wordt aangemaakt (wp_initialize_site).
Configuratie
Alle Invoice Pilot-schermen staan onder het hoofdmenu Invoice Pilot in de WordPress admin-sidebar:
- Dashboard — KPI-kaarten en trend-charts.
- Documents — moderne data-grid die elk uitgegeven document toont (factuur, creditnota, proforma, offerte, kassabon) met een unified toolbar (AI search + type-filter), kleurgecodeerde status-pills (paid / void / converted / draft / issued), 20-rij paginering en inline PDF- / XML- / Delete-acties.
- Settings — configuratiepagina met acht tabs (hieronder gedocumenteerd).
- Log — integratie-log-entries met retentie en een handmatige cleanup-actie.
De Settings-pagina is verdeeld over de volgende tabs, in de volgorde waarin ze in de UI verschijnen:
- General
- Series
- Document types
- Templates
- VAT validation
- Integrations
- AI
- Advanced
General

De General-tab is verdeeld in drie kaarten: License, Seller details en Document defaults.
License
| Veld | Notities |
|---|---|
| License Key | Plak de PILOT-XXXX-XXXX-XXXX-XXXX-key uit je orderbevestigingsmail en druk op Verify & Save om automatische plugin-updates vanaf de GitHub release feed te activeren. De plugin geeft ook zonder key documenten uit; alleen het auto-update-kanaal is gated. |
Seller details bevat de identiteit die op elk uitgegeven document geprint wordt; Document defaults bevat een klein aantal WooCommerce-level defaults.
| Veld | Default | Notities |
|---|---|---|
| Seller name | leeg | Free text. |
| VAT | leeg | BTW-identifier van de seller. |
| Tax code | leeg | Italiaanse codice fiscale of equivalent. |
| Address | leeg | Straat. |
| ZIP / CAP | leeg | Postcode. |
| City | leeg | |
| Province (2 letters, alleen IT) | leeg | Wordt bij save force-uppercased. |
| Country (ISO, 2 letters) | IT | ISO-3166-1 alpha-2; force-uppercased. |
| leeg | Gevalideerd als e-mailadres. | |
| Logo | leeg | Gekozen uit de WordPress Media Library. PNG of SVG met transparante achtergrond werkt het best; aanbevolen hoogte 64–128px. Het logo wordt rechtsboven op de factuur geprint. |
| IBAN | leeg | Gebruikt door writers die betalingsinstructies emitteren. Geprint in de footer van de factuur en ingebed in FatturaPA <DatiPagamento>. |
| Bank name | leeg | Vrije tekst — geprint onder de IBAN in de factuur-footer en geëmitteerd als <IstitutoFinanziario> in het FatturaPA-blok <DettaglioPagamento>. |
| SWIFT / BIC | leeg | 8 of 11 alfanumerieke tekens; bij save uppercased en gestript van whitespace. Geprint naast de IBAN en geëmitteerd als <BIC> in FatturaPA. |
| Trigger status | processing | WooCommerce-orderstatus die automatische factuuruitgifte triggert. Toegestane waarden: processing, completed, on-hold, pending. |
| Default series | INV | Slug van de numbering series die voor nieuwe facturen gebruikt wordt. |
| VAT number format on PDF | Prefixed — VAT IT04032690614 (VIES-stijl, aanbevolen) | Hoe het BTW-nummer van de seller op de gerenderde factuur en de PDF-preview wordt geprint. Waarden: Prefixed (landcode vóór het nummer, volgens het VIES-stijl format), Bare (alleen het nummer, zoals ingevoerd in Seller details → VAT). Default is Prefixed. |
| Landspecifieke factuurvelden | Alleen Italië (SDI / PEC / fiscaal regime) | Tri-state selector die bepaalt welke landspecifieke velden bij checkout getoond worden. Waarden: Uit — alleen de universele BTW- en fiscaal-code-velden worden getoond, Alleen Italië (SDI / PEC / fiscaal regime), Alle EU-27 landspecifieke velden. Geldt voor zowel de block-checkout als de legacy shortcode-checkout. Elk veld heeft een vertaalbare label (bv. SDI recipient code, Certified email (PEC), SIRET, Steuernummer) — de oude ruwe snake_case-namen zijn verdwenen. |
Series

De Series-tab is een CRUD-tabel over de numbering series die zijn
opgeslagen in de eigen series-tabel van de plugin. Elke rij regelt
hoe documenten van een bepaald type genummerd worden.
Kolommen: Slug, Pattern, Counter, Reset, Default, Enabled, Actions (Edit / Delete).
Het Add- / Edit-formulier toont:
| Veld | Toegestane waarden | Default |
|---|---|---|
| Slug | Lowercase identifier. Moet uniek zijn. | leeg |
| Document type | invoice, receipt, credit_note, proforma, quote. | invoice |
| Pattern | Free text; placeholders {YYYY} (jaar) en {NNNN} (counter) worden bij issue-time uitgebreid. | INV-{YYYY}-{NNNN} |
| Counter | Integer, één of hoger. Volgende nummer dat wordt toegewezen — het eerstvolgende document dat uit deze series wordt uitgegeven, krijgt exact deze waarde (dus Counter = 47 geeft de volgende keer INV-2026-0047, niet INV-2026-0048). | 1 |
| Reset strategy | never, yearly. | never |
| Default | Boolean — markeer deze series als default voor nieuwe documenten van dit type. | uit |
| Enabled | Boolean — sta deze series toe om gebruikt te worden. | aan |
Het hernoemen van een slug update de series-rij in place (met behoud
van het integer id en eventuele referenties) en migreert de setting
default_series automatisch als die naar de oude slug wees. Een series
verwijderen verwijdert niet bestaande documenten; die behouden hun
nummers.
Document types

De Document types-tab toggelt optionele document types en toont de FatturaPA-specifieke bollo- en ritenuta-instellingen.
Kaart Document types
| Toggle | Default | Beschrijving |
|---|---|---|
| Auto-issue credit note on WC refund | aan | Wanneer een WooCommerce-refund wordt aangemaakt, automatisch een creditnota uitgeven die aan de originele factuur is gekoppeld. |
| Enable proforma documents | aan | Toon een knop “Create proforma” op het WC-orderscherm en sta conversie naar factuur toe. |
| Enable quote (preventivo) documents | aan | Toon een knop “Create quote” op het WC-orderscherm. Offertes zijn non-fiscaal: er wordt een PDF geproduceerd maar geen XML. |
Kaart FatturaPA — Italian B2B
| Veld | Default | Beschrijving |
|---|---|---|
| Bollo virtuale assolto | uit | Emitteer DatiBollo (2,00 EUR virtuele stamp) op facturen boven EUR 77,47 wanneer de verplichting bij de Agenzia delle Entrate is aangegeven. |
| Apply Ritenuta d’acconto | uit | Bereken en emitteer DatiRitenuta op facturen aan Italiaanse B2B-kopers. |
| Default rate | 20.00 % | 0–100, stap 0.01. |
| Tipo ritenuta | RT02 | RT01 (persone fisiche) of RT02 (persone giuridiche). |
| Causale pagamento | A | Eén uppercase letter uit de SDI 1.1.5.2-tabel (bijv. A = professional services). |
Templates

Kies één van drie meegeleverde PDF-templates en pas zijn kleuren en typografie aan.
| Template | Beschrijving |
|---|---|
| Minimal | Clean sans-serif layout met een teal accent. Default. |
| Classic | Serif-typografie met een gekleurde header band. Traditionele look voor professional services. |
| Modern | Twee-koloms header en rounded cards. Geschikt voor design-led brands. |
Aanvullende velden:
| Veld | Default | Notities |
|---|---|---|
| Primary colour | #1e8a8a | Native HTML5 color picker; accent voor headings, dividers en table headers. |
| Font | Site theme font (system stack) | Eén van: default, dejavusans, dejavuserif, dejavusansmono, helvetica, times, courier. De waarde default gebruikt de system font stack van de site met DejaVuSans als PDF-fallback. |
| Text colour | #222222 | Default body-text-kleur. Muted captions en footers behouden hun lichtere tone. |
De tab embedt ook een live PDF-preview (gerenderd tegen het REST-
endpoint /wp-json/invoice-pilot/v1/preview-template), zodat je
templates side-by-side kunt vergelijken voor het opslaan. Het wisselen
van de radio swapt de iframe direct; de keuze blijft pas bewaard wanneer
je op Save template drukt.

Een Document type-selector staat boven de iframe, zodat je kunt
previewen hoe elk van de vier document types gerenderd wordt —
invoice, credit_note, proforma, quote — met hetzelfde template,
dezelfde sample seller en dezelfde sample buyer. De per-type verschillen:
| Type | Title | Number prefix | Status pill | Disclaimer banner | Payment / IBAN |
|---|---|---|---|---|---|
invoice | Invoice | INV- | ISSUED | — | getoond |
credit_note | Credit note | CN- | CREDIT NOTE | Refund of INV-… | verborgen |
proforma | Proforma | PRO- | PROFORMA | Proforma — not a fiscal document. | getoond |
quote | Quote | Q- | QUOTE | Quote — not a fiscal document, subject to acceptance. | verborgen |
Offertes herlabelen daarnaast de prominente “Issued” / “Due date”-cellen
naar Valid until en hernoemen de hero total naar Estimated total;
creditnota’s hernoemen het naar Refund total. Deze verschillen komen
uit een per-type label override map en een doc_type_context() helper
die in de template engine wordt gevoed, zodat de drie meegeleverde designs
(Minimal / Classic / Modern) een consistente visuele identiteit behouden
over document types heen zonder template-bestanden te dupliceren.
De footer toont het land van de koper altijd in zijn volledige Engelse
vorm (bv. Germany, niet DE) — de ISO-code uit de order wordt voor
het renderen opgelost via PHP’s Locale::getDisplayRegion(), wat de
gerenderde factuur leesbaar houdt voor menselijke kopers en
belastingauditors. Het BTW-nummer van de seller zelf wordt geprint
volgens VAT number format on PDF in General → Document defaults —
default is het VIES-stijl prefixed format (VAT IT04032690614), met
een Bare-optie voor jurisdicties die het kale nummer prefereren.
De dispatcher die de juiste XML-envelope per land van de koper kiest is
de filter invoice_pilot_xml_writer_for_country, zodat host-code per
ISO kan overschrijven (zie Hooks en filters).
BTW-validatie

BTW-identifiers die bij de checkout (en op elk adresscherm waarop het veld getoond wordt) worden ingevoerd, worden door een keten van validators gehaald. Elke validator wordt door een onafhankelijke toggle geactiveerd en draait in volgorde totdat er één een positief resultaat teruggeeft; zowel positieve als negatieve antwoorden worden gecached voor de geconfigureerde TTL.
| Validator | Default | Beschrijving |
|---|---|---|
| VIES (EU SOAP) | aan | Cross-checkt EU BTW-ID’s tegen de VIES-service van de Europese Commissie. |
| Per-country format | aan | Offline regex-validatie per land. Altijd aanbevolen als fallback. |
| Veld | Default | Range / Notes |
|---|---|---|
| Cache TTL (uren) | 24 | 1 – 720. Failed VIES-lookups ouder dan 6 uur worden door de hourly cron opnieuw gevalideerd. |
| Intra-EU B2B reverse charge | aan | Wanneer de koper in een andere EU-lidstaat zit dan de verkoper en een BTW-nummer levert dat de keten als geldig bevestigt, zet WooCommerce de BTW in het winkelmandje automatisch op nul (de koper voldoet de BTW zelf in zijn eigen land). Het BTW-veld krijgt ook een live-badge — groen ✓ bij succes, rood ✕ bij fout. |
| BTW aftrekken als klant in basisland zit | uit | De meeste jurisdicties staan dit NIET toe — laat uit, tenzij je specifiek fiscaal advies hebt dat het op jouw bedrijf van toepassing is. Wanneer aan, triggert een geldige binnenlandse B2B-BTW ook bij binnenlandse verkopen de reverse-charge-aftrek. |
Een read-only rij Cache state rapporteert het aantal gecachte entries en hoeveel daarvan verlopen zijn en op eviction wachten.
Test BTW-validatie — een kleine tester-kaart onder de instellingen draait elke provider rechtstreeks tegen één enkel BTW-nummer, omzeilt de keten-volgorde en de cache, zodat je kunt zien of VIES het nummer daadwerkelijk heeft bevestigd of dat alleen de offline-formatcheck dat heeft gedaan.
Seed EU-27 standaard BTW-tarieven — de kaart onderaan vult WooCommerce → Settings → Tax → Standard rates met het actuele standaard-BTW-tarief voor elke EU-27-lidstaat (AT 20% BE 21% BG 20% HR 25% CY 19% CZ 21% DK 25% EE 22% FI 25.5% FR 20% DE 19% GR 24% HU 27% IE 23% IT 22% LV 21% LT 21% LU 17% MT 18% NL 21% PL 23% PT 23% RO 21% SK 23% SI 22% ES 21% SE 25%). Standaard worden alleen ontbrekende landen ingevoegd; vink Overwrite existing rates aan om elke regel naar de canonieke waarde te forceren (handig nadat de EU een nationaal tarief heeft aangepast). De kaart toont ook elk (ISO, tarief)-paar zodat je precies ziet wat geschreven wordt voordat je op de knop drukt.
Integrations
De Integrations-tab rendert één paneel per geregistreerde integration-
provider achter één enkele Provider-selector bovenaan — kies de
provider die je wilt configureren, en alleen zijn kaart is zichtbaar;
de anderen blijven verborgen in de DOM. De selector is sticky over
form-saves: wanneer je het formulier van een provider opslaat (of de
tab opent met ?integration=<id> in de URL), houdt de volgende render
die provider geselecteerd, zodat je niet terug gestuurd wordt naar
welke provider dan ook die als eerste is geregistreerd.
Standaard levert Invoice Pilot zes providers; third-party code kan via
de filter invoice_pilot_integration_providers extra registreren.
Elk providerpaneel wordt afgesloten door een Connection Status-kaart met een knop Test Connection. De knop stuurt een lightweight request tegen de opgeslagen credentials en print de upstream response — sla het formulier eerst op als je net nieuwe tokens hebt geplakt.
SmartBill

Roemeense facturatieprovider. Credentials worden at rest encrypted met de symmetric crypto-laag van de plugin.
| Veld | Default | Notities |
|---|---|---|
| Enable SmartBill | uit | Push uitgegeven facturen naar SmartBill zodra ze worden uitgegeven. |
| API username | leeg | De username die je gebruikt om in te loggen op SmartBill. |
| Token | leeg | Plak je SmartBill API-token. De opgeslagen waarde is encrypted; laat het veld bij vervolgsaves leeg om hem te behouden. |
| CIF (company) | leeg | Roemeense bedrijfs-BTW-code. |
| Series | leeg | SmartBill-series gebruikt voor gepushte facturen. |
Indien ingeschakeld roept Invoice Pilot bij uitgifte
POST /SBORO/api/v2/invoice aan, daarna pull_status om te
reconciliëren en void wanneer een factuur wordt geannuleerd.
Fatture in Cloud

Italiaanse facturatieprovider. OAuth-tokens worden at rest encrypted
opgeslagen. De daily cron invoice_pilot_refresh_fic_token ververst
de access token automatisch wanneer de integratie is ingeschakeld.
| Veld | Default | Notities |
|---|---|---|
| Enable Fatture in Cloud | uit | Push uitgegeven documenten (facturen, creditnota’s, proforma, offertes) naar Fatture in Cloud zodra ze worden uitgegeven. |
| Client ID | leeg | OAuth client identifier. |
| Access token | leeg | Plak de OAuth access token. De opgeslagen waarde is encrypted; laat het veld bij vervolgsaves leeg om hem te behouden. |
| Refresh token | leeg | Zelfde handling als de access token. |
| Company ID | 0 | Numerieke company identifier in je Fatture in Cloud-account. |
| Create customers | aan | Maak automatisch een customer record op FIC aan wanneer een nieuwe koper wordt gefactureerd. |
Conform het product-policy van Fatture in Cloud submit Invoice Pilot geen FatturaPA naar de SDI namens jou. SDI-submission blijft een aparte manuele stap vanuit je FIC-account.
Xero

Globaal accounting-platform. OAuth 2.0-tokens worden at rest encrypted. De settings-tab is opgebouwd als Connection (status + Connect / Disconnect-knoppen) bovenaan en Settings (app-credentials + push-gedrag) eronder.
Verbinden
Invoice Pilot levert een ingebouwde OAuth-flow — u hoeft de dans in Postman niet meer te doen en geen vier strings meer in het formulier te plakken. De end-to-end setup is:
- Maak een Web app aan op developer.xero.com met de redirect URI die in het Connection-paneel wordt afgedrukt — kopieer hem woordelijk, Xero matcht karakter voor karakter. Apps die na 2 maart 2026 worden aangemaakt kunnen alleen de granulaire scope-set aanvragen; Invoice Pilot kiest automatisch de juiste.
- Genereer een Client secret op de Xero app-pagina (Xero toont hem slechts één keer), plak vervolgens Client ID en Client secret in het Settings-formulier en sla op.
- Klik op Connect to Xero. U wordt door het standaard consent-scherm geleid en, als uw account voor meer dan één organisatie is geautoriseerd, wordt u doorgestuurd naar een in-card picker om de doel-tenant te kiezen. Tokens worden automatisch uitgewisseld en bewaard.
- Disconnect wist de access- en refresh-tokens en de tenant id, terwijl de app-credentials behouden blijven voor een eenvoudige herverbinding.
Pushes gebruiken POST /Invoices met de standaard
Idempotency-Key-header afgeleid van het lokale invoice-id + nummer,
zodat een netwerk-retry samenvalt op hetzelfde Xero InvoiceID in
plaats van een duplicaat te creëren. De refresh token roteert
automatisch bij een 401; mocht hij ooit verlopen (Xero invalideert
refresh tokens na 60 dagen inactiviteit), druk dan gewoon opnieuw
op Connect.
Velden
| Veld | Default | Notities |
|---|---|---|
| Enable Xero | uit | Push uitgegeven documenten naar Xero zodra ze worden uitgegeven. |
| Client ID / Client secret | leeg | OAuth 2.0 app-credentials uit het Xero Developer Portal. Vereist voordat Connect gebruikt kan worden. |
| Access token / Refresh token (advanced) | leeg | Automatisch ingevuld door de Connect-knop. Plak alleen handmatig in als u de tokens buiten deze UI heeft verkregen. |
| Tenant ID | leeg | UUID van de Xero-organisatie. Automatisch ingevuld door Connect (één organisatie) of ingesteld via de in-card tenant picker (meerdere organisaties). |
| Default account code | 200 | Revenue account code die op elke gepushte regel wordt gestempeld. Regio-defaults: UK/NZ 200, US 400, AU 200. Vind de uwe onder Accounting → Chart of accounts in Xero. |
| Default tax type | OUTPUT | Xero TaxType toegepast op belaste regels. Veelvoorkomende waarden: OUTPUT (standaard BTW op verkoop), OUTPUT2 (verlaagd tarief), EXEMPTOUTPUT, NONE. Regels met BTW van nul vallen automatisch terug op NONE. |
| Invoice status on push | AUTHORISED | Eén van DRAFT (bewerkbaar in Xero, nog geen echte factuur), SUBMITTED (wacht op goedkeuring), AUTHORISED (gefinaliseerd). Alles anders wordt teruggesaniteerd naar AUTHORISED. |
| Payment account UUID | leeg | Xero bank- / kas-AccountID gebruikt bij het registreren van betalingen. Vind hem via GET /api.xro/2.0/Accounts?where=Type=="BANK" of in de Xero UI (Chart of accounts → click the bank account → URL contains the UUID). Laat leeg om het registreren van betalingen uit te schakelen. |
QuickBooks Online

Intuit QuickBooks Online — US / CA / UK / globaal. OAuth 2.0-tokens worden at rest encrypted. De settings-tab is opgebouwd als Connection (status + Connect / Disconnect-knoppen) bovenaan en Settings (app-credentials + push-gedrag) eronder.
Verbinden
Invoice Pilot levert een ingebouwde OAuth-flow — u hoeft de dans in Postman niet meer te doen en geen vijf strings meer in het formulier te plakken. De end-to-end setup is:
- Maak een app aan op developer.intuit.com
met QuickBooks Online and Payments als platform en de scope
com.intuit.quickbooks.accounting. Open de tab Keys & OAuth en wissel tussen Development en Production afhankelijk van welke environment u target — elk heeft zijn eigen client_id + secret-paar. - Voeg de redirect URI die in het Connection-paneel wordt afgedrukt
toe aan de lijst Redirect URIs en klik op Save — Intuit
accepteert
http://localhostvoor Development-apps. - Plak Client ID en Client secret in het Settings-formulier, kies de bijpassende Environment (Sandbox / Production) en sla op.
- Klik op Connect to QuickBooks. Het consent-scherm van Intuit
laat u kiezen tegen welke company de integratie moet schrijven; het
gekozen
realmIdwordt teruggegeven in de callback-URL en automatisch opgeslagen — er is geen aparte tenant picker. - Disconnect wist de access- en refresh-tokens en de realm id, terwijl de app-credentials behouden blijven voor een eenvoudige herverbinding.
Elke push gebruikt POST /v3/company/{realmId}/invoice met de
query-parameter requestid ingesteld op een stabiele waarde per
factuur — QBO laat herhaalde POSTs samenvallen op de oorspronkelijke
response, zodat een netwerk-retry nooit een duplicaat zal aanmaken.
Pushes dragen ook minorversion=75 zodat QBO de actuele entity-shapes
teruggeeft (zonder deze waarde downgradet de API stilzwijgend naar het
contract uit 2017). Refresh tokens hebben een levensduur van 100 dagen
vanaf uitgifte en roteren bij elk gebruik; de plugin handelt de
rotatie transparant af bij een 401.
Velden
| Veld | Default | Notities |
|---|---|---|
| Enable QuickBooks Online | uit | Push uitgegeven documenten zodra ze worden uitgegeven. |
| Environment | sandbox | sandbox (default) bereikt sandbox-quickbooks.api.intuit.com; production bereikt quickbooks.api.intuit.com. Elke environment heeft zijn eigen Client ID + secret op de Intuit app-pagina. |
| Client ID / Client secret | leeg | OAuth 2.0 app-credentials uit de tab Keys & OAuth van uw Intuit Developer-app. Vereist voordat Connect gebruikt kan worden. |
| Access token / Refresh token (advanced) | leeg | Automatisch ingevuld door de Connect-knop. QBO access tokens duren ongeveer 60 minuten en roteren via de refresh token; refresh tokens duren 100 dagen vanaf uitgifte en roteren bij elk gebruik. Plak alleen handmatig in als u de tokens buiten deze UI heeft verkregen. |
| Realm ID | leeg | QuickBooks company-ID. Automatisch ingevuld door Connect — QBO geeft hem mee als realmId in de OAuth-callback. Sandbox-companies zien er bijvoorbeeld uit als 9341457147734811; production-realms zijn vergelijkbaar. |
| Default customer ID | leeg | QBO Customer.Id waaraan elke gepushte factuur wordt gehangen. Vereist — QBO weigert facturen zonder een CustomerRef. Vind hem onder Sales → Customers in de QBO-UI of via GET /v3/company/{realmId}/query?query=select * from Customer. |
| Default item ID | 1 | QBO Item.Id gebruikt voor elke regel. 1 is het standaard “Services”-item in een vers sandbox; vind het uwe onder Sales → Products and services. |
| Default tax code | NON | QBO TaxCodeRef toegepast op elke regel. NON = niet-belastbaar (default), TAX = standaard sales tax in US/CA-accounts. Override per jurisdictie door de tax code in QBO aan te maken en de naam ervan hier in te plakken. |
Fortnox

Zweeds accounting-platform. OAuth 2.0-credentials at rest encrypted.
| Veld | Default | Notities |
|---|---|---|
| Enable Fortnox | uit | Push uitgegeven documenten zodra ze worden uitgegeven. |
| Client ID / Client secret | leeg | OAuth 2.0-credentials uit het Fortnox developer portal. |
| Access token / Refresh token | leeg | At rest encrypted. |
| Default customer number | leeg | Gebruikt wanneer de koper geen resolved Fortnox customer number heeft. |
| Default VAT | 25 | Default Zweedse BTW-tarief (in %) toegepast wanneer geen tarief gemapt is. |
| Bookkeep on push | uit | Maak ook de bookkeeping voucher aan bij het pushen van de factuur. |
Sage

OAuth 2.0 accounting-platform (Sage Accounting / Business Cloud).
| Veld | Default | Notities |
|---|---|---|
| Enable Sage | uit | Push uitgegeven documenten zodra ze worden uitgegeven. |
| Client ID / Client secret | leeg | OAuth 2.0-credentials van Sage Developer. |
| Access token / Refresh token | leeg | At rest encrypted. |
| Business ID | leeg | Identifier van de Sage-business waar de integratie naar schrijft. |
| Default contact id / ledger id / tax rate id | leeg | Fallbacks toegepast wanneer de snapshot de bijbehorende mapping niet bevat. |
AI

De AI-tab is verdeeld in twee kaarten: Provider Configuration en Features. De plugin werkt volledig zonder API key; deze tab voegt optionele AI-gestuurde capabilities toe.
Provider Configuration
| Veld | Notities |
|---|---|
| Provider | Anthropic (default), OpenAI, Google Gemini, DeepSeek of Grok (xAI). Elke provider houdt zijn eigen encrypted API key bij, zodat je kunt switchen zonder credentials opnieuw te plakken. |
| API Key | Encrypted opgeslagen. De kaart toont een groene Configured-badge wanneer er al een key in file zit. De link “Get your API key from …” wijst naar de console van de gekozen provider. |
| Model | Lijst per provider (zie tabel hieronder). Het eerste model in de lijst wordt als default gebruikt wanneer geen model is geconfigureerd. |
| Test Connection | Roept het endpoint messages / chat/completions van de provider aan met een one-token prompt en rapporteert success of de upstream error. |
Modellen aangeboden per provider:
| Provider | Modellen |
|---|---|
| Anthropic | Claude Opus 4.7 (beste kwaliteit, default), Claude Sonnet 4.6 (aanbevolen), Claude Haiku 4.5 (snel, goedkoop) |
| OpenAI | GPT-5 (beste kwaliteit), GPT-5 mini (snel), GPT-4o, GPT-4o mini (goedkoopst) |
| Google Gemini | Gemini 2.5 Pro, Gemini 2.5 Flash (beste value), Gemini 2.5 Flash Lite (goedkoopst) |
| DeepSeek | DeepSeek V3.2 Chat, DeepSeek V3.2 Reasoner |
| Grok (xAI) | Grok 4.1 Fast, Grok 4, Grok 3, Grok 3 Mini |
Features
| Toggle | Default | Beschrijving |
|---|---|---|
| Smart-fill billing | uit | Klanten plakken een free-form billing block bij de checkout; het model vult het gestructureerde formulier. |
| Smart-fill calls per uur | 5 | Per-session rate limit. |
| Compliance pre-flight check | uit | Laat de AI elke factuur scannen voor uitgifte en mogelijke issues flaggen. |
| Block issuance on error-level findings | uit | Wanneer een kritisch issue gevonden wordt, voorkom dat de factuur wordt uitgegeven. |
| Compliance calls per uur | 10 | |
| Translate line descriptions | uit | Gebruik AI om factuur-lines naar de taal van de koper te vertalen. Polyglot-aware wanneer de sibling-plugin geïnstalleerd is. |
| Natural-language document search | uit | Free-text queries op de Documents admin-pagina. |
| Search calls per uur | 10 |
Advanced

Retentie & uninstall
| Veld | Default | Range |
|---|---|---|
| Log retention (days) | 90 | 1 – 3650. Integration-log-entries ouder dan dit worden door de daily cron gepurged. |
| Wipe data on uninstall | uit | Drop alle Invoice Pilot-tabellen en options wanneer de plugin gedeïnstalleerd wordt. Destructief. Standaard uit. |
Maintenance acties
- Run log cleanup now — vuurt de actie
invoice_pilot_cleanup_logsdirect af in plaats van te wachten op de daily cron. - Purge validation cache — verwijdert elke rij uit de BTW-validation cache-tabel.
Een kleine rij Versions onderaan print de huidige plugin-versie en database schema-versie.
Gebruik
Een factuur automatisch uitgeven vanuit een WooCommerce-order
De default workflow vereist geen manuele actie.
- Een klant plaatst een order op WooCommerce. De checkout toont de
velden VAT number en Tax code plus eventuele landspecifieke
velden geregistreerd voor het billing country (bijvoorbeeld
SDI recipient code en Certified email (PEC) op
IT-orders). Het VAT-veld wordt live gevalideerd terwijl de klant typt — een groene ✓-badge verschijnt in het input wanneer de keten het nummer bevestigt, een rode ✕ wanneer het faalt. Als de koper in een andere EU-lidstaat zit en het VAT-nummer geldig is, zet WooCommerce de BTW in het winkelmandje automatisch op nul (intra-EU B2B reverse charge — zie Settings → VAT validation). - Wanneer de order de trigger-status bereikt die gedefinieerd is onder
Settings → General → Trigger status (
processingis de default), geeft Invoice Pilot een factuur uit met de Default series (INVis de default), persisteert een immutable JSON-snapshot van de order, rendert de PDF, genereert de XML-envelope voor het land van de koper en pusht naar elke ingeschakelde integratie. - Het orderscherm krijgt een meta box Invoice Pilot die de uitgegeven documenten oplijst met links naar de PDF en XML, plus actieknoppen voor Regenerate, Reissue, Void, Create credit note, Create proforma, Create quote en Push to provider.

De Invoice Pilot meta box toont voor het meest recente niet-geannuleerde
document op de order: het nummer van het document
(bv. INV-2026-0063), de status-pill (Issued / Paid / Void), de
download-knoppen PDF en XML (token-signed REST-links), een
actie Regenerate document die de artefacten opnieuw rendert tegen
de huidige template en seller-instellingen zonder het documentnummer
te wijzigen, en een sectie Other documents met één-kliks-knoppen
Create proforma en Create quote. Wanneer een integratie is
ingeschakeld, verschijnt naast de PDF- / XML-links een knop Push to
provider die de integratie-call opnieuw afvuurt tegen het
geconfigureerde target.
Handmatig uitgeven
Is automatische uitgifte uitgeschakeld of heeft de order de trigger-status nog niet bereikt, dan toont de order meta box een knop Issue now. Dezelfde flow geldt — snapshot, PDF, XML, integration push — maar hij draait on demand.
Creditnota’s uit refunds
Wanneer Auto-issue credit note on WC refund aanstaat (de default),
triggert elke WooCommerce-refund die wordt aangemaakt tegen een order
met een bestaande factuur, een creditnota in de CN-series. De
creditnota linkt terug naar de parent-factuur en refereert ernaar in
de XML. De gerenderde PDF draagt bovenaan een disclaimer-banner
“Refund of INV-…”, een CREDIT NOTE-status-pill, Refund total in
de hero-cel, en verbergt de IBAN- / payment-method-footer (de
originele payment-flow geldt niet langer). Je kunt ook handmatig een
creditnota uitgeven — volledig of partial — vanuit de kaart Actions
op het edit-scherm van de factuur, zolang de parent-factuur in status
issued staat.
Proforma’s en offertes
Wanneer de bijbehorende toggles aanstaan, toont het orderscherm ook knoppen Create proforma en Create quote. Beide produceren non-fiscale documenten — er wordt een PDF gerenderd maar voor offertes geen XML gegenereerd. De gerenderde PDF draagt een visuele behandeling specifiek voor zijn type: een disclaimer-banner bovenaan (“Proforma — not a fiscal document.” / “Quote — not a fiscal document, subject to acceptance.”), een “QUOTE”- / “PROFORMA”-status- pill in plaats van “ISSUED”, en op offertes wisselt het prominente date-label naar Valid until en de hero total naar Estimated total. Offertes verbergen het IBAN- / payment-method-blok aangezien er nog geen betaling verschuldigd is.
Een proforma kan met de actie Convert worden omgezet naar een factuur, die het document hernummert onder de geconfigureerde invoice-series.
Een factuur naar de klant sturen
De plugin registreert een order-actie Send Invoice Pilot invoice to
customer onder de standaard order-actions-dropdown van WooCommerce,
die de PDF naar de koper mailt via WordPress’ wp_mail().
Documenten downloaden
PDFs en XML-envelopes worden geserveerd vanuit een publiek bereikbaar maar token-signed REST-endpoint:
GET /wp-json/invoice-pilot/v1/download/{id}/{format}?token=…{format} is pdf of xml. De token wordt gegenereerd wanneer het
document wordt uitgegeven en geprint in de order meta box en de
Invoices list-tabel.
Dashboard

Invoice Pilot → Dashboard opent een kaart Activity overview boven een kaart Trends. De Activity overview toont een period-bar met vier windows — 7 days, 14 days, 30 days (default) en 90 days — en vijf KPI-kaarten:
- Invoices — totaal aantal documenten uitgegeven in de periode.
- Net revenue — som van de netto-totalen in de winkelvaluta,
gerenderd met het valutasymbool van de locale en twee decimalen
(bv.
€3,876.09of3.876,09 €afhankelijk van de locale van de admin). - VAT collected — som van de BTW-totalen uit de immutable snapshot. Dezelfde locale-aware valutaformattering als Net revenue. Een aparte schema-migratie vult deze waarde achteraf aan voor facturen die zijn uitgegeven vóór schema-versie 1.3.1, toen de kolom bij het schrijven niet werd gevuld.
- Avg value — net revenue gedeeld door het aantal facturen, ook als valuta geformatteerd.
- B2B / B2C — verdeling van B2B-facturen (koper heeft een BTW-nummer) tegenover B2C-facturen in dezelfde periode.
Onder de KPI’s rendert de kaart Trends twee charts naast elkaar
— Invoices over time (een dual-axis lijn- + area-chart met het
aantal facturen op de linkeras en het verloop van de net revenue als
gevulde area op de rechteras) en By buyer country (een donut-chart
van de top buyer ISO-codes, met de kleur-legenda eronder). Alle cijfers
worden gehydrateerd vanuit
/wp-json/invoice-pilot/v1/dashboard?days=N.
Documents-lijst

Invoice Pilot → Documents lijst elk uitgegeven document met status-
pills (paid / void / converted / draft / issued — kleur-gecodeerd op
lifecycle-state), een kolom Compliance met de kleur-gecodeerde
badge die door de AI pre-flight check geproduceerd wordt, en inline
PDF- / XML- / Delete-acties per rij.
De pagina pagineert 20 rijen per keer en toont een unified toolbar die
de AI free-text search combineert met een document-type-filter
(invoice / credit_note / proforma / quote / receipt) plus
een running count rechts. Wanneer AI search aanstaat, accepteert de
search-box free-text queries (bijvoorbeeld “Duitse facturen vorige
maand boven 1.000 EUR”) die de geconfigureerde provider in een
list-query vertaalt; de resolved filter-chips verschijnen boven de
tabel zodat je precies kunt zien hoe het model je zin geparsed heeft.
WooCommerce Orders-lijst

Invoice Pilot voegt één kolom Invoice toe aan de standaard
WooCommerce Orders-lijst (/wp-admin/admin.php?page=wc-orders) zodat
de shop-eigenaar in één oogopslag ziet welke orders al gedocumenteerd
zijn en welke niet, zonder het Orders-scherm te verlaten. De kolom zit
tussen Order en Date en toont het documentnummer dat door de
geconfigureerde series is toegekend (bijvoorbeeld INV-2026-0063),
woordelijk gelezen uit de immutable number-kolom, met een klein
oog-preview-icoontje naast het nummer dat de gerenderde PDF inline
in een nieuw tabblad opent.
Orders zonder uitgegeven document renderen een liggend streepje — handig
bij het debuggen van trigger-status mismatches of bij het filteren op
orders die een handmatige wp invoice-pilot issue-run nodig hebben.
Dezelfde renderer wired zowel de legacy posts-table-kolom
(manage_edit-shop_order_columns) als de HPOS-kolom
(manage_woocommerce_page_wc-orders_columns), zodat de ervaring
identiek is ongeacht welke orders-storage je shop gebruikt.
Integration log

Core\Logger.Invoice Pilot → Log registreert elke integration-push, response en failure. De toolbar bovenaan combineert een selector Bulk actions
- knop Apply (op dit moment een single-action bulk-delete), een provider-dropdown en een action-dropdown — beide gevuld met de waarden die daadwerkelijk in het log voorkomen, zodat alleen filters getoond worden die met een echte rij overeenkomen — plus een lopende teller met aantal entries rechts.
Het datagrid bevat acht kolommen:
| Kolom | Notities |
|---|---|
DATE (UTC) | Timestamp-pill, UTC. Standaard aflopend gesorteerd. |
PROVIDER | Lowercase provider-slug (fattureincloud, smartbill, xero, …). |
ACTION | Operatie die de entry heeft geproduceerd (push, pull_status, refresh_token, void). |
INVOICE | #<id>-link terug naar het document, of een liggend streepje voor entries die niet met één specifieke factuur te maken hebben (token-refreshes, handmatig onderhoud). |
HTTP | Gekleurde pill met de upstream status-code — groen voor 2xx, oranje voor 4xx, rood voor 5xx (of elke entry met een niet-lege error-kolom). |
ERROR | Upstream-foutmelding in rode tekst wanneer de call gefaald is; liggend streepje bij succes. |
MS | Wall-clock-duur van de call in milliseconden. |
ACTIONS | Een rode actie Delete per rij voor one-off cleanup. |
Gevoelige payload-velden worden bij write geredacteerd door de
Core\Logger van de plugin, zodat request- en response-bodies veilig
in het log bewaard kunnen blijven. Oude entries worden gepurged door
de daily cron invoice_pilot_cleanup_logs volgens de instelling
Log retention (days) in de Advanced-tab.
Network admin (Multisite)
Op een Multisite-netwerk verschijnt een extra pagina Invoice Pilot Network in de network admin-sidebar. Hij aggregeert invoice-counts en totalen over elke sub-site die Invoice Pilot actief heeft.
EU-27-facturatie
Invoice Pilot levert een registry van country-specifieke billing-velden voor elke EU-27-lidstaat. Elk veld is optioneel bij de checkout (de plugin forceert geen B2B-only data op een B2C-order); validatie vuurt alleen wanneer het land van de koper matcht met de ISO van het veld.
Het register dekt momenteel:
| Land | Velden |
|---|---|
IT Italië | ei_recipient_code (7 alphanumeric, default 0000000), ei_certified_email (PEC), fiscal_regime (RF01–RF19) |
FR Frankrijk | siren (9 digits), siret (14 digits), chorus_pro_service_code |
DE Duitsland | steuernummer, ust_id, leitweg_id, hrb |
ES Spanje | nif, face_oficina_contable, face_organo_gestor, face_unidad_tramitadora |
PT Portugal | nif (9 digits), atcud |
NL Nederland | kvk_number (8 digits), btw_id |
BE België | bce_number (10 digits) |
LU Luxemburg | — |
AT Oostenrijk | uid_nummer, firmenbuchnummer, steuernummer |
IE Ierland | — |
DK Denemarken | cvr_number (8 digits), ean_location_number |
SE Zweden | organisationsnummer |
FI Finland | y_tunnus, ovt_code |
PL Polen | nip (10 digits), regon, ksef_id |
CZ Tsjechië | dic, ico (8 digits), data_box_id |
SK Slowakije | dic, ico (8 digits), data_box_id |
HU Hongarije | tax_number, group_member_id |
SI Slovenië | vat_id, maticna_stevilka |
HR Kroatië | oib (11 digits) |
RO Roemenië | cui |
BG Bulgarije | eik (9–13 digits), vat_id |
GR Griekenland | afm (9 digits), dou_code |
CY Cyprus | tic |
MT Malta | id_number |
LT Litouwen | company_code |
LV Letland | registration_number |
EE Estland | registry_code |
De block-checkout-integratie registreert velden onder de namespace
invoice-pilot/... via de Additional Checkout Fields API. Standaard
worden alleen de Italiaanse velden in de block-checkout getoond om
niet-Italiaanse shoppers niet te overweldigen; de toggle All EU-27
fields at checkout in General schakelt de volledige set in.
De legacy shortcode-checkout rendert altijd het volledige register,
gefilterd op het geselecteerde billing-country.
Country-velden worden gepersisteerd op de order, gekopieerd in de
immutable invoice-snapshot en geconsumeerd door de XML-writers — zo
wordt bijvoorbeeld de Italiaanse ei_recipient_code
CodiceDestinatario / PECDestinatario in de FatturaPA-envelope,
terwijl de Duitse leitweg_id BuyerReference / EndpointID 0204
wordt in XRechnung.
Integrations
SmartBill
SmartBill (Roemenië) is in de IntegrationManager van de plugin
gewired via de filter invoice_pilot_integration_providers en toont
het standaard provider-interface: push, pull_status, void en
test_connection.
- Push mapt de invoice-snapshot naar de SmartBill JSON-schema en
roept
POST /SBORO/api/v2/invoiceaan met de geconfigureerde CIF en series. - Status sync reconciliëert draft / issued / paid state wanneer de vijftien-minuten retry-cron draait.
- Void annuleert een eerder gepushte factuur op SmartBill wanneer de source-factuur in WordPress wordt geannuleerd.
Alle acties worden gelogd in het Integration log. Failures worden
gequeued en opnieuw geprobeerd door de cron
invoice_pilot_retry_integrations.
Fatture in Cloud
Fatture in Cloud (Italië) volgt hetzelfde provider-interface en mapt
de invoice-snapshot naar de shape entity / items_list die door het
issued-document-endpoint van FIC verwacht wordt. Italiaanse country-
specifieke velden worden expliciet gemapt:
ei_recipient_code→ei_codeei_certified_email→certified_email- BTW / fiscale-code / provincie / land van de koper → corresponding
entity-keys
OAuth-credentials worden at rest encrypted. De daily cron
invoice_pilot_refresh_fic_token ververst de access token wanneer
de integratie is ingeschakeld. Create customers op aan zetten
zorgt ervoor dat de integratie bij de eerste factuur voor een koper
een nieuwe customer record in FIC aanmaakt.
Invoice Pilot submit geen FatturaPA naar de SDI namens jou. SDI- submission blijft een aparte manuele stap vanuit je Fatture in Cloud-account.
AI smart-fill
De AI-laag is volledig optioneel. Zonder geconfigureerde API key blijft de plugin facturen uitgeven, PDFs en XML renderen, BTW valideren en naar integraties pushen — alleen de vier AI-features hieronder zijn niet beschikbaar.
Vijf providers worden ondersteund:
| Provider | Default model | API key URL |
|---|---|---|
| Anthropic | claude-opus-4-7 | console.anthropic.com |
| OpenAI | gpt-5 | platform.openai.com |
| Google Gemini | gemini-2.5-pro | aistudio.google.com |
| DeepSeek | deepseek-chat | platform.deepseek.com |
| Grok (xAI) | grok-4-1-fast-non-reasoning | console.x.ai |
De API key wordt at rest encrypted opgeslagen via de symmetric crypto- laag van de plugin. Een druk op Test Connection stuurt een minimaal request naar het gekozen endpoint en brengt de upstream error naar boven als de credentials fout zijn.
Vier features kunnen onafhankelijk geactiveerd worden zodra er een key in file zit:
- Smart-fill bij de checkout — een textarea “Paste billing details” verschijnt bij de checkout. Het model parsed de free-form tekst en vult het gestructureerde WooCommerce billing-formulier, inclusief de country-specifieke velden. Rate-limited per session.
- Compliance pre-flight check — elke factuur wordt vlak voor uitgifte door het model gehaald, met de optie om block issuance on error-level findings wanneer een kritisch issue gedetecteerd wordt (bijvoorbeeld een Italiaanse B2B-factuur waar de SDI-recipient- code ontbreekt).
- Line auto-translate — beschrijvingen van factuur-lines worden vertaald naar de taal van de koper. Wanneer de sibling-plugin Polyglot geïnstalleerd is, wordt de translation pipeline daaraan gedelegeerd.
- Natural-language document search — de search-box op de Documents admin-pagina accepteert free-text queries die het model in een list-query vertaalt.
Elke feature heeft zijn eigen rate limit per uur.
Hooks en filters
Gecentraliseerde hook-namen leven in de class
\InvoicePilot\Core\Hooks. De volledige lijst:
| Hook | Type | Doel |
|---|---|---|
invoice_pilot_redact_keys | filter | Extra keys om te redacteren uit gelogde payloads. |
invoice_pilot_xml_writer_for_country | filter | Overschrijf de XML-writer per ISO van de koper. Twee arguments: current writer, ISO. |
invoice_pilot_validator_chain | filter | Overschrijf of breid de BTW-validator-chain uit. |
invoice_pilot_integration_providers | filter | Registreer aanvullende integration-providers. |
invoice_pilot_country_fields | filter | Voegt country-specifieke checkout-velden toe of verwijdert ze. Twee argumenten: huidige veld-array, ISO-code. |
invoice_pilot_booted | action | Vuurt nadat de plugin is gebooted. Geeft de singleton door. |
invoice_pilot_register_modules | action | Module-registratie-hook. |
invoice_pilot_invoice_issued | action | Vuurt nadat een nieuwe factuur is uitgegeven. |
invoice_pilot_invoice_rendered | action | Vuurt nadat de PDF of XML is gerenderd. |
invoice_pilot_integration_pushed | action | Vuurt na een succesvolle integration-push. |
invoice_pilot_integration_failed | action | Vuurt na een mislukte integration-push. |
invoice_pilot_cleanup_logs | action | Daily cron — purget oude integration-log-entries. |
invoice_pilot_retry_integrations | action | Vijftien-minuten cron — herprobeert failed pushes. |
invoice_pilot_revalidate_vies | action | Hourly cron — hervalideert stale VIES cache-entries. |
invoice_pilot_render_integration_tab | action | Wordt afgevuurd vanuit de Integrations settings-tab zodat providers hun eigen settings-cards kunnen renderen. |
invoice_pilot_refresh_fic_token | action | Daily cron — ververst de access token van Fatture in Cloud. |
Een custom XML-writer registreren:
add_filter(
'invoice_pilot_xml_writer_for_country',
function ( $writer, $iso ) {
if ( 'NL' === $iso ) {
return new My_Custom_Nl_Writer();
}
return $writer;
},
20,
2
);Een custom integration-provider registreren:
add_filter(
'invoice_pilot_integration_providers',
function ( array $providers ) {
$providers[] = new My_Custom_Provider();
return $providers;
}
);Country-specifieke checkout-velden verbergen of uitbreiden (bijvoorbeeld om
de Italiaanse ei_certified_email (PEC)- en fiscal_regime (RF-code)-prompts
te verwijderen wanneer je winkel deze nooit nodig heeft — geen plugin-fork
vereist):
add_filter(
'invoice_pilot_country_fields',
function ( array $fields, string $iso ) {
if ( 'IT' === $iso ) {
$fields = array_values(
array_filter(
$fields,
fn ( $f ) => ! in_array(
$f->name,
[ 'ei_certified_email', 'fiscal_regime' ],
true
)
)
);
}
return $fields;
},
10,
2
);Het filter draait zowel op het PHP-submit-validatiepad als op de JS-snapshot die aan de WC Blocks-checkout wordt geserveerd, zodat de twee lagen gesynchroniseerd blijven. Machinenamen van velden die momenteel worden geleverd (gebruik deze in het filter):
| Land | Veldnamen |
|---|---|
| IT | ei_certified_email, fiscal_regime |
| FR | siren, siret, chorus_pro_service_code |
| DE | steuernummer, ust_id, leitweg_id, hrb |
| ES | nif, face_oficina_contable, face_organo_gestor, face_unidad_tramitadora |
| PT | nif, atcud |
| NL | kvk_number, btw_id |
De volledige registry per land is gedefinieerd in
CountryFieldRegistry::install_defaults() en dekt alle EU-27 ISO’s.
FAQ
Submit Invoice Pilot FatturaPA naar de SDI?
Nee. Invoice Pilot genereert de FatturaPA-XML en bewaart hem op de order; SDI-submission is bewust een aparte manuele stap (of via de Fatture in Cloud-integratie op je account).
Kan ik een writer toevoegen voor een land dat niet ingebouwd is?
Ja. Hook in op invoice_pilot_xml_writer_for_country en geef je eigen
implementatie van \InvoicePilot\Modules\Xml\XmlWriterInterface terug.
Werkt het op de WooCommerce block-checkout?
Ja. Country-specifieke velden zijn geregistreerd via de WooCommerce 8.6+ Additional Checkout Fields API, dus ze verschijnen in zowel de block-checkout als de legacy shortcode-checkout. Op WooCommerce-versies ouder dan 8.6 wordt alleen het legacy filter-pad gebruikt.
Werkt het op WordPress Multisite?
Ja. Elke sub-site heeft zijn eigen tabellen, settings en numbering
counters. Een network admin-pagina onder Network Admin → Invoice
Pilot Network aggregeert invoice-counts over het netwerk. Op nieuwe
sub-sites worden tabellen en default-series automatisch aangemaakt
via de hook wp_initialize_site.
Worden credentials encrypted?
Ja. SmartBill-tokens, Fatture in Cloud OAuth-tokens en de AI API key
worden at rest encrypted via \InvoicePilot\Core\Crypto. Een
token-veld leeg laten bij de volgende save behoudt de bestaande
opgeslagen waarde.
Wat gebeurt er met mijn data als ik de plugin verwijder?
Niets, tenzij je dat zelf opt-int. De default voor Advanced → Wipe
data on uninstall is uit, dus tabellen, options, integration logs
en de validation cache blijven bewaard over deactivation /
reactivation. Zet de optie aan als je wilt dat de routine
uninstall.php alles drop wanneer WordPress de plugin verwijdert.
Waar krijg ik een API key voor de AI-features?
Elke provider heeft zijn eigen console: Anthropic op console.anthropic.com , OpenAI op platform.openai.com , Google AI Studio op aistudio.google.com , DeepSeek op platform.deepseek.com , en Grok op console.x.ai . De AI-tab linkt rechtstreeks naar de console van de gekozen provider.
Heb ik een AI key nodig om de plugin te laten werken?
Nee. De AI-features (smart-fill, compliance check, line translation, natural-language search) zijn optioneel. De core invoicing-engine — document-lifecycle, PDF- en XML-generatie, BTW-validatie, integraties, dashboard — draait zonder API key.
Troubleshooting
De factuur wordt niet uitgegeven wanneer de order naar Processing gaat
Check Settings → General → Trigger status. De default is
processing; heb je hem aangepast (bijvoorbeeld naar completed),
dan vuurt de auto-issue routine alleen op de geconfigureerde status.
Je kunt ook Issue now indrukken vanuit de order meta box om
handmatig uit te geven, ongeacht de trigger.
De checkout toont te veel (of te weinig) landvelden
De default toont alleen de Italiaanse SDI-velden. Open Settings → General → Document defaults → Landspecifieke factuurvelden en kies de scope:
Uit— alleen de universele BTW- en fiscaal-code-velden worden getoond.Alleen Italië (SDI / PEC / fiscaal regime)— default.Alle EU-27 landspecifieke velden— elke ISO in het register.
De instelling geldt voor zowel de block-checkout als de legacy shortcode-checkout. Landspecifieke velden worden nog steeds client-side verborgen wanneer het billing-country niet overeenkomt.
BTW-validatie hangt of timeout
De VIES-service is af en toe traag of niet beschikbaar. De plugin houdt
een per-BTW cache bij voor de geconfigureerde TTL (24 uur is de default)
en hervalideert stale entries uurlijks via de cron
invoice_pilot_revalidate_vies. Is VIES offline, dan accepteert de
validator Per-country format nog steeds well-formed nummers. Je
kunt de cache TTL ook verhogen onder Settings → VAT validation.
Het dashboard toont geen data
De dashboard-SQL leunt op JSON_EXTRACT / JSON_UNQUOTE tegen de
immutable invoice-snapshot-kolom. Zorg dat je database-server MySQL
5.7+ of MariaDB 10.2+ is. Toont de period-bar het juiste window maar
blijven de kaarten op -- staan, open dan rechtstreeks
/wp-json/invoice-pilot/v1/dashboard?days=30 en check de response —
REST-authenticatie-failures verschijnen als rest_forbidden.
Integration push faalt
Open Invoice Pilot → Log en lokaliseer de failed entry — de HTTP-
kolom flagt non-2xx-responses met een gekleurde badge en de Error-
kolom toont het upstream errorbericht in rood. De failed entry wordt
automatisch elke vijftien minuten opnieuw geprobeerd door de cron
invoice_pilot_retry_integrations; je kunt ook Push to provider
indrukken in de order meta box om direct opnieuw te proberen. Gebruik
de Delete-actie op een rij om een one-off entry te wissen zonder
op de retention-cron te wachten.
Test Connection op de AI-tab rapporteert een error
Het bericht in rood komt rechtstreeks van het endpoint van de provider. Veel voorkomende oorzaken:
- Een invalid of ingetrokken API key — genereer een nieuwe en plak hem in het veld API Key, daarna opslaan.
- Een modelnaam waar het account geen toegang toe heeft — kies een ander model in de dropdown.
- Network egress geblokkeerd door de host — bevestig dat outbound
HTTPS naar
api.anthropic.com,api.openai.com,generativelanguage.googleapis.com,api.deepseek.comofapi.x.aiis toegestaan.
Email alerts aan de klant arriveren niet
Customer invoice-mails worden verzonden via WordPress’ functie
wp_mail(). Komt er geen e-mail aan, dan zit het probleem bijna
altijd in de mail-configuratie van de site in plaats van bij Invoice
Pilot. Installeer een transactionele mail-plugin (bijvoorbeeld eentje
die WordPress-mail via SMTP routeert) en trigger de order-actie
Send Invoice Pilot invoice to customer opnieuw vanuit een
test-order.