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
- Invoices, packing slips, proforma invoices and credit notes — one template engine, four faces. Each document type uses a stock design or a custom template you build, at the paper size you choose (A4 / Letter).
- Credit notes on refund — refund an order and a credit note is offered automatically, referencing the original invoice.
- Receipts — an optional "Receipt vs Invoice" choice at checkout, with its own template and (optionally) its own number sequence.
- Delivery notes — print carrier, tracking number, shipping and expected-delivery dates on the invoice and/or packing slip (opt-in, per type).
Numbering that fits your books
- Sequential auto-numbering with prefix/suffix,
{YYYY} / {MM} placeholders, zero-padding and yearly reset — or simply reuse the WooCommerce order number or the raw order ID.
- Separate, race-safe sequences for credit notes and proforma invoices, each with its own start / prefix / suffix / padding.
- Migrating from another plugin? Detect existing YITH / WebToffee numbers and continue your sequence from the highest, so numbering stays unbroken.
Automation
- Auto-generate documents on the order statuses you choose.
- A configurable document × WooCommerce-email matrix — attach the right document to the right transactional email (e.g. the invoice on "Completed", the packing slip on "Processing").
- Fulfillment stages — a safe parallel flow (In packaging → Dispatched → In transit → Delivered) that never touches WooCommerce's own order statuses, with live dashboard counters, optional per-stage customer emails, and the current stage printed on packing slips.
- Payment reminders — automatically email customers past their due date at the day-offsets you set; reminders stop the moment an order is paid.
- Accountant export — on a chosen day each month, email your accountant a ZIP of last month's invoice PDFs plus a CSV index. A global kill-switch pauses every automated email at once.
A real admin, not just a settings page
- A Profit & Loss dashboard — Revenue, Item costs, Gross profit, Margin %, Tax collected, Refunds and Unpaid outstanding, with a month / quarter / year / custom switcher, inline charts, a monthly breakdown and top products, all exportable to CSV. (Honestly labelled "gross profit = revenue − item costs" — sales-and-margin at a glance, not double-entry accounting.)
- A searchable, filterable Documents manager with bulk actions — generate, email, or download a ZIP — across both WooCommerce and manual documents, with source / type / status / stage / date filters.
- A Products table mirroring your WooCommerce catalogue (thumbnail, SKU, price, cost, stock) with a Cost price field that feeds the margin maths, plus branded product-catalog PDFs.
- On the WooCommerce order screen: generate / view / email documents, set the fulfillment stage, and record carrier & tracking — on both the classic and HPOS order screens. There's also an Invoice column and bulk actions on the orders list, and a "Download invoice" button in My Account.
- A built-in System Check page (and WordPress Site Health tests) that verifies PHP, extensions, storage and the engine, and renders a live sample PDF so you can confirm it works before you rely on it.
- A guided first-run setup wizard for company details, currency and numbering (with a live invoice-number preview).
Design your documents visually
- A drag-and-drop template builder: reorder sections (header, bill-to, meta, items, totals, payment, terms, signature, plus text / divider / spacer and a sanitised custom-HTML block), toggle what each shows, and choose which item columns print.
- Design tokens — colours, a bundled dompdf-safe font, base size, heading case, corner radius, header / totals style, logo position and your uploaded logo.
- A side-by-side live preview renders through the real engine as you edit, plus an "Exact PDF" button — what you preview is exactly what generates. Start from any of 10 stock designs, and export / import templates as JSON between sites.
- Two layout modes — Flow and Canvas. Flow stacks sections down the page; Canvas places blocks freely — drag to move, resize with corner/edge handles, nudge with the arrow keys, and layer them front-to-back. Blocks are positioned as a percentage of the page, the same coordinates the PDF uses, so the layout you build is the layout that prints. Existing templates stay in Flow mode.
Works with or without WooCommerce
- Manual invoices — a full "New invoice" screen: saved clients (de-duplicated by email), unlimited line items (quantity, unit price, cost, tax rate), currency, date, template and status. A race-safe number is assigned, the PDF is stored, and a share link is ready — even with WooCommerce switched off.
- A public invoice-builder website — four shortcodes (
[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
- Public share links — a tokenised, no-login viewer page with single-PDF download, per-document expiry (7 / 30 / 90 days or never), regenerate and revoke, and an optional QR code printed on the PDF.
- Send any document by email from the order screen or the Documents manager, with an editable recipient / subject / message, dynamic
{tags} filled in on send, and a logged send history.
Payments, deposits & client acceptance
- Partial payments and deposits — record payments against any document (date, amount, method, note). Once a payment exists, the PDF prints an Amount paid and Balance due pair beneath the total (on all 10 stock designs and your custom templates), the dashboard's "Unpaid outstanding" counts the remaining balance, and two tags —
{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).
- Online client acceptance — turn on an "Accept" button on the public share link, per document type (typically a proforma or quote; off by default). The client types their name, ticks an agreement box and accepts; their name, the date/time and IP are recorded, an "Accepted online by …" stamp is added to the PDF, and the order screen logs who accepted. It is a clear, honest online acceptance — not a legally binding electronic signature.
WhatsApp delivery
- Click-to-chat (free, zero setup) — every generated document gets a WhatsApp button on the order screen and the Documents manager. It opens WhatsApp (app or web) with the customer's number and a message containing the document's secure share link; your own WhatsApp sends it. There are no API keys, and the plugin makes no request of its own.
- Cloud API server-send (optional) — connect your OWN Meta WhatsApp Business Cloud API and a "Send on WhatsApp now" action delivers the share link to the customer directly from your server. Inside WhatsApp's 24-hour customer-service window it sends your session message; outside it, it falls back to your pre-approved template. It is off by default, your access token is stored encrypted, and nothing is ever sent automatically.
Compliance & exports
- VAT / fiscal-code at checkout (classic and block checkout) — each field independently optional or required, scoped to all countries / EU only / a country list, with per-country VAT format checks, the Italian Partita IVA & Codice Fiscale checksums, and an optional EU VIES online lookup (off by default).
- Italian e-invoicing (FatturaPA) — generate the official FatturaPA 1.2 (FPR12) XML for invoices and credit notes, per-document or as a bulk ZIP, validated locally against the Agenzia delle Entrate schema before download. Honest scope: it produces the XML file — it does not transmit to the SDI, and it refuses to guess when data can't be mapped cleanly.
- Accounting exports — the Documents list exports to CSV or XML (respecting your active filters), and each document to a UBL-lite XML. Product lists export to CSV / XML too.
- Compliance field packs — show your seller VAT, GST/HST and a generic Tax ID in the company block (per document type, off by default), and print an editable EU reverse-charge note (defaults to the Art. 196 wording). In automatic mode the note appears only where reverse charge actually applies — intra-EU B2B with your EU VAT number and a VAT-registered customer in another EU country — or you can set it to always print. The note is informational; it never changes your tax totals.
Multi-language & right-to-left documents
- Print the customer-facing document in a chosen language — a store default under Settings → Documents → Language & direction, or per document (on the invoice editor and the WooCommerce order screen). The built-in labels (Invoice, Bill To, Subtotal, Tax, Total, and the rest) translate automatically.
- French, German, Spanish, Dutch, Italian, Portuguese and Hebrew are built in; Hebrew (and other right-to-left languages) render the whole document right-to-left using the bundled font, with no extra setup. With no language chosen, documents render exactly as before, and your admin screens stay in English. (Arabic is not offered yet — the bundled PDF engine cannot join Arabic letters correctly.)
Cloud backup (optional, off by default)
- Copy every generated document to your own Dropbox or Google Drive, mirroring the local folder layout (
/SoftGlaze Invoices/{Year}/{Month}/).
- You use your own app credentials via a standard OAuth flow — there is no SoftGlaze server in the middle. Refresh tokens are stored encrypted at rest on your server.
- Background uploads with automatic retry, a "Backup everything now" backfill, and a disconnect that revokes and deletes the stored tokens. Nothing is uploaded — and no backup task is even scheduled — until you connect an account.
Privacy, security & compatibility
- Zero external requests by default. The PDF engine always renders locally; the only opt-in network features are the EU VIES check, cloud backup and WhatsApp Cloud API sending, each disclosed here and in a settings notice.
- HPOS (High-Performance Order Storage) compatible; all order data is read through WooCommerce CRUD.
- Generated files live in a protected uploads directory (deny-all + index guard) and are served only through capability- and ownership-checked endpoints — a direct link to someone else's document returns "not found".
- Every feature added since your current version is off by default and update-safe: an existing store's checkout, documents, emails and numbering are unchanged until you opt in.
- Developer-friendly — human-readable React source ships in
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.
- Upload the plugin folder to
/wp-content/plugins/ (or install the ZIP from Plugins → Add New).
- Activate it through the Plugins screen.
- Open SoftGlaze Invoices → Settings and fill in your company, logo, bank and numbering details (they are pre-filled from your site and WooCommerce store).
- Open a WooCommerce order and click Generate Invoice PDF, or let auto-generation handle it on your chosen statuses.
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.
2.28.3
- Compliance field packs (seller VAT / GST / Tax-ID display and the EU reverse-charge note) now live under Settings, in the Documents tab, so they work on manual invoices and in standalone mode - not only when WooCommerce is active.
- Fresh installs no longer attach a packing slip to the New Order email by default, so an invoice-first store gets one document per order instead of two. Existing stores keep their current setting.
2.28.2
Housekeeping — no functional changes.
- Pointed the in-plugin "Documentation" link to the plugin's own manual page.
2.28.1
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.
2.28.0
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.
2.27.0
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.)
2.26.0
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.
2.25.0
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.
2.24.0
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.
2.23.0
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.
2.22.0
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.
2.21.1
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.
2.21.0
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.
2.20.0
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.
2.19.0
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.
2.18.0
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).
2.17.0
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.
2.16.0
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.