WooCommerce PDF Invoice Plugins Compared

WooCommerce PDF Invoice Plugins Compared

Two completely different products get called a WooCommerce invoice plugin, and picking the wrong category is the most common way this decision goes wrong. One generates a PDF document from an order that already paid. The other adds a payment method so a customer can check out without paying and settle on terms. This page is about the first kind, and there is a section near the end for the second, because the search results mix them together and the plugins do not substitute for each other.

What follows is the criteria I judged each one on, a table of versions, install counts and prices checked on 26 September 2026, the SQL that tells you whether your invoice numbers have duplicates, and why the one feature a US store needs the first time it issues a refund is behind the paywall in every option here. Tested against WooCommerce 11.1.2 on WordPress 7.1.2.

Work out which of the two products you need

A document generator hooks into order status changes. Order 1,482 reaches Processing, the plugin renders a PDF from a template, stamps it with the next number in a sequence, attaches it to the order email, and stores it so you and the customer can download it again later. Nothing about money moves. The order was already paid by your gateway.

A pay-by-invoice gateway does the opposite. It registers itself at checkout as a payment method that takes no payment, so a wholesale buyer with a purchase order number can place an order that lands in your admin marked awaiting payment, and you chase it on net-30 terms. That is an accounts-receivable workflow, and no amount of PDF template editing produces it.

Quick test

If your problem is “customers ask me for a receipt and I have nothing to send”, you want a document generator, and everything in the table below solves it. If your problem is “my wholesale accounts will not pay by card at checkout”, you want a gateway, and the table below solves none of it. Some stores need both, installed separately.

The five criteria I judged each WooCommerce PDF invoice plugin on

Stated up front so you can reweight them for a store shaped differently from the one I assumed: a US store doing 100 to 3,000 orders a month, selling mostly to consumers with some business customers, using an outside bookkeeper who wants a quarter of invoices as one download, and no in-house developer to maintain a custom template.

  1. What the free tier actually generates. Not “invoicing” as a marketing word. Invoice, packing slip, delivery note, credit note, receipt: these are five different documents, and every plugin here draws the free/paid line in a different place across them.
  2. Whether a credit note exists, and what it costs. This is the criterion that decides the budget. The first time you refund an order, your bookkeeper wants a document that references the original invoice number rather than a deleted invoice, and credit notes are a paid feature in most options on this page.
  3. How numbering behaves under stress. Sequential and gap-free sounds trivial until two orders complete in the same second, or a test order eats number 1,001, or you want the count to reset each January. Numbering is where these plugins produce real accounting problems.
  4. Bulk export that survives a quarter. Three months of orders is a few hundred PDFs rendered in one request. Whether that completes or dies at the PHP time limit is a plugin design question, not a hosting question, and it is worth testing before your accountant asks.
  5. Maintenance signals, read strictly. Tested-up-to version, days since the last release, and whether the one-star reviews cluster on anything. This code runs on every completed order and writes numbers your books depend on, so a stale invoicing plugin is a worse risk than a stale gallery plugin.

WooCommerce PDF invoice plugins compared

Versions, install counts, ratings and prices come from WordPress.org and each vendor’s own pricing page, all checked on 26 September 2026. On a narrow screen this table stacks into one card per plugin rather than scrolling sideways.

