WDOnline Invoice Payment for WooCommerce

Description

WDOnline Invoice Payment for WooCommerce adds a B2B-friendly invoice payment gateway where payment terms belong to the customer rather than the order date.

Core behavior:

  • Enable or disable invoice payment globally.
  • Configure a global default payment term.
  • Configure invoice eligibility and payment terms by WordPress user role.
  • Create new user roles from the User roles tab by safely copying permissions from an existing role.
  • Review all user roles and safely delete unused roles created through this plugin.
  • Override invoice eligibility and payment terms for individual customers.
  • Show a dynamic checkout title such as “Invoice – 30 days”.
  • Save the customer’s payment terms on the order at checkout.
  • Keep invoice date and due date separate from the order date.
  • Calculate the due date only after an invoice date has been entered or the order has been marked as invoiced.
  • Store an optional invoice number on the order.
  • Upload an externally generated PDF invoice to an order and make it available through a protected customer download.
  • Keep invoice PDFs outside the WordPress Media Library under random internal filenames with server access-deny rules.
  • Mark invoices as paid or unpaid independently of the WooCommerce order status.
  • Display payment terms, invoice date and due date in order emails and My Account.
  • Display invoice due information in the WooCommerce order list.
  • Supports WooCommerce HPOS and Checkout Blocks.
  • Set global, role-based, or individual customer credit limits.
  • Treat a credit limit of 0 as unlimited credit.
  • Track each customer’s open invoice balance, available credit, and overdue balance.
  • Include not-yet-invoiced invoice orders in credit exposure to prevent customers from exceeding their limit before invoicing.
  • Optionally block invoice payment when overdue invoices exist.
  • Configure an overdue grace period and override overdue blocking by role or individual customer.
  • Show a clear checkout notice when invoice payment is unavailable because the credit limit is exceeded or overdue invoices block new invoice orders.
  • Let the store customize the credit-limit checkout message with credit limit, available credit, and order total placeholders.
  • Show invoice payment status directly in the customer My Account order list.
  • Show paid, due, and overdue messages on individual order pages.
  • Add a dedicated My Account > Invoice payments page with credit summary, overdue balance, and invoice order history.
  • Optionally hide the customer’s credit-limit and available-credit values independently from the My Account invoice summary without changing credit enforcement.
  • Customize the customer My Account menu label and invoice-page heading without changing the endpoint URL.
  • Review invoice-payment orders from the dedicated, paginated Invoice orders tab with WooCommerce order-status filtering.
  • Fully translatable with standard WordPress gettext translation files and Loco Translate.
  • Includes a translation template in the plugin languages folder.
  • Add a WordPress Dashboard widget with key invoice-payment KPIs for store managers.
  • Filter dashboard sales statistics by Today, Yesterday, week, month, year, all time, or a custom date range.
  • Show invoice sales, order count, customer count, average invoice order value, paid invoices, and largest customer for the selected period.
  • Show Top 5 invoice customers for the selected period.
  • Track payment dates for newly marked paid invoices and calculate average payment time.
  • Show current outstanding balance, overdue balance, and invoices due within the next 7 days.
  • Store daily balance snapshots and show outstanding-balance development when enough history is available.
  • Cache dashboard statistics for performance and automatically refresh them when WooCommerce orders change.
  • Optional integration with WD Online Support Diagnostics for read-only health checks and temporary privacy-safe error logging.

The due date is intentionally not calculated when the customer places the order. For example, an order placed on September 1 with 30-day terms and invoiced on September 5 will be due on October 5.

Developer Notes

Available filters:

  • wdonline_ipw_customer_eligible
  • wdonline_ipw_terms_days
  • wdonline_ipw_due_date
  • wdonline_ipw_credit_limit
  • wdonline_ipw_block_overdue
  • wdonline_ipw_account_summary
  • wdonline_ipw_credit_decision
  • wdonline_ipw_dashboard_stats

Installation

  1. Upload the plugin ZIP through Plugins > Add New > Upload Plugin.
  2. Activate the plugin.
  3. Go to WD Online > WDOnline Invoice Payment for WooCommerce.
  4. Configure global and role defaults.
  5. Edit individual WordPress users to override invoice access or payment terms where required.

FAQ

Can a customer choose their own payment term in checkout?

No. The payment term is assigned by the store through the customer’s individual setting, role default, or global default.

When is the due date calculated?

Only when the order has an invoice date. Enter an invoice date in the order editor or use the “Mark as invoiced” button.

What happens if I change a customer’s payment term later?

Existing orders keep the payment term that was saved when the order was placed.

Are guest customers allowed to pay by invoice?

No. A logged-in customer is required so invoice access, payment terms, credit limit, and overdue rules can be resolved safely.

What counts toward the credit limit?

