Invoice not sent after Stripe payment. VAT not showing. EU reverse charge missing. Tax class wrong on PDF. Here is what is actually happening and how to fix it.
Extract Invoice Tax Data → See All ProblemsSourced from WordPress support forums, WooCommerce issue trackers, and plugin review threads across 4 invoice plugins.
Order sits in "on-hold" after a Stripe Checkout or 3D Secure payment. The invoice plugin is configured to trigger on "processing" — but the order never reaches it.
Invoice prints totals but the VAT line is blank or missing. Customer asks for a valid VAT invoice and you cannot provide one.
B2B customer in another EU country provides their VAT number, gets zero-rated, but the invoice PDF has no reverse charge notice. Non-compliant for EU VAT rules.
Invoice shows 0% VAT on a UK or EU order that should be standard-rated, or the wrong reduced rate appears for a specific product category.
EU B2B customer entered their VAT number at checkout but it does not appear on the invoice PDF. The customer needs it for their own VAT records.
_billing_eu_vat_number or billing_vat_number. In most invoice plugins: go to Template Settings → Billing Address and add a custom field mapped to that meta key. In Flexible PDF Invoices, use the "Additional fields" section. Verify the meta key by checking the order in wp-admin → Orders → Edit → scroll to "Custom Fields" at the bottom.Invoice sent to customer immediately on order creation, before payment completes. Creates accounting entries for orders that later fail or are abandoned.
Comparing 4 leading WooCommerce invoice plugins on tax and payment workflow features.
| Plugin | EU Reverse Charge | VAT Number on Invoice | Trigger on "On-Hold" | Tax Itemisation | Community Tax Resolution Rate |
|---|---|---|---|---|---|
| WooCommerce PDF Invoices & Packing Slips | ⚠ Via add-on | ✓ Custom field | ✓ Configurable | ✓ Itemised | ~72% |
| Print Invoice & Delivery Notes | ✗ Not built-in | ⚠ Template edit | ✓ Configurable | ✓ Itemised | ~65% |
| Flexible PDF Invoices | ✓ Native support | ✓ Native support | ✓ Configurable | ✓ Itemised | ~78% |
| WP ERP (CRM + Invoice) | ✗ No | ⚠ CRM field only | ✗ Manual | ⚠ Summary only | ~55% |
Resolution rates based on public support thread outcomes across wordpress.org and GitHub issue trackers.
Go to Stripe Dashboard → Developers → Webhooks. Find the endpoint for your site. It should be:
https://yourstore.com/?wc-api=WC_Stripe
Check the "Recent deliveries" tab. If you see failed deliveries for payment_intent.succeeded or charge.succeeded, that is why invoices are not sending — the order never transitions to "processing".
The Stripe WooCommerce plugin registers webhooks automatically, but sometimes they get out of sync. Go to WooCommerce → Settings → Payments → Stripe → Settings and click "Configure" then save the settings — this re-registers the webhook endpoints. You can also manually add the required events in Stripe Dashboard:
payment_intent.succeededcharge.succeededpayment_intent.payment_failedcustomer.subscription.updated (if using subscriptions)In your invoice plugin, go to Settings → Invoice → "Attach invoice to" and add both "processing" and "completed". Some stores also add "on-hold" for BACS orders that need a proforma invoice — just make sure you have two separate document types (proforma vs. final invoice) if you do this.
When you sell to a VAT-registered business in another EU country, the sale is zero-rated and the invoice must include the buyer's VAT number and the text "Reverse charge — VAT to be accounted for by the buyer" (or equivalent in the local language). Without this, your invoice is technically non-compliant.
You need three things in place simultaneously:
If your invoice plugin does not have native EU VAT support, add the reverse charge notice as a conditional footer note. In WooCommerce PDF Invoices & Packing Slips:
<?php
// Add to your theme's functions.php
add_filter('wpo_wcpdf_footer', function($footer, $document) {
if ($document->get_type() === 'invoice') {
$order = $document->order;
$vat_number = get_post_meta($order->get_id(), '_billing_eu_vat_number', true);
if (!empty($vat_number) && $order->get_total_tax() == 0) {
$footer .= '<p>Reverse charge — VAT to be accounted for by the recipient. Customer VAT No: ' . esc_html($vat_number) . '</p>';
}
}
return $footer;
}, 10, 2);
?>
Orders stuck in "on-hold" after Stripe payment usually means the webhook is not firing correctly. Verify the endpoint in Stripe Dashboard → Developers → Webhooks. Also check that your invoice plugin's trigger statuses include "processing" — the status Stripe transitions to on successful payment confirmation.
The invoice shows whatever WooCommerce calculated at checkout. If VAT is zero or wrong on the invoice, the error happened at order creation — check tax rates, product tax class, and customer address detection. Enable "Itemised" tax display in WooCommerce → Settings → Tax and enable "Show taxes" in your invoice plugin template settings.
Use an EU VAT Number plugin to capture and validate the buyer's VAT number at checkout (which auto-applies zero rate), then add a conditional footer note to the invoice showing the reverse charge notice and the buyer's VAT number. Flexible PDF Invoices has this built in; other plugins require a short PHP filter in functions.php.
The invoice reports what WooCommerce calculated — so wrong tax on the invoice means wrong tax at checkout. Check the product's tax class, the customer's billing country, and whether your Standard Rate table has the right percentage for that country. If the order is already placed with the wrong rate, you need to issue a corrected invoice manually.
Find the meta key used by your EU VAT plugin (usually _billing_eu_vat_number) by checking a test order's custom fields in wp-admin. Then add it as a custom field in your invoice plugin's billing address template section — most plugins have a "Custom fields" option in their template editor.
If you need to pull tax amounts, VAT rates, and VAT numbers from existing invoice PDFs for accounting or audit, an invoice extraction tool that returns structured JSON handles this. Useful Patch extracts every field — including tax lines, VAT numbers, and line-item tax rates — from any WooCommerce invoice layout without the file leaving your browser.
Upload any WooCommerce invoice PDF and get back structured JSON with every tax field, VAT number, and line item — without the file leaving your browser.
Try Free — No Signup Developer Plan £29/mo