PluginFree tierPaid price (26 Sep 2026)What the paid tier is really forWhere it falls short
PDF Invoices & Packing Slips for WooCommerce (WP Overnight)v5.16.3, 300,000+ installs, 5/5 across 1,863 reviews, tested to WP 7.1.2, PHP 7.4+, updated three days ago. Invoice and packing slip, auto-attached to order emails, bulk generation, sequential numbering, editable HTML/CSS templates, 36 locales, and structured e-document output (UBL 2.1, Peppol BIS 3.0, Factur-X, ZUGFeRD)Professional: €69/yr one site, €139/yr three sites, €279/yr 25 sitesCredit notes, proforma invoices and receipts; separate numbering sequences per document type; bulk export filtered by date range, order status and customer; automatic upload to Dropbox, Google Drive or SFTPPriced in euros, so a US buyer carries the exchange rate and should check what the checkout adds in tax. The product page I read states no money-back period, which is worse than the guarantee a competitor publishes
PDF Invoices, Packing Slips, Delivery Notes & Shipping Labels (WebToffee)v5.0.2, 50,000+ installs, 4.9/5 across 284 reviews, tested to WP 7.1.2, updated two days ago. The widest free tier here: invoices, packing slips, delivery notes, shipping labels and dispatch labels, bulk printing, UBL and XML output, customer downloads from My Account, and a preview before you printPremium: $69/yr one site, $99/yr five sites, $199/yr 25 sites, 30-day money-back policyCredit notes, bulk export, numbering with auto-reset rules, payment links embedded in the PDF, PrintNode for remote label printing, Dropbox backup, and VAT/GST/ABN tax fieldsDeclares PHP 5.6 as its minimum, which tells you the codebase still carries compatibility shims for a version end-of-life since 2018. The breadth of the free tier also means the busiest settings screen of the four
Print Invoice & Delivery Notes for WooCommerce (Tyche Softwares)v7.3.0, 30,000+ installs, 4.4/5 across 139 reviews, tested to WP 7.0.6, PHP 7.4+, updated two months ago. Invoices, delivery notes, receipts, credit notes and packing slips, bulk print, customer downloads from My Account, branded templates. The 7.0.0 release in April 2026 rebuilt the admin interface in ReactFree on WordPress.org; Tyche sells related order and delivery extensions separately rather than a single Pro tier for this pluginNot applicable — the document set most stores need is in the free plugin, including the credit note the others charge forTested only to WordPress 7.0.6, one minor release behind, with two months since the last update. A 4.4 average on 139 reviews is a real spread rather than a rounding artefact, and the React rebuild is recent enough that you should test it on staging
Flexible PDF Invoices (WP Desk)v6.2.28, 6,000+ installs, 4.4/5 across 37 reviews, tested to WP 7.1.2, PHP 7.4+, updated two weeks ago. Invoices stored as their own post type, manual invoices not tied to any order, bulk download by date range, numbering prefixes and suffixes, date-range reportsPro sold on wpdesk.net; the WordPress.org listing does not state the tier price, so take it from their pricing pageSold primarily on EU VAT compliance features and multi-document handlingBuilt around EU VAT invoicing, including a VAT number field at checkout, so a US-only store pays in complexity for shape it will never use. Smallest install base and review count of the four, which matters for code that numbers your books

One entry to actively avoid, because older roundups still list it: YITH’s free PDF invoice plugin was closed on WordPress.org in September 2021 and its last release was tested against WordPress 5.8. If a comparison article published this year still recommends it, that article has not been checked since before HPOS existed, which tells you what the rest of it is worth.

Credit notes are the feature that decides your budget

Here is the sequence that catches stores out. You install a free invoicing plugin, it works, everyone is happy for four months. Then a customer returns a $340 order, you refund it in WooCommerce, and your bookkeeper asks for the credit note. You do not have one. What you have is an invoice for money you no longer hold, and the temptation is to delete or edit it, which is exactly the thing that makes a sequence unauditable.

A credit note is a separate document with its own number that references the original invoice and records a negative amount. It leaves the original invoice untouched, which is the whole point. In three of the four plugins above that document is a paid feature, and it is the single most common reason a store that started free ends up buying a licence.

So the honest budgeting advice runs against the usual order of operations: decide about credit notes on day one rather than in month five. If you sell anything returnable, you will need them, and the cheapest correct route is either Tyche’s free plugin, which includes credit notes, or WebToffee’s $69 single-site tier with its 30-day refund window so you can confirm the document looks right for your accountant before you commit.

Check your invoice numbering for duplicates before an audit does

