Need SKU on your invoices? Custom delivery note fields? A PO number or tax ID that actually prints? Here's how to get every field where it belongs — across 5 plugins that people are fighting with right now.
Jump to Field Map ↓ Extract Custom Fields from Any PDF →Most plugins hide SKU by default. Store owners discover this only after printing 200 invoices and realising their warehouse team can't match items. The SKU field exists in WooCommerce product data, but the invoice template doesn't pull it unless explicitly configured.
{sku} to the line items block. If your plugin has no toggle, add this filter to your theme's functions.php: add_filter('woocommerce_order_item_name', function($name, $item) { $product = $item->get_product(); return $product ? $name . ' (SKU: ' . $product->get_sku() . ')' : $name; }, 10, 2);By default, SKU gets crammed into the product name cell. For warehouse picking or delivery notes, you want SKU on its own line (or even its own column) for scannability. The plugin UI doesn't offer this; you have to edit the template.
yourtheme/woocommerce/woocommerce-delivery-notes/). In the line items loop, add the SKU output as a separate <div> or table column. The CSS-only shortcut: wrap SKU in <span style="display:block; font-size:0.85em; color:#666;"> to push it to a new line inside the same cell without restructuring the HTML.Print Invoice & Delivery Notes lets you add delivery note fields through its settings, but only covers the basics. If you need custom checkout fields (PO number, special instructions) to appear on the delivery note, you need to save them as order meta and then reference them in the template.
wcdn_order_info_fields filter to add custom fields: add_filter('wcdn_order_info_fields', function($fields, $order) { $fields['po_number'] = array('label' => 'PO Number', 'value' => $order->get_meta('_po_number')); return $fields; }, 10, 2); For the PO number to exist on the order, capture it at checkout using a custom checkout field that saves to order meta.WP ERP forces the email field as required when creating a customer contact. For businesses that deal with walk-in customers, wholesale accounts without email, or cash-on-delivery orders, this blocks the workflow entirely.
erp_crm_customer_form_fields filter to make email optional. Add to functions.php: add_filter('erp_crm_customer_form_fields', function($fields) { if (isset($fields['email']['required'])) $fields['email']['required'] = false; return $fields; }); Be aware: invoice email delivery and some CRM automations will fail for contacts without email addresses, so add a manual follow-up workflow for those records.If you edited the invoice template inside the plugin's own directory, a plugin update replaces your changes. This is the most common "my invoices broke" report that isn't actually a bug — it's a workflow problem. Flexible PDF Invoices and Print Invoice & Delivery Notes both have this issue.
yourtheme/woocommerce/woocommerce-delivery-notes/ and put your modified template files there. For Flexible PDF Invoices: use the built-in template editor which saves to the database (survives updates). Never edit files inside wp-content/plugins/ directly.Print Invoice & Delivery Notes adds a "Print" prompt that some store owners want to remove or change. The message appears on the order edit screen and customer-facing pages. There's no UI toggle — you have to override it.
.wcdn-print-link-wrapper { display: none !important; } Or remove it with PHP: add_action('admin_init', function() { remove_action('woocommerce_admin_order_data_after_order_details', 'wcdn_print_link'); }); If you want to keep it but change the text, use the wcdn_print_link_text filter.Which WooCommerce invoice plugins give you the most control over custom fields? Based on current features and WordPress support forum data.
| Plugin | Installs | SKU Support | Custom Fields | Delivery Notes | Theme Override | Support Resolution |
|---|---|---|---|---|---|---|
| Print Invoice & Delivery Notes | 30,000+ | ✓ Built-in toggle | ✓ Via filters | ✓ Full support | ✓ Theme templates | 4/12 (33%) |
| Flexible PDF Invoices | 7,000+ | ✓ Template placeholder | ✓ Template editor | ✗ Invoice only | ~ DB templates | 3/3 (100%) |
| WP ERP | 6,000+ | ✗ No invoice PDF | ~ Via filters | ✗ N/A | ✗ N/A | 0/0 |
| Sliced Invoices | 5,000+ | ~ Requires custom code | ✓ Custom fields UI | ✗ Invoice only | ✓ Theme templates | 1/2 (50%) |
| SuperFaktura | 2,000+ | ✓ Automatic | ~ Limited to exchange rate | ~ Via third-party system | ✗ Cloud-rendered | 1/1 (100%) |
This is the single most requested field customization across all WooCommerce invoice plugins. Here are three approaches depending on your plugin.
Go to WooCommerce → Settings → Print. Under "Invoice Options", check Show SKU. Save. Generate a test invoice to confirm SKU appears in the line items table.
Go to the invoice template editor. In the line items section, add the {sku} placeholder where you want the SKU to appear. You can place it after the product name, in a separate column, or on its own line.
If your plugin has no built-in SKU option, add this to your theme's functions.php:
// Add SKU to invoice line items for any WooCommerce invoice plugin
add_filter('woocommerce_order_item_name', function($name, $item) {
$product = $item->get_product();
if ($product && $product->get_sku()) {
$name .= '<br><small style="color:#666;">SKU: '
. esc_html($product->get_sku()) . '</small>';
}
return $name;
}, 10, 2);
This appends the SKU below the product name in any template that uses the standard WooCommerce order item name filter. It works with Print Invoice & Delivery Notes, PDF Invoices & Packing Slips, Sliced Invoices, and most other WooCommerce PDF plugins.
Want a PO number, project reference, or special delivery instructions on the delivery note? It's a two-step process: capture the field at checkout, then display it on the note.
// Add PO Number field to checkout
add_action('woocommerce_after_order_notes', function($checkout) {
echo '<div class="form-row form-row-wide">';
woocommerce_form_field('po_number', array(
'type' => 'text',
'class' => array('form-row-wide'),
'label' => 'PO Number',
'placeholder' => 'Your purchase order number (optional)',
'required' => false,
), $checkout->get_value('po_number'));
echo '</div>';
});
// Save the PO Number to order meta
add_action('woocommerce_checkout_update_order_meta', function($order_id) {
if (!empty($_POST['po_number'])) {
update_post_meta($order_id, '_po_number',
sanitize_text_field($_POST['po_number']));
}
});
// Add PO Number to Print Invoice & Delivery Notes
add_filter('wcdn_order_info_fields', function($fields, $order) {
$po = $order->get_meta('_po_number');
if ($po) {
$fields['po_number'] = array(
'label' => 'PO Number',
'value' => $po,
);
}
return $fields;
}, 10, 2);
This pattern works for any custom field — shipping references, department codes, tax IDs, construction site addresses. Save to order meta at checkout, then pull from order meta into the delivery note template.
The #1 reason people lose their invoice field customizations: they edited files inside wp-content/plugins/. Every plugin update wipes those changes. Here's the update-proof approach.
Create this directory in your theme:
wp-content/themes/your-theme/woocommerce/woocommerce-delivery-notes/
Copy the template files from the plugin's templates/ directory into your theme directory. Edit your copies. These override the plugin's templates and survive updates.
Use the built-in template editor (WooCommerce → Invoices → Templates). Templates created in the editor are saved to the database, not to plugin files. They survive updates automatically.
Whenever possible, use filters and action hooks in your theme's functions.php instead of editing template files directly. Filters are future-proof as long as the plugin maintains its hook names (which most do across minor versions).
Before updating any invoice plugin: export 3 test invoices as PDF. After the update, generate the same 3 invoices and compare. If fields are missing, your template override may need updating. Keep your pre-update PDFs as the "known good" reference.
Before you go live with customized invoices, verify every item:
wp-content/themes/your-theme/woocommerce/, not inside wp-content/plugins/.Check your plugin settings first — Print Invoice & Delivery Notes has a built-in "Show SKU" toggle. Flexible PDF Invoices uses a {sku} template placeholder. For any plugin without native support, use the woocommerce_order_item_name filter to append SKU to the product name.
Yes. Save your custom data as order meta (via a checkout field or programmatically), then use the wcdn_order_info_fields filter to display it on the delivery note. This works for PO numbers, shipping references, department codes, or any other field.
You probably edited files inside the plugin directory. Plugin updates replace those files. Move your customizations to your WordPress theme directory or use functions.php filters. Theme-level overrides survive plugin updates.
Edit the invoice template (in your theme directory, not the plugin). Output SKU in its own <div> below the product name. The CSS shortcut: wrap the SKU in a span with display:block to force a line break without restructuring the template HTML.
Use the erp_crm_customer_form_fields filter to set email's required attribute to false. Be aware that invoice email delivery won't work for contacts without email addresses.
If you have invoice PDFs with custom fields (SKU, PO numbers, delivery references) and need that data in a spreadsheet or accounting system, use Useful Patch. Upload the PDF and get every field back as structured JSON — including custom fields the extractor identifies automatically. No file leaves your browser during extraction.
Upload any invoice PDF — WooCommerce, Xero, QuickBooks, custom — and get every field including SKUs, PO numbers, and custom references back as clean JSON.
Open Free Demo → Start Developer Plan — £29/mo View API Docs →