Faq

FAQ

Common questions about Easy PDF Invoices for WooCommerce.

General

Is this plugin really free?

Yes. Free forever, GPL v2+, hosted on WordPress.org. No premium tier, no Freemius, no upsell, no telemetry. Themology runs other premium plugins; this one stays free because PDF invoicing is a core need every WooCommerce store has.

Why another invoice plugin?

The most popular free option (WP Overnight, 300K+ installs) is solid but gates credit notes, paid stamps, and additional templates behind a $54–99/year bundle. Other free options either bundle multiple PDF libraries (50MB+ plugin zip) or skip features that tax-compliant stores actually need: smart Invoice/Receipt distinction, atomic sequential numbering, modern HPOS support.

We built Easy PDF Invoices to do the core job well, ship zero bloat, and stay free forever.

When will it be available on WordPress.org?

The plugin has been submitted and is currently under review. Once approved, it'll be installable directly from your WordPress dashboard. Bookmark this page, or follow us on X and LinkedIn to hear about the launch.

Is there a Pro version?

No, and there isn't one planned. Every feature on the product page is in the free plugin: 4 templates, credit notes, packing slips, PAID badge, REST API, CSV export, bulk operations, Subscriptions compatibility, WPML and Polylang support, multi-currency.

The only future companion plugin we're planning is Easy PDF Invoices mPDF for stores that need RTL or CJK font support. It'll also be free.

Technical

Does it work with HPOS?

Yes, fully. The plugin declares custom_order_tables compatibility and uses WooCommerce CRUD methods exclusively. No get_post_meta() calls. Tested with HPOS enabled and disabled.

Does it work with the Block Checkout?

Yes. The plugin declares cart_checkout_blocks compatibility. There's no checkout interaction — PDFs attach after order creation, regardless of which checkout flow the customer used.

What's the minimum PHP version?

PHP 8.1. We use strict types on every file, modern enums, and readonly properties.

If you're on PHP 8.0 or lower, your hosting needs an upgrade anyway — PHP 8.0 is past end-of-life as of November 2023, and WordPress 6.7+ recommends 8.1+. By the time you read this, almost every host supports PHP 8.2+.

What's the minimum WordPress version?

WordPress 6.4. We use modern WordPress APIs that aren't available in older releases.

What's the minimum WooCommerce version?

WooCommerce 8.0. That's when HPOS became stable.

How big is the plugin?

Under 5MB on disk. We bundle one PDF library (DOMPDF, ~2MB) and one font (DejaVu Sans). Some bundled invoicing plugins ship at 50MB or more by including multiple PDF libraries — we kept it lean by design.

How fast is PDF generation?

Under 500ms for a typical 5-item order, well under the 32MB memory limit. Lazy generation means we only render PDFs when they're actually needed (email attachment, customer download, admin click), so storefronts don't see any latency hit.

Documents

What's the difference between an Invoice and a Receipt?

The plugin auto-detects:

  • Order not yet paidInvoice (shows amount due, terms).
  • Order paidReceipt (shows PAID badge with payment date and method).
  • Order refundedCredit Note (shows REFUNDED badge, references original).
This is the #1 confusion point in support tickets for other plugins. Customers often wonder why their "invoice" doesn't say it's been paid. We solved it by reading $order->is_paid() and labelling the document correctly.

Can I force every order to generate an Invoice?

Yes. Settings > Invoices > General > Document type mode has three options: Auto (recommended), Always Invoice, or Always Receipt. Pick Always Invoice if your business workflow requires it.

Can I customise the PAID badge?

Yes. Use the epdi_paid_badge_text filter to change the text (e.g., to PAGADO, BEZAHLT, or anything else). For visual changes, override the CSS variant in your theme.

What if my order has multiple tax rates?

Each tax rate gets its own row in the totals section, labelled with the rate name (e.g., "VAT 20%", "GST 5%", "State Tax 8%"). The plugin uses $order->get_tax_totals() so this matches whatever WooCommerce shows elsewhere.

Can I generate a packing slip without an invoice?

Yes. Open any order, click Generate packing slip in the metabox. Or use the bulk action Generate packing slips (ZIP) on the order list. Packing slips don't auto-generate; they're created on demand.

Does it support custom fields on invoices?

Yes. Two ways:

  • Theme template override — copy the template into your theme and add custom field rendering directly. This is the recommended approach for stable customisations.
  • epdi_template_data filter — add data to the rendering context programmatically. The data becomes available in the template scope.
See Templates & Branding for the full override hierarchy.

Numbering

Will my invoice numbers reset when I deactivate the plugin?

No. By default, deactivation keeps the counter, all generated PDFs, settings, and order meta. Reactivate later and the counter picks up exactly where it left off.