Duplicate invoice numbers happen more than vendors admit. Two orders completing in the same second can both read the same “next number” option before either writes it back, a staging site pointed at the production database can consume numbers, and a plugin switch mid-year can restart a sequence at 1 while old invoices still hold those numbers. None of this announces itself. You find out when someone reconciles.

First work out where your orders live, because the answer changed for everyone and most snippets on the web are still written for the old storage. HPOS has been the default for new installs since WooCommerce 8.2, and it moves order data out of wp_posts and wp_postmeta into wp_wc_orders, wp_wc_orders_meta and two companion tables.

# "yes" means HPOS is authoritative and wp_wc_orders_meta is where to look.
wp option get woocommerce_custom_orders_table_enabled

Now find the meta key your plugin uses rather than trusting one from a tutorial, because each vendor names it differently and the names change between major versions. Substitute your table prefix for wp_ throughout.

# HPOS store:
wp db query "SELECT meta_key, COUNT(*) AS rows_found
  FROM wp_wc_orders_meta
  WHERE meta_key LIKE '%invoice_number%'
  GROUP BY meta_key;"

# Legacy store (or a store still running compatibility mode):
wp db query "SELECT meta_key, COUNT(*) AS rows_found
  FROM wp_postmeta
  WHERE meta_key LIKE '%invoice_number%'
  GROUP BY meta_key;"

Take whichever key came back with a realistic row count and feed it into the duplicate check. Anything in the output is a real problem, not a display quirk.

# Replace the meta_key with the one the previous query returned.
wp db query "SELECT meta_value AS invoice_number, COUNT(*) AS times_used
  FROM wp_wc_orders_meta
  WHERE meta_key = '_wcpdf_invoice_number'
    AND meta_value != ''
  GROUP BY meta_value
  HAVING times_used > 1
  ORDER BY times_used DESC
  LIMIT 50;"

Two settings prevent most of this going forward. Turn off invoice generation on order statuses you use for testing, so a cancelled test order never consumes a number. And if your bookkeeper wants numbers that reset each January, configure that in the plugin rather than by hand — a sequence you reset manually in December is a sequence with a gap and no record of why.

Never renumber to tidy up

If you find duplicates or gaps, resist the urge to rewrite the sequence. A customer may already hold a PDF with the old number, and changing it server-side means their copy and yours disagree. Document the break, start a clean sequence with a new prefix from a dated cut-off, and keep the old one readable. Take a database backup before touching any of it.

Bulk exporting a quarter without hitting the memory limit

Rendering PDFs is the most memory-hungry thing an invoicing plugin does. Each document is HTML parsed into a layout tree, fonts loaded, and the whole thing held in memory until it is written out. One invoice is nothing. Four hundred invoices in a single admin request is how you get a white screen halfway through a download your accountant is waiting on.

Size the job before you run it. This counts real orders per month against the HPOS tables, so you know whether a quarter is 200 documents or 2,000.

wp db query "SELECT DATE_FORMAT(date_created_gmt, '%Y-%m') AS month,
       COUNT(*) AS orders
  FROM wp_wc_orders
  WHERE status IN ('wc-completed', 'wc-processing')
  GROUP BY month
  ORDER BY month DESC
  LIMIT 12;"

Then check what the process is allowed to use. The admin figure and the CLI figure are usually different, and the CLI one is the one you can raise freely.

# What a web request gets:
wp eval 'echo "web memory_limit: ", ini_get("memory_limit"), "\n";'

# Run a heavy export with a higher ceiling, CLI only, without
# touching the limit your front end runs under:
php -d memory_limit=1024M "$(which wp)" <your-export-command>

The practical rule: export month by month rather than quarter by quarter, even when the plugin offers a date range that spans the whole period. Twelve small downloads that all complete beat one large download that fails at document 380 and gives you no way to tell which ones were written. If you are already seeing white screens during bulk operations, the underlying cause is usually the PHP ceiling rather than the plugin — how to fix the WordPress allowed memory size exhausted error covers where to raise it and which of the three common places actually takes effect.

