{"id":361065,"date":"2026-09-04T14:20:48","date_gmt":"2026-09-04T14:20:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/invoice-sync-for-pennylane\/"},"modified":"2026-09-04T20:51:24","modified_gmt":"2026-09-04T20:51:24","slug":"ukto-invoice-sync-for-pennylane","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ukto-invoice-sync-for-pennylane\/","author":23557567,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.1","stable_tag":"1.7.1","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"UKTO Invoice Sync for Pennylane","header_author":"S\u00e9bastien DUBOIS","header_description":"Send your WooCommerce orders to Pennylane as compliant invoices: one-click invoicing from the order screen, full VAT\/OSS mapping, EU VAT number validation (VIES) and company ID at checkout, invoice PDF in My Account.","assets_banners_color":"1e4340","last_updated":"2026-09-04 20:51:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/ukto.fr\/pennylane.php","header_author_uri":"https:\/\/ukto.fr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.0":{"tag":"1.7.0","author":"ukto","date":"2026-09-04 14:20:15","revision":3681342},"1.7.1":{"tag":"1.7.1","author":"ukto","date":"2026-09-04 20:51:24","revision":3681792}},"upgrade_notice":{"1.7.1":"<p>Cosmetic: the plugin site opens in your admin language.<\/p>","1.7.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3681339,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3681339,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3681339,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3681339,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.0","1.7.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3681339,"resolution":"1","location":"assets","locale":"","width":1300,"height":530},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3681339,"resolution":"2","location":"assets","locale":"","width":1300,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3681339,"resolution":"3","location":"assets","locale":"","width":1300,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3681339,"resolution":"4","location":"assets","locale":"","width":1300,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3681339,"resolution":"5","location":"assets","locale":"","width":1300,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3681339,"resolution":"6","location":"assets","locale":"","width":1300,"height":900}},"screenshots":{"1":"The Pennylane box on a WooCommerce order \u2014 invoice finalized with its legal number, PDF one click away.","2":"Connection tab \u2014 your Pennylane API token and the connection test.","3":"Invoicing tab \u2014 test mode, VIES validation, SIRET auto-fill, B2B exemption, OSS, invoice language.","4":"Checkout \u2014 company ID and EU VAT number fields for business customers.","5":"Diagnostics tab \u2014 everything checked at a glance.","6":"The invoice available in the customer's My Account."}},"plugin_section":[],"plugin_tags":[2526,226218,12480,261792,286],"plugin_category":[45],"plugin_contributors":[279178],"plugin_business_model":[],"class_list":["post-361065","plugin","type-plugin","status-publish","hentry","plugin_tags-accounting","plugin_tags-factur-x","plugin_tags-invoice","plugin_tags-pennylane","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-ukto","plugin_committers-ukto"],"banners":{"banner":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/banner-772x250.png?rev=3681339","banner_2x":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/banner-1544x500.png?rev=3681339","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/icon-128x128.png?rev=3681339","icon_2x":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/icon-256x256.png?rev=3681339","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-1.png?rev=3681339","caption":"The Pennylane box on a WooCommerce order \u2014 invoice finalized with its legal number, PDF one click away."},{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-2.png?rev=3681339","caption":"Connection tab \u2014 your Pennylane API token and the connection test."},{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-3.png?rev=3681339","caption":"Invoicing tab \u2014 test mode, VIES validation, SIRET auto-fill, B2B exemption, OSS, invoice language."},{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-4.png?rev=3681339","caption":"Checkout \u2014 company ID and EU VAT number fields for business customers."},{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-5.png?rev=3681339","caption":"Diagnostics tab \u2014 everything checked at a glance."},{"src":"https:\/\/ps.w.org\/ukto-invoice-sync-for-pennylane\/assets\/screenshot-6.png?rev=3681339","caption":"The invoice available in the customer's My Account."}],"raw_content":"<!--section=description-->\n<p>This plugin connects your WooCommerce store to the Pennylane accounting platform. Invoices are\nissued <strong>by Pennylane<\/strong>, which keeps legal numbering and archiving where they belong \u2014 the plugin\nnever generates an invoice itself.<\/p>\n\n<p>Create a compliant, legally numbered invoice for any order with a single click: the customer, the\ninvoice lines, the VAT treatment and the legal mentions are all built for you.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li><strong>One-click invoicing<\/strong> \u2014 a \"Create invoice\" button on every WooCommerce order. The invoice is\ncreated as a draft in Pennylane, then finalized (legal numbering) automatically, and the\nFactur-X PDF is retrievable from the order screen.<\/li>\n<li><strong>Customer sync<\/strong> \u2014 companies and individuals are created in Pennylane with their billing\ndetails, and reused on the next order (no duplicates).<\/li>\n<li><strong>Full VAT and OSS mapping<\/strong> \u2014 French rates (20 %, 10 %, 5.5 %, 2.1 %), intra-EU B2B reverse\ncharge, intra-EU B2C (OSS), exports outside the EU. The right legal mention is written on the\ninvoice automatically.<\/li>\n<li><strong>EU VAT number at checkout<\/strong> \u2014 an optional VAT number field for business customers (classic\ncheckout and Checkout Blocks), format-checked, with <strong>VIES validation<\/strong> (the official European\nCommission service) to secure the exemption.<\/li>\n<li><strong>B2B VAT exemption at checkout (optional)<\/strong> \u2014 charge no VAT to EU businesses with a validated\nVAT number: the customer pays the net amount and the invoice carries the legal intra-Community\nexemption mention. Off by default (it changes what customers pay, and intra-Community supplies\nrequire filing the EC Sales List \u2014 check with your accountant). Whatever you choose, the\ninvoice always follows the money: if VAT was collected, the invoice is issued with that VAT.<\/li>\n<li><strong>OSS awareness<\/strong> \u2014 tell the plugin whether the store is registered for the EU One-Stop Shop:\nunder the \u20ac10,000 threshold, EU consumers are invoiced with French VAT codes; OSS-registered\nstores get destination-country VAT codes.<\/li>\n<li><strong>Company ID (SIRET) at checkout with auto-fill<\/strong> \u2014 French business customers type their SIRET\nand the company name and address fill in automatically (public data from data.gouv.fr).<\/li>\n<li><strong>Invoice PDF in My Account<\/strong> \u2014 customers can download their invoice from their account,\nthrough a secure endpoint.<\/li>\n<li><strong>Test mode (dry run)<\/strong> \u2014 validate your whole configuration without sending anything to\nPennylane: payloads are built and written to the logs, nothing else.<\/li>\n<li><strong>Diagnostics tab<\/strong> \u2014 token check, live API permission check, decimals check, logs shortcut:\nsee at a glance why something would not work.<\/li>\n<li><strong>HPOS and Checkout Blocks compatible<\/strong> \u2014 works with the classic checkout and the block-based\ncheckout, with or without High-Performance Order Storage.<\/li>\n<\/ul>\n\n<p>The free plugin is fully functional on its own and is not time-limited.<\/p>\n\n<p>Need automation? The <a href=\"https:\/\/ukto.fr\/pennylane.php?lang=en#editions\">Pro version<\/a> adds automatic invoicing on\nstatus change, credit notes on refunds, payment reconciliation, invoice e-mailing to the customer\n(your template or Pennylane's), product mapping, bulk actions with ZIP export, backfill of past\norders, integrity checks, weekly summary, failure alerts and WP-CLI commands.<\/p>\n\n<p>This plugin is not affiliated with, nor endorsed by, Pennylane. \"Pennylane\" is a trademark of its\nrespective owner and is used here only to describe compatibility.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin communicates with the following third-party services. Nothing is sent without your\nconfiguration or the customer's own input, and none of these calls carry marketing or tracking\ndata:<\/p>\n\n<ul>\n<li><strong>Pennylane API<\/strong> (https:\/\/app.pennylane.com) \u2014 the purpose of the plugin. When you create an\ninvoice, the order data (customer billing details, invoice lines, totals, VAT) is sent to your\nown Pennylane account using the API token you configured. Nothing is sent before a token is\nconfigured and an invoice is triggered.\nTerms of service: https:\/\/www.pennylane.com\/fr\/conditions-generales\nPrivacy policy: https:\/\/www.pennylane.com\/fr\/legal\/privacy<\/li>\n<li><strong>VIES<\/strong> (European Commission, https:\/\/ec.europa.eu) \u2014 optional, off by default. When enabled,\nthe VAT number typed by a business customer at checkout (and only that number) is checked\nagainst the European Commission's official VAT validation service. Disabled by default: it\nonly runs after you switch it on in WooCommerce &gt; Pennylane &gt; Checkout.\nTerms of use: https:\/\/ec.europa.eu\/taxation_customs\/vies\/\nPrivacy policy: https:\/\/commission.europa.eu\/privacy-policy_en<\/li>\n<li><strong>Recherche d'entreprises<\/strong> (https:\/\/recherche-entreprises.api.gouv.fr) \u2014 optional, off by\ndefault. When enabled, the company ID (SIRET) typed by the customer (and only that) is sent to\nthe French government's public company directory to retrieve the company name and address.\nDisabled by default: it only runs after you switch it on in WooCommerce &gt; Pennylane &gt; Checkout.\nTerms of use: https:\/\/www.data.gouv.fr\/pages\/legal\/cgu\/\nService documentation: https:\/\/api.gouv.fr\/les-api\/api-recherche-entreprises<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin (WooCommerce must be active).<\/li>\n<li>Go to WooCommerce \u2192 Pennylane \u2192 Connection and paste your Pennylane API token\n(in Pennylane: Settings \u2192 Connectivity \u2192 Developers). Required permissions: customers\nread\/write, customer invoices read\/write, products read.<\/li>\n<li>Click \"Test connection\": all three permissions must be green.<\/li>\n<li>Open the Invoicing tab and review the settings. Enable test mode and create a test invoice\nfrom any order: the full payload is written to the logs (WooCommerce \u2192 Status \u2192 Logs, source\n\"pennylane\") without anything being sent to your accounting.<\/li>\n<li>Happy with the payloads? Turn test mode off and invoice for real.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20an%20official%20pennylane%20plugin%3F\"><h3>Is this an official Pennylane plugin?<\/h3><\/dt>\n<dd><p>No. It is an independent integration built on the public Pennylane API (v2). It is not\naffiliated with, endorsed by or sponsored by Pennylane.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20pennylane%20account%3F\"><h3>Do I need a Pennylane account?<\/h3><\/dt>\n<dd><p>Yes. The plugin sends invoices to <em>your<\/em> Pennylane account through the official API. Any\nPennylane plan that includes API access works.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20generate%20the%20invoices%20itself%3F\"><h3>Does the plugin generate the invoices itself?<\/h3><\/dt>\n<dd><p>No. Invoices are created and numbered by Pennylane through its API. The plugin sends the order\ndata and retrieves the resulting document, so legal numbering stays in your accounting software.<\/p><\/dd>\n<dt id=\"which%20vat%20cases%20are%20handled%3F\"><h3>Which VAT cases are handled?<\/h3><\/dt>\n<dd><p>Domestic French sales at any legal rate, intra-EU B2B with a validated VAT number\n(intra-Community supply exemption, Article 138 of Directive 2006\/112\/EC), intra-EU B2C (OSS \u2014\nthe customer country's rate as configured in WooCommerce), and exports outside the EU\n(article 262 I of the French tax code). The matching legal mention is written on the invoice.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20vies%20is%20down%3F\"><h3>What happens if VIES is down?<\/h3><\/dt>\n<dd><p>Nothing blocks. The order goes through and the VAT number is re-checked at invoicing time; a\nnote is added to the order so you can verify manually. If the B2B exemption option is on and\nVIES cannot confirm the number at checkout, VAT is charged \u2014 and the invoice then follows what\nwas actually collected.<\/p><\/dd>\n<dt id=\"can%20eu%20business%20customers%20buy%20without%20vat%3F\"><h3>Can EU business customers buy without VAT?<\/h3><\/dt>\n<dd><p>Yes, as an option (off by default): enable \"B2B checkout \u2014 VAT exemption\" in the Invoicing tab.\nWith a validated EU VAT number, the customer pays the net amount and the invoice carries the\nintra-Community exemption mention (Article 138 of Directive 2006\/112\/EC). Selling VAT-free\nintra-Community supplies requires filing the EC Sales List \u2014 check with your accountant first.<\/p><\/dd>\n<dt id=\"is%20test%20mode%20safe%20on%20a%20live%20store%3F\"><h3>Is test mode safe on a live store?<\/h3><\/dt>\n<dd><p>Yes. With test mode enabled, no write request reaches Pennylane: the API client blocks them\ncentrally and payloads are only written to the WooCommerce logs so you can review them before\ngoing live.<\/p><\/dd>\n<dt id=\"where%20are%20the%20logs%3F\"><h3>Where are the logs?<\/h3><\/dt>\n<dd><p>WooCommerce \u2192 Status \u2192 Logs, source \"pennylane\". Every API error is logged with the full\nresponse, and every order keeps its own note trail.<\/p><\/dd>\n<dt id=\"can%20invoices%20be%20created%20automatically%3F\"><h3>Can invoices be created automatically?<\/h3><\/dt>\n<dd><p>Automatic invoicing on status change \u2014 plus credit notes, reconciliation, customer e-mailing,\nbulk actions and backfill \u2014 is part of the <a href=\"https:\/\/ukto.fr\/pennylane.php?lang=en#editions\">Pro version<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Links to the plugin site now open in the language of your WordPress admin, and land on the\nedition comparison rather than the top of the page.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>First release on WordPress.org.<\/li>\n<li>Renamed to \"UKTO Invoice Sync for Pennylane\"; option and hook prefixes moved to <code>isfp_<\/code>, with\na one-time migration so existing settings are preserved.<\/li>\n<li>VIES validation and company-ID auto-fill are now off by default: nothing is sent to a third\nparty until you enable it.<\/li>\n<li>Invoice locking now relies on a database uniqueness constraint, so two simultaneous requests\ncan no longer create two numbered invoices.<\/li>\n<li>VAT numbers are format-checked before any cache write or network call.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Submitted for review, never publicly released.<\/li>\n<li>One-click invoicing (draft + finalization by Pennylane) from the order screen.<\/li>\n<li>Customer sync (companies and individuals) without duplicates.<\/li>\n<li>Full VAT mapping: FR rates, intra-EU B2B reverse charge, OSS, exports \u2014 with automatic legal mentions.<\/li>\n<li>EU VAT number checkout field with VIES validation.<\/li>\n<li>Optional B2B VAT exemption at checkout (validated EU VAT number \u2192 net price + legal mention).<\/li>\n<li>OSS setting: French VAT codes under the \u20ac10,000 threshold, destination codes when OSS-registered.<\/li>\n<li>Company ID (SIRET) checkout field with company auto-fill (data.gouv.fr).<\/li>\n<li>Invoice PDF download in My Account.<\/li>\n<li>Test mode (dry run), diagnostics tab, detailed logging.<\/li>\n<li>HPOS and Checkout Blocks compatibility.<\/li>\n<li>Before this public release, the plugin went through six private iterations (1.0 \u2192 1.5) on a\nproduction pilot store, including a full code review with every confirmed finding fixed.<\/li>\n<\/ul>","raw_excerpt":"Send your WooCommerce orders to Pennylane as legally compliant invoices, with one click from the order screen.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=361065"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ukto"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361065"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361065"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361065"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361065"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361065"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}