All open WDOnline Invoice Payment orders that have not been marked as paid, including orders that have not yet been invoiced. Cancelled, failed, and fully refunded orders are excluded.

When is an invoice overdue?

An invoice becomes overdue after its due date plus the configured grace period.

Can the plugin be translated?

Yes. All plugin interface strings use the WordPress gettext translation system. The plugin includes a POT template in the languages folder and is compatible with Loco Translate and standard PO/MO translation workflows. Customer-facing checkout title, description, instructions, and credit-limit message can also be edited directly in the plugin settings.

Are uploaded invoice PDFs public?

No. Invoice PDFs are not added to the WordPress Media Library and no public file URL is shown. They are stored under random internal filenames in a directory protected by Apache and IIS access-deny rules. Downloads are streamed through WordPress only after login, order ownership or administrator permission, and a security nonce have been verified.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“WDOnline Invoice Payment for WooCommerce” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

0.6.29

  • Fixed an incorrect upload error after removing an invoice PDF without selecting a replacement file.
  • Allowed an existing PDF to be removed and optionally replaced during the same order update.

0.6.28

  • Fixed infinite recursion during invoice PDF uploads caused by resolving the upload directory from inside the upload directory filter.
  • Reused WordPress’ already resolved base upload path when routing invoice PDFs to protected private storage.

0.6.27

  • Removed the Plugin URI and Author URI headers because WordPress.org could not access those URLs reliably.
  • Added explicit nonce and capability validation to the invoice due-status and dashboard date filters.
  • Updated protected invoice downloads to use WordPress admin referer validation.
  • Reworked PDF uploads to use the WordPress upload API while retaining protected private storage and additional PDF validation.
  • Replaced the generic WD Online menu slug with the plugin-specific wdonline-ipw slug.

0.6.26

  • Added a separate setting to hide Available invoice credit from the customer My Account invoice summary.
  • Made both customer credit display settings dependent on the Invoice balance and history feature.
  • Enforced the new dependency in both the administration interface and server-side settings validation.

0.6.25

  • Fixed the My Account Invoice payments endpoint returning a 404 page after the customer-account feature was enabled in settings.
  • Registered the endpoint independently of its optional customer-facing interface so rewrite refreshes always include it.
  • Refreshed rewrite rules automatically when the customer invoice balance and history feature changes status.

0.6.24

  • Made the customer credit-limit display setting dependent on the customer invoice balance and history feature.
  • Disabled and cleared the credit-limit display option immediately when its parent customer-account feature is turned off.
  • Enforced the same dependency when settings are saved.

0.6.23

  • Displayed the uploaded invoice PDF filename directly above the View current PDF button in the order editor.
  • Stored the sanitized original filename separately while retaining the random protected storage filename.

0.6.22

  • Fixed the credit-limit notice so it remains visible when invoice payment is the only available gateway.
  • Added a dedicated checkout fragment that refreshes the credit message when the cart total changes.
  • Added a debounced checkout refresh for compatibility with quantity controls that update the cart through a separate AJAX request.
  • Kept the displayed order total, gateway availability, and credit-limit calculation synchronized after checkout quantity changes.

0.6.21

  • Updated the Plugin URI to the current public WD Online product page.
  • Aligned the plugin folder, main file, text domain, and translation template with the intended WordPress.org slug.
  • Replaced direct temporary-file and protection-file reads and writes with the WordPress filesystem implementation.
  • Documented the intentional streamed PDF response and updated the Invoice orders description to refer to its current tab.

0.6.20

  • Added guidance explaining where individual customer payment terms can be configured.
  • Added a complete user-role list to the User roles tab, including role slugs and assigned-user counts.
  • Added protected deletion for unused roles created through this plugin.
  • Prevented deletion of WordPress, WooCommerce, third-party, and in-use roles.
  • Removed saved invoice-payment rules when their plugin-created role is deleted.

0.6.19

  • Combined Gateway, Invoice orders, and User roles on the main plugin administration page as tabs.
  • Removed the separate Invoice orders and User roles items from the WD Online sidebar menu.
  • Redirected legacy administration links to the corresponding new tabs.
  • Kept the User roles tab restricted to administrators.
  • Standardized the support box text and preserved the PayPal or card support link.

0.6.18

  • Added an administrator-only User roles submenu under WD Online.
  • Added secure user-role creation with a custom display name and optional technical slug.
  • Added the option to copy capabilities from an existing role, with WooCommerce Customer selected by default.
  • New roles automatically become available in the invoice payment Role defaults table.

0.6.17

  • Added an option to hide the Credit limit row from the customer Invoice payments account page without changing credit-control calculations.
  • Added an Invoice orders submenu with a paginated overview of orders placed using invoice payment.
  • Added filtering of the Invoice orders overview by WooCommerce order status.