One more thing worth knowing about the schedule these run on. Some plugins queue invoice generation as a background job through Action Scheduler rather than rendering it inline, which is better for checkout speed and worse if your cron is broken: invoices are simply never generated and nobody notices for a week. If the admin feels sluggish during busy periods, diagnosing a slow WordPress admin dashboard covers reading the scheduled-actions queue, which is where a backlog shows up first.

The invoice PDF is only useful if the email arrives

Every plugin here can attach the invoice to a WooCommerce order email, and that attachment is how most customers ever see it. The attachment goes out through wp_mail() like every other WordPress email, which means it inherits whatever your store’s mail deliverability already is.

PDF attachments make this worse, not better. A message with an attachment from an unauthenticated sending domain is a stronger spam signal than the same message without one, so a store that was getting away with PHP mail for plain order confirmations can start seeing invoice emails disappear. Confirm the mail path before you blame the invoicing plugin — WooCommerce SMTP plugins compared for order emails covers which options give you a delivery log, which is what lets you prove an invoice was sent rather than argue about it.

Two related settings to get right while you are in there. Attach the invoice to the Completed email rather than the Processing one if you take payment methods that can fail after checkout, or you will send invoices for orders that never paid. And if you sell into multiple states, the tax lines on that PDF come from whatever calculates them at checkout, so a wrong rate becomes a wrong document you have already emailed — WooCommerce sales tax plugins compared for US stores covers what it costs to get those rates right.

If you need customers to pay on terms, that is a gateway

Back to the split from the top of the page. Wholesale and B2B buyers frequently will not put a card into a checkout at all. They want to place the order against a purchase order number and have accounts payable settle it in 30 days. What you need for that is a payment method that completes the order without capturing funds, and none of the PDF plugins above provide one.

Start with what WooCommerce already ships, because it is free and it is often enough. Under WooCommerce > Settings > Payments you have Check payments and Direct bank transfer. Both complete an order into On hold without taking money, and both can be restricted to a wholesale customer role with a few lines in your theme’s functions file. For a store with eight trade accounts, that is the correct answer and you should stop there.

Where the built-in methods fall down is capturing a purchase order number and putting it on the order and the paperwork. Two plugins address that, and both are small. GazChap’s WooCommerce Purchase Order Payment Gateway is v3.2 with 200+ installs and three reviews, tested to WordPress 7.0.0 and last updated four months ago; it collects a PO number, optionally takes a separate invoicing address, and exposes the PO data over the REST API. My own Invoice Payment adds an invoice payment method with configurable invoice settings at checkout. Disclosure: I build and maintain that plugin.

Judged by the same maintenance criteria I applied in the table, mine is the weaker of the two on the measure that matters most: it is at v1.1.7 with 10+ installs and no reviews at all, against GazChap’s longer track record. For code that sits in your checkout, install base is evidence and I do not have much of it yet. If you want the option with more stores behind it, use GazChap’s. If you want neither, the built-in Check payments gateway plus a note on the invoice PDF covers net terms for a small trade list at zero risk and zero cost, and that is a legitimate answer rather than a consolation prize.

Whichever route you take, model the cash-flow cost before you offer terms. Every net-30 order is 30 days of your money sitting in someone else’s account, and the comparison worth making is against the card processing fee you avoided — WooCommerce payment gateway fees explained for US stores has the real per-transaction figures to weigh it against.

