Harvify PDF Invoices attaches a PDF invoice to the order emails WooCommerce already
sends, and issues a credit note whenever you refund.
The part that matters is not the PDF. It is the
numbering.
Getting started
- Go to Harvify → PDF Invoices. The Settings screen opens.
- Under Invoice numbering, set the number format: a prefix such as
INV-{year}-
and how many digits the number has.
- Under Attach to emails, tick the WooCommerce emails that should carry the
invoice. Most shops choose the completed-order email.
- Fill in Your tax details so they print on every invoice, then click
Save settings.
- Open Diagnostics to confirm nothing on your server needs attention.
- Complete an order: the invoice is attached to the email you chose, and the order
screen's Harvify documents section opens it. Refund the order and a credit note is
issued.
If you are moving from another invoicing plugin, open
Import first. It continues
your existing numbers instead of starting again at 1.
Every number is accounted for
- Numbers are allocated so that two orders placed at the same moment can never
receive the same one. The database itself enforces this, not a lucky read.
- A number is never reused.
- A number never silently disappears. If a document fails after its number was
allocated, that number is recorded as void — with the reason and the time —
and stays visible in your numbering audit.
That is a stronger promise than "gapless", and unlike "gapless" it is one that
survives two customers checking out in the same second. The
numbering audit
screen shows you the whole sequence, per period, with every void explained, and
exports it as CSV. It is the screen you show your accountant.
Switching from another invoicing plugin
Most people never move invoicing plugins, because restarting numbering at #1
breaks the sequence their accountant and tax authority expect.
So this one
continues your existing numbers. The importer reads your current
plugin, shows you a dry run first —
"after import your next invoice will be
INV-2026-0004, the same number you would get today" — and only then writes
anything. Your historical numbers are preserved exactly as they were, your number
format is adopted, and the old plugin is never modified, so you can compare the two
side by side or back out entirely.
Imports from
WooCommerce PDF Invoices & Packing Slips, from
WebToffee
(beta), or from a
CSV file of
order_id,invoice_number,invoice_date — so you
can move from a plugin nobody has mapped, from a spreadsheet, or from a paper book.
If any line of the file cannot be read, nothing at all is imported and every problem
is listed: a half-imported invoice history is worse than none.
The WebToffee route is marked
beta because it is newly verified: we checked it
against
WebToffee 5.0.1 by having that plugin issue real invoice numbers and then
importing them, so we know it reads what WebToffee actually stores. Older WebToffee
versions we have not tested. The dry run protects you either way — it shows the
numbers you will end up with
before anything is written, and the import can be
rolled back afterwards.
Dual run — try it without your customers seeing anything
Importing your history is one thing; trusting the next real order is another. Turn
on
dual run and this plugin produces and numbers every document exactly as it
will in production — and attaches none of them to your customers' emails. Your old
plugin carries on sending its own, so customers see no change at all, while you get
a side-by-side table of its invoice number and ours for every order placed since you
started.
It never ends on a timer. When the period you chose is up you are simply told;
nothing reaches a customer until you press the button yourself.
What you get
- PDF invoices, attached to the WooCommerce emails you choose
- Credit notes on refund — one per refund, on their own separate sequence
- Prefix, suffix and zero-padding, with {year} and {month} tokens
- Yearly or monthly restart — and earlier periods are never renumbered
- Numbering audit — with CSV export
- Numbers are immutable once issued — an order edit, a status change or a
refund never renumbers a document that has already been issued.
- VOID tracking — a number is never reused and never silently disappears; a
failure records a VOID with its reason and timestamp.
- Import your existing numbers — from WooCommerce PDF Invoices & Packing
Slips, WebToffee (beta) or a CSV file — with a dry run, a rollback and a
dual-run mode
- Multiple tax rates per document, VAT number, reverse-charge note
- Diagnostics screen — a live test render, memory headroom, storage,
numbering health, the language a given order's document will be produced in,
and font coverage checked against your own recent orders, each with the fix
stated
- Fonts for non-Latin invoices — one-click download of the matching Noto
font, or upload your own
- Bulk generate and bulk ZIP download — straight from the Orders list
- Customer self-service — your buyers download their own invoice from My
Account
- WP-CLI — regenerate a document, export the numbering audit, check sequence
status
Pro — the Harvify Pro Bundle
- Visual template designer — logo, colours, type sizes, page margins, the
order of the blocks on the page, and your own CSS, with a live preview that
is real PDF output rather than an HTML approximation of one. A save is only
accepted if it renders: if the candidate template throws, the save is
refused and the documents your customers receive are left exactly as they
were.
- More document types — proforma invoices, delivery notes and
dunning (payment reminder) letters, plus packing-slip customisation:
retitle it, drop the SKU column, hide the customer note or the shipping
method, add a footer line of your own. The basic packing slip stays free. The
three new documents are deliberately unnumbered — a quotation that never
becomes a sale must not consume an invoice number, because a number is never
reused and a gap is permanent.
- Bulk generation at scale, and automation — Pro does not raise the free
bulk limit, it queues the work on Action Scheduler, one order per job, so
nothing renders inside the request and a run across thousands of orders cannot
time out. Plus per-status auto-attach rules — choose which of
WooCommerce's own emails carry a document for orders in a given status. Rules
are evaluated at send time, so switching one off takes effect on the very next
email rather than after a queue drains.
- Scheduled accountant export — a weekly, monthly or quarterly package of
the numbering audit CSV and that period's documents, delivered to an email
address or an FTP server. Consecutive delivery failures pause the
schedule and say why, on the screen and in Diagnostics — because a monthly
export bouncing off a dead mailbox for a year is exactly the sort of thing
nobody notices.
- Multi-language documents — the language follows the customer, not the
admin. — German, French, Spanish, Italian, Dutch, Portuguese and Polish ship
with the plugin, so documents translate on a shop with nothing else installed;
WPML and Polylang are honoured when present and never required. A language is
used only if it can translate every string on the document: a page reading
"Rechnung" above "Subtotal" is worse than English throughout, so the fallback
is the whole document rather than the missing phrase. The same order produces
the same language from the order screen, from WP-CLI and from the customer's
own My Account download.
- Per-document-type sequences and per-country legal blocks — where your
jurisdiction requires sequentially numbered delivery notes, give that type
its own series: it starts at 1 and never draws a number from the invoice
sequence. And attach the legal wording a given billing country requires,
printed in the document's notice box rather than buried in footer grey.
Harvify Pro Bundle
One subscription unlocks the Pro features of every Harvify plugin. Install only
the tools your store needs.
What we translate, and what we do not
The seven bundled languages cover
the wording of the document itself -- its
headings, its column titles, its totals and its notices. The country name in the
customer's address and WooCommerce's own tax labels come from the WordPress and
WooCommerce language packs, so on a shop that has never installed the German pack
they stay in English however complete our translation is. The Languages screen
tells you which packs this site has. The date is the one thing we handle
ourselves: when a pack is missing it is printed numerically, so it never appears
in the wrong language.
Non-Latin invoices are refused, not mangled
The bundled font covers Latin, Greek and Cyrillic. If an order contains Japanese,
Arabic, Hebrew, Thai or Devanagari characters, most plugins render a document full
of empty boxes and nobody notices until a customer complains.
This one
refuses to produce that document, names the script, and offers you the
font — one click to download it to your own server, or upload your own
.ttf.
We never email your customers
Invoices reach buyers by being attached to WooCommerce's own order emails. This
plugin has no path of its own for sending anything to a customer, so your
existing mail setup keeps working exactly as it does, and a delivery problem
stays a mail-configuration question rather than becoming ours.
There is exactly one thing this plugin sends, and it is not to a customer: the
Pro
accountant export, which mails your own records to the address you type
in yourself. Nothing about what your customers receive changes.
What this does not claim
We generate invoices containing the fields
commonly required for VAT and GST.
We do
not claim to make you tax compliant, and you should confirm with your
accountant that the documents meet the requirements in your jurisdiction.