{"id":379158,"date":"2026-10-03T06:21:48","date_gmt":"2026-10-03T06:21:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/harvify-pdf-invoices-for-woocommerce\/"},"modified":"2026-10-03T06:21:20","modified_gmt":"2026-10-03T06:21:20","slug":"harvify-pdf-invoices","status":"publish","type":"plugin","link":"https:\/\/es.wordpress.org\/plugins\/harvify-pdf-invoices\/","author":23508132,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.14.11","stable_tag":"0.14.11","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Harvify PDF Invoices for WooCommerce","header_author":"harv","header_description":"PDF invoices, packing slips and credit notes for WooCommerce, attached to your existing order emails. Numbering that is atomic under concurrency, never reused and never silently skipped, with a numbering audit you can hand to an accountant \u2014 and a one-click import that continues your existing invoice numbers instead of restarting them.","assets_banners_color":"9ba5df","last_updated":"2026-10-03 06:21:20","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.14.11":{"tag":"0.14.11","author":"jethalal","date":"2026-10-03 06:21:20","revision":3725825}},"upgrade_notice":{"0.9.0":"<p>Pro adds per-document numbering (delivery notes can have their own sequence) and\nper-country legal text on documents.<\/p>","0.8.0":"<p>Pro adds proforma invoices, delivery notes and payment reminders, plus packing-slip\nappearance options.<\/p>","0.7.0":"<p>Adds WP-CLI: regenerate a document, and export the numbering audit.<\/p>","0.6.0":"<p>Customers can now download their own invoice from My Account.<\/p>","0.5.0":"<p>Adds bulk generate and bulk ZIP download from the Orders list.<\/p>","0.4.0":"<p>Adds dual run: produce and number every document for real while your customers keep\nreceiving your old plugin&#039;s invoices, and compare the two before you commit.<\/p>","0.3.0":"<p>The importer is now reachable from the admin \u2014 it was not before \u2014 and can read a\nCSV file as well as WooCommerce PDF Invoices &amp; Packing Slips.<\/p>","0.2.0":"<p>Adds free packing slips, and fixes an invoice-renumbering bug \u2014 update before\nregenerating any invoice.<\/p>","0.1.0":"<p>First development release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3725825,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3725825,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3725825,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3725825,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3725825,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.14.11"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3725825,"resolution":"1","location":"assets","locale":"","width":1078,"height":1256},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3725825,"resolution":"2","location":"assets","locale":"","width":1078,"height":1190},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3725825,"resolution":"3","location":"assets","locale":"","width":1078,"height":1256},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3725825,"resolution":"4","location":"assets","locale":"","width":1078,"height":1000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3725825,"resolution":"5","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Invoice numbering: prefix, padding and restart rules, with the next number\nshown before it is used.","2":"The numbering audit \u2014 every number accounted for, exportable as CSV.","3":"Diagnostics: a live test render, font coverage checked against your own\nrecent orders, and the fix for anything that is wrong.","4":"Free and Pro, side by side.","5":"Customers download their own invoice from My Account, without emailing you\nfor it."}},"plugin_section":[],"plugin_tags":[181403,12480,51080,1764,286],"plugin_category":[45,50],"plugin_contributors":[280380],"plugin_business_model":[],"class_list":["post-379158","plugin","type-plugin","status-publish","hentry","plugin_tags-credit-note","plugin_tags-invoice","plugin_tags-packing-slip","plugin_tags-pdf","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-media","plugin_contributors-jethalal","plugin_committers-jethalal"],"banners":{"banner":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/banner-772x250.png?rev=3725825","banner_2x":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/banner-1544x500.png?rev=3725825","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/icon.svg?rev=3725825","icon":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/icon.svg?rev=3725825","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/screenshot-1.png?rev=3725825","caption":"Invoice numbering: prefix, padding and restart rules, with the next number\nshown before it is used."},{"src":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/screenshot-2.png?rev=3725825","caption":"The numbering audit \u2014 every number accounted for, exportable as CSV."},{"src":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/screenshot-3.png?rev=3725825","caption":"Diagnostics: a live test render, font coverage checked against your own\nrecent orders, and the fix for anything that is wrong."},{"src":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/screenshot-4.png?rev=3725825","caption":"Free and Pro, side by side."},{"src":"https:\/\/ps.w.org\/harvify-pdf-invoices\/assets\/screenshot-5.png?rev=3725825","caption":"Customers download their own invoice from My Account, without emailing you\nfor it."}],"raw_content":"<!--section=description-->\n<p>Harvify PDF Invoices attaches a PDF invoice to the order emails WooCommerce already\nsends, and issues a credit note whenever you refund.<\/p>\n\n<p>The part that matters is not the PDF. It is the <strong>numbering<\/strong>.<\/p>\n\n<h4>Getting started<\/h4>\n\n<ol>\n<li>Go to <strong>Harvify \u2192 PDF Invoices<\/strong>. The <strong>Settings<\/strong> screen opens.<\/li>\n<li>Under <strong>Invoice numbering<\/strong>, set the number format: a prefix such as <code>INV-{year}-<\/code>\nand how many digits the number has.<\/li>\n<li>Under <strong>Attach to emails<\/strong>, tick the WooCommerce emails that should carry the\ninvoice. Most shops choose the completed-order email.<\/li>\n<li>Fill in <strong>Your tax details<\/strong> so they print on every invoice, then click\n<strong>Save settings<\/strong>.<\/li>\n<li>Open <strong>Diagnostics<\/strong> to confirm nothing on your server needs attention.<\/li>\n<li>Complete an order: the invoice is attached to the email you chose, and the order\nscreen's <strong>Harvify documents<\/strong> section opens it. Refund the order and a credit note is\nissued.<\/li>\n<\/ol>\n\n<p>If you are moving from another invoicing plugin, open <strong>Import<\/strong> first. It continues\nyour existing numbers instead of starting again at 1.<\/p>\n\n<h4>Every number is accounted for<\/h4>\n\n<ul>\n<li>Numbers are allocated so that <strong>two orders placed at the same moment can never\nreceive the same one<\/strong>. The database itself enforces this, not a lucky read.<\/li>\n<li>A number is <strong>never reused<\/strong>.<\/li>\n<li>A number <strong>never silently disappears<\/strong>. If a document fails after its number was\nallocated, that number is recorded as <strong>void<\/strong> \u2014 with the reason and the time \u2014\nand stays visible in your numbering audit.<\/li>\n<\/ul>\n\n<p>That is a stronger promise than \"gapless\", and unlike \"gapless\" it is one that\nsurvives two customers checking out in the same second. The <strong>numbering audit<\/strong>\nscreen shows you the whole sequence, per period, with every void explained, and\nexports it as CSV. It is the screen you show your accountant.<\/p>\n\n<h4>Switching from another invoicing plugin<\/h4>\n\n<p>Most people never move invoicing plugins, because restarting numbering at #1\nbreaks the sequence their accountant and tax authority expect.<\/p>\n\n<p>So this one <strong>continues your existing numbers<\/strong>. The importer reads your current\nplugin, shows you a dry run first \u2014 <em>\"after import your next invoice will be\nINV-2026-0004, the same number you would get today\"<\/em> \u2014 and only then writes\nanything. Your historical numbers are preserved exactly as they were, your number\nformat is adopted, and the old plugin is never modified, so you can compare the two\nside by side or back out entirely.<\/p>\n\n<p>Imports from <strong>WooCommerce PDF Invoices &amp; Packing Slips<\/strong>, from <strong>WebToffee\n(beta)<\/strong>, or from a <strong>CSV file<\/strong> of <code>order_id,invoice_number,invoice_date<\/code> \u2014 so you\ncan move from a plugin nobody has mapped, from a spreadsheet, or from a paper book.\nIf any line of the file cannot be read, nothing at all is imported and every problem\nis listed: a half-imported invoice history is worse than none.<\/p>\n\n<p>The WebToffee route is marked <strong>beta<\/strong> because it is newly verified: we checked it\nagainst <strong>WebToffee 5.0.1<\/strong> by having that plugin issue real invoice numbers and then\nimporting them, so we know it reads what WebToffee actually stores. Older WebToffee\nversions we have not tested. The dry run protects you either way \u2014 it shows the\nnumbers you will end up with <strong>before<\/strong> anything is written, and the import can be\nrolled back afterwards.<\/p>\n\n<h4>Dual run \u2014 try it without your customers seeing anything<\/h4>\n\n<p>Importing your history is one thing; trusting the next real order is another. Turn\non <strong>dual run<\/strong> and this plugin produces and numbers every document exactly as it\nwill in production \u2014 and attaches none of them to your customers' emails. Your old\nplugin carries on sending its own, so customers see no change at all, while you get\na side-by-side table of its invoice number and ours for every order placed since you\nstarted.<\/p>\n\n<p>It never ends on a timer. When the period you chose is up you are simply told;\nnothing reaches a customer until you press the button yourself.<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li><strong>PDF invoices<\/strong>, attached to the WooCommerce emails you choose<\/li>\n<li><strong>Credit notes on refund<\/strong> \u2014 one per refund, on their own separate sequence<\/li>\n<li>Prefix, suffix and zero-padding, with {year} and {month} tokens<\/li>\n<li><strong>Yearly or monthly restart<\/strong> \u2014 and earlier periods are never renumbered<\/li>\n<li><strong>Numbering audit<\/strong> \u2014 with CSV export<\/li>\n<li><strong>Numbers are immutable once issued<\/strong> \u2014 an order edit, a status change or a\nrefund never renumbers a document that has already been issued.<\/li>\n<li><strong>VOID tracking<\/strong> \u2014 a number is never reused and never silently disappears; a\nfailure records a VOID with its reason and timestamp.<\/li>\n<li><strong>Import your existing numbers<\/strong> \u2014 from WooCommerce PDF Invoices &amp; Packing\nSlips, WebToffee (beta) or a CSV file \u2014 with a dry run, a rollback and a\ndual-run mode<\/li>\n<li>Multiple tax rates per document, VAT number, reverse-charge note<\/li>\n<li><strong>Diagnostics screen<\/strong> \u2014 a live test render, memory headroom, storage,\nnumbering health, the language a given order's document will be produced in,\nand font coverage checked against <em>your own recent orders<\/em>, each with the fix\nstated<\/li>\n<li><strong>Fonts for non-Latin invoices<\/strong> \u2014 one-click download of the matching Noto\nfont, or upload your own<\/li>\n<li><strong>Bulk generate and bulk ZIP download<\/strong> \u2014 straight from the Orders list<\/li>\n<li><strong>Customer self-service<\/strong> \u2014 your buyers download their own invoice from My\nAccount<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 regenerate a document, export the numbering audit, check sequence\nstatus<\/li>\n<\/ul>\n\n<h4>Pro \u2014 the Harvify Pro Bundle<\/h4>\n\n<ul>\n<li><strong>Visual template designer<\/strong> \u2014 logo, colours, type sizes, page margins, the\norder of the blocks on the page, and your own CSS, with a <strong>live preview that\nis real PDF output<\/strong> rather than an HTML approximation of one. A save is only\naccepted <strong>if it renders<\/strong>: if the candidate template throws, the save is\nrefused and the documents your customers receive are left exactly as they\nwere.<\/li>\n<li><strong>More document types<\/strong> \u2014 <strong>proforma invoices<\/strong>, <strong>delivery notes<\/strong> and\n<strong>dunning (payment reminder) letters<\/strong>, plus <strong>packing-slip customisation<\/strong>:\nretitle it, drop the SKU column, hide the customer note or the shipping\nmethod, add a footer line of your own. The basic packing slip stays free. The\nthree new documents are deliberately <strong>unnumbered<\/strong> \u2014 a quotation that never\nbecomes a sale must not consume an invoice number, because a number is never\nreused and a gap is permanent.<\/li>\n<li><strong>Bulk generation at scale, and automation<\/strong> \u2014 Pro does not raise the free\nbulk limit, it <strong>queues the work on Action Scheduler<\/strong>, one order per job, so\nnothing renders inside the request and a run across thousands of orders cannot\ntime out. Plus <strong>per-status auto-attach rules<\/strong> \u2014 choose which of\nWooCommerce's own emails carry a document for orders in a given status. Rules\nare evaluated at send time, so switching one off takes effect on the very next\nemail rather than after a queue drains.<\/li>\n<li><strong>Scheduled accountant export<\/strong> \u2014 a weekly, monthly or quarterly package of\nthe numbering audit CSV and that period's documents, delivered to an <strong>email\naddress or an FTP server<\/strong>. Consecutive delivery failures <strong>pause the\nschedule<\/strong> and say why, on the screen and in Diagnostics \u2014 because a monthly\nexport bouncing off a dead mailbox for a year is exactly the sort of thing\nnobody notices.<\/li>\n<li><strong>Multi-language documents \u2014 the language follows the customer, not the\nadmin.<\/strong> \u2014 German, French, Spanish, Italian, Dutch, Portuguese and Polish ship\nwith the plugin, so documents translate on a shop with nothing else installed;\nWPML and Polylang are honoured when present and never required. A language is\nused only if it can translate <strong>every<\/strong> string on the document: a page reading\n\"Rechnung\" above \"Subtotal\" is worse than English throughout, so the fallback\nis the whole document rather than the missing phrase. The same order produces\nthe same language from the order screen, from WP-CLI and from the customer's\nown My Account download.<\/li>\n<li><strong>Per-document-type sequences and per-country legal blocks<\/strong> \u2014 where your\njurisdiction requires sequentially numbered delivery notes, give that type\n<strong>its own series<\/strong>: it starts at 1 and never draws a number from the invoice\nsequence. And attach the legal wording a given billing country requires,\nprinted in the document's notice box rather than buried in footer grey.<\/li>\n<\/ul>\n\n<h4>Harvify Pro Bundle<\/h4>\n\n<p>One subscription unlocks the Pro features of every Harvify plugin. Install only\nthe tools your store needs.<\/p>\n\n<h4>What we translate, and what we do not<\/h4>\n\n<p>The seven bundled languages cover <strong>the wording of the document itself<\/strong> -- its\nheadings, its column titles, its totals and its notices. The country name in the\ncustomer's address and WooCommerce's own tax labels come from the WordPress and\nWooCommerce language packs, so on a shop that has never installed the German pack\nthey stay in English however complete our translation is. The Languages screen\ntells you which packs this site has. The date is the one thing we handle\nourselves: when a pack is missing it is printed numerically, so it never appears\nin the wrong language.<\/p>\n\n<h4>Non-Latin invoices are refused, not mangled<\/h4>\n\n<p>The bundled font covers Latin, Greek and Cyrillic. If an order contains Japanese,\nArabic, Hebrew, Thai or Devanagari characters, most plugins render a document full\nof empty boxes and nobody notices until a customer complains.<\/p>\n\n<p>This one <strong>refuses to produce that document<\/strong>, names the script, and offers you the\nfont \u2014 one click to download it to your own server, or upload your own <code>.ttf<\/code>.<\/p>\n\n<h4>We never email your customers<\/h4>\n\n<p>Invoices reach buyers by being attached to WooCommerce's own order emails. This\nplugin has no path of its own for sending anything to a customer, so your\nexisting mail setup keeps working exactly as it does, and a delivery problem\nstays a mail-configuration question rather than becoming ours.<\/p>\n\n<p>There is exactly one thing this plugin sends, and it is not to a customer: the\nPro <strong>accountant export<\/strong>, which mails your own records to the address you type\nin yourself. Nothing about what your customers receive changes.<\/p>\n\n<h4>What this does not claim<\/h4>\n\n<p>We generate invoices containing the fields <strong>commonly required<\/strong> for VAT and GST.\nWe do <strong>not<\/strong> claim to make you tax compliant, and you should confirm with your\naccountant that the documents meet the requirements in your jurisdiction.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to Freemius, the licensing and update service Harvify uses to\nsell and deliver the Pro tier of its plugins.<\/p>\n\n<p>Nothing is sent to Freemius unless you choose to send it. On activation you are shown\nFreemius's standard opt-in screen. Until you answer it a fresh install makes no\noutbound request at all, and if you choose Skip the free tier stays fully usable\nand still sends nothing. Data is transmitted only when you take one of these\nactions:<\/p>\n\n<ul>\n<li><strong>You click \"Allow &amp; Continue\" on the Freemius opt-in screen.<\/strong> This sends your\nsite address, your administrator email address, and your WordPress, PHP and active\nplugin\/theme details, so Harvify can provide support and know which environments to\ntest against. Skipping that screen sends nothing and leaves the plugin working\nnormally.<\/li>\n<li><strong>You enter a Pro Bundle licence key.<\/strong> This sends the key together with your site\naddress so the licence can be activated for that site. While a licence is active the\nsite also re-checks periodically that it is still valid and whether a Pro update is\navailable.<\/li>\n<\/ul>\n\n<p>Service provided by Freemius, Inc. - https:\/\/freemius.com\/\nTerms of service: https:\/\/freemius.com\/terms\/\nPrivacy policy: https:\/\/freemius.com\/privacy\/<\/p>\n\n<h4>Font downloads (optional, one click per script)<\/h4>\n\n<p>Invoices render in Latin scripts using fonts bundled with the plugin. If you need\nJapanese, Arabic, Hebrew, Thai or Devanagari, the Fonts screen offers to download the\nmatching Noto font, and that download runs only when you click install for that\nspecific script.<\/p>\n\n<p>Sent: a request to raw.githubusercontent.com for the font file itself. Like every\nrequest WordPress makes, it carries WordPress's standard User-Agent header, which\nnames your WordPress version and your site address, and GitHub sees your server's\nIP address. Nothing about your orders or your customers is included.<\/p>\n\n<p>Fonts are the Noto family, hosted on GitHub - https:\/\/github.com\/notofonts\nTerms: https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service\nPrivacy: https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-general-privacy-statement<\/p>\n\n<h4>Accountant export<\/h4>\n\n<p>The Pro accountant export can upload documents to an FTP server that you configure.\nIt is part of the Pro tier and is not included in this free download.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>This plugin bundles the following open-source libraries. Each ships with its own\nlicence file inside the plugin's <code>vendor<\/code> directory.<\/p>\n\n<ul>\n<li><strong>Dompdf<\/strong> (LGPL-2.1) \u2014 HTML to PDF rendering. https:\/\/github.com\/dompdf\/dompdf<\/li>\n<li><strong>php-font-lib<\/strong> (LGPL-2.1-or-later) and <strong>php-svg-lib<\/strong> (LGPL-3.0-or-later),\nby the Dompdf project<\/li>\n<li><strong>Masterminds HTML5<\/strong> (MIT) \u2014 HTML parsing<\/li>\n<li><strong>Sabberworm PHP CSS Parser<\/strong> (MIT) \u2014 CSS parsing<\/li>\n<li><strong>DejaVu Sans<\/strong> \u2014 bundled font, released under a permissive\nBitstream Vera \/ Arev derived licence<\/li>\n<\/ul>\n\n<p>Noto fonts, offered as an optional one-click download, are published by Google\nunder the SIL Open Font License 1.1 and are downloaded to your own server. They are\nnot bundled with this plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate. WooCommerce must be active.<\/li>\n<li>Go to <strong>Harvify \u2192 PDF Invoices \u2192 Settings<\/strong> and choose your number format and\nwhich emails should carry the invoice.<\/li>\n<li>Check <strong>Diagnostics<\/strong> \u2014 it will tell you if anything on your server needs\nattention before the first document is issued.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20change%20my%20existing%20invoice%20numbers%3F\"><h3>Will it change my existing invoice numbers?<\/h3><\/dt>\n<dd><p>No. The importer preserves every historical number exactly, and continues the\nsequence from where your current plugin left off. The dry run shows you the next\nnumber before anything is written, and you can roll the import back.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20two%20orders%20are%20placed%20at%20exactly%20the%20same%20moment%3F\"><h3>What happens if two orders are placed at exactly the same moment?<\/h3><\/dt>\n<dd><p>They receive different numbers. Allocation is enforced by a uniqueness constraint\nin the database, so a collision is impossible rather than unlikely.<\/p><\/dd>\n<dt id=\"why%20was%20my%20invoice%20not%20created%3F\"><h3>Why was my invoice not created?<\/h3><\/dt>\n<dd><p>Check the Diagnostics screen \u2014 it reports the actual cause with the fix. The most\ncommon one is an order containing characters the installed fonts cannot draw, which\nis refused deliberately rather than rendered as empty boxes.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. All order data is read through the WooCommerce CRUD API rather than post meta.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.14.11<\/h4>\n\n<ul>\n<li><strong>Admin messages no longer travel in the address bar.<\/strong> The bulk-action, Fonts and\nSettings screens used to print their message from the URL, so a crafted link could\nshow any sentence on those screens. Messages are now kept for the user whose action\ncaused them, and shown once.<\/li>\n<li><strong>The Diagnostics order lookup now needs a security token and the WooCommerce\nmanager capability.<\/strong> Without both, the lookup is ignored.<\/li>\n<li><strong><code>wp harvify-pdf export-audit --file<\/code> only writes to the plugin's protected folder<\/strong>\nin your uploads directory. Only the file name you give is used.<\/li>\n<li>The document translations used by Pro are no longer included in the free plugin.<\/li>\n<li>Readme: a formatting error in the feature list is fixed, and a Getting started\nsection is added.<\/li>\n<\/ul>\n\n<h4>0.14.10<\/h4>\n\n<ul>\n<li><strong>Fixed: the PDF Invoices settings screen could not be opened on a site with no\nother Harvify plugin.<\/strong> The menu was registered too late to be built, so\nWooCommerce stores that installed only this plugin saw \"Sorry, you are not\nallowed to access this page\" instead of the settings.<\/li>\n<\/ul>\n\n<h4>0.14.9<\/h4>\n\n<ul>\n<li><strong>Fixed: deleting the plugin with \"delete data on uninstall\" switched on now\nremoves all of its settings.<\/strong> Twelve options survived an opted-in delete, among\nthem the main settings, the importer's saved state and, on Pro, the accountant\nexport's stored secret. Generated PDF files and the invoice numbers recorded on\nyour orders are still always kept, as the setting says. With the setting off\n(the default) nothing is removed, as before.<\/li>\n<li>Fixed: the External services section and the Fonts screen now say exactly what\na font download sends. The request goes to raw.githubusercontent.com and carries\nWordPress's standard User-Agent, which names your WordPress version and site\naddress. It was previously described as sending nothing about your site.<\/li>\n<li>Changed: the External services section now describes the Freemius opt-in screen\nshown on activation. Until you answer it a fresh install makes no outbound\nrequest, and choosing Skip keeps the free tier fully usable and sends nothing.<\/li>\n<li>Fixed: two lines on the Pro panels promised more than Pro does. Pro numbering\ngives each document type its own prefix (padding and the reset period follow\nyour invoice settings), and the Automation screen lists recent background\nfailures rather than showing progress.<\/li>\n<\/ul>\n\n<h4>0.14.8<\/h4>\n\n<ul>\n<li>Added: a single <strong>Support<\/strong> entry in the Harvify menu, so you can reach us from\ninside WordPress. Until now no plugin offered a contact route at all. One entry for\nthe whole suite rather than one per plugin.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>0.14.7<\/h4>\n\n<ul>\n<li>Added: an <strong>External services<\/strong> section to this readme, naming every third-party\nservice the plugin can contact, exactly what is sent, when, and each provider's terms\nand privacy policy. Required for WordPress.org submission.<\/li>\n<li>Changed: the <code>Contributors<\/code> field now names the correct WordPress.org account.<\/li>\n<li>No behaviour changes.<\/li>\n<\/ul>\n\n<h4>0.14.6<\/h4>\n\n<ul>\n<li>Fixed: deactivating or deleting the plugin now cancels queued document\ngeneration and the scheduled accountant export. A bulk run could leave one\nqueued job per order behind, each firing against a plugin that was no longer\nactive.<\/li>\n<\/ul>\n\n<h4>0.14.5<\/h4>\n\n<ul>\n<li>Fixed: a delivery note, proforma invoice or payment reminder printed itself as a\n\"Packing slip\" when that document type had been switched off in the settings. The\nheading was looked up in the list of ENABLED documents, so turning one off left the\ndocument with no name of its own. On a German shop the note went out headed\n\"Packzettel\". What a document is CALLED no longer depends on whether it is\ncurrently OFFERED.<\/li>\n<\/ul>\n\n<h4>0.14.4<\/h4>\n\n<ul>\n<li>Added: a single <strong>Manage licence<\/strong> link on the Plan screen, so an active customer can\ndeactivate this site, change their licence key or re-check their licence without\nneeding a URL from support. No per-plugin Account tab is added.<\/li>\n<\/ul>\n\n<h4>0.14.3<\/h4>\n\n<ul>\n<li><strong>Fixed: updating the plugin did not update its database.<\/strong> WordPress only runs a plugin's\nsetup routine when you <em>activate<\/em> it, never when it updates \u2014 so a change to the plugin's own\ntables never reached sites that had simply updated. On those sites some features failed with a\ndatabase error. The update now applies itself on the next page load.<\/li>\n<li><strong>One upgrade link instead of one per plugin.<\/strong> With several Harvify plugins active the\nmenu showed a row called \"Upgrade\" for each of them, all identically labelled, and it kept\nsaying Upgrade to people who had already bought. They are replaced by a single <strong>Plan<\/strong>\nscreen that says what the bundle costs, what it covers, and whether your licence is active.<\/li>\n<li><strong>The dashboard is quiet again.<\/strong> Each plugin used to add its own \"opt in to make this\nbetter\" notice to the main WordPress dashboard, so five plugins meant five notices. Harvify\nplugins now share one queue: promotional notices appear only on Harvify's own screens, and\nonly one at a time. Licence and account messages are never held back.<\/li>\n<li><strong>Fixed: the \"Data &amp; uninstall\" box covered the page.<\/strong> It was being drawn into the admin\nfooter, which WordPress pins to the bottom of the screen, so it floated on top of whatever was\nunderneath it. It now sits in the page like any other card. Saving it also tells you what it\nsaved, instead of just reloading.<\/li>\n<li><strong>Fixed: the upgrade screen advertised the wrong number of sites.<\/strong> Several plugins listed\nthe Freelancer and Agency plans as covering 5 and 25 sites. They cover 3 and 10.<\/li>\n<\/ul>\n\n<h4>0.14.2<\/h4>\n\n<ul>\n<li><strong>Deleting the plugin can now clean up after itself.<\/strong> It previously had no uninstall routine\nat all, so its options stayed in your database forever with no way to remove them. A new\n<strong>Data &amp; uninstall<\/strong> control on the plugin's own screen lets you opt in to a full cleanup; the\ndefault is to keep everything, so nothing changes unless you ask for it.<\/li>\n<\/ul>\n\n<h4>0.14.1<\/h4>\n\n<ul>\n<li><strong>The plugin now looks like the rest of the Harvify suite.<\/strong> Its screens were plain\nWordPress settings markup dropped onto the grey admin background -- no card, labels stranded\nin a narrow column -- under a Harvify header, so it read as a different product bolted on.\nEvery section is now inside the same card the other twelve plugins use, with grouped\nheadings, matching inputs and readable help text.<\/li>\n<li><strong>Fixed: PRO badges were shown on the tabs even when your licence was active.<\/strong> On a paid\nsite those screens are simply yours; labelling them PRO read like being sold something you\nhad already bought. The badges now appear only while a feature is locked.<\/li>\n<li>Wide tables (numbering audit, diagnostics) scroll inside their card instead of pushing the\npage sideways.<\/li>\n<\/ul>\n\n<h4>0.14.0<\/h4>\n\n<ul>\n<li><strong>You can now see that a Pro tier exists.<\/strong> This plugin had no Pro visibility at all: the\npaid screens are registered by the Pro code, so on the free build they simply were not\nthere. A free user saw five tabs, nothing labelled Pro, and no way to find out what the\npaid tier does or what it costs -- from inside the plugin, the paid tier did not exist.<\/li>\n<li>Every Pro feature now has a tab in the free build, marked <strong>PRO<\/strong>: Template, Documents,\nNumbering &amp; legal, Automation, Languages and Accountant export. Opening one explains what\nthe feature does, what you get, and the price -- rather than a blank screen. It never shows\nthe working feature.<\/li>\n<li>New <strong>Upgrade<\/strong> tab (it becomes <strong>Plan<\/strong> once licensed, showing that Pro is unlocked as\npart of your Harvify Pro Bundle, with a link to manage the licence).<\/li>\n<li>A dismissible upgrade card on the free working screens. Dismiss it and it stays dismissed.<\/li>\n<li>The plugin now uses the shared Harvify admin design the other twelve plugins use: branded\nheader, Free\/Pro plan pill, and the section nav. The shared packages it already expected\nwere never actually bundled with it, so none of that had been loading.<\/li>\n<li>Fixed: with all twelve tabs present the section nav ran off the right-hand edge of the\nwindow and the last tab could not be reached without scrolling the whole page sideways.\nIt now wraps onto a second row.<\/li>\n<li>Fixed: WordPress admin notices were being drawn inside the plugin's header panel.<\/li>\n<\/ul>\n\n<h4>0.13.3<\/h4>\n\n<ul>\n<li><strong>Fixed: the WebToffee importer read the wrong fields and would have found nothing.<\/strong> It looked\nfor meta keys that no version of WebToffee writes, so on a real WebToffee shop it would have\nreported an empty history \u2014 and that shop would have restarted its invoice numbering at 1,\nwhich is the exact thing this importer exists to prevent. Checked against WebToffee 5.0.1 by\nhaving that plugin issue real invoice numbers and reading back what it stored, the importer now\nreads the right fields, understands that WebToffee keeps only a finished (prefixed and padded)\nnumber, and reads its invoice date correctly.<\/li>\n<li>The <strong>WebToffee<\/strong> source is now offered on the Import screen, marked <strong>beta<\/strong> while it is newly\nverified: 5.0.1 is checked, older versions are not. The dry run shows you the numbers you will\nend up with before anything is written, and the import can be rolled back.<\/li>\n<\/ul>\n\n<h4>0.13.2<\/h4>\n\n<ul>\n<li>Documentation: the Pro features are now described in the plugin description. The template\ndesigner, the extra document types, queued bulk generation, the scheduled accountant export,\nmulti-language documents and per-country legal blocks were all built, drilled and shipped --\nbut they appeared only in this changelog, so nobody reading the description ever learnt the\nplugin does them. No code changed.<\/li>\n<\/ul>\n\n<h4>0.13.1<\/h4>\n\n<ul>\n<li>Fixed: the Pro accountant-export download now reads its package through WordPress's own\nfilesystem layer, like every other download in the plugin. It was the one route still using a\ndirect PHP call, under a suppression comment that named a rule which does not exist \u2014 so the\nsuppression did nothing and the call was flagged.<\/li>\n<li>Housekeeping: \"Tested up to\" moved to WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>0.13.0<\/h4>\n\n<ul>\n<li><strong>Pro: a visual template designer.<\/strong> Colours, logo, type sizes, page margin, the order your document's blocks appear in, and your own CSS -- with a <strong>live preview that is the real PDF<\/strong>, produced by the same engine that makes your invoices, drawn from one of your own real orders.<\/li>\n<li><strong>Pro: a template that does not render is not saved.<\/strong> Every save is checked by producing a real document with it first. If that fails, the save is refused and the template you are using stays in use -- you cannot break your invoices by pressing Save.<\/li>\n<li><strong>Pro: blocks can be reordered but never removed.<\/strong> Each one carries something an invoice needs, and a stored layout that is damaged or out of date is repaired on the way to the document rather than producing an invoice with no totals.<\/li>\n<li><strong>Pro: a large logo cannot break your invoices.<\/strong> Images are re-encoded and scaled down before they are stored.<\/li>\n<li><strong>Pro: low contrast is pointed out, not blocked.<\/strong> If your text colour is hard to read the screen says which pair and what the ratio is, and leaves the decision to you -- quiet text is sometimes exactly what you want.<\/li>\n<li><strong>Pro: restore the default template at any time.<\/strong> The shipped template is part of the plugin rather than a saved copy of one, so restoring always works.<\/li>\n<\/ul>\n\n<h4>0.12.0<\/h4>\n\n<ul>\n<li><strong>Pro: scheduled accountant export.<\/strong> Sends your invoice records to your accountant on a schedule -- the numbering audit for the period plus the documents issued in it, in one ZIP, by email or FTP. Each package covers the period that has just ENDED, because half a month is not something an accountant can file.<\/li>\n<li><strong>Pro: the audit and the documents reconcile.<\/strong> Every issued number in the CSV says whether its PDF is in the package, so a number without an enclosed document arrives explained instead of queried.<\/li>\n<li><strong>Pro: a forgotten schedule stops itself.<\/strong> Three consecutive delivery failures pause it, the reason is recorded, and Diagnostics says plainly that nothing is being sent. Switching the export off stops it immediately rather than after whatever was already queued.<\/li>\n<li><strong>Pro: your FTP password is never shown back to you.<\/strong> The field is always blank and blank means \"keep it\"; the password is stored outside the settings, is never written to the run log or any error message, and appears in nothing this plugin can hand to a support request.<\/li>\n<li>Google Drive and Dropbox are deliberately not offered -- they would mean us running an OAuth application over your customers' invoices.<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<ul>\n<li><strong>Pro: documents in your customer's language.<\/strong> Seven languages ship with the plugin -- German, French, Spanish, Italian, Dutch, Portuguese and Polish -- and the language follows the CUSTOMER, not whoever is looking at the screen. The same order comes out in the same language from the order screen, from WP-CLI, and from the customer's own download in My Account.<\/li>\n<li><strong>Pro: a language is used only if the whole document can be translated.<\/strong> If a single phrase is missing, the entire document is produced in English instead. Half-German-half-English is worse than English, so we never produce one. The Languages screen shows the coverage for each language and names any phrase that is holding one back.<\/li>\n<li><strong>Pro: no translation plugin required.<\/strong> The translations are ours and work on a shop with nothing else installed. WPML and Polylang are used WHEN PRESENT -- for the order's language and for translated product titles -- and are never needed.<\/li>\n<li><strong>Pro: the billing country can supply the language<\/strong> when nothing else knows it. Only for countries with one obvious language: Belgium, Switzerland, Canada and Luxembourg are deliberately left alone, because guessing there gets it wrong for real customers.<\/li>\n<li><strong>Diagnostics now reports which language a given order's document will use<\/strong>, and where that language came from -- so you see it before your customer does. There is a box on the screen to ask about any order.<\/li>\n<li>Dates on a translated document are shown numerically when your site does not have that language's WordPress pack installed, so an English month name never appears on a German invoice.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Pro: bulk generation at scale. With the background queue on, a bulk run is no longer capped at 100 orders \u2014 each order becomes its own background job, so the run finishes whatever its size and nothing happens in your browser request. The free limit is unchanged.<\/li>\n<li>Pro: attach by order status. Choose which of WooCommerce's own emails carry the invoice, per order status. Nothing is attached until you tick something, and unticking takes effect on the very next email.<\/li>\n<li>Fixed: one invoice number per order is now enforced by the database, not by a check in code. Two workers generating for the same order at the same instant could each allocate a number \u2014 no duplicate number was ever issued, but the order could end up with a second number recorded against it in the numbering audit. Found by a test that injects a genuine race.<\/li>\n<li>If your site already carries that footprint, nothing is changed behind your back: Diagnostics and the numbering audit both name the affected orders, and <code>wp harvify-pdf reconcile-numbers --dry-run<\/code> shows what reconciling would do. Reconciling keeps the number your customer's invoice actually shows and marks the other VOID with a reason \u2014 nothing is deleted.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li><strong>Pro: give a document its own numbers.<\/strong> Some countries require delivery notes to carry\ntheir own sequential number. Switch it on and that document gets a sequence of its OWN,\nstarting at 1, with its own prefix \u2014 it never takes numbers from your invoice series, and\nyour next invoice number does not move.<\/li>\n<li>Switching it back off stops new documents being numbered. Numbers already issued stay\nexactly as they are: a number that has been given out is never reused and never quietly\ndisappears.<\/li>\n<li><strong>Pro: country legal text.<\/strong> Wording printed on documents for customers billed in a\nparticular country \u2014 a reverse-charge note, a local tax statement. Chosen by the billing\ncountry, printed in a boxed panel at readable size rather than buried in the small print,\nand shown alongside (not instead of) a proforma's own statement.<\/li>\n<li>Fixed: if a document's numbering was switched on but its sequence table was missing \u2014 after\na restored backup or a site clone, for example \u2014 the screen could show a raw database error.\nIt now repairs the table when you open the screen.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li><strong>Pro: more documents.<\/strong> A <strong>proforma invoice<\/strong>, a <strong>delivery note<\/strong> and a <strong>payment\nreminder<\/strong>, alongside the invoice and packing slip. Each can be switched on or off.<\/li>\n<li>None of them takes an invoice number. A proforma is a quotation, not a sale \u2014 numbering one\nwould use up a real invoice number for an order that may never happen, and numbers are never\nreused. The proforma says plainly that it is not a VAT invoice and that no payment is due\nagainst it.<\/li>\n<li><strong>Pro: packing-slip appearance.<\/strong> Retitle it, hide the SKU column, hide the customer note or\nthe shipping method, and add your own footer line. The packing slip itself stays part of the\nfree plugin \u2014 only these options are Pro.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li><strong>WP-CLI commands.<\/strong> <code>wp harvify-pdf regenerate &lt;order&gt;...<\/code> re-renders a document under\nthe number it already has \u2014 useful after a restore, a tidied uploads folder or a template\nfix. It never issues a new number for an order that already has one.<\/li>\n<li><code>wp harvify-pdf export-audit<\/code> writes the numbering audit as CSV to standard output, or with\n  --file= to the plugin's protected folder in your uploads directory, for invoices or\ncredit notes. It is the same export the Numbering audit screen\nproduces, built by the same code.<\/li>\n<li><code>wp harvify-pdf status<\/code> shows where each sequence stands, with issued and void counts.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li><strong>Customers can download their own invoice<\/strong> from My Account \u2014 an Invoice button on their\norder list and a download on the order page. A customer only ever sees their own orders,\nand the button appears only once the invoice exists.<\/li>\n<li>Opening an invoice never creates one, so a customer visiting the page cannot cause a\ndocument number to be issued for an unfinished order.<\/li>\n<li>Can be switched off entirely on the Settings screen.<\/li>\n<li>Fixed: an error message on the Fonts screen was displayed with all of its spaces removed,\nmaking it very hard to read. (Same cause as the Settings-screen fix in 0.5.0; the whole\nplugin was checked for other instances.)<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li><strong>Bulk actions on the Orders list.<\/strong> Select orders and choose <em>Generate invoices<\/em>, or\n<em>Download invoices (ZIP)<\/em> to get them all in one archive. Files inside the archive are\nnamed after the invoice number, so they are easy to find.<\/li>\n<li>Orders that already have an invoice <strong>keep the number they were given<\/strong> \u2014 a bulk run never\nre-issues a number, and the result tells you how many kept theirs.<\/li>\n<li>Works on both WooCommerce order storage modes, and on servers without PHP's ZIP extension.<\/li>\n<li>Fixed: a warning message on the Settings screen was displayed with all of its spaces\nremoved, making it very hard to read.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li><strong>Dual run<\/strong> \u2014 try this plugin without your customers seeing anything. Every document is\nproduced and numbered exactly as it will be in production, and none of them are attached\nto your customers' emails; your old plugin carries on sending its own. You get a\nside-by-side table of its invoice number and ours for every order placed since you\nstarted, so you can check the numbering before you commit to it.<\/li>\n<li>Dual run <strong>never ends on a timer.<\/strong> When the period you chose is up you are told, and\nnothing changes until you press the button yourself \u2014 because that button is the moment\ncustomers start receiving documents from this plugin.<\/li>\n<li>Your old plugin is never modified, switched off, or stripped from an email. Dual run only\ndecides what <em>this<\/em> plugin attaches.<\/li>\n<li>While dual run is on, a banner on every screen of the plugin says so, so it cannot be\nforgotten.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li><strong>The importer now has a screen.<\/strong> It could be reached from nowhere in the admin\nbefore this release, so nobody could actually use it. It lives under\nPDF Invoices \u2192 Import: it tells you which of your plugins it found invoice history\nin, shows the dry run, and only writes when you press Import. Undo is there too.<\/li>\n<li><strong>Import from a CSV file<\/strong> \u2014 three columns, <code>order_id,invoice_number,invoice_date<\/code>,\nwith an optional heading row. Semicolon-separated files (the ones Excel writes in\nmuch of Europe) are read correctly. If any line cannot be read, nothing at all is\nimported and every problem is listed with its line number.<\/li>\n<li>An optional <strong>\"next number\"<\/strong> you can set alongside a CSV, for when your sequence\nhas moved on since the file was made. It can only move numbering forward.<\/li>\n<li>Fixed: two different files with the same number of rows and the same highest\ninvoice number could be mistaken for one already imported, so the second import\ndid nothing while reporting success.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Your licence is now manageable from the plugin itself. The Account screen was previously\nhidden, which also hid <strong>Deactivate License<\/strong> \u2014 so a licence could not be released from one\nsite to move it to another without contacting support. It is visible again, along with the\nlicence key, plan, Sync and Change License.<\/li>\n<li>The repeated <em>\"Opt in to make \u2026 better!\"<\/em> admin notice no longer appears. Licence, plan and\nupdate notices are unaffected \u2014 only the opt-in prompt is suppressed.<\/li>\n<li>Packing slips (free). A packing slip for every order, from the Documents column on\nthe Orders list and from the order screen: delivery address, items, SKU and\nquantity, the customer's note \u2014 and deliberately no prices, no tax and no totals,\nso it is safe to put in a gift or drop-shipped order. Packing slips carry no\ndocument number and never consume one; they are rebuilt each time you open one, so\nthey always match the order as it stands. Optionally attachable to a WooCommerce\nemail (off by default).<\/li>\n<li>Fixed: regenerating an invoice could issue it a SECOND number and overwrite the\nfirst. It now always reuses the number already issued, including when the PDF file\nitself has gone missing from uploads.<\/li>\n<li>WooCommerce HPOS (custom order tables) compatibility is now declared.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial development release: PDF invoices attached to WooCommerce emails; credit\nnotes on refund with an independent sequence; concurrency-safe numbering with void\ntracking and a numbering audit with CSV export; yearly\/monthly restart with\n  {year}\/<code>{month}<\/code> tokens; import from WooCommerce PDF Invoices &amp; Packing Slips\nwith dry-run preview, format adoption and rollback; font coverage detection with\none-click Noto download and manual upload; diagnostics self-check.<\/li>\n<\/ul>","raw_excerpt":"PDF invoices and credit notes for WooCommerce, with numbering your accountant can actually check \u2014 and an import that continues your existing numbers.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/379158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=379158"}],"author":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jethalal"}],"wp:attachment":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=379158"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=379158"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=379158"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=379158"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=379158"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=379158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}