How to Create a Proforma Invoice PDF for WooCommerce (Step by Step)

A proforma invoice is the document you send before payment: it tells the customer exactly what they will pay and how, without being a final tax invoice. It is the standard way to handle bank-transfer, pay-later and B2B orders in WooCommerce. In this guide you will build a proforma invoice with PDF Invoice for WooCommerce + Drag and Drop Template Builder (plugin slug pdf-for-woocommerce, by add-ons.org): duplicate the built-in invoice template, change its wording, add payment instructions with dynamic merge tags, then attach the PDF automatically to pending and on-hold orders, to the new-order and on-hold emails, and to the customer’s My Account page. Every step is shown with a screenshot. The same workflow works for any other document type: only the texts and the trigger statuses change.

Video tutorial

1. What You Need

  • WooCommerce and the PDF Invoice for WooCommerce + Drag and Drop Template Builder plugin installed and activated (it adds the PDF Templates menu and a PDF tab in WooCommerce → Settings).
  • An offline or deferred payment method that leaves orders in Pending payment or On hold: Direct bank transfer (BACS), Check payments, or an invoice/pay-later gateway.
  • Your bank details or payment instructions, and the wording you want on the document (validity period, legal note).

How the plugin decides when to create a PDF: every PDF setting has a list of order statuses. When an order enters one of those statuses the PDF is generated and stored with the order; the same setting also decides which WooCommerce emails get the file and when customers can download it from My Account. For a proforma invoice the statuses are Pending payment and On hold; a final invoice would use Processing and Completed.

2. Create the Proforma Template

Step 1: Open PDF Templates

Go to PDF Templates in the WordPress admin menu. The plugin ships with a WooCommerce Invoice Template that already contains the logo, store address, billing and shipping blocks and the order table. We will reuse it instead of starting from a blank page.

The PDF Templates list in WordPress admin with the WooCommerce Invoice Template, Packing Slip Template and other templates
PDF Templates → the WooCommerce Invoice Template is the base for the proforma.

Step 2: Export the invoice template

Open WooCommerce Invoice Template. In the builder toolbar click the Export icon (arrow down). A file named yeepdf.json is downloaded: it contains the whole layout.

The drag-and-drop builder showing the WooCommerce Invoice Template with the sample order loaded
The builder: Elements and Editor panels on the left, the template canvas on the right, Templates / Import / Export / Preview / Save in the toolbar.
The builder toolbar with the Export icon highlighted
Export downloads the template as yeepdf.json.

Step 3: Create a new template and import the file

Click PDF Templates → New Template, then the Import icon (arrow up). The WordPress media window opens: upload yeepdf.json, select it and click Import template. The invoice layout appears in the new template. Type the title Proforma Invoice in the title field.

The Import template media window with Drop files to upload and Select Files
Import → upload the JSON file you exported.
The new template with the imported invoice layout and the title Proforma Invoice
The imported layout, renamed “Proforma Invoice”. Nothing else is shared with the original template.

Step 4: Change the heading

Click the Invoice heading on the canvas. The Editor panel opens on the left with a rich-text editor: replace the word with Proforma Invoice. Keep the bold 30 px styling so it still reads as a title.

The builder with the heading element selected and the Editor panel showing Proforma Invoice in the text editor
Click any text block to edit it in the Editor panel; the canvas updates immediately.

Step 5: Add a proforma number

Every proforma should carry its own reference. Click the Note: line in the order-info column and replace it with Proforma No: PF-8448. The tag 8448 is replaced by the order number when the PDF is generated, so each document gets a unique number such as PF-1756.

The Editor panel with the text Proforma No: PF-8448 and the canvas showing it in the order info column
A merge tag inside the text becomes dynamic order data in the PDF.

Step 6: Replace the footer with payment instructions

Click the Thank you block and change it to a clear legal note, for example “This is a proforma invoice, not a tax invoice”. Then click the contact block below it and replace it with the amount due and your bank details:

Amount due: 19.00 USD
Please transfer the amount within 7 days to confirm your order:
Bank: Demo Bank | Account name: Demo Yee Add-ons | IBAN: DE00 1234 5678 9012 3456 00
Payment reference: Order #8448
A final tax invoice will be issued once the payment has been received.
The builder with the footer block selected and the Editor panel containing the payment instructions with merge tags
The payment block uses the Order Total, Order Currency and Order Number merge tags.

You do not have to remember tag names: the editor toolbar has a Shortcodes menu that lists every WooCommerce merge tag (order, billing, shipping, customer, user, cart) and inserts it at the cursor.

The Shortcodes drop-down in the text editor listing WooCommerce merge tags
The Shortcodes menu inserts order data such as 19.00 or PIERLUIGI CIPRIANI.

Step 7: Save and preview

Click Save. The template is now listed under PDF Templates. Use the Sample order drop-down in the toolbar to load a real order into the canvas, and Preview to open the generated PDF in a new tab.

The builder after saving the Proforma Invoice template
Save stores the template; Preview renders it as a PDF with the selected sample order.
The PDF Templates list now including Proforma Invoice
The new template next to the original invoice template.

3. Attach the Proforma to Orders and Emails

Step 1: Add a new PDF setting