To delete everything on uninstall, change Settings > Invoices > Advanced > Uninstall behaviour to Delete everything.

Can two orders ever get the same invoice number?

No. The number generator uses database row-level locking (SELECT ... FOR UPDATE inside a transaction) so two requests at the same moment can never read the same value. Hosts without transaction support fall back to optimistic compare-and-set with bounded retries.

If you've seen duplicate numbers from another plugin, this was the most likely cause. We solved it on day one.

Can I migrate from another plugin and keep my old invoice numbers?

Two options:

  • Continue the sequence. Set the start number to last_old_number + 1 in Settings > Invoices > Numbering. New orders get fresh numbers; old orders keep what they had in your old plugin.
  • Backfill old orders with their original numbers. Either via a one-time SQL migration or via the REST API. For complex migrations, contact support.

Can I use date placeholders in my number format?

Yes. {YYYY}, {YY}, {MM}, {DD} work in both prefix and suffix. Combined with annual reset, this produces year-scoped sequences like INV-2026-000001.

How do I reset the counter every year?

Settings > Invoices > Numbering > Annual reset toggle. When on, the counter resets to your start number on the first order of each calendar year. The reset is detected inside the same database lock so it never skips or duplicates at year-end.

Emails

Will the PDF attach to every WooCommerce email?

By default:

  • Customer Processing Order → Invoice
  • Customer Completed Order → Receipt
  • Customer Refunded Order → Credit Note
  • New Order (admin) → Invoice copy
You can disable any of these per email from Settings > Invoices > Emails, or change the attachment method (Attachment / Link / Both / None).

What if the email server strips attachments?

Switch to Attachment method: Link in settings. The email body gets a "Download your invoice" link instead. The link uses the order key for guest authentication, so customers can click it from the email without logging in.

Can I send the invoice as a download link only, with no attachment?

Yes. Settings > Invoices > Emails > Attachment method: Link. The PDF still gets generated lazily (only when the customer actually clicks the link).

Where does the download link appear in the email?

Settings > Invoices > Emails > Download link position has two options: Before order table or After order table. Default: After.

Customisation

Can I change the document template?

Yes. Four ways, in order of complexity:

  • Switch variant — Modern, Classic, Minimal, or Thermal from Settings > Invoices > Branding.
  • Adjust accent colour and footer text — also under Branding.
  • Theme template override — copy any template from easy-pdf-invoices-for-woocommerce/templates/ into your-theme/easy-pdf-invoices/. Theme overrides survive plugin updates.
  • Use filtersepdi_pdf_html, epdi_pdf_css, epdi_template_data, and others.
See Templates & Branding for the full guide.

Can I add my logo?

Yes. Settings > Invoices > Branding > Company logo opens the WordPress media library. Pick an image, save. Recommended size: 600×200 pixels at 72dpi.

Can I change the colour scheme?

Yes. Settings > Invoices > Branding > Accent colour uses the WordPress colour picker. The accent applies to the document title underline, grand total row, and PAID badge background.

Does it support RTL languages (Arabic, Hebrew)?

Not in the base plugin. The bundled DejaVu Sans font covers Latin, Cyrillic, and Greek. For Arabic, Hebrew, or CJK (Chinese, Japanese, Korean), install the upcoming companion plugin Easy PDF Invoices mPDF. It detects RTL or CJK content and swaps DOMPDF for mPDF with the appropriate fonts.

We made this a separate plugin to keep the core lightweight for the 95% of stores that don't need it.

Can I use my own PDF library instead of DOMPDF?

Yes. Implement \EasyPDFInvoices\PDF\GeneratorInterface and register your generator via the epdi_pdf_generator filter. The companion mPDF plugin uses this exact pattern.

Security and privacy

Does the plugin call home or send analytics?

No. The plugin does not collect telemetry, does not phone home, and does not load assets from any CDN. We make no automated calls to themology.com or anywhere else.

What data is stored?

  • Order meta (per order): invoice number, display number, document type, generated date, PDF file path, random hash.
  • PDF files: stored in wp-content/uploads/easy-pdf-invoices/{year}/{month}/. Filenames include a random hash to defeat URL guessing.
  • Settings (single option row): plugin configuration.
  • Counters (option rows): next invoice number, next credit note number.
No customer-facing tracking, no IP addresses (only hashed for rate limiting), no third-party servers.

Are downloads secure?

Yes. The download endpoint uses three-tier authorisation:

  • manage_woocommerce capability (admins always pass).
  • Order ownership for logged-in customers.
  • Order key match via hash_equals() for guests.
Plus path traversal protection (realpath() validation), random hash in filenames, and rate limiting (10 downloads per minute per identity).

Is the plugin GDPR compliant?

