0+
July 29, 2026
July 26, 2026
SoftGlaze PDF Invoices turns WooCommerce orders — and invoices you create by hand — into clean, professional PDF documents. Everything renders 100% locally: the bundled dompdf engine runs on your own server, every logo, icon and font is embedded from local files, and a document render never makes an outbound HTTP request. The default install talks to zero external services; the only features that can ever reach the network are opt-in and off by default (the EU VIES VAT lookup, cloud backup, and WhatsApp Cloud API sending — each to an official service or your own account).
It scales with you: from “I just need an invoice attached to my order emails” all the way to a full self-service invoice-builder website your visitors sign up and use — all from one plugin, driven by a modern React admin.
Full documentation, setup guides and screenshots: https://softglaze.com/docs/pdf-invoices-plugin-for-woocommerce-and-manual
Four document types, one design system
Numbering that fits your books
{YYYY} / {MM} placeholders, zero-padding and yearly reset — or simply reuse the WooCommerce order number or the raw order ID.Automation
A real admin, not just a settings page
Design your documents visually
Works with or without WooCommerce
[sgci_invoice_builder], [sgci_my_invoices], [sgci_dashboard], [sgci_login] / [sgci_register]) let visitors sign up, build their own invoices with a live preview, and manage them — a complete self-service invoice site. Every document is private to its owner; one user can never see another’s. When WooCommerce is active, the same view merges into a My Account Invoices tab.Share & send
{tags} filled in on send, and a logged send history.Payments, deposits & client acceptance
{amount_paid} and {balance_due} — are available in the builder. On WooCommerce orders the balance respects the order status (only Pending / On-hold show a balance).WhatsApp delivery
Compliance & exports
Multi-language & right-to-left documents
Cloud backup (optional, off by default)
/SoftGlaze Invoices/{Year}/{Month}/).Privacy, security & compatibility
src/; the filters sgci_document_template_json and sgci_document_html let you reshape output in code; and a shared dynamic-tag engine powers {invoice_number}, {order_number}, {total}, {share_url}, {carrier}, {tracking_code}, {order_meta:key}, {user_meta:key} and more.Bundled libraries (all GPL-compatible, in vendor/): dompdf (LGPL-2.1) with php-font-lib and php-svg-lib, with docs and tests removed.
/wp-content/plugins/ (or install the ZIP from Plugins Add New).WooCommerce is required for order invoicing. The bundled dompdf library ships with the plugin; if it is ever missing, documents fall back to print-ready HTML.
By default, no. Rendering is entirely local — the PDF engine embeds all assets from your own server and makes no outbound HTTP request when generating a document.
There are exactly three opt-in exceptions, all off by default:
EU VIES VAT check — if you turn on Settings Checkout Verify EU VAT numbers online with VIES, a VAT number entered at checkout is sent to the official EU VIES service to confirm it exists. Format and checksum checks always run locally first.
Cloud backup — if you connect a destination under Settings Backup, generated documents are uploaded to YOUR own Dropbox or Google Drive using YOUR app credentials. There is no SoftGlaze middleman server, refresh tokens are stored encrypted on your server, and nothing is uploaded until you connect an account. Disconnecting revokes and deletes the stored tokens.
WhatsApp Cloud API sending — if you enable it and save your own Meta credentials under Settings Automations WhatsApp Cloud API, clicking “Send on WhatsApp now” on a document sends its share link to the customer via YOUR own WhatsApp Business account (graph.facebook.com). Your access token is stored encrypted on your server, nothing is sent until you connect and click send, and the free click-to-chat button needs none of this. (The click-to-chat button itself uses WhatsApp’s wa.me links and makes no request from your server.)
Until you switch one of these on, the plugin makes zero external requests.
Yes. The plugin declares HPOS compatibility and reads orders only through WooCommerce CRUD.
By default, uninstalling removes only the plugin’s own options and order meta. Enable Remove data on uninstall in Settings first if you also want the invoice records and generated PDF files deleted.
Yes. Two filters let you override document output in code:
sgci_document_template_json — apply_filters('sgci_document_template_json', $template, $doc_type). Fires when a named custom template is about to render a document type; return a modified template array (name, base_preset, tokens, sections, doc_types) to change what renders — for example to reorder sections or inject a custom-HTML section programmatically.sgci_document_html — apply_filters('sgci_document_html', $html, $invoice). Fires on the final document HTML immediately before the PDF is rendered (and before the HTML fallback is written), for every document type and template/layout. Return modified HTML to post-process the document.Dynamic template tags are resolved by one shared engine used by PDFs, emails and reminders. Alongside {invoice_number}, {order_number}, {date}, {due_date}, {customer_name}, {company_name}, {total} and {share_url}, you can pull arbitrary order or customer meta with {order_meta:your_key} and {user_meta:your_key}. Values are output-escaped; an optional key allowlist (Settings) restricts which keys resolve.
You can assemble a self-service invoice site — where visitors sign up and make their own PDF invoices — from three pages, no WooCommerce needed:
[sgci_register] on a page for the standard WordPress registration form.[sgci_invoice_builder my_invoices="/my-invoices/"] — the full builder (company details saved per user, client, line items, currency, a design picker, a live preview, and Generate PDF + share link).[sgci_my_invoices builder="/create-invoice/"] — each user’s own documents, with search, download, duplicate, a copyable share link, and delete.[sgci_login] (and, if you like, [sgci_register]).my_invoices and builder attributes above accept a page path (e.g. /my-invoices/), a full URL, or a numeric page ID; they power the builder’s “My invoices” link, the list’s “+ New invoice” button, and the empty-state call-to-action. Add the three pages to your menu and you have a complete builder site — any membership or login-redirect plugin works alongside it.Privacy: every document a visitor creates is owned by that visitor. One user can never see, download, or touch another user’s invoices, and a direct link to someone else’s document returns “not found”. Guests are shown a login/register prompt instead of the builder.
No. WooCommerce is required only for order-based invoicing — turning orders into documents, the order-screen tools, the orders-list column and the My Account download. Without WooCommerce you can still create invoices by hand, design templates, use share links, and run the public invoice-builder site.
Invoices, packing slips, proforma invoices, credit notes, receipts and delivery notes. Each type has its own template assignment and can use its own number sequence.
Yes. The New invoice screen lets you pick a saved client (or add one), add unlimited line items with quantity, unit price, cost and tax rate, choose the currency, date, template and status, and save. A race-safe number is assigned, the PDF is stored and a share link is ready — with WooCommerce on or off.
Numbering is sequential with an optional prefix and suffix, {YYYY} and {MM} placeholders, zero-padding and an optional yearly reset. Credit notes and proforma invoices can each use their own separate, race-safe sequence. You can also reuse the WooCommerce order number or the raw order ID instead of a counter.
Yes. The plugin can detect existing YITH / WebToffee (and other) invoice numbers, continue your sequence from the highest one found, and optionally copy the old numbers onto historical orders. Developers can extend the detected meta keys with the sgci_import_number_meta_keys filter.
Use the document × email matrix in Settings to choose which document attaches to which transactional email (for example the invoice on “Completed”, the packing slip on “Processing”). You can also auto-generate documents on the order statuses you choose.
Yes. When WooCommerce is active there is a “Download invoice” button in My Account and an optional Invoices tab. You can also send any document by email or share a tokenised link.
Each link carries a random token, has a per-document expiry you choose (7 / 30 / 90 days or never), and can be regenerated or revoked. Generated files live in a protected uploads folder and are served only through capability- and ownership-checked endpoints, so a direct link to someone else’s file returns “not found”.
Yes — enable the share-link QR code per document type and the link prints as a QR code in the corner of the PDF. The QR image is generated locally.
Record one or more payments (date, amount, method, note) against a document — from a Payments panel on the manual invoice screen, or a Payments box on the WooCommerce order (classic and HPOS). The PDF then prints Amount paid and Balance due, and the dashboard’s unpaid figure counts only the remaining balance.
No, and it is labelled as such. It records a typed name, an agreement checkbox, a timestamp and the client’s IP as a simple, honest online acceptance — useful for proformas and quotes. It is not a qualified or legally binding e-signature.
Click the WhatsApp button on a generated document (order screen or Documents manager). WhatsApp opens with the customer’s number and a message containing the document’s share link, ready for you to send. This uses WhatsApp’s wa.me links and needs no setup or API keys.
Under Settings Automations WhatsApp Cloud API, enable it and save your own Meta WhatsApp Business credentials (phone-number ID and access token). A “Send on WhatsApp now” action then delivers the share link from your server. Inside Meta’s 24-hour customer-service window it sends your session message; outside it, it uses your pre-approved template. It is off by default, the token is stored encrypted, and every send is a manual click.
Yes. Enter your VAT, GST/HST and a generic Tax ID in Settings Company details, then switch them on per document type under Compliance field packs. You can also print an editable EU reverse-charge note; in automatic mode it appears only on intra-EU B2B documents where reverse charge applies. The note never changes your tax totals.
Yes. Choose a document language globally or per document. French, German, Spanish, Dutch, Italian, Portuguese and Hebrew are built in, and Hebrew renders right-to-left with the bundled font. With no language chosen, documents are unchanged and the admin stays in English. Arabic is not offered yet, because the bundled PDF engine cannot join Arabic letters correctly.
Flow stacks the document sections down the page (header, then bill-to, then items, and so on). Canvas lets you place blocks freely anywhere on the page — drag to move, resize with handles, and layer them. Both use the same block types and the same live preview, and both print exactly what you see. Flow is the default; Canvas is a per-template choice.
Yes. Build a named template from blocks, or add a custom-HTML block. Custom HTML is sanitised — scripts, event handlers and remote references are stripped, on save and on every preview — so it stays safe for the local PDF engine.
It generates the official FatturaPA 1.2 (FPR12) XML for invoices and credit notes, per document or as a bulk ZIP, and validates each file locally against the Agenzia delle Entrate schema before download. It does not transmit to the SDI — send the file via your intermediary or the AdE portal — and it refuses to guess when data cannot be mapped cleanly. Off by default.
Yes, optionally. Connect your own Dropbox and/or Google Drive app under Settings Backup and each generated document is copied to your account, mirroring the local folder layout. You use your own OAuth credentials (there is no SoftGlaze server in between), refresh tokens are stored encrypted, and nothing is uploaded until you connect an account. Off by default.
WordPress 6.3+, PHP 7.4+, and WooCommerce for order-based invoicing. The dompdf engine is bundled, so there is nothing to install; if it were ever missing, documents fall back to print-ready HTML.
No. Every feature is off by default or defaults to your current behaviour, so an existing store’s checkout, documents, emails and numbering are unchanged until you opt in.
The complete manual — for both WooCommerce and manual/standalone use — is at https://softglaze.com/docs/pdf-invoices-plugin-for-woocommerce-and-manual. It walks through every feature above with step-by-step screenshots.
Housekeeping — no functional changes.
* Pointed the in-plugin “Documentation” link to the plugin’s own manual page.
Housekeeping — no functional changes.
* Shortened the changelog shown on WordPress.org to the most recent releases (the complete history now lives in changelog.txt), keeping it within the directory’s display limit.
Release “CANVAS” — a freeform drag-and-drop / resize page builder.
* Design freeform documents — the template builder now has a Canvas mode alongside the classic Flow (stacked) mode. Drop blocks anywhere on the page, drag to move them, resize with corner and edge handles, nudge with the arrow keys, and layer them with bring-front / send-back. A logo top-right, an address bottom-left, a big status watermark across the middle, an items table sized to a region — however you want it.
* What you lay out is what prints — blocks are positioned by percentage of the page, the exact same coordinates the PDF engine uses, and the live preview shows the real document as you design. Nothing runs off the page.
* Opt-in and safe — every existing template stays in Flow mode and renders exactly as before; Canvas is a per-template choice you switch on. Built with a tiny in-house drag/resize (no third-party libraries) and, like the rest of the plugin, makes zero external requests.
Release “POLISH” (part 6) — multi-language & right-to-left documents.
* Print documents in your customer’s language — pick a default document language under Settings Documents Language & direction, or set it per document (on the invoice editor and the WooCommerce order screen). The document labels — Invoice, Bill To, Subtotal, Tax, Total, and the rest — translate automatically. French, German, Spanish, Dutch, Italian, Portuguese and Hebrew are built in.
* Right-to-left support — Hebrew (and other RTL languages) render the whole document right-to-left, using the bundled font, so no setup or extra fonts are needed.
* Off by default, admin stays English — with no language chosen, documents render exactly as before. This affects the customer-facing PDF/print only; your admin screens are unchanged. Makes zero external requests, like everything else. (Arabic isn’t offered yet — the bundled PDF engine can’t join Arabic letters correctly.)
Release “POLISH” (part 5) — WhatsApp Cloud API (server-send).
* Send documents on WhatsApp from your server — an optional upgrade to the click-to-chat button. Connect your OWN Meta WhatsApp Business Cloud API and a green “Send on WhatsApp now” action appears on documents (Documents page and the order screen). One click delivers the document’s secure share link straight to the customer — no need to open WhatsApp yourself.
* Smart delivery — inside WhatsApp’s 24-hour customer-service window it sends your editable session message; outside it, it automatically falls back to your pre-approved message template. Every send is a manual click — nothing is ever sent automatically.
* Opt-in, private, and off by default — the free click-to-chat button still works with zero setup. Server-send stays completely inert until you enable it AND save your own credentials under Settings Automations WhatsApp Cloud API. Your access token is stored encrypted and never shown again; the only network request goes to your own Meta account (graph.facebook.com), and only when you click send. Existing sites are unaffected.
Release “POLISH” (part 4) — compliance field packs.
* Seller tax IDs on documents — add your VAT, GST/HST and a generic Tax ID in Settings Company details, then switch them on per document type under Settings Compliance field packs. They print in your company block alongside EIN / D-U-N-S. Off by default, so existing documents are unchanged.
* EU reverse-charge note — print a reverse-charge statement (editable; defaults to the Art. 196 wording) on documents. In automatic mode it appears only where reverse charge actually applies — intra-EU B2B: your EU VAT number plus a VAT-registered customer in another EU country — or you can set it to always print on the enabled document types.
* Note only, never touches your totals — the plugin states the compliance position; you stay in control of the VAT rate. Everything is opt-in per document type and makes zero external requests.
Release “POLISH” (part 3) — WhatsApp delivery (click-to-chat).
* Send a document’s link on WhatsApp — each generated document gets a WhatsApp button, both on the WooCommerce order screen and on the Documents manager. Click it and WhatsApp opens (app or web) with the customer’s number and a message containing the document’s secure share link, ready to send.
* Zero setup, zero external requests — it uses WhatsApp’s own wa.me click-to-chat, so there are no API keys, no configuration, and the plugin itself never contacts WhatsApp; your own WhatsApp does the sending. Nothing changes for existing sites until you click the button.
* Smart phone handling — the recipient’s number is taken from the order’s billing phone (or the customer record) and turned into international format using the billing/store country, so national-format numbers work; if a number can’t be resolved, WhatsApp simply lets you pick the contact.
Release “POLISH” (part 2) — client acceptance (“e-sign”).
* “Accept” button on a document’s share link — turn it on per document type (typically a proforma or quote) under Settings Client acceptance. Off by default, so nothing changes for existing sites until you opt a type in.
* Records who accepted — the client types their name, ticks an agreement box and accepts; their name, the date and time, and their IP address are recorded. It’s a simple, honest online acceptance — clearly labelled as not a legally binding electronic signature.
* Accepted stamp on the PDF — once accepted, every invoice design (all 10 stock layouts and your custom templates) shows an “Accepted online by …” stamp. Two new template tags, {accepted_by} and {accepted_on}, are available in the builder.
* Visible in the admin — a WooCommerce order shows who accepted each document on the order screen and logs a private order note; the share viewer shows the recorded acceptance in place of the button.
* Still makes zero external requests: the whole flow is on your own site.
Release “POLISH” (part 1) — partial payments & deposits.
* Record partial payments / deposits against any document — each with a date, amount, method and note. On a manual invoice, a new Payments panel on the New / Edit invoice screen; on a WooCommerce order, a Payments box on the order screen (classic and HPOS), saved with the order.
* Balance due on the PDF — once a payment is recorded, every invoice design (all 10 stock layouts and your custom templates) prints an Amount paid and Balance due pair beneath the total. Two new template tags, {amount_paid} and {balance_due}, are available in the builder.
* Dashboard shows what’s really outstanding — the “Unpaid outstanding” figure now counts the remaining balance (total minus payments received), not the gross total, so a half-paid invoice shows only what’s still owed.
* Respects the WooCommerce order status — balance due shows only on orders still awaiting payment (Pending / On hold); Processing and Completed count as paid, and cancelled / failed / refunded orders show no balance.
* No behaviour changes for existing sites: a document with no recorded payment prints and counts exactly as before, and the feature still makes zero external requests.
Listing & documentation update — no functional code changes.
* Expanded the plugin description into a full, sectioned feature overview.
* Grew the screenshot gallery from 7 to 30 — the dashboard, Documents manager, WooCommerce order screen, the visual template builder, System Check, Italian FatturaPA, cloud backup, the public invoice-builder pages (builder, My Account tab, standalone dashboard, sign-in) and every settings tab and setup-wizard step.
* No change to code behaviour; existing sites are unaffected, and the plugin still makes zero external requests by default.
Release “COMPLY” (part 3) — Italian electronic invoicing (FatturaPA XML).
* FatturaPA export — for Italian sellers, generate the official FatturaPA 1.2 XML (FPR12) for any invoice or credit note: a per-document “FatturaPA XML” button in the Documents table, plus a bulk “Export FatturaPA” that ZIPs every document matching your current filters.
* Validated against the official schema — every file is checked against the Agenzia delle Entrate XSD (bundled locally) before it is offered for download, so you never get a malformed file. A new System Check “FatturaPA XML validates” row confirms the pipeline at a glance.
* New “Italy” settings tab — enter your Partita IVA, Codice Fiscale, Regime Fiscale, PEC, registered office (Sede) and transmitter details, plus a Natura code for zero-rated lines. Off by default; nothing Italian appears until you enable it.
* Honest scope — this produces a compliant XML file for you to download. It does not transmit to the Sistema di Interscambio (SDI) — send it via your intermediary or the AdE portal. Where a document cannot be mapped cleanly (a customer with no Partita IVA / Codice Fiscale, a 0% line with no Natura mapping, an unsupported document type), the export is refused with a clear message rather than guessing. For Italian stores — verify the output with your commercialista before first transmission.
* Still zero external requests: the schema is bundled and validated locally; the feature makes no network calls.
Release “INSIGHT” (part 3) — order fulfillment stages + document exports.
* Fulfillment stages — track where each order is with a simple, safe flow: In packaging Dispatched In transit Delivered. Set the stage from a dropdown on the order screen (in the Shipment info box) or inline in the Documents table. It’s a parallel status that never touches WooCommerce’s own order statuses, so it stays out of the way of every other plugin and automation.
* Live stage counters — the dashboard shows how many orders sit in each stage right now (“In packaging: 5 · Dispatched: 3 · In transit: 2”).
* Optional stage emails — turn on a customer email for any stage (Settings Automations “Fulfillment stage emails”). Each is off by default and uses the same tag system as reminders, including the new {stage} tag and the shipment/tracking tags — so the “Dispatched” email can carry the carrier and tracking link automatically.
* On the paperwork — the current stage is printed on packing slips, and every stage change is logged as a private note on the order for a clean history.
* Document exports — export the Documents list as CSV or XML for your accountant or bookkeeping tool; the export respects whatever filters (type, status, source, stage, date range, search) you have applied. Each document can also be exported as a single UBL-lite XML file (line items included). These are generic accounting exports and make no e-invoicing-compliance claim.
* Expert option — advanced users can switch stages to real custom WooCommerce order statuses instead of the safe parallel meta (Settings Advanced). Off by default, with the trade-offs spelled out on the screen.
* No behaviour changes for existing sites: every new toggle is off by default, and the whole feature still makes zero external requests.
Release “INSIGHT” (part 2) — storefront analytics + guest builder.
* Storefront visitor analytics (opt-in) — a privacy-first, local-only view of product-page and builder-page traffic, top-viewed products, and a daily trend, right on the dashboard. Aggregate day counts only — no personal data, no IP, no cookies, and zero external requests. Off by default.
* Guest invoice builder — optionally let signed-out visitors use the public builder.
Release “INSIGHT” (part 1) — the Profit / Loss dashboard.
* Profit / Loss at a glance — a redesigned dashboard with Revenue, Item costs, Gross profit and Margin %, Tax collected, Refunds and Unpaid outstanding, a month/quarter/year/custom period switcher, inline charts, a monthly breakdown and top products — all exportable to CSV. Honestly labelled “Gross profit (revenue − item costs)”: this is sales & margin at a glance, not double-entry accounting.
* Product cost prices — a “Cost price” field on the WooCommerce product screen feeds the margin maths (with a nudge for products still missing a cost).
Release “FRONTEND” (part 2) — a polished, mobile-first experience for the public builder.
* Mobile-first everywhere — the builder, the invoices list, and the login/register screens are fully responsive; on a phone the invoices table folds into tidy labelled cards with full-width, easy-to-tap actions.
* A friendlier “My invoices” — search with clear, distinct empty states (nothing yet vs. no matches), a “+ New invoice” button, colour-coded status badges, a one-tap Copy button for share links, and confirmation before a delete.
* Live preview, refined — the builder’s preview shows an “Updating…” status while it renders and a friendly placeholder on first paint, and quietly recovers from the occasional hiccup.
* Toasts — short, unobtrusive on-screen confirmations (for example “Share link copied”) that never get in the way, layered on top of the existing after-submit messages.
* Self-contained accounts — a single, clean card with a Log in / Create account toggle where new users pick their own password and are signed straight in, plus an on-site “Forgot your password?” flow that emails a reset link and lets people choose a new password without ever seeing a WordPress login screen.
* Your details, remembered — the builder now also saves your website, bank name and IBAN/account number alongside your company details and logo, and fills them all in automatically the next time you create a document.
* One dashboard for your customers — a new [sgci_dashboard] shortcode puts a user’s invoices and a “Create invoice” builder together on one page as simple tabs, with a clean sign-out. Any logged-in user can create documents and sees only their own.
* Merges into WooCommerce My Account — when WooCommerce is active, an “Invoices” tab appears in My Account with the same view-and-create dashboard. A new setting (SoftGlaze Invoices Settings Frontend “User dashboard”) lets you choose where it lives: both the standalone page and the My Account tab (default), the My Account tab only, or the standalone page only. Without WooCommerce, the standalone page is always used.
* Cross-linked pages — point the builder at your invoices page and vice-versa with simple shortcode attributes ([sgci_invoice_builder my_invoices="/my-invoices/"] and [sgci_my_invoices builder="/create-invoice/"]), so the “New invoice” button and the empty-state call-to-action just work.
* The readme now walks you through assembling a complete standalone invoice-builder website from the shortcodes. No behaviour changes for existing sites — the frontend stays off until you switch it on, and the whole feature still makes zero external requests.
Release “FRONTEND” — a public invoice-builder site your visitors can use.
* Four new shortcodes — [sgci_invoice_builder] (a full builder: your company details saved per user, client, line items, currency, design picker, a live preview, and Generate PDF + share link), [sgci_my_invoices] (each user’s own documents: search, download, duplicate, share, delete), and [sgci_register] / [sgci_login] (thin wrappers over WordPress accounts). Put one shortcode per page and you have a complete freeinvoicebuilder.com-style site — any membership plugin works alongside it.
* Private by design — every document a visitor creates is owned by that visitor. One user can never see, download, or touch another user’s invoices, and a direct link to someone else’s document returns “not found”.
* A new “Frontend” settings tab — one master on/off switch (a kill-switch that instantly hides every frontend page), which of your saved templates the builder may offer (un-ticked templates stay private), a documents-per-user-per-day limit (default 20), a preview-render rate limit, the default currency, and default terms text.
* Safe by default on update — the builder is off on existing sites after updating (so no public surface appears unbidden) and on for brand-new installs. Every form is nonce- and honeypot-protected and rate-limited; uploaded logos go through WordPress media handling (images only, size-capped); and the whole feature makes zero external requests, like the rest of the plugin.
For the changelog of earlier releases (2.5.0 through 2.15.1), see changelog.txt.