Go to WooCommerce → Settings → PDF. The page lists every PDF document the store produces. Click Add new PDF.

The WooCommerce Settings PDF tab listing existing PDF documents with Add new PDF button
WooCommerce → Settings → PDF: one row per document (invoice, packing slip, catalog…).

Step 2: Configure when and where the proforma is used

The PDF setting form filled in for the proforma: label, template, file name, order statuses Pending payment and On hold, email attachments, My Account download and a conditional logic rule
The complete proforma setting. The conditional-logic rule at the bottom is optional.
FieldValue for a proforma invoiceWhy
Enable this PDFtickedTurns the setting on.
LabelProforma invoiceShown as the button label in the admin order box, the orders list and My Account.
PDF TemplateProforma InvoiceThe template you just built.
PDF Nameproforma-8448File name of the attachment, e.g. proforma-1756.pdf. Merge tags are allowed.
Enable when order statusPending payment, On holdThe PDF is generated when the order enters one of these statuses. Paid orders never get a proforma.
Attachment toNew order, Order on-hold, Order detailsNew order goes to the shop admin, Order on-hold to the customer right after a bank-transfer checkout, Order details is the email you send manually from the order screen (“Send order details to customer”).
PasswordemptyOptional PDF password.
Allow My Account invoice downloadOnly for specific order statuses → Pending payment, On holdCustomers see the download button only while the order is unpaid.
Conditional Logic (optional)Enable if Payment Method is Direct bank transferLimits the proforma to bank-transfer orders; card payments skip it.

Click Save changes. The new row appears in the PDF list with status Enable.

The PDF settings list with the new Proforma invoice row enabled
The proforma setting is live. You can keep a separate “Invoice” setting for paid orders.

4. What the Customer Sees

Checkout with bank transfer

The WooCommerce checkout with Direct bank transfer selected
A bank-transfer checkout puts the order On hold, which triggers the proforma.
The Order received page with the bank account details and the on-hold order
The order is On hold. At this moment the proforma PDF is generated and attached to the on-hold email.

My Account

Because the setting allows downloads for Pending payment and On hold, the customer gets a Proforma invoice button in My Account → Orders and a download link on the order detail page. Once the order is paid and moves to Processing, the button disappears and the regular invoice takes over.

My Account Orders list with a Proforma invoice button next to the on-hold order
My Account → Orders: the Proforma invoice button only shows for unpaid statuses.
The My Account order detail page with Proforma invoice: Download links
The order detail page lists every PDF available for the order.

The generated PDF

The generated proforma invoice PDF for order 1756: heading Proforma Invoice, billing and shipping addresses, Proforma No PF-1756, the order table, the legal note and the bank transfer instructions with the amount due
The finished proforma for order #1756: unique number, amount due, bank details and the “not a tax invoice” note.

5. Managing Proformas in the Admin

The WooCommerce Orders list with the PDFs column showing Proforma invoice and Invoice links for the on-hold order
Orders list → the PDFs column links to every document of each order. Bulk actions let you download them for several orders at once.
The PDF box on the order edit screen with Download, Preview and Regenerate buttons for the Proforma invoice
Order edit screen → PDF box: Download, Preview, and Regenerate after you change the template or the order.

To send the proforma again, for example after the customer asks for it, choose Send order details to customer in the Order actions box: because Order details is ticked under Attachment to, the proforma is attached to that email.

The Order actions box with the Choose an action drop-down
Order actions → “Send order details to customer” re-sends the email with the proforma attached.

6. Tips

  • Final invoice: keep a second PDF setting (the default “Invoice”) enabled for Processing and Completed so the customer receives the tax invoice after payment.
  • Validity: add a sentence such as “Prices valid for 7 days from August 28, 2026” to make the offer time-limited.
  • Numbering: prefix the order number (PF-8448) to keep proforma and invoice numbers distinct.
  • Bank details per currency: duplicate the template and use conditional logic on Order Currency to attach the right one.
  • Password: for B2B quotes with confidential pricing, set a PDF password in the setting; share it with the customer separately.
  • Regenerate: after editing the template, click Regenerate in the order’s PDF box so the stored file is rebuilt; emails always attach the stored file.

7. Frequently Asked Questions (FAQ)

Why did my on-hold email arrive without the PDF?

Make sure the Order on-hold box is ticked under Attachment to and that On hold is selected under Enable when order status. The PDF is only attached to emails of statuses that are enabled.

Can I add VAT or tax lines to the proforma?

Yes. The order table block already prints subtotal, shipping, tax and total as configured in WooCommerce; you can also add single tags such as 0 in a text block.

How do I stop the proforma once the order is paid?

Nothing to do: it is only generated for Pending and On hold. When the order becomes Processing the Invoice setting takes over and the proforma button disappears from My Account.

Can customers download the proforma without an account?

The download links in emails work for everybody; the My Account buttons need a logged-in customer.

Does it work with HPOS (High-Performance Order Storage)?

Yes, the plugin declares compatibility with custom order tables; the PDF box and the PDFs column appear on both the classic and the HPOS orders screens.

Can I use a different language or RTL layout?

Yes. Texts are yours to write in any language; the builder supports RTL and bundles DejaVu Sans with wide Unicode coverage. Upload extra fonts under PDF Templates → Settings.