{"id":374805,"date":"2026-09-25T06:32:48","date_gmt":"2026-09-25T06:32:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/unpaid-order-guard-for-woocommerce\/"},"modified":"2026-09-30T09:40:19","modified_gmt":"2026-09-30T09:40:19","slug":"jeytech-unpaid-transfer-guard","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/jeytech-unpaid-transfer-guard\/","author":23573036,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.0.0","stable_tag":"3.0.0","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"JeyTech Unpaid Transfer Guard for WooCommerce","header_author":"JeyTech","header_description":"Automatically cancel unpaid bank transfer (BACS) orders after a delay you choose \u2014 with a dry-run preview first.","assets_banners_color":"3c4048","last_updated":"2026-09-30 09:40:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":197,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jeytech","date":"2026-09-25 06:32:37","revision":3712491},"1.1.0":{"tag":"1.1.0","author":"jeytech","date":"2026-09-25 20:03:09","revision":3713507},"2.0.0":{"tag":"2.0.0","author":"jeytech","date":"2026-09-26 06:39:46","revision":3713908},"3.0.0":{"tag":"3.0.0","author":"jeytech","date":"2026-09-30 09:40:19","revision":3720839}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3712517,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3712517,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3712517,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3712517,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","2.0.0","3.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1-fr.png":{"filename":"screenshot-1-fr.png","revision":3720839,"resolution":"1","location":"assets","locale":"fr","width":1204,"height":958},"screenshot-1.png":{"filename":"screenshot-1.png","revision":3720839,"resolution":"1","location":"assets","locale":"","width":1204,"height":938},"screenshot-2-fr.png":{"filename":"screenshot-2-fr.png","revision":3720839,"resolution":"2","location":"assets","locale":"fr","width":1204,"height":909},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3720839,"resolution":"2","location":"assets","locale":"","width":1204,"height":909},"screenshot-3-fr.png":{"filename":"screenshot-3-fr.png","revision":3720839,"resolution":"3","location":"assets","locale":"fr","width":1262,"height":628},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3720839,"resolution":"3","location":"assets","locale":"","width":1262,"height":628},"screenshot-4-fr.png":{"filename":"screenshot-4-fr.png","revision":3720839,"resolution":"4","location":"assets","locale":"fr","width":1262,"height":958},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3720839,"resolution":"4","location":"assets","locale":"","width":1262,"height":938}},"screenshots":{"1":"Settings: delay, dry-run or live mode, with a confirmation box.","2":"Preview of orders eligible for cancellation and optional stale-order alerts.","3":"Bank transfer dashboard: unpaid orders, cancellation deadlines, bulk extensions and CSV export.","4":"Total-based cancellation delays and optional daily Slack or signed webhook alerts."}},"plugin_section":[],"plugin_tags":[39374,127760,244945,280224,286],"plugin_category":[45],"plugin_contributors":[282653],"plugin_business_model":[],"class_list":["post-374805","plugin","type-plugin","status-publish","hentry","plugin_tags-bacs","plugin_tags-bank-transfer","plugin_tags-cancel-orders","plugin_tags-unpaid-orders","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-jeytech","plugin_committers-jeytech"],"banners":{"banner":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/banner-772x250.jpg?rev=3712517","banner_2x":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/banner-1544x500.jpg?rev=3712517","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/icon-128x128.png?rev=3712517","icon_2x":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/icon-256x256.png?rev=3712517","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/screenshot-1.png?rev=3720839","caption":"Settings: delay, dry-run or live mode, with a confirmation box."},{"src":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/screenshot-2.png?rev=3720839","caption":"Preview of orders eligible for cancellation and optional stale-order alerts."},{"src":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/screenshot-3.png?rev=3720839","caption":"Bank transfer dashboard: unpaid orders, cancellation deadlines, bulk extensions and CSV export."},{"src":"https:\/\/ps.w.org\/jeytech-unpaid-transfer-guard\/assets\/screenshot-4.png?rev=3720839","caption":"Total-based cancellation delays and optional daily Slack or signed webhook alerts."}],"raw_content":"<!--section=description-->\n<p>When a customer picks <strong>Direct bank transfer<\/strong>, WooCommerce puts the order <strong>on hold<\/strong> and keeps the stock aside. If the transfer never arrives, the order stays there until someone cancels it by hand. WooCommerce's \"Hold stock (minutes)\" setting does not help: it only applies to <em>pending payment<\/em> orders, not to on-hold bank transfer orders.<\/p>\n\n<p>Unpaid Transfer Guard cleans them up for you, safely:<\/p>\n\n<ul>\n<li><strong>Pick a delay<\/strong> \u2014 for example 7 days, or 48 hours.<\/li>\n<li><strong>Dry-run first<\/strong> \u2014 right after activation, the plugin only <em>lists<\/em> the orders it would cancel. Nothing is changed until you switch to live mode and tick a confirmation box.<\/li>\n<li><strong>Automatic, every hour<\/strong> \u2014 in live mode, expired orders are cancelled through the WooCommerce API, with an order note explaining why.<\/li>\n<li><strong>Stock goes back automatically<\/strong> \u2014 WooCommerce restores the stock of a cancelled order itself; the plugin never touches stock levels.<\/li>\n<li><strong>Last-second checks<\/strong> \u2014 each order is checked again right before being cancelled, so an order paid in the meantime is left alone.<\/li>\n<li><strong>Clear logs<\/strong> \u2014 every run is written to WooCommerce \u2192 Status \u2192 Logs.<\/li>\n<li><strong>Stale order alerts<\/strong> \u2014 optionally send the site administrator a daily digest when Processing or On-hold orders have had no updates for a delay you choose. No email is sent when there are no matching orders, and alerts never change order statuses.<\/li>\n<li><strong>Collection dashboard<\/strong> \u2014 see on-hold bank transfers, their current cancellation deadlines and any overdue orders.<\/li>\n<li><strong>Bulk extensions and CSV<\/strong> \u2014 extend selected unpaid bank transfer deadlines without changing order statuses, and export the waiting-transfer queue.<\/li>\n<li><strong>Rules by order total<\/strong> \u2014 set up to five minimum-total thresholds with their own cancellation delays. The highest matching threshold applies; otherwise the global delay applies.<\/li>\n<li><strong>Optional Slack or webhook alerts<\/strong> \u2014 send the daily stale-order summary to a configured HTTPS destination only after explicitly enabling it.<\/li>\n<\/ul>\n\n<p>Automatic cancellation, total-based deadlines and manual extensions concern only unpaid, on-hold <strong>Direct bank transfer<\/strong> orders. Cheque, cash on delivery and card orders are never cancelled by this plugin. Stale-order alerts can report Processing and On-hold orders regardless of payment method.<\/p>\n\n<p>Compatible with High-Performance Order Storage (HPOS) and the Cart &amp; Checkout blocks.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin (WooCommerce must be active).<\/li>\n<li>Go to <strong>WooCommerce \u2192 Unpaid orders<\/strong>.<\/li>\n<li>Choose the delay, check the preview of the orders that would be cancelled.<\/li>\n<li>When the preview looks right, select <strong>Live<\/strong>, tick the confirmation box and save.<\/li>\n<li>Optionally enable <strong>Stale order alerts<\/strong> and choose how long an order may go without updates before it appears in the daily digest. This does not require Live mode.<\/li>\n<li>Open <strong>WooCommerce \u2192 Bank transfers<\/strong> to review the queue, extend selected deadlines, export CSV, set total-based delays or opt in to Slack\/webhook alerts.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20cancel%20orders%20as%20soon%20as%20i%20activate%20it%3F\"><h3>Will it cancel orders as soon as I activate it?<\/h3><\/dt>\n<dd><p>No. The plugin starts in dry-run mode: it only lists the orders that would be cancelled. Real cancellations start only after you select live mode and tick the confirmation box.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20stock%3F\"><h3>What happens to the stock?<\/h3><\/dt>\n<dd><p>WooCommerce puts the stock back when an order is cancelled, exactly as when you cancel it by hand. The plugin does not change stock levels itself, so stock is never restored twice.<\/p><\/dd>\n<dt id=\"are%20customers%20notified%3F\"><h3>Are customers notified?<\/h3><\/dt>\n<dd><p>Cancelling an order triggers WooCommerce's own emails, as when you cancel it by hand: the \"Cancelled order\" email to the store admin and, if enabled in WooCommerce \u2192 Settings \u2192 Emails, the \"Cancelled order\" email to the customer. Check these settings before switching to live mode.<\/p><\/dd>\n<dt id=\"what%20if%20the%20transfer%20arrives%20just%20before%20the%20delay%20ends%3F\"><h3>What if the transfer arrives just before the delay ends?<\/h3><\/dt>\n<dd><p>Mark the order as paid (Processing) as usual: the plugin only cancels orders that are still on hold. Each order is checked again right before being cancelled.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20and%20the%20checkout%20block%3F\"><h3>Does it work with HPOS and the Checkout block?<\/h3><\/dt>\n<dd><p>Yes. The plugin only uses the WooCommerce order API, and declares compatibility with High-Performance Order Storage and the Cart &amp; Checkout blocks.<\/p><\/dd>\n<dt id=\"can%20it%20handle%20cheque%20payments%20too%3F\"><h3>Can it handle cheque payments too?<\/h3><\/dt>\n<dd><p>Not in this version: only Direct bank transfer (BACS) orders are handled.<\/p><\/dd>\n<dt id=\"how%20often%20does%20it%20run%3F\"><h3>How often does it run?<\/h3><\/dt>\n<dd><p>Every hour, in batches of 50 orders. If more orders are waiting, the next batch starts right away. You can also run it manually from the settings page.<\/p><\/dd>\n<dt id=\"how%20do%20stale%20order%20alerts%20work%3F\"><h3>How do stale order alerts work?<\/h3><\/dt>\n<dd><p>When enabled, the plugin checks Processing and On-hold orders once a day. If an order has not been updated for longer than the separate alert delay, a plain-text digest goes to the site's administrator email address. The preview on the settings page shows matching orders. The first scheduled check happens within a day of enabling alerts. No digest is sent when none match. The alert never changes an order's status or stock.<\/p><\/dd>\n<dt id=\"how%20are%20total-based%20rules%20and%20extensions%20applied%3F\"><h3>How are total-based rules and extensions applied?<\/h3><\/dt>\n<dd><p>For bank transfer orders in the store currency, the highest minimum-total rule that the order reaches decides its base delay. Other currencies use the global delay. A manual extension moves the deadline forward from the later of its current deadline and the present time. Only still-unpaid, on-hold bank transfers can be extended. Existing extensions are never shortened by a later settings change.<\/p>\n\n<p>The dashboard shows projected deadlines even in dry-run mode. Actual cancellation still requires Live mode. If Live mode is already active, setting a shorter delay can make existing orders eligible at the next hourly run.<\/p><\/dd>\n<dt id=\"what%20does%20the%20csv%20contain%3F\"><h3>What does the CSV contain?<\/h3><\/dt>\n<dd><p>The export streams the current on-hold bank transfer queue to the authorized shop manager's browser. It contains order numbers, creation dates, customer email addresses, totals, currencies and deadlines. No export file is kept on the server.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20contact%20an%20external%20service%3F\"><h3>Does this plugin contact an external service?<\/h3><\/dt>\n<dd><p>Only if the shop manager explicitly enables a Slack or generic HTTPS webhook in <strong>WooCommerce \u2192 Bank transfers<\/strong>. When stale Processing or On-hold orders exist, the plugin sends a daily JSON request with the site name or URL, number of matching orders, and up to 50 order numbers and administrator edit links. It sends no customer names or email addresses. No request is made when no order matches. A generic webhook can include an HMAC-SHA256 signature if a secret is configured. The merchant controls the destination and should review its privacy and retention policy. For Slack, see <a href=\"https:\/\/slack.com\/terms-of-service\/user\">Slack's service terms<\/a> and <a href=\"https:\/\/slack.com\/privacy-policy-updated\">privacy policy<\/a>. The plugin does not send data to JeyTech.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Bank transfer collections dashboard, bulk deadline extensions, CSV export and total-based cancellation delays.<\/li>\n<li>Explicitly enabled Slack or signed generic webhook for daily stale-order alerts.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Optional daily digest of stale Processing and On-hold orders, with an independent delay and a read-only preview.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add extension hooks for optional payment methods, per-gateway delays, exclusions and reminders.<\/li>\n<li>Refresh the WooCommerce settings screen with the JeyTech design and updated screenshots.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: delay in days or hours, dry-run preview, hourly cancellation of expired on-hold bank transfer orders, order notes, logs.<\/li>\n<\/ul>","raw_excerpt":"Track unpaid bank transfers, extend deadlines, export the queue, and receive optional alerts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/374805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=374805"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jeytech"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=374805"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=374805"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=374805"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=374805"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=374805"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=374805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}