What to pick at your store’s size

  • Under 100 orders a month, consumer sales, nothing returnable yet. WP Overnight’s free plugin. It has the largest install base and the strongest review record of anything here, the free tier covers invoice and packing slip attached to order emails, and you can defer the licence decision until a refund forces it.
  • You refund orders regularly and want to spend nothing. Tyche’s Print Invoice & Delivery Notes, which puts credit notes in the free plugin where the others charge for them. Accept the trade: tested one WordPress minor behind, updated two months ago, and a recently rebuilt admin. Test it on staging against a real refund before you rely on it.
  • You want the widest free document set and a refund window on the upgrade. WebToffee. Shipping labels, delivery notes and dispatch labels in the free tier, $69 for one site when you need credit notes and bulk export, and a 30-day money-back policy so you can verify the credit note format with your bookkeeper inside it.
  • Multi-site agency work, several client stores on one licence. Compare WebToffee’s $199 for 25 sites against WP Overnight’s €279 for 25 and price the euro conversion honestly, including whatever their checkout adds. The feature sets are close enough at that tier that support responsiveness and billing currency are the deciding factors, not capability.
  • Selling B2B and confusing the two product categories. Install one of each. A document generator for the paperwork and a gateway for the terms. Buying a bigger invoicing licence will never add a checkout payment method, and this is the mistake that wastes the most money in this category.

Frequently asked questions

Does WooCommerce generate PDF invoices without a plugin?

No. Core WooCommerce sends an order confirmation email containing an HTML summary of the order, and that is all. It produces no PDF, assigns no invoice number separate from the order number, and offers no packing slip. If a customer or a bookkeeper needs a numbered document, you need one of the plugins above. Printing the order screen from the browser is a workaround, not an invoice, because it carries no sequence.

Can the invoice number be different from the WooCommerce order number?

Yes, and it usually should be. Order numbers have gaps: failed payments, abandoned checkouts and cancelled orders all consume them. An invoice sequence needs to be gap-free to be auditable, so every plugin here maintains its own counter, assigned when the invoice is generated rather than when the order is created. Order 1,482 might carry invoice 903. That mismatch is correct behaviour, and it is worth explaining to whoever reconciles your books before they report it as a bug.

Which WooCommerce PDF invoice plugin includes credit notes for free?

Of the four compared here, Tyche Softwares’ Print Invoice & Delivery Notes lists credit notes in its free plugin. WP Overnight, WebToffee and WP Desk all place them behind a paid tier. Verify the format meets your accountant’s requirements before committing either way, since a credit note that does not reference the original invoice number solves the filing problem but not the audit one.

Do these plugins work with HPOS?

All four declare HPOS compatibility, which has been table stakes since it became the default for new installs in WooCommerce 8.2. Check it yourself under WooCommerce > Settings > Advanced > Features, which lists any active plugin that is incompatible with the storage you have selected. The place this still bites is custom template code and old snippets: anything calling get_post_meta() against an order ID needs to move to $order->get_meta(), which works under both storage modes.

Why are my invoice PDFs missing or blank for some orders?

Three causes, in the order worth checking. The plugin is set to generate on an order status those orders never reached, so nothing was ever created. The render ran out of memory, which produces a truncated or empty file rather than an error you would see. Or generation is queued through Action Scheduler and the queue is not running, in which case the documents are pending rather than broken. Check the status setting first, since it costs nothing and explains most cases.

Can customers download their own invoices?

WebToffee and Tyche both list a download link on the My Account orders page in their free versions, which cuts a category of support email entirely. Whichever plugin you use, check the generated URL is not a guessable path to a file in your uploads directory, because an invoice carries a customer’s full billing address. If the link is a plain /wp-content/uploads/ path with a predictable filename, treat that as a privacy problem and ask the vendor how access is restricted.

The short version

Decide first whether you need a document or a payment method, because the two product categories do not overlap and the search results do not distinguish them. For documents, WP Overnight’s free plugin is the safe default at small volume on the strength of 300,000 installs and a 5/5 record. Move when refunds force credit notes into the requirements, and at that point either Tyche’s free plugin or WebToffee’s $69 tier is the cheaper correct answer than the euro-priced alternative.

Then do the two checks nobody does until something goes wrong: run the duplicate-number query above against your live data, and export one month rather than one quarter to see whether bulk generation completes on your host. Before either, take a backup you have actually restored, because invoice numbers are one of the few things in WooCommerce you cannot correctly regenerate from the orders alone — WooCommerce backup plugins compared for store owners covers which ones capture order data taken during the restore window.

Leave a Reply to This Post