WooCommerce PDF Invoices, Packing Slips, and Shipping Labels: The Plugin Stack That Actually Works
WooCommerce ships without PDF invoices, packing slips, or label generation out of the box. That gap affects every order you ship. This guide covers the four plugins that actually handle these documents reliably in 2026 – WPO Invoices, the WooCommerce PDF Invoices plugin by Bas Elbers, YITH PDF Invoices, and ShipStation – including GST/VAT template support, bulk export, and how to build a complete document stack without plugins fighting each other.
What WooCommerce Does Not Include By Default
A fresh WooCommerce installation sends email order confirmations but does not generate PDF documents. No invoice with a sequential invoice number, no packing slip for the warehouse, no carrier-formatted shipping label. For stores processing more than a few orders per week, manual document creation is not sustainable.
Three document types matter most: invoices (sent to the buyer for accounting), packing slips (inside the box for the recipient), and shipping labels (carrier-formatted barcode labels). A fourth type – delivery notes – sits between invoices and packing slips and is often required by EU regulations or enterprise buyers.
WPO Invoices and Packing Slips: The Most-Used Option
WooCommerce PDF Invoices and Packing Slips by WP Overnight (WPO) is the most widely installed solution, with over 300,000 active installs at the time of writing. It generates PDF invoices and packing slips automatically on order completion and attaches them to the WooCommerce order email.
The free version covers most needs: automatic PDF attachment, customizable templates, sequential invoice numbering, and bulk PDF export from the Orders screen. The Pro version adds credit notes, proforma invoices, and delivery notes. For stores that need EU-compliant invoice numbering with no gaps in the sequence, the Pro sequential numbering system handles edge cases around order cancellations and refunds correctly.
- PDF automatically attached to order confirmation email
- Sequential invoice numbers with configurable prefix and starting number
- Template customization via PHP template overrides or built-in editor
- Bulk PDF export and bulk email from Orders admin screen
- GST/VAT field display with configurable tax detail level
- Support for variable products, fees, and shipping line items on invoice
GST and VAT Template Configuration
WPO Invoices supports multiple tax display modes: combined tax column, tax per line item, or a tax summary at the bottom of the invoice. For Indian GST compliance, the most common setup shows CGST and SGST as separate columns. This requires a template override to split the tax rows – the default template uses a single Tax column. The WPO documentation includes a code example for the split-tax template. For stores requiring GST Invoice Number format (financial year prefix), the sequential number format field accepts custom strings.
WooCommerce PDF Invoices by Bas Elbers: A Lighter Alternative
The WooCommerce PDF Invoices plugin by Bas Elbers is a lighter, more opinionated option. It uses a Bootstrap-based template system that is easier to customize via HTML/CSS without PHP knowledge. The plugin attaches PDFs to WooCommerce emails and supports a basic invoice numbering system.
The key difference from WPO: this plugin has no packing slip functionality in the core version. It is an invoice-only plugin. Stores that need both invoice and packing slip generation should use WPO Invoices or YITH instead. The plugin’s template flexibility makes it a good choice for stores with designer-built invoice layouts that need pixel-accurate PDF output.
YITH PDF Invoices and Packing Slips: When You Need More Control
YITH PDF Invoices and Packing Slips has a more polished admin interface and a premium tier that adds features WPO only covers in its Pro version. The free version generates invoices and packing slips, supports manual generation from the order screen, and includes a basic template editor.
The premium version adds delivery notes, receipt documents, credit notes, document numbering policies, and the ability to send documents on specific order statuses (not just completion). For stores where the packing team needs a warehouse-specific packing slip that differs from the customer-facing invoice, YITH’s document type separation and per-document template assignment is the cleanest solution.
YITH vs WPO: Decision Criteria
| Need | WPO Invoices | YITH PDF |
|---|---|---|
| Free invoice + packing slip | Yes | Yes |
| Credit notes (free) | No | No |
| Delivery notes | Pro only | Premium only |
| Template editor (no-code) | Basic | More polished |
| Per-status document triggers | Pro only | Premium only |
| Active install base | 300,000+ | 70,000+ |
Shipping Labels: Where PDF Invoice Plugins Stop
None of the three PDF invoice plugins above generate carrier-formatted shipping labels. A PDF invoice is an accounting document. A shipping label is a carrier-formatted barcode document that needs to match the exact specifications of UPS, FedEx, USPS, DHL, or your regional carrier. These are fundamentally different document types.
For shipping label generation, WooCommerce stores use one of three paths: a carrier-specific plugin (WooCommerce Shipping for USPS, FedEx, etc.), a multi-carrier shipping platform like ShipStation, or a print-on-demand label plugin like Shippo or EasyPost.
ShipStation Integration With WooCommerce
ShipStation connects to WooCommerce via a native integration that imports orders automatically. Once imported, labels are generated inside the ShipStation dashboard (not WordPress), with rate shopping across all connected carriers. Labels are printed to a thermal or laser printer; ShipStation pushes tracking numbers back to WooCommerce automatically.
The ShipStation approach means labels never touch WordPress at all – they are generated in ShipStation’s web app or desktop client. For high-volume stores (50+ shipments per day), this separation is preferable because label printing does not add load to the WordPress server. For small stores, the additional ShipStation cost ($9-$229/month depending on tier) may be unnecessary if a single carrier plugin covers the use case.
Building an efficient WooCommerce order process goes beyond documents. If your store offers services alongside products, see how to add package pricing to WooCommerce service products to structure your offerings alongside your fulfillment workflow.
Bulk Export: Getting All Documents Out of WooCommerce
Both WPO Invoices and YITH support bulk PDF export from the WooCommerce Orders screen. The process: filter orders by date range or status, select all, choose the bulk action (Generate PDF or Download PDF), and the plugin creates a merged PDF or individual files depending on configuration.
For accounting integration, both plugins support exporting invoice data to CSV. WPO Invoices has a direct integration with accounting software via its Pro extension. YITH integrates with YITH’s own accounting module. Neither integrates natively with QuickBooks or Xero without a third-party connector like WooCommerce QuickBooks Online or Zapier.
For stores handling large order volumes, bulk export performance matters. WPO generates PDFs on-the-fly using DOMPDF; bulk exports of 500+ orders can time out on shared hosting. The solution is either to raise the PHP time limit for the export action or use the regenerate queue feature in WPO Pro, which generates PDFs asynchronously.
EU Compliance: What Your Invoice Must Include
EU VAT invoices require specific fields: sequential invoice number, invoice date, supplier name and address, VAT registration number, customer name and address, description of goods or services, quantity, unit price, VAT rate per line, and total VAT amount. All three invoice plugins support these fields, but the level of configuration required varies.
WPO Invoices has the most documentation on EU compliance and handles most requirements in the free version. YITH requires the premium version for delivery note documents that some EU member states require alongside invoices for physical goods. The Bas Elbers plugin requires template customization to display all mandatory EU fields correctly.
For stores also managing customer loyalty and repeat purchases alongside their invoicing setup, the guide on WooCommerce rewards and loyalty plugins covers how to build a complete post-purchase system.
Recommended Stack by Store Type
- Small store, EU-based: WPO Invoices (free). Covers the mandatory EU fields, widely supported, large community.
- Small store, India-based, GST required: WPO Invoices (free) with CGST/SGST template override.
- Medium store needing credit notes and delivery notes: WPO Invoices Pro or YITH Premium.
- Designer-controlled invoice layout: Bas Elbers plugin with custom Bootstrap template.
- High-volume physical goods, multi-carrier: WPO Invoices (invoices/packing slips) plus ShipStation (labels).
- Enterprise, accounting integration: YITH Premium with their accounting module, or WPO Pro with QuickBooks connector.
Common Setup Mistakes to Avoid
Three mistakes appear repeatedly in WooCommerce invoice plugin support threads:
First: running two invoice plugins simultaneously. WPO Invoices and YITH will both try to attach PDFs to the same order email, resulting in duplicate documents. Choose one and uninstall the other.
Second: not testing PDF output at high zoom levels. Logos and QR codes that look fine at 100% can pixelate badly when printed. Upload vector logos (SVG or high-res PNG at 300+ DPI) to the invoice template settings.
Third: forgetting to regenerate historical invoices after changing the template. WPO and YITH both store generated PDFs. Template changes only affect new orders unless you manually regenerate existing invoices via the bulk action.
PDF Engine Comparison: DOMPDF vs mPDF vs wkhtmltopdf
WooCommerce PDF invoice plugins use different PDF rendering engines, and the choice of engine directly affects template fidelity, performance, and memory usage. Understanding which engine your chosen plugin uses helps set the right expectations for PDF output quality.
DOMPDF is the most common engine and is used by WPO Invoices. It renders HTML and CSS to PDF in pure PHP with no external binary required. DOMPDF handles most invoice layouts correctly but has known limitations: it does not support CSS Grid or Flexbox layouts, it struggles with complex multi-column table styling, and it cannot render web fonts loaded from external URLs. For invoice templates using DOMPDF, stick to table-based layouts, use system fonts or embed fonts via base64, and avoid modern CSS layout properties. DOMPDF’s memory usage on a standard invoice is 8-15MB per document – acceptable for single-invoice generation but a concern for bulk exports of 200+ invoices on shared hosting.
mPDF is used by some invoice plugins as an alternative. It has better support for right-to-left languages (Arabic, Hebrew), better multi-column layout handling, and better performance on complex tables. If your store operates in RTL markets or your invoice template uses complex styling, mPDF produces more predictable output. The tradeoff is a larger library footprint than DOMPDF.
wkhtmltopdf is a binary-based renderer used by premium invoice solutions. It renders using a full WebKit engine, which means it supports modern CSS including Flexbox, Grid, and external webfonts. The output quality is the closest to what the template looks like in a browser. The limitation: it requires a system binary installed on the server, which shared hosting environments typically do not allow. wkhtmltopdf is practical on VPS and dedicated hosting but requires server-level access to configure. If your invoices require design-accurate output and you are on a managed VPS, wkhtmltopdf via a wrapper plugin produces the best results.
| Engine | Used By | CSS Grid/Flex | RTL Support | Server Requirement | Memory per PDF |
|---|---|---|---|---|---|
| DOMPDF | WPO Invoices | No | Partial | PHP only | 8-15MB |
| mPDF | Various | Partial | Yes | PHP only | 12-20MB |
| wkhtmltopdf | Premium solutions | Yes | Yes | Binary required | 50-80MB |
Getting Your Document Stack Running
For most WooCommerce stores, WPO Invoices (free) is the right starting point. Install it, configure your company details and logo, set your invoice number start point, and test with a staging order. The bulk export and automatic email attachment work without additional configuration.
Add packing slips to the same plugin – it is built in. For shipping labels, add ShipStation or a carrier plugin only when order volume justifies the additional complexity. Keep the stack at two plugins maximum: one for accounting documents, one for carrier labels. Running three or more document plugins creates conflicts that are hard to debug.
Automating Invoice Generation for High-Volume Stores
For stores processing 500+ orders per month, manual invoice regeneration or per-order PDF creation adds up. WPO Invoices handles this through background PDF generation: when an order is completed, the PDF is generated and cached server-side. Subsequent requests for that invoice retrieve the cached file rather than regenerating it, which prevents server load spikes during peak periods.
Stores on shared hosting should test bulk PDF export performance before relying on it. The DOMPDF library used by WPO Invoices is memory-intensive – generating 100 PDFs simultaneously can exhaust the PHP memory limit on plans under 256MB. The solution: upgrade to a managed host with configurable PHP settings, or use WPO Pro’s async regeneration queue which processes PDFs in batches of 10-20 in the background.
Tax Number and Company Fields on WooCommerce Invoices
B2B WooCommerce stores need buyer tax number (VAT number, GSTIN, ABN) on invoices. None of the three invoice plugins add a tax ID checkout field by default – you need to add it via a checkout customization plugin or custom code, then display the saved value on the invoice template. WooCommerce EU VAT Number plugin adds a EU VAT field and passes it to order meta; WPO Invoices can display any order meta field on the invoice template with a simple PHP override.
For stores selling services with recurring billing, integrating invoice generation with WooCommerce Subscriptions requires the Pro version of WPO Invoices, which adds renewal invoice support. Each subscription renewal generates a new invoice with a sequential number, attached to the renewal order email automatically. This is the complete invoice stack for service-based businesses running subscriptions through WooCommerce. For a full picture of how service product pricing structures work alongside invoice generation, see the guide on adding package pricing to WooCommerce service products.
Invoice Numbering Compliance and Audit Trails
Sequential invoice numbering without gaps is a legal requirement in many jurisdictions. The EU and India both require that invoice numbers be sequential with no missing numbers in the series. WPO Invoices Pro enforces this: when an order is cancelled or refunded, it generates a credit note with its own sequential number rather than deleting or reusing the original invoice number. The audit trail remains intact.
The starting invoice number matters for stores migrating from another system. WPO Invoices allows you to set any starting number in the settings – set it to the number after your last invoice from the previous system to maintain a continuous sequence. Both WPO and YITH also support annual invoice number resets (reset to 1 each January) with the year embedded in the number format, which is required in some European countries.
For accurate record-keeping alongside invoice generation, pairing with a solid customer retention system ensures your invoicing and customer communication stay aligned. See how automating service delivery emails after payment creates a complete post-order communication sequence that complements your invoice workflow.
WooCommerce HPOS Compatibility for PDF Invoice Plugins
WooCommerce’s High-Performance Order Storage (HPOS), enabled by default from WooCommerce 8.2 onward, moves order data from the wp_posts and wp_postmeta tables to dedicated order tables (wc_orders, wc_orders_meta). PDF invoice plugins that query order data must use WooCommerce’s CRUD methods rather than direct database queries or get_post_meta() calls to remain compatible.
WPO Invoices has declared HPOS compatibility in its plugin header as of version 3.7.x and uses WooCommerce’s wc_get_order() function throughout. YITH PDF Invoices declared compatibility in its 4.x release series. The Bas Elbers plugin’s HPOS status has been less clearly communicated – check the changelog for the explicit HPOS compatibility declaration before using it on a store with HPOS enabled.
To check whether HPOS is active on your store: go to WooCommerce – Settings – Advanced – Features and look for the High-Performance Order Storage toggle. If it is enabled and your invoice plugin does not declare compatibility, invoices may generate successfully but fail to attach to emails because the plugin cannot retrieve the order object. The symptom is order completion emails sent without the PDF attachment. Disabling HPOS (if the rest of your plugin stack does not require it) is the fastest workaround while the plugin updates; migrating to a compatible plugin is the correct long-term fix.
The HPOS compatibility question extends beyond PDF generation to the bulk export feature. Bulk exports that build a list of order IDs by querying wp_posts directly will not return orders stored in the HPOS tables. The result: bulk PDF exports silently omit HPOS-stored orders, which means the export appears to succeed but is missing orders from the date range. This is a particularly difficult bug to catch because there is no error – the export simply contains fewer PDFs than expected. Verify PDF count against WooCommerce order count for the same date range before relying on bulk exports for accounting purposes.
Customizing the Packing Slip for Warehouse Operations
The default WPO packing slip template includes the customer name, shipping address, ordered items, and quantities. For warehouse operations with more than a few daily orders, additional information improves pick-and-pack efficiency. Common additions: SKU numbers (for stores that do not use human-readable product names in inventory), bin locations (for multi-shelf warehouses), and a barcode of the order number (for scanner-based fulfillment systems).
WPO Invoices supports these additions via template overrides. Copy the default packing slip template from the plugin’s templates folder to your theme’s woocommerce/pdf directory and modify it. The SKU is available via $item->get_product()->get_sku() on each line item. Barcodes require a PHP barcode library (Picqer’s php-barcode-generator works well in this context) added as a Composer dependency, then called from the template override. The barcode renders as an inline SVG in the PDF, which DOMPDF handles without font embedding issues.
For stores where the packing slip is printed alongside a carrier shipping label in the same print job, aligning the packing slip page size with your label printer’s output size (typically 4×6 inches for thermal label printers) prevents manual cutting and resizing. Set the page size in the WPO Invoices settings to match your printer’s format. The A4 default wastes paper on thermal label printers and requires the warehouse team to cut each sheet.
Choosing Between On-Demand and Pre-Generated PDFs
WPO Invoices and YITH both offer two modes: generate PDFs on demand (when the customer or admin requests them) or pre-generate and cache them at order completion. The right choice depends on order volume and server resources. On-demand generation reduces storage use and ensures the PDF always reflects the current order state – useful if you frequently update orders after completion. Pre-generated PDFs reduce server load at peak periods and make bulk export faster, since the files already exist on disk. Stores with Cloudways or other managed hosts where disk is cheap and PHP time limits are configurable benefit from pre-generation. Stores on shared hosting with limited disk quotas should use on-demand generation to avoid filling their allocation with cached PDFs. Configure the mode in WPO Invoices under Documents settings for each document type independently – invoices and packing slips can use different modes based on their respective usage patterns.