Emboss - PDF Invoices and Packing Slips for WooCommerce
Free PDF invoices, receipts, packing slips, and credit notes for WooCommerce. Auto-attach to emails, smart Invoice/Receipt distinction, HPOS native, zero bloat.
- Auto-generates PDFs on order status change
- Smart Invoice/Receipt distinction (PAID badge)
- Sequential numbering with database locking
- Auto-attaches to WooCommerce order emails
- Customer downloads from My Account
- Credit notes for full or partial refunds
- Packing slips for fulfilment
- 4 template variants: Modern, Classic, Minimal, Thermal
- Theme template overrides
- Bulk download as ZIP
- Bulk regenerate and bulk email
- Backfill PDFs for past orders
- CSV export of invoice list
- REST API endpoints
- WooCommerce Subscriptions compatible
- WPML and Polylang compatible
- Multi-currency aware
- HPOS native
- Block Checkout compatible
- PHPStan level 8, zero errors
WooCommerce store owners shouldn’t have to pay $54–99/year for the basics: invoices that attach to order emails, receipts that say “PAID”, credit notes for refunds, and packing slips for fulfilment. Yet most options on the market either gate these features behind premium tiers or bundle bloat that slows your site down.
Emboss - PDF Invoices and Packing Slips for WooCommerce is the PDF invoicing plugin WooCommerce should have shipped natively. It generates clean, branded invoices, receipts, packing slips, and credit notes, attaches them to order emails, and works the moment you activate it. No premium tier, no upsell, no Freemius, no third-party tracking. Free forever on WordPress.org.
Available on WordPress.org#
Install Emboss - PDF Invoices and Packing Slips for WooCommerce directly from your WordPress dashboard → Plugins → Add New, then search for “Emboss - PDF Invoices and Packing Slips for WooCommerce” and click Install. Or download the latest .zip from WordPress.org and upload it from Plugins → Add New → Upload Plugin.
Free, forever — no Pro tier, no upsell modals, no third-party tracking.
Why store owners choose this plugin#
- Smart document type. Receipts show a PAID badge with payment date and method. Invoices show the amount due. Credit notes are auto-generated for refunds. The plugin reads
$order->is_paid()and labels the document correctly without you configuring anything. - Sequential numbering that doesn’t break. Tax-compliant numbering uses database row-level locking (
SELECT ... FOR UPDATE) so two orders placed at the same moment never share a number. Optimistic compare-and-set fallback for hosts without transaction support. - HPOS-native from day one. Built for WooCommerce’s High-Performance Order Storage. No legacy
get_post_meta()calls. NoWP_Queryonshop_orderpost type. - One PDF library, not three. Just DOMPDF (~2MB) and one bundled font (DejaVu Sans). The plugin zip is under 5MB. Some bundled invoicing plugins ship at over 50MB on disk.
- Zero-config defaults. Activate it. Add a logo. You’re done. Every setting is optional.
- Native WooCommerce settings. Settings tab lives under WooCommerce > Settings > Invoices, uses SelectWoo dropdowns, the WP color picker, and the WordPress media library.
Who is this for?#
- Small to medium WooCommerce stores (10–500 orders/month) that want invoices that just work without touching code.
- Stores with tax-compliance requirements that need sequential numbering, prefix/suffix formats, and annual reset support.
- Agencies and developers setting up stores for clients who need a reliable, free, maintained invoicing solution they can recommend.
- Stores migrating from older or unmaintained invoicing plugins that want a modern replacement with proper HPOS support and active maintenance.
- Enterprise stores moving from Stripe Invoicing that need professional documents, bulk operations, and CSV export for accountants.
What you get out of the box#
4 document types#
- Invoice for orders awaiting payment. Shows amount due, payment terms, and your company details.
- Receipt for completed orders. Includes a PAID badge with the payment date and method (e.g., “PAID on March 15, 2026 via Stripe”).
- Credit note for full or partial refunds. References the original invoice number and shows the refund total.
- Packing slip for fulfilment. No prices, no tax, just product names, SKUs, quantities, and the ship-to address. Optional QR code for warehouse scanning.
Smart document resolution#
The plugin reads order status and decides what to render:
| Order status | Document |
|---|---|
| Pending / On hold | Invoice (amount due) |
| Processing | Invoice (payment confirmed but not fulfilled) |
| Completed | Receipt (PAID badge) |
| Refunded | Credit note (REFUNDED badge) |
| Partial refund | Receipt with refund line item |
| Failed / Cancelled | No document generated |
You can override this mapping in settings if your business logic differs.
4 template variants, all included#
Most paid competitors charge $54–99/year for additional templates. We ship four free.
- Modern — Stripe-inspired clean layout. The default.
- Classic — Formal serif (Times-Roman), centred title, headed-paper feel.
- Minimal — Accountant-friendly, monospace numbers, hairline rules, single-line top header.
- Thermal — 80mm POS receipt printer layout. Single column, monospace, compact spacing. Works for in-store retail receipts, kitchen tickets, pickup slips, and slap-and-ship labels.
Switch variants from the Branding tab. Override any variant in your theme at your-theme/easy-pdf-invoices/{variant}/{template}.php.
Auto-attach to WooCommerce emails#
The plugin attaches the right document to the right email automatically:
- Customer Processing Order → Invoice
- Customer Completed Order → Receipt
- Customer Refunded Order → Credit note
- New Order (admin) → Invoice copy
Per-email toggles let you disable any of these. Choose between PDF attachment, download link in the email body, both, or neither. Position the link before or after the order table.
Customer downloads#
A “Download invoice” / “Download receipt” / “Download credit note” button appears on three customer-facing surfaces:
- My Account > Orders with the label adapted to the document type.
- Order received (Thank You) page for both logged-in customers and guests.
- Email body as an optional download link beside the order table.
Guest authentication uses the WooCommerce order key. Rate limiting blocks abuse (10 downloads per minute per identity, IP-hashed for privacy).
Sequential numbering done right#
- Atomic increment via
SELECT ... FOR UPDATEinside a transaction. Optimistic compare-and-set fallback for non-transactional engines. - Configurable format: prefix, suffix, padding digits, start number.
- Date placeholders in prefix and suffix:
{YYYY},{YY},{MM},{DD}. Example:INV-2026-000042. - Annual reset support, with year-change detection inside the same lock so the counter never skips or duplicates at year-end.
- Separate sequences for invoices and credit notes.
- Manual override with a confirmation dialog if you ever need to set the next number explicitly.
- Live preview of the format in settings.
Admin tools#
- Invoice number column on the WooCommerce orders list (HPOS and legacy). Shows display number plus type label.
- Quick “Download PDF” icon in the order row actions next to View / Complete.
- Order edit metabox with document type, number, generation date, file size, and Download / Regenerate / Email customer buttons.
- Bulk actions on the order list:
- Regenerate PDFs (inline up to 50 orders, Action Scheduler offload above).
- Download PDFs (ZIP) with on-the-fly ZIP creation, capped at 200 orders to avoid memory issues.
- Email invoices to customers using WooCommerce’s native customer-invoice email.
- Backfill tool under Settings > Invoices > Advanced. Generate PDFs for past orders within a date range. Queues each order via Action Scheduler.
- CSV export of the invoice list with date range filter. UTF-8 BOM for Excel compatibility.
REST API for headless and integrations#
Three endpoints under /wp-json/epdi/v1/documents/:
GET /documents/{order_id}— invoice metadata.GET /documents/{order_id}/pdf— download the PDF binary.POST /documents/{order_id}/regenerate— force regeneration.
Permission: manage_woocommerce capability. Disabled by default — enable it from Settings > Invoices > Advanced when you need it.
WooCommerce ecosystem compatibility#
- HPOS native. Declares
custom_order_tablescompatibility. Uses WooCommerce CRUD methods exclusively. - Block Checkout. Declares
cart_checkout_blockscompatibility. - WooCommerce Subscriptions. Strips inherited PDF meta from renewal orders so each renewal earns a fresh invoice number.
- WPML and Polylang. Switches locale via
switch_to_locale()based on order language meta. Restores after generation. - Multi-currency. Templates render each order in its own currency through
wc_price(). Works with WOOCS, WPML, Aelia, and any plugin that sets order currency correctly. - Action Scheduler. Used for bulk operations above 50 orders. Bundled with WooCommerce, not duplicated.
Privacy and security#
- No telemetry. No phone-home. No tracking pixels. No CDN loads.
- One optional external service, disabled by default: QR codes on packing slips. When enabled, the QR Server API generates the image and the result is cached locally for 12 hours. Disable it and no external calls happen.
- Locked-down PDF engine. DOMPDF runs with
isRemoteEnabled=false,isPhpEnabled=false,isJavascriptEnabled=false, chroot toABSPATH. - Path traversal protection on every download via
realpath()validation. - Capability + nonce + sanitised input on every admin action and every REST endpoint.
- Random hash filenames prevent URL guessing. Storage directory protected with
.htaccess,web.config, andindex.php.
Built for the long term#
- PHP 8.1+ with strict types on every file.
- PHPStan level 8 with zero errors.
- WordPress Coding Standards with zero errors across 52 files.
- WordPress Plugin Check with zero errors.
composer auditwith no security advisories.- GPL v2+ licensed.
How it compares#
| Feature | Emboss - PDF Invoices and Packing Slips for WooCommerce | WP Overnight | WebToffee | Andrew Benbow |
|---|---|---|---|---|
| Price | Free forever | Free + $54–99/yr | Free + Premium | $79/yr |
| Smart Invoice/Receipt | Yes (auto) | No | No | No |
| PAID badge on receipts | Yes | No (free) | Premium | No |
| Credit notes | Free | Premium | Premium | No |
| Packing slips | Free | Free | Free | No |
| 4 template variants | Free | $54–99/yr | Premium | No |
| Sequential numbering with DB lock | Yes | Unknown | Unknown | Unknown |
| Single PDF library | DOMPDF only | DOMPDF | DOMPDF | 3 libraries |
| Plugin zip size | < 5 MB | ~8 MB | ~12 MB | ~60 MB |
| HPOS native | Yes (100%) | Yes | Yes | Partial |
| PHP 8.1+ strict types | Yes | No | No | No |
| REST API | Free | No | No | No |
| CSV export | Free | No | Premium | No |
| Subscriptions compat | Free | Premium | Premium | Partial |
| PHPStan level 8 ready | Yes | Unknown | Unknown | Unknown |
| Active development | Yes | Yes | Yes | Slow |
Frequently asked questions#
Is this plugin really free?#
Yes. Free forever, GPL v2+, no premium tier, no Freemius, no upsell. We make money on other premium plugins; this one stays free because PDF invoicing is a core need every WooCommerce store has.
Does it work with HPOS?#
Yes. The plugin declares full compatibility with WooCommerce’s High-Performance Order Storage and uses WooCommerce CRUD methods exclusively. No legacy get_post_meta() calls. Tested with HPOS enabled and disabled.
Does it work with the new Block Checkout?#
Yes. The plugin declares compatibility with the cart and checkout blocks. No additional configuration needed.
Can I customise the template?#
Yes. Switch between Modern, Classic, Minimal, and Thermal variants from the Branding tab. To go further, copy any template from easy-pdf-invoices-for-woocommerce/templates/ into your-theme/easy-pdf-invoices/ and edit it. Theme overrides survive plugin updates.
Does the PAID badge appear on every order?#
The PAID badge appears only on receipts (orders that have transitioned to a paid status). Invoices for unpaid orders show the amount due instead. Credit notes show a REFUNDED badge.
What happens to my numbers if I deactivate the plugin?#
Numbering, generated PDFs, and order meta are kept by default. Settings > Invoices > Advanced lets you choose “delete everything” if you’d prefer a clean uninstall.
Does it support RTL or CJK languages?#
The base plugin includes DejaVu Sans, which covers Latin, Cyrillic, and Greek scripts. For Arabic, Hebrew, and CJK, install the upcoming companion plugin “Emboss mPDF”, which swaps in mPDF and the appropriate fonts only when needed. We keep the main plugin lightweight for the 95% of stores that don’t need RTL or CJK.
Does it work with WooCommerce Subscriptions?#
Yes. Each renewal order earns a fresh invoice number — the plugin strips inherited PDF meta so renewals don’t reuse the original order’s number.
What about WPML and Polylang?#
The plugin switches locale based on each order’s language meta during PDF generation, then restores afterwards. Templates and labels render in the customer’s language.
Is there a setup wizard?#
Yes. After activation, a three-step wizard takes you from zero to working invoices in under 60 seconds: upload a logo, confirm company details (pre-filled from WooCommerce), add VAT number. Skip any step. The wizard is dismissible and never returns once dismissed.
Can I generate invoices for past orders?#
Yes. Settings > Invoices > Advanced has a Backfill tool. Pick a date range and click run. The plugin queues each order via Action Scheduler so large batches don’t time out.
Does it bundle three PDF libraries like the competition?#
No. One library: DOMPDF 3.x. One font: DejaVu Sans. The plugin zip is under 5MB. We made this a hard design constraint because some bundled invoicing plugins ship at 50MB or more, and most stores never use the extra libraries.
Emboss is live on WordPress.org. Install it from your WordPress dashboard and you’re set. Follow us on X and LinkedIn for release notes and tips.