WooCommerce Customization

WooCommerce Invoice Field Customization — SKU, Delivery Notes & Custom Fields

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 →

The 6 Most Common Field Customization Problems (and How to Fix Each One)

Problem #1 — SKU Not Showing

"How do I add the SKU to the product information on my invoice?"

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.

Fix: In Print Invoice & Delivery Notes → WooCommerce → Settings → Print → check "Show SKU". In Flexible PDF Invoices → edit your template and add {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);
Problem #2 — SKU and Quantity Layout

"SKU and quantity on separate lines — how?"

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.

Fix: Copy the invoice template to your theme directory (e.g., 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.
Problem #3 — Missing Delivery Note Fields

"I need extra fields on the delivery note — shipping ref, picker notes, PO number"

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.

Fix: Use the 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.
Problem #4 — Customer Fields in ERP

"Email field required when adding customers — but I don't have everyone's email"

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.

Fix: Use the 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.
Problem #5 — Custom Fields Lost After Update

"My invoice customisations disappeared after the plugin updated"

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.

Fix: Copy the template to your WordPress theme directory. For Print Invoice & Delivery Notes: create 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.
Problem #6 — "Print" Message Won't Go Away

"How to remove the 'Print: Open print view in browser' message?"

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.

Fix: Add CSS to your admin stylesheet: .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.

Plugin Comparison: Field Customization Support

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%)

Adding SKU to WooCommerce Invoices: Step by Step

This is the single most requested field customization across all WooCommerce invoice plugins. Here are three approaches depending on your plugin.

Method 1: Plugin Settings (Print Invoice & Delivery Notes)

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.

Method 2: Template Placeholder (Flexible PDF Invoices)

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.

Method 3: PHP Filter (Any Plugin)

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.

Adding Custom Checkout Fields to Delivery Notes

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.

Step 1: Add a Custom Checkout Field

// 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']));
    }
});

Step 2: Display on Delivery Note

// 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.

Protecting Customizations from Plugin Updates

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.

For Print Invoice & Delivery Notes

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.

For Flexible PDF Invoices

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.

For Any Plugin: Use functions.php

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).

Backup Strategy

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.

Field Customization Checklist

Before you go live with customized invoices, verify every item:

Common Questions

How do I add SKU numbers to WooCommerce invoice PDFs?

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.

Can I add custom fields to WooCommerce delivery notes?

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.

Why did my custom invoice fields disappear after a plugin update?

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.

How do I put SKU and quantity on separate lines?

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.

Can I make the email field optional in WP ERP?

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.

How do I extract custom fields from existing invoice PDFs?

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.

Need Custom Invoice Fields in Structured Data?

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 →