{"id":312966,"date":"2026-05-28T15:18:21","date_gmt":"2026-05-28T15:18:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/b2brouter-for-woocommerce\/"},"modified":"2026-05-28T15:17:59","modified_gmt":"2026-05-28T15:17:59","slug":"b2brouter-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/b2brouter-for-woocommerce\/","author":23404227,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.5","stable_tag":"1.0.5","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"B2Brouter for WooCommerce","header_author":"B2Brouter","header_description":"Electronic invoicing for WooCommerce. Compliance for Spain (Verifactu), France (DGFiP), Poland (KSeF) and general EU e-invoicing.","assets_banners_color":"dae6fd","last_updated":"2026-05-28 15:17:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.b2brouter.net\/docs\/#\/en\/integration\/woocommerce","header_author_uri":"https:\/\/b2brouter.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":22,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.5":{"tag":"1.0.5","author":"b2brouter","date":"2026-05-28 15:17:59"}},"upgrade_notice":{"1.0.5":"<p>Bumps the bundled B2Brouter PHP SDK to v1.3 (API version <code>2026-04-20<\/code>) and migrates the refund payload to the new <code>invoice_references[]<\/code> shape. Adds plugin self-identification to the outbound <code>User-Agent<\/code> header. Tested up to WordPress 7.0.<\/p>","1.0.4":"<p>Security release. Hardens invoice PDF cache path validation and stops the WooCommerce REST API from writing internal <code>_b2brouter_*<\/code> order meta. All sites should upgrade.<\/p>","1.0.3":"<p>Strips development-only files from the bundled SDK in the release ZIP (no behaviour change for installed plugins). Resolves the WordPress.org Plugin Review Team&#039;s flag on <code>.env.example<\/code> and similar package internals.<\/p>","1.0.2":"<p>Declares WooCommerce as a plugin dependency via the <code>Requires Plugins<\/code> header (WordPress 6.5+). No change in behaviour for users on older WordPress versions.<\/p>","1.0.1":"<p>Fixes the plugin header so the WordPress.org submission validator accepts it: <code>Plugin URI<\/code> and <code>Author URI<\/code> are now distinct.<\/p>","1.0.0":"<p>First stable release. Plugin slug renamed to <code>b2brouter-for-woocommerce<\/code> for WordPress.org compliance \u2014 existing installs upgrading in place will see the plugin as a new entry under the new directory and must be reactivated. Bulk invoice generation moved to Action Scheduler. SDK upgraded to v1.2.<\/p>","0.9.4":"<p>Final pre-release before 1.0. Filesystem API migration (required for wp.org), translations, and explicit compliance scope docs (Verifactu, DGFiP, KSeF). Sequential and custom numbering modes removed \u2014 switch to Automatic or WooCommerce order number before upgrading.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3552384,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3552384,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3552384,"resolution":"1","location":"assets","locale":"","width":1200,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3552384,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3552384,"resolution":"3","location":"assets","locale":"","width":1200,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3552384,"resolution":"4","location":"assets","locale":"","width":1200,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3552384,"resolution":"5","location":"assets","locale":"","width":1200,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3552384,"resolution":"6","location":"assets","locale":"","width":1200,"height":900}},"screenshots":{"1":"Settings page with API key validation and account information.","2":"Order edit screen showing the B2Brouter Invoice meta box with status and PDF download.","3":"WooCommerce orders list with the invoice status column.","4":"List of Invoices admin page with bulk PDF download.","5":"Webhook configuration section.","6":"Customer \"My Account\" view with Download Invoice \/ Generate Invoice buttons."}},"plugin_section":[],"plugin_tags":[225611,252347,249779,247447,286],"plugin_category":[45],"plugin_contributors":[264810],"plugin_business_model":[],"class_list":["post-312966","plugin","type-plugin","status-publish","hentry","plugin_tags-e-invoicing","plugin_tags-ksef","plugin_tags-peppol","plugin_tags-verifactu","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-b2brouter","plugin_committers-b2brouter"],"banners":{"banner":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/banner-772x250.png?rev=3552384","banner_2x":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/banner-1544x500.png?rev=3552384","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/b2brouter-for-woocommerce_dae6fd.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-1.png?rev=3552384","caption":"Settings page with API key validation and account information."},{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-2.png?rev=3552384","caption":"Order edit screen showing the B2Brouter Invoice meta box with status and PDF download."},{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-3.png?rev=3552384","caption":"WooCommerce orders list with the invoice status column."},{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-4.png?rev=3552384","caption":"List of Invoices admin page with bulk PDF download."},{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-5.png?rev=3552384","caption":"Webhook configuration section."},{"src":"https:\/\/ps.w.org\/b2brouter-for-woocommerce\/assets\/screenshot-6.png?rev=3552384","caption":"Customer \"My Account\" view with Download Invoice \/ Generate Invoice buttons."}],"raw_content":"<!--section=description-->\n<p><strong>B2Brouter for WooCommerce<\/strong> connects your WooCommerce store with the B2Brouter platform to generate and send electronic invoices automatically \u2014 including the country-specific tax authority reporting required in Spain, France and Poland.<\/p>\n\n<h4>Built-in regulatory compliance<\/h4>\n\n<p>The plugin includes explicit support for the following e-invoicing regimes:<\/p>\n\n<ul>\n<li><strong>Spain \u2014 Verifactu<\/strong>: automatic AEAT reporting with QR verification on every issued invoice.<\/li>\n<li><strong>France \u2014 DGFiP<\/strong>: routing through the official PPF \/ Chorus Pro infrastructure.<\/li>\n<li><strong>Poland \u2014 KSeF<\/strong>: automatic submission of invoices to the national KSeF system.<\/li>\n<\/ul>\n\n<p>Beyond these explicit regimes, the plugin generates compliant electronic invoices in standard formats (UBL, Facturae, Peppol) for the rest of the EU, the UK, and other jurisdictions supported by B2Brouter.<\/p>\n\n<p><strong>Important:<\/strong> Authority-specific configuration (Verifactu certificates, KSeF tokens, Chorus Pro identifiers, etc.) is managed in the <strong>B2Brouter dashboard<\/strong>, not in the WordPress plugin UI. The plugin only needs your B2Brouter API key.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Automatic or manual invoice generation<\/strong> \u2014 issue invoices on order completion or on demand from the order screen.<\/li>\n<li><strong>Bulk invoice generation<\/strong> \u2014 process multiple completed orders at once via WooCommerce bulk actions.<\/li>\n<li><strong>Standard and simplified invoices<\/strong> \u2014 IssuedInvoice (B2B with TIN) or IssuedSimplifiedInvoice (B2C without TIN), selected automatically.<\/li>\n<li><strong>Credit notes for refunds<\/strong> \u2014 generated on demand when a WooCommerce refund is created against an invoiced order.<\/li>\n<li><strong>PDF generation, caching and email attachment<\/strong> \u2014 store PDFs locally and attach them to order\/customer\/refund emails.<\/li>\n<li><strong>Real-time invoice status<\/strong> via webhooks (HMAC-SHA256 signed) with optional 6-hour fallback polling.<\/li>\n<li><strong>TIN \/ VAT field at checkout<\/strong> \u2014 works on both classic and block-based checkout (WooCommerce 8.6+); intra-EU reverse charge auto-detected.<\/li>\n<li><strong>HPOS compatibility<\/strong> \u2014 native support for High-Performance Order Storage (Custom Order Tables).<\/li>\n<li><strong>Peppol tax categories<\/strong> \u2014 automatic mapping (S, E, Z, NS, AE) from WooCommerce tax configuration.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.8 or higher<\/li>\n<li>WooCommerce 5.0 or higher<\/li>\n<li>PHP 7.4 or higher<\/li>\n<li>Active B2Brouter eDocExchange subscription<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects your WooCommerce store to <strong>B2Brouter<\/strong>, a third-party e-invoicing SaaS operated by B2Brouter SL. Using the plugin requires an active B2Brouter account and API key.<\/p>\n\n<p><strong>Service endpoint:<\/strong> <code>https:\/\/api.b2brouter.net<\/code> (overridable via the <code>B2BROUTER_API_BASE<\/code> constant for staging or self-hosted instances).<\/p>\n\n<p><strong>Data sent to B2Brouter when an invoice or credit note is created:<\/strong><\/p>\n\n<ul>\n<li>Order data \u2014 order number, date, currency, totals, and line items (product name, SKU, quantity, unit price, tax rate, Peppol tax category).<\/li>\n<li>Customer billing data \u2014 name, company name, billing address, country, email, and TIN\/VAT number when provided at checkout.<\/li>\n<li>Refund data when a credit note is generated against a previously invoiced order.<\/li>\n<\/ul>\n\n<p><strong>Data received from B2Brouter:<\/strong> invoice status updates and PDF documents, either via webhook callbacks to <code>\/wp-json\/b2brouter\/v1\/webhook<\/code> or via SDK polling.<\/p>\n\n<p><strong>When data is transmitted:<\/strong> whenever an invoice or credit note is created (automatically on order completion, or on demand from the order screen, the WooCommerce bulk action, or the customer's My Account page) and whenever invoice status is polled or pushed back via webhook.<\/p>\n\n<p><strong>Provider and legal documents:<\/strong><\/p>\n\n<ul>\n<li>Provider: <a href=\"https:\/\/www.b2brouter.net\">B2Brouter<\/a><\/li>\n<li><a href=\"https:\/\/www.b2brouter.net\/global\/terms-and-conditions\/\">Terms and Conditions<\/a><\/li>\n<li><a href=\"https:\/\/www.b2brouter.net\/global\/privacy-policy\/\">Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Download the plugin ZIP from the <a href=\"https:\/\/github.com\/B2Brouter\/b2brouter-woocommerce\/releases\">GitHub releases page<\/a> (or install from the WordPress.org plugin directory once available).<\/li>\n<li>In WordPress admin, go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong> and select the ZIP file.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate Plugin<\/strong>.<\/li>\n<li>Navigate to <strong>Invoices \u2192 Settings<\/strong>, paste your B2Brouter API key and click <strong>Validate Key<\/strong>.<\/li>\n<li>Choose <strong>Automatic<\/strong> or <strong>Manual<\/strong> invoice generation mode and configure series codes for invoices and credit notes.<\/li>\n<li>(Recommended) Configure webhooks under <strong>Invoices \u2192 Settings \u2192 Webhook Configuration<\/strong> for real-time status updates.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20b2brouter%20account%3F\"><h3>Do I need a B2Brouter account?<\/h3><\/dt>\n<dd><p>Yes. The plugin requires an active B2Brouter eDocExchange subscription. Sign up at <a href=\"https:\/\/app.b2brouter.net\">app.b2brouter.net<\/a> and obtain an API key under <strong>Developers \u2192 API Keys<\/strong>.<\/p><\/dd>\n<dt id=\"where%20do%20i%20configure%20verifactu%2C%20ksef%20or%20chorus%20pro%3F\"><h3>Where do I configure Verifactu, KSeF or Chorus Pro?<\/h3><\/dt>\n<dd><p>Authority-specific configuration (certificates, tokens, identifiers) is managed in your B2Brouter dashboard, not in the WordPress plugin UI. Once your dashboard is configured, the plugin transparently sends invoices through the appropriate regime.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20for%20countries%20outside%20spain%2C%20france%20and%20poland%3F\"><h3>Does the plugin work for countries outside Spain, France and Poland?<\/h3><\/dt>\n<dd><p>Yes. Beyond the explicitly supported compliance regimes, the plugin generates standard electronic invoices (UBL, Facturae, Peppol) for the rest of the EU, the UK and other jurisdictions supported by B2Brouter. Need explicit compliance for another country? <a href=\"https:\/\/github.com\/B2Brouter\/b2brouter-woocommerce\/issues\/new\">Open an issue<\/a>.<\/p><\/dd>\n<dt id=\"is%20hpos%20%28high-performance%20order%20storage%29%20supported%3F\"><h3>Is HPOS (High-Performance Order Storage) supported?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares full compatibility with WooCommerce HPOS \/ Custom Order Tables.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20real-time%20invoice%20status%20updates%3F\"><h3>How do I get real-time invoice status updates?<\/h3><\/dt>\n<dd><p>Enable webhooks under <strong>Invoices \u2192 Settings \u2192 Webhook Configuration<\/strong>. Copy the auto-generated webhook URL into your B2Brouter dashboard (<strong>Developers \u2192 Webhooks<\/strong>), then paste the generated webhook secret back into WordPress. Updates arrive in under one second; a 6-hour fallback poll keeps things reliable.<\/p><\/dd>\n<dt id=\"is%20the%20tin%2Fvat%20field%20shown%20at%20checkout%3F\"><h3>Is the TIN\/VAT field shown at checkout?<\/h3><\/dt>\n<dd><p>Yes, automatically. It works with both classic shortcode-based checkout and the new block-based checkout (WooCommerce 8.6+). The value is stored in <code>_billing_tin<\/code> on the order and on the customer profile for reuse.<\/p><\/dd>\n<dt id=\"are%20credit%20notes%20generated%20automatically%3F\"><h3>Are credit notes generated automatically?<\/h3><\/dt>\n<dd><p>Credit notes are generated on demand for WooCommerce refunds when the parent order has an invoice. They follow the country-specific format (e.g. Spanish rectifying invoices) and are accessible from the order admin and from the customer's My Account page.<\/p><\/dd>\n<dt id=\"are%20tests%20included%3F\"><h3>Are tests included?<\/h3><\/dt>\n<dd><p>Yes. The plugin ships with a PHPUnit test suite. See <code>docs\/DEVELOPER_GUIDE.md<\/code> in the repository for instructions.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.5<\/h4>\n\n<p><strong>Changed:<\/strong><\/p>\n\n<ul>\n<li>B2Brouter PHP SDK upgraded from 1.2 to 1.3. Default API version is now <code>2026-04-20<\/code>. The plugin's refund \/ credit-note payload migrates from the flat top-level amend fields to the new structured <code>invoice_references[]<\/code> array. Resolves a long-standing latent bug along the way: the refund reason was being emitted as <code>amended_reason<\/code> (extra <code>d<\/code>), which no API version has ever accepted \u2014 Rails strong-params had been silently dropping it on every release. The new payload places the reason inside the reference object, so the refund reason now actually reaches the backend.<\/li>\n<li>Outbound API requests now identify the plugin in their <code>User-Agent<\/code> header via the SDK's <code>app_info<\/code> option, making plugin-originated calls distinguishable from raw SDK calls in B2Brouter's server logs.<\/li>\n<li>Tested against WordPress 7.0 \"Armstrong\" with WooCommerce 10.7.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<p><strong>Security:<\/strong><\/p>\n\n<ul>\n<li>Hardened invoice PDF cache path validation so privileged users can no longer coax the plugin into reading, deleting, or email-attaching files outside the configured PDF storage directory. The WooCommerce REST API can no longer write keys in the <code>_b2brouter_*<\/code> namespace on orders or refunds. Reported privately and coordinated with <a href=\"https:\/\/really-simple-ssl.com\/\">Really Simple Plugins<\/a>; huge thanks to their team.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<p><strong>Fixed:<\/strong><\/p>\n\n<ul>\n<li>Release ZIP no longer ships development-only files from the bundled B2Brouter PHP SDK (<code>.env.example<\/code>, the package's own <code>tests\/<\/code>, <code>docs\/<\/code>, <code>examples\/<\/code>, <code>.github\/<\/code>, <code>phpunit.xml.dist<\/code>, <code>CHANGELOG.md<\/code>, <code>README.md<\/code>). Surfaced by the WordPress.org Plugin Review Team.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<p><strong>Added:<\/strong><\/p>\n\n<ul>\n<li>Declare WooCommerce as a plugin dependency via the <code>Requires Plugins: woocommerce<\/code> header (WordPress 6.5+). Older WordPress versions ignore the header and fall back to the existing PHP-side dependency check.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<p><strong>Fixed:<\/strong><\/p>\n\n<ul>\n<li>Plugin header <code>Plugin URI<\/code> and <code>Author URI<\/code> were both set to the same value; <code>Plugin URI<\/code> now points at the WooCommerce integration documentation (<code>https:\/\/www.b2brouter.net\/docs\/#\/en\/integration\/woocommerce<\/code>) so the two URIs are distinct, as required by the WordPress.org submission validator.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>First stable release. Cleared for distribution via the WordPress.org plugin directory and the WooCommerce Marketplace. Plugin Check reports zero errors and zero warnings on the shipped ZIP, and HPOS compatibility was audited end to end (no direct <code>wp_postmeta<\/code> access remains).<\/p>\n\n<p><strong>Added:<\/strong><\/p>\n\n<ul>\n<li><code>== External Services ==<\/code> disclosure section listing the B2Brouter API endpoint, data sent\/received, transmission triggers, and links to Terms and Privacy Policy.<\/li>\n<li>Build-time validation in <code>build-release.sh<\/code>: the release ZIP is rejected if <code>readme.txt<\/code>, <code>uninstall.php<\/code>, or the bundled SDK is missing.<\/li>\n<\/ul>\n\n<p><strong>Changed:<\/strong><\/p>\n\n<ul>\n<li>Plugin slug renamed from <code>b2brouter-woocommerce<\/code> to <code>b2brouter-for-woocommerce<\/code> for WordPress.org trademark compliance. The user-facing plugin name is unchanged; PHP constants, option keys, and extension hooks are preserved for compatibility.<\/li>\n<li>Bulk \"Generate B2Brouter Invoices\" now runs through Action Scheduler instead of a synchronous loop \u2014 no more 504 timeouts on large selections. Progress visible under <strong>WooCommerce \u2192 Status \u2192 Scheduled Actions<\/strong>.<\/li>\n<li>Staging\/production environment selector removed from the settings page. The plugin defaults to production; staging can be reached via the <code>B2BROUTER_API_BASE<\/code> constant.<\/li>\n<li>B2Brouter PHP SDK upgraded to v1.2 (API version <code>2026-03-02<\/code>). API-key validation now uses the SDK's new <code>AccountService<\/code>.<\/li>\n<li>Uninstaller routes all filesystem operations through the WordPress <code>WP_Filesystem<\/code> API.<\/li>\n<li>Invoice due date now uses <code>wp_date()<\/code> for timezone-stable formatting.<\/li>\n<\/ul>\n\n<p><strong>Security:<\/strong><\/p>\n\n<ul>\n<li>All flagged output paths now run through appropriate escape functions (<code>esc_html__<\/code>, <code>esc_html<\/code>, <code>wp_kses_post<\/code>, <code>(int)<\/code> casts).<\/li>\n<li>Exception messages are escaped at throw time so any consumer that echoes them remains safe.<\/li>\n<li>All superglobal reads (<code>$_POST<\/code> \/ <code>$_GET<\/code> \/ <code>$_REQUEST<\/code>) go through <code>wp_unslash()<\/code> before sanitization; nonce verification uses the canonical <code>check_admin_referer()<\/code> pattern.<\/li>\n<li>Settings API options declare <code>sanitize_callback<\/code> (strict whitelist for invoice mode).<\/li>\n<\/ul>\n\n<p><strong>Fixed:<\/strong><\/p>\n\n<ul>\n<li>Orphan PDF metadata cleanup is now HPOS-aware. The previous implementation queried <code>wp_postmeta<\/code> directly and silently missed orders on HPOS-only stores.<\/li>\n<\/ul>\n\n<h4>0.9.4<\/h4>\n\n<p>Final pre-release before 1.0. Focused on stability, operational polish, and preparing the plugin for distribution via the WordPress.org plugin directory and the WooCommerce Marketplace.<\/p>\n\n<p><strong>Compliance scope:<\/strong><\/p>\n\n<ul>\n<li>Documented explicit support for three national e-invoicing regimes: Spain Verifactu, France DGFiP (PPF \/ Chorus Pro) and Poland KSeF. General electronic invoicing (UBL \/ Facturae \/ Peppol) continues to work for the rest of the EU, the UK, and other countries supported by B2Brouter. Authority-specific credentials and identifiers are managed in the B2Brouter dashboard, not in the WordPress plugin UI.<\/li>\n<\/ul>\n\n<p><strong>Added:<\/strong><\/p>\n\n<ul>\n<li>Initial translation files for Catalan, German, Spanish, French and English plus a <code>.pot<\/code> template.<\/li>\n<li>Bulk \"Generate Invoice\" action on the HPOS orders screen; non-completed orders are skipped with a scoped admin notice.<\/li>\n<li>Organizational unit selector when the connected B2Brouter account has multiple organizational units.<\/li>\n<li><code>uninstall.php<\/code> cleans up <code>b2brouter_*<\/code> options, sync timestamps and cached PDFs when the plugin is deleted.<\/li>\n<\/ul>\n\n<p><strong>Changed:<\/strong><\/p>\n\n<ul>\n<li>Invoice numbering: removed sequential and custom numbering modes. Remaining modes are WooCommerce order number and automatic B2Brouter numbering.<\/li>\n<li>Status sync: finalized invoices are no longer re-polled; stale non-final invoices use exponential backoff.<\/li>\n<li>Service loading: admin services instantiated only in admin context and customer services only on the frontend.<\/li>\n<li>Logging: replaced <code>error_log()<\/code> with <code>wc_get_logger()<\/code>. Plugin messages now appear under WooCommerce \u2192 Status \u2192 Logs (source <code>b2brouter-for-woocommerce<\/code>).<\/li>\n<li>Filesystem operations: PDF reads, writes, deletions and directory operations now use the WP Filesystem API.<\/li>\n<li>Welcome page redesigned; admin menu cleaned up (Welcome is the default landing page).<\/li>\n<\/ul>\n\n<p><strong>Fixed:<\/strong><\/p>\n\n<ul>\n<li>Customer invoice download reliability from My Account \u2192 Orders.<\/li>\n<li><code>_b2brouter_invoice_date<\/code> now parsed in the site timezone.<\/li>\n<li>Eliminated the duplicate save-success notice on the settings page.<\/li>\n<\/ul>\n\n<h4>0.9.3<\/h4>\n\n<ul>\n<li>Real-time webhook integration (HMAC-SHA256 signed <code>issued_invoice.state_change<\/code> events; 5-minute timestamp window).<\/li>\n<li>Smart polling strategy with optional 6-hour fallback when webhooks are enabled.<\/li>\n<li>Admin menu renamed to \"Invoices\" with a new custom SVG icon.<\/li>\n<li>Fixed TIN field saving for HPOS-enabled stores (classic checkout and admin order editing).<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>Upgraded to B2Brouter PHP SDK v1.0.0.<\/li>\n<li>Fixed credit note number collision for refunds.<\/li>\n<li>Fixed WordPress 6.7.0 translation loading timing.<\/li>\n<li>Fixed refund invoice generation under HPOS.<\/li>\n<li>Improved invoice status sync UX (real status on creation instead of generic \"draft\").<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>New \"List of Invoices\" admin page with pagination, sorting and bulk PDF download.<\/li>\n<li>Invoice status sync system with hourly cron and color-coded badges.<\/li>\n<li>Customer invoice generation from My Account in manual mode.<\/li>\n<li>Customer credit note downloads from My Account.<\/li>\n<li>Exponential backoff retry for PDF downloads.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>First public beta. Automatic \/ manual \/ bulk invoice generation, credit notes for refunds, PDF caching and email attachment, TIN\/VAT collection, HPOS compatibility.<\/li>\n<\/ul>\n\n<p>For the complete history, see <code>CHANGELOG.md<\/code> in the repository.<\/p>","raw_excerpt":"Electronic invoicing for WooCommerce. Compliance for Spain (Verifactu), France (DGFiP) and Poland (KSeF). EU + UK invoicing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312966","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=312966"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/b2brouter"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312966"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312966"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312966"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312966"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312966"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}