0.6.16

  • Replaced remaining legacy short HTML, CSS, and private-directory identifiers with the plugin-specific wdonline-ipw- prefix.
  • Updated the WooCommerce payment-method description to use the current settings submenu name.
  • Added a translatable support and donation section at the bottom of the plugin settings page.

0.6.15

  • Changed the WD Online submenu page title and menu label to “WDOnline Invoice Payment for WooCommerce”.

0.6.14

  • Renamed the plugin display name to “WDOnline Invoice Payment for WooCommerce” to match the WDOnline plugin naming convention.
  • Updated related user-facing plugin name references, diagnostics labels, and translation metadata.
  • Kept the plugin folder, filename, text domain, and technical slug unchanged.

0.6.13

  • Deferred component initialization that can resolve translated default settings until the WordPress init hook.
  • Deferred registration of the optional diagnostics provider until init.
  • Prevented WordPress 6.7 and later from reporting that the plugin and WooCommerce text domains were loaded too early.

0.6.12

  • Replaced all plugin-owned short wdo_ identifiers with the unique wdonline_ipw_ prefix across PHP, JavaScript, CSS, settings, metadata, hooks, nonces, cron events, payment gateway identifiers, and asset handles.
  • Renamed plugin classes, constants, and include files to use the matching WDONLINE_IPW_ and wdonline-ipw- naming conventions.
  • Updated the optional diagnostics integration to the official wdonline_sd_providers and wdonline_sd_log interface.
  • Updated the Plugin URI to the plugin-specific public page on wdonline.dk.
  • No legacy aliases or data migration were added because there are no official installations of the plugin.

0.6.11

  • Added separate settings for the customer My Account menu label and invoice-page heading.
  • Kept the existing invoice-payments endpoint unchanged to preserve existing account links.
  • Empty label fields safely fall back to the translatable default “Invoice payments” text.

0.6.10

  • Fixed PDF uploads from the classic WooCommerce order editor by enabling multipart file submission on the order form.
  • Added compatibility code that applies the same upload encoding to the HPOS order editor form.
  • Added a clear Upload PDF or Replace PDF submit button directly below the file selector.
  • Clarified that uploading the PDF also saves other changes made to the order.

0.6.9

  • Replaced the direct PHP upload move and writable check with WordPress filesystem APIs.
  • Made the existing order nonce verification explicit inside private invoice document processing for Plugin Check compatibility.
  • No invoice-document access, customer-history, layout, checkout, or credit-control behaviour was changed.

0.6.8

  • Added optional private PDF invoice uploads to individual invoice-payment orders.
  • Added protected invoice downloads for authorised administrators and the customer who owns the order.
  • Stored invoice files under random internal filenames in a web-blocked private directory and never exposed a public media URL.
  • Added customer Invoice PDF links to invoice order history when a document is available.
  • Added a feature switch for external invoice PDFs; it is enabled by default for backward compatibility.
  • Corrected invoice-history column sizing and alignment on desktop while preserving WooCommerce’s responsive mobile layout.

0.6.7

  • Documented and narrowly exempted the admin-only HPOS invoice-status meta query from the generic slow-query sniff.
  • No invoice filtering, feature-module, checkout, credit-limit, or customer-account behavior was changed.

0.6.6

  • Added optional feature controls for customer profile invoice settings, order-list invoice status, individual-order invoice management, the Dashboard overview, and customer My Account invoice balance/history.
  • All optional features remain enabled by default for backward compatibility.
  • Disabling a feature hides its interface without deleting stored invoice data or changing checkout and credit-limit behavior.
  • Added privacy-safe diagnostics reporting for each optional feature’s enabled or disabled state.

0.6.5

  • Added an Invoice due filter to both the HPOS and legacy WooCommerce order lists.
  • Orders can be filtered by overdue, due but not overdue, paid, or not invoiced status.
  • Overdue filtering respects the configured overdue grace period.

0.6.4

  • Added optional compatibility with WD Online Support Diagnostics using the standard read-only provider interface.
  • Added diagnostics for plugin/version state, WooCommerce dependency, settings format and ranges, checkout hooks, and the daily dashboard snapshot cron event.
  • Added privacy-safe temporary checkout failure events while diagnostic logging is active. No customer IDs, order IDs, email addresses, IP addresses, URLs, or payment amounts are logged.
  • Diagnostics remains fully optional and does not change normal invoice-payment behaviour when the support plugin is not installed.

0.6.3

  • Fixed the credit-limit checkout notice during AJAX quantity changes in the classic WooCommerce checkout.
  • Replaced WooCommerce’s generic “no available payment methods” notice with the invoice credit explanation when invoice credit rules are the reason no payment method remains.
  • Prevented duplicate credit notices when invoice payment is the only configured payment method.
  • Updated the WD Online support/donation link.