Yes:

  • No personal data sent to external services (the QR feature is off by default and only sends an order edit URL anyway).
  • Customer data on invoices is the same data WooCommerce already stores (billing address, items, totals).
  • PDF files can be deleted when an order is anonymised via WooCommerce's GDPR tools.
  • Hashed IPs only for rate limiting; raw IPs are never stored.
For specific GDPR documentation, see Compatibility.

Comparison with other plugins

How does it compare to WP Overnight PDF Invoices & Packing Slips?

WP Overnight (300K+ installs) is the market leader by install count, and it's a solid plugin. Where Easy PDF Invoices differs:

  • Smart Invoice/Receipt distinction with PAID badge — auto, no configuration. WP Overnight doesn't do this in the free version.
  • Credit notes for free — WP Overnight gates them behind the $54–99/year bundle.
  • 4 template variants for free — WP Overnight gates additional templates.
  • REST API for free — WP Overnight doesn't have one.
  • CSV export for free — WP Overnight doesn't have one.
  • WooCommerce Subscriptions compat for free — WP Overnight gates it.
  • Smaller plugin zip — under 5MB vs ~8MB.
If you're already happy with WP Overnight, there's no need to switch. If you're hitting their paywall and don't want to pay, Easy PDF Invoices is a free alternative with similar core functionality.

How does it compare to the more expensive paid options?

Several paid WooCommerce invoicing plugins charge $79+/year for a feature set Easy PDF Invoices ships free. Where it specifically differs:

  • Smart Invoice/Receipt distinction with PAID badge — the document adapts based on payment status without any configuration.
  • Database-locked sequential numbering — atomic increments that never duplicate, even under concurrent load.
  • Full HPOS compatibility — declared on before_woocommerce_init, with no legacy get_post_meta() calls on orders.
  • PHPStan level 8 — a higher static analysis bar than most paid plugins ship with.
  • Single PDF library — under 5MB on disk vs 50MB+ for some bundled alternatives.
  • Free forever — no premium tier, no upsell, no annual fee.
If you're switching from another WooCommerce invoicing plugin, both Easy PDF Invoices and most competitors store invoice numbers in WooCommerce order meta, so a migration script can transfer existing numbers cleanly. Contact support if you need help mapping the old plugin's meta keys to ours.

How does it compare to WebToffee PDF Invoices?

WebToffee (60K+ installs) has a solid free version, but premium ($59+/year) gates credit notes, paid stamps, drag-and-drop customisation, and date range printing.

Easy PDF Invoices includes all of the above (except drag-and-drop, which we deliberately skipped — PHP template overrides are more reliable). The plugin is also lighter, more secure (PHPStan level 8), and has no upsell.

How does it compare to Acowebs PDF Invoices?

Acowebs (1K+ installs, 5/5 rating from 19 reviews) is newer and well-rated but premium-gated for the same features as WebToffee.

Easy PDF Invoices ships everything for free with PHP 8.1+ and PHPStan level 8 — a higher static analysis bar than most paid alternatives.

Troubleshooting

"The PDF didn't attach to the email"

Check, in order:

  • The Settings > Invoices > Emails toggle for that email type is on.
  • The relevant WooCommerce email is enabled in WooCommerce > Settings > Emails.
  • The order generated a PDF — open the order edit screen and look at the Easy PDF Invoices metabox.
  • The WooCommerce log under WooCommerce > Status > Logs (source: easy-pdf-invoices) for any errors.

"The metabox isn't showing"

Make sure WooCommerce 8.0+ is active and the order is in a status that generates documents (not cancelled or failed). Try deactivating and reactivating the plugin.

"Customers can't download from My Account"

Check that the customer is logged in as the order owner. For guest orders, the email needs to include &key={order_key} in the download URL.

If clicking does nothing, check the browser developer tools Network tab. A 403 means authentication failed; a 429 means rate-limited; a 500 means server error (check the WooCommerce log).

"I changed branding but old PDFs still show the old logo"

Existing PDFs aren't regenerated automatically. Use the Regenerate button on individual orders or the Bulk regenerate action on the order list to refresh past orders.

"Numbering jumped to a wrong value after restoring a backup"

If you restored the database and the counter doesn't match the highest invoice number, the counter is now out of sync. Use the Manual override under Settings > Invoices > Numbering > Next number to set it explicitly. The override has a uniqueness check to prevent conflicts.

For more help, contact support.

Coming features

Things we're planning for v2.0:

  • E-invoicing formats (UBL, Peppol, ZUGFeRD) for EU compliance.
  • Visual template customizer (block-based) — keeping the PHP template override as the canonical mechanism for developers.
  • Delivery notes with custom fields.
  • QR code on invoices for payment verification.
These will all be in the free plugin. No premium tier.

Other questions?

Browse the rest of the documentation, or contact support if your question isn't covered.