# PDF Invoice and Packing Slip for WooCommerce

Generate professional PDF invoices and packing slips for every WooCommerce order — automatically, in bulk, or on demand.

WooCommerce 4.5+ WordPress 4.8+ HPOS Compatible PHP 7.1+

## Quick Start

Get your first invoice generated in under a minute.

1. Install and activate the plugin. WooCommerce must already be active — the plugin will not load without it.
2. Go to WPWing → Invoice Settings in the WordPress admin menu.
3. Open the Template tab. Upload your company logo and fill in your company name, address, and VAT/Tax ID.
4. Open the General tab. Under Auto-generate invoice on status, tick the order statuses that should trigger automatic invoice creation — for example Processing.
5. Open any existing order. The PDF Invoice by WPWing metabox appears in the right sidebar. Click Create next to Invoice.
6. Click View to confirm the PDF renders correctly. Done.

Auto-generation is optional. You can always create invoices manually from the order page or in bulk from the Orders list — auto-generation is a convenience, not a requirement.

## General Settings

Found at WPWing → Invoice Settings → General tab.

Setting | Default | Description
--- | --- | ---
Next invoice number | 1 | The serial number assigned to the next invoice. Increase this if you are migrating from another plugin or need to align with an external accounting system.
Invoice number format | `{number}` | Tokens: `{number}` = serial, `{year}` = 4-digit year, `{month}` = 2-digit month, `{day}` = 2-digit day. Example: `INV-{number}/{year}` produces `INV-42/2026`.
Invoice date format | `d/m/Y` | Any valid PHP date format string. This controls how the date appears on the invoice itself.
Invoice due date (days) | 0 | Number of days after the order creation date before payment is due. Leave at `0` to hide the field. When set to any positive number, a "Payment due date" row appears on every invoice automatically.
Reset invoice number yearly | Off | When on, the serial counter resets to 1 on January 1 each year. Useful for compliance in some countries.
PDF button behaviour | Download PDF | Download PDF triggers a browser file download. Open in Browser renders the PDF inline in a new tab.
Paper size | A4 | Sets the physical page dimensions of every generated PDF. Choose A4 (210 × 297 mm) or Letter (216 × 279 mm).
Disable invoice for free orders | Off | When on, invoices are never created for orders with a zero grand total. Applies to both manual and automatic creation.
Auto-generate invoice on status | None | Tick the order statuses that should trigger automatic invoice creation (e.g. Processing, Completed). An invoice is created only once per order — subsequent status changes to a ticked status are ignored.
Auto-generate packing slip on status | None | Same as above but for packing slips.
Attach invoice PDF to emails | None | The invoice PDF is attached to the selected WooCommerce transactional emails. If no invoice exists yet it is automatically generated at send time. Options: Processing Order, Completed Order, Customer Invoice / Order Details, Order On-Hold.

## Template Settings

Found at WPWing → Invoice Settings → Template tab. Click Preview Invoice at any time to see how your current (unsaved) choices will look — the preview uses your most recent order.

Setting | Default | Description
--- | --- | ---
Invoice template | Default | Choose between Default (clean white layout) and Modern (dark navy accents). Both templates are print-ready.
Packing slip template | Default | Same choice applied independently to packing slips.
Show company name | Off | Displays your company name in the invoice header. Reveals the Company name text field when enabled.
Show company logo | Off | Displays an image in the top-right of the invoice header. Use the Upload Logo button to choose from the Media Library. Recommended size: no wider than 200 px and no taller than 100 px.
Show company details | Off | Reveals address, city, ZIP, country, phone, email, and VAT/Tax ID fields. Leave any field blank to omit it from the invoice.
Show notes | Off | Adds a shaded notes box to every invoice — useful for payment terms, bank details, or a thank-you message.
Show footer | Off | Adds a footer line at the bottom of every invoice page.
Show shipping address | Off | Prints the shipping address alongside the billing address when the two differ.
Show product SKU | Off | Adds a SKU column to the product line-items table.
Show customer order note | Off | Prints the note the customer entered at checkout in a shaded box below the product table.
Show tax breakdown | On | When on, each tax class (e.g. GST 10%, PST 7%) appears as its own row in the invoice totals. When off, a single combined Tax row is shown instead.

## Invoice

An invoice is a legally-numbered document recording the sale. It contains your company details, the customer's billing address, a product line-items table with quantities and prices, tax and discount lines, and the order total.

### Creating an invoice

Open any order in WooCommerce. In the PDF Invoice by WPWing metabox on the right, click Create next to Invoice. The PDF is generated immediately and stored in the uploads folder.

### Viewing and downloading

Once an invoice exists, click View in the metabox. Whether it downloads or opens inline depends on the PDF button behaviour setting.

### Previewing as HTML

Click the small code icon next to the View button to open the invoice or packing slip as a plain HTML page in a new tab. This lets you check the layout instantly without generating a PDF - useful when fine-tuning a custom template.

### Cancelling an invoice

Click Cancel (red button) in the metabox. This deletes the stored PDF and removes the invoice metadata from the order. The order itself is not affected — only the invoice document is removed. You can create a new invoice for the same order afterwards.

Invoice numbers are permanent. Once an invoice number is assigned it will not be reused, even if the invoice is cancelled. This ensures your invoice sequence has no gaps that could raise questions during an audit.

## Packing Slip

A packing slip is an internal fulfilment document. It lists the items in the order and the shipping address — no prices, taxes, or totals. It is intended to travel with the shipment so the recipient can verify the contents.

### Creating, viewing, and cancelling

The workflow is identical to invoices: use the Create, View, and Cancel buttons in the PDF Invoice by WPWing metabox, in the Packing Slip row.

