Installation
The plugin is uploaded like any WordPress plugin: Plugins → Add New → Upload Plugin, then Activate. WooCommerce must be installed and active; otherwise a notice reminds you and the plugin stays inert.
To update, simply upload the new archive: WordPress detects the existing plugin and offers to replace it. Your settings and token are preserved.
Pro version — the Pro is a second plugin that installs alongside the free one, never instead of it. Install and activate the free plugin first, then the Pro: its tabs and features appear in the same settings page. If the free plugin is deactivated, the Pro goes dormant and tells you so.
Never keep two invoicing systems active at the same time on the same store (ours and another plugin): every order would be invoiced twice.
Connecting to Pennylane
Go to WooCommerce → Pennylane → Connection and paste your API token. You generate it in Pennylane under Settings → Connectivity → Developers.
The token needs three permissions: Customers read and write, Customer invoices read and write, Products read. The "Test connection" button checks all three separately and tells you which one is missing.
The token is encrypted before storage and never displayed again in clear text, neither in the interface nor in the logs.
Test mode
Test mode is on by default. While it is on, the plugin fully prepares the data — customer, invoice, credit note — writes it to the logs, and sends nothing to Pennylane.
This is how you validate your VAT configuration against real orders before writing anything into your accounting. A banner stays visible in the admin while the mode is on, so you cannot forget it.
Logs live under WooCommerce → Status → Logs, source pennylane.
Manual or automatic
By default, invoicing is manual: a "Pennylane" box appears at the top of every order screen, with a "Create invoice" button. Nothing leaves without your action.
To automate it, tick "Automatic invoicing" and pick the trigger statuses. On most stores a paid order moves to "Processing" — so that is the status to tick, not "Completed".
Either way, the invoice is created only once per order, whatever happens.
VAT, OSS and VIES
The tax regime is determined automatically from the billing country and the presence of a valid EU VAT number:
- France — French VAT at the order rate.
- European Union, business — reverse charge, exempt invoice with the matching legal wording.
- European Union, consumer — destination country rate (OSS one-stop shop).
- Outside the European Union — export exemption with its wording.
VIES validation, if you enable it, queries the official European Commission service. A number reported invalid never grants the reverse charge, even when its format is correct. If the service is unreachable, the order is never blocked: the number is re-checked at invoicing time and a note is added to the order.
Set WooCommerce to two decimals. Any other setting produces rounding differences between the order and the invoice.
Invoice e-mails
Two templates to choose from.
Pennylane template — Pennylane writes and sends the e-mail. Wording, branding and sender are set in your Pennylane account, under Settings → Customer invoicing → Customisation. Careful: the default template includes a bank transfer request, even for an order already paid. Untick "Bank transfer" in the template payment conditions.
Our template — the e-mail is sent by your shop, with the layout and logo of your WooCommerce e-mails, your wording, and the Factur-X PDF attached. This is the recommended choice for an online store, where the customer has already paid.
Variables available in your wording: {prenom}, {nom}, {numero_facture}, {numero_commande}, {total}, {boutique}, {lien_facture}.
On a multilingual site, one wording block appears per language. Leave a language empty and the translated default wording is used.
Credit notes and reconciliation
Every WooCommerce refund, full or partial, creates a credit note in Pennylane, linked to the original invoice and carrying the refunded lines.
Reconciliation marks the invoice as paid in Pennylane as soon as the order is settled. On an online store the order is almost always paid before it is invoiced, so the marking happens a few seconds after the invoice is created.
If you enable e-mail delivery without enabling reconciliation, your customers will receive an invoice marked unpaid, with a payment request — for an order they have already paid. The plugin shows a permanent alert in that case.
Backfill
The Backfill tab lists orders in a trigger status that have no invoice. You pick a start date, review the list, and run the batch.
Each invoice keeps the original order date, which preserves the consistency of your accounting.
Monitoring
Three independent mechanisms stop you from discovering a problem weeks later.
- Failure alerts — a summary e-mail as soon as an operation fails, grouped so it never exceeds one message per hour, with a direct link to each affected order.
- Weekly summary — every Monday morning: invoices created, amount invoiced, errors pending, orders without an invoice.
- Total consistency check — after each invoice, its total is compared to the order total; any mismatch is reported on the order and by alert.
Command line
Four WP-CLI commands, useful for diagnostics and larger stores.
wp pennylane test-connection
wp pennylane generate <order_id>
wp pennylane status <order_id>
wp pennylane backfill --from=2026-01-01 --dry-run
Developer customisation
The sensitive points are filterable, so the plugin can be adapted to a specific case without modifying its code.
// Tax regime applied to an order
add_filter( 'pw_tax_regime', function ( $regime, $order ) { … }, 10, 2 );
// VAT rate code of a line
add_filter( 'pw_vat_rate_code', function ( $code, $regime, $order, $item ) { … }, 10, 4 );
// Invoice payload before sending
add_filter( 'pw_invoice_payload', function ( $payload, $order ) { … }, 10, 2 );
// Invoice e-mail recipients
add_filter( 'pw_email_recipients', function ( $emails, $order ) { … }, 10, 2 );
Pro license
The Pro version is activated with a license key, e-mailed to you after purchase. Paste it under WooCommerce → Pennylane → License and click "Activate the license". One key covers one production site.
The license is re-checked automatically once a day, in the background. To move the key to another site — during a migration, for instance — click "Release this site" on the old site, then activate the key on the new one.
Soft expiry — if the license expires, nothing stops: invoices, credit notes, e-mails and reconciliation keep running. Only updates and support are paused until renewal. A discreet reminder shows on the plugins page and in the settings, nowhere else.
Pro updates arrive under Dashboard → Updates, like any plugin, as long as the license is valid. The free version updates from WordPress.org.
Troubleshooting
The logs (WooCommerce → Status → Logs, source pennylane) record every call and every response. Here are the most common situations.
- The button does nothing
- Every manual action now shows a confirmation or error banner. If you see nothing, reload the page: a browser tab left open on an older state can save stale settings back.
- Invoice not created automatically
- Check that "Automatic invoicing" is ticked and that at least one trigger status is selected. Then check under WooCommerce → Status → Scheduled Actions that the task was created.
- The customer receives a payment request
- The invoice was sent before being marked as paid. Enable reconciliation, or switch to our own e-mail template where you control the wording.
- E-mail never received
- Look at the log: a 409 code means the PDF was not generated yet on the Pennylane side — the plugin retries automatically. Any other code appears in clear with the API message.
- Total mismatch reported
- Check the WooCommerce decimal setting and your tax configuration. The message shows both amounts being compared.