0.6.2

  • Added nonce protection to the Dashboard date-range filter and preserved the filter securely when refreshing statistics.
  • Improved sanitization of custom Dashboard date inputs to satisfy WordPress Plugin Check.
  • Removed the paid-invoice meta query from Dashboard statistics and filter paid invoice status in PHP to avoid the Plugin Check slow meta-query warning.
  • No existing invoice, credit, checkout, or customer-account behavior was changed.

0.6.1

  • Removed version-specific helper notices from the Dashboard widget now that the plugin is still in private testing.
  • Simplified the Payments recorded and Outstanding balance change KPI displays.

0.6.0

  • Added a date-range selector to the WordPress Dashboard invoice overview with Today, Yesterday, This week, Last week, This month, Last month, Last 30 days, This year, Last year, All time, and custom date ranges.
  • Added period-specific invoice sales, invoice order count, customer count, and average invoice order value.
  • Added Top 5 invoice customers for the selected period.
  • Added payment-date tracking when an invoice is marked as paid.
  • Added average payment time from invoice date to recorded payment date. Existing paid invoices without a recorded payment date are excluded from this metric.
  • Added current balance for invoices due within the next 7 days.
  • Added daily outstanding and overdue balance snapshots for future balance-development reporting.
  • Added an outstanding-balance change KPI when sufficient snapshot history is available.
  • Added a daily WP-Cron snapshot task and cache-versioned dashboard statistics.
  • Kept current outstanding, overdue, and due-soon figures separate from the selected historical sales period to avoid misleading historical balance figures.

0.5.0

  • Added an Invoice Payment Overview widget to the main WordPress Dashboard for users who can manage WooCommerce.
  • Added total invoice sales and current-month invoice sales.
  • Added total outstanding balance, overdue balance, open-order count, and overdue-invoice count.
  • Added paid invoice count/value and invoice customer count.
  • Added largest invoice customer by historical invoice sales with a direct customer edit link.
  • Added automatic dashboard-statistics cache invalidation when WooCommerce orders change and a manual Refresh data link.
  • Added dashboard-specific responsive styling and translatable dashboard strings.

0.4.1

  • Fixed Plugin Check output-escaping warnings for payment-term values.
  • Improved sanitization of customer credit, payment-term, global credit-limit, and role-rule input.
  • Removed the discouraged explicit load_plugin_textdomain() call; translations remain compatible with WordPress language packs and Loco Translate.
  • Removed bundled PO/MO files to follow WordPress.org translation handling; the POT template remains included for translators.
  • Avoided a translated plugin-name trademark warning during Plugin Check.

0.4.0

  • Added explicit WordPress text-domain loading for bundled and custom translations.
  • Added a POT translation template for all plugin strings.
  • Added full compatibility with Loco Translate and standard PO/MO translation workflows.
  • Added a bundled Danish translation (da_DK).
  • Kept English as the plugin source/default language.

0.3.1

  • Improved the checkout message shown when invoice payment is hidden because the order exceeds the customer credit limit.
  • The message now shows the customer credit limit, available credit, and current order total.
  • Added a customizable credit-limit checkout message under WD Online > Invoice Payment.
  • Added {credit_limit}, {available_credit}, and {order_total} placeholders for the checkout credit-limit message.
  • Reused the same customer-facing credit message during server-side checkout validation.

0.3.0

  • Added a customer-facing checkout notice when the invoice credit limit is exceeded.
  • Added a checkout notice when overdue invoices block invoice payment.
  • Added an Invoice status column to My Account > Orders.
  • Added paid, due, not-invoiced, and overdue messages to My Account order details.
  • Added a dedicated My Account > Invoice payments endpoint and menu item.
  • Added customer invoice account summary with open balance, credit limit, available credit, and overdue balance.
  • Added invoice order history with invoice number, invoice date, due date, amount, status, and order link.
  • Added automatic rewrite-rule refresh on plugin version changes for the new My Account endpoint.

0.2.0

  • Added global, role-based, and individual customer credit limits.
  • Added open invoice balance and available credit calculations.
  • Added overdue invoice balance and overdue order counts.
  • Added optional blocking of invoice payment when overdue invoices exist.
  • Added configurable overdue grace period.
  • Added role and customer overrides for overdue blocking.
  • Added credit information to customer profiles, the Users list, and invoice order admin boxes.
  • Added server-side credit validation when invoice payment is processed.
  • Added credit-limit snapshot metadata to invoice orders.
  • Updated overdue display logic to respect the configured grace period.

0.1.0

  • Initial development release.
  • Added customer-, role- and global invoice payment settings.
  • Added WooCommerce invoice payment gateway.
  • Added order-level snapshot of payment terms.
  • Added manual invoice date, due date calculation and invoice number.
  • Added invoice paid/unpaid status.
  • Added customer email and My Account invoice information.
  • Added WooCommerce order list due-date column.
  • Added HPOS and Checkout Blocks compatibility declarations and integration.