Packing slips use the order number, not the invoice number. If you cancel and recreate a packing slip, the same order number is reused. Packing slips are not subject to the same sequential-numbering rules as invoices.

## Auto-Generation

When an order transitions to a status you have ticked in the General Settings, the plugin automatically creates the corresponding document — no manual action required.

### How it works

- The check fires on the `woocommerce_order_status_changed` action.
- If an invoice (or packing slip) already exists for the order, a new one is not created — auto-generation is idempotent.
- If Disable invoice for free orders is on, free orders are skipped even if the status matches.
- Auto-generation and email attachment can both be active at the same time. Only one invoice is ever created per order regardless of how many triggers fire.

Recommended status: Processing. Most stores choose Processing as the trigger because it fires as soon as payment is confirmed, giving the customer an invoice at the earliest possible moment.

## Email Attachments

The plugin can attach the invoice PDF automatically to outgoing WooCommerce transactional emails. Enable this under Attach invoice PDF to emails in the General tab.

Email | Sent when
--- | ---
Processing Order | Order status changes to Processing (payment confirmed)
Completed Order | Order status changes to Completed
Customer Invoice / Order Details | Manually sent from the order edit page, or triggered by a status change for certain payment gateways
Order On-Hold | Order status changes to On-Hold (e.g. bank transfer awaiting payment)

No invoice yet? If the order does not have an invoice at the time the email is sent, the plugin creates one automatically before attaching it. The invoice number and date will reflect the moment of generation.

## Invoice Numbers

Invoice numbers follow a configurable format using tokens. You set the format under Invoice number format in the General tab.

### Available tokens

Token | Replaced with | Example
--- | --- | ---
`{number}` | Sequential serial number | `42`
`{year}` | 4-digit year of invoice date | `2026`
`{month}` | 2-digit month of invoice date | `06`
`{day}` | 2-digit day of invoice date | `15`

### Format examples

Format string | Result (invoice 42, June 2026)
--- | ---
`{number}` | `42`
`INV-{number}` | `INV-42`
`{year}-{number}` | `2026-42`
`INV-{number}/{year}{month}` | `INV-42/202606`
`{year}/{month}/{number}` | `2026/06/42`

Concurrent safety. Invoice numbers are assigned using a MySQL advisory lock (`GET_LOCK`) so two simultaneous orders can never receive the same number, even on busy stores.

## Bulk Actions

You can generate invoices or packing slips for many orders at once from the WooCommerce → Orders list — useful when migrating from another plugin or backfilling documents for existing orders.

1. Go to WooCommerce → Orders.
2. Select the orders you want to process using the checkboxes on the left.
3. Open the Bulk actions dropdown and choose Generate Invoices or Generate Packing Slips.
4. Click Apply. A summary notice will tell you how many documents were created and how many were skipped (because a document already existed).

50-order limit per run. To prevent timeouts, each bulk action processes a maximum of 50 orders at a time. If you selected more, run the action again — orders that already have a document are automatically skipped, so repeated runs are safe.

## Customer Account

Customers can download their own invoices directly from their account, without needing to contact you.

### Where the link appears

An Invoice button appears in the order actions column of the My Account → Orders table — but only for orders that already have an invoice. If no invoice has been generated yet, no button is shown.

### Access control

Customers can only view invoices for their own orders. Attempting to access another customer's invoice URL will fail the ownership check. The PDF button behaviour setting (download vs. open) applies to customer downloads too.

## FAQ

Does the plugin work with WooCommerce HPOS (High-Performance Order Storage)?

Yes. The plugin is fully compatible with HPOS. All document metadata is stored using WooCommerce's order meta API, so it works correctly whether orders are stored in the traditional `wp_posts` table or in the newer HPOS custom tables. Bulk actions and the invoice status column on the Orders list work on both screens.

Can I customise the invoice template?

Yes. Copy the template folder from `wp-content/plugins/wpwing-pdf-invoice-packing-slip-for-woocommerce/templates/{template-name}/` into your theme at `wp-content/themes/{your-theme}/wpwing-wcpdf/{template-name}/`. Edit the copied files freely. Plugin updates will never overwrite theme-level templates.

Where are the PDF files stored?

PDFs are saved to `wp-content/uploads/wpwing-pdf-invoices/`, organised by year and month. An `.htaccess` file (Apache) is written automatically on activation to prevent direct URL access. To serve a PDF you must use the plugin's View action, which checks permissions before streaming the file.

Why did my invoice number jump by more than 1?

This usually happens when both auto-generation on status and email attachment are active for the same order. Even though only one invoice is created per order, the number counter increments once for each attempted generation. Check your settings and ensure only one trigger is active for the same status if gapless numbering is required.

The PDF is blank or shows garbled characters — what do I do?

This is typically a font cache problem. Delete the folder `wp-content/uploads/wpwing-pdf-fonts/` via FTP or your hosting file manager, then regenerate the invoice. The fonts will be re-registered on the next generation. If the problem persists, check that your server's PHP memory limit is at least 128 MB.

Can I reset all plugin settings?

Yes. At the bottom of the settings page there is a Reset all link. Click it and confirm the prompt. This deletes all saved settings — invoice number, company details, templates, and all other options. The stored PDF files and invoice metadata on orders are not affected.

How do I stop invoices being attached to a specific email type?

Go to WPWing → Invoice Settings → General tab, find Attach invoice PDF to emails, and uncheck the email type you want to exclude. Save changes. Future emails of that type will no longer include the PDF attachment.

Can I use a different invoice numbering sequence per year?

Enable Reset invoice number yearly in the General tab. On January 1 each year the serial counter automatically resets to 1. You can combine this with a year token in the format — for example `{year}-{number}` — so each year's invoices are clearly identifiable: `2025-199`, `2026-1`, `2026-2`, etc.