{"id":348246,"date":"2026-08-15T11:59:48","date_gmt":"2026-08-15T11:59:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/paidradar\/"},"modified":"2026-08-15T11:59:15","modified_gmt":"2026-08-15T11:59:15","slug":"paidradar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/paidradar\/","author":23532621,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"PaidRadar","header_author":"famosMedia Technologies Ltd.","header_description":"Finds WooCommerce orders stuck in pending\/on-hold\/failed whose payment actually succeeded at the gateway (missed webhook), re-queries the gateway API read-only, completes them correctly, writes an audit trail and alerts the admin. Supports Stripe + PayPal.","assets_banners_color":"9e5ca4","last_updated":"2026-08-15 11:59:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/usepaidradar.com\/","header_author_uri":"https:\/\/famos-media.de\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"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":"famosmedia","date":"2026-08-15 11:59:15"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3648536,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3648536,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3648536,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3648536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3648536,"resolution":"1","location":"assets","locale":"","width":1280,"height":307},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3648536,"resolution":"2","location":"assets","locale":"","width":1120,"height":823},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3648536,"resolution":"3","location":"assets","locale":"","width":1120,"height":446}},"screenshots":{"1":"PaidRadar dashboard: last run, total recovered, and the \"Check now\" button.","2":"The payment audit trail with per-order events and status transitions.","3":"Settings: look-back window, enabled gateways and alert e-mail."}},"plugin_section":[],"plugin_tags":[260080,334,5349,275813,286],"plugin_category":[45],"plugin_contributors":[271826],"plugin_business_model":[],"class_list":["post-348246","plugin","type-plugin","status-publish","hentry","plugin_tags-payment-recovery","plugin_tags-paypal","plugin_tags-stripe","plugin_tags-stuck-pending-order","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-famosmedia","plugin_committers-famosmedia"],"banners":{"banner":"https:\/\/ps.w.org\/paidradar\/assets\/banner-772x250.png?rev=3648536","banner_2x":"https:\/\/ps.w.org\/paidradar\/assets\/banner-1544x500.png?rev=3648536","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/paidradar\/assets\/icon-128x128.png?rev=3648536","icon_2x":"https:\/\/ps.w.org\/paidradar\/assets\/icon-256x256.png?rev=3648536","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/paidradar\/assets\/screenshot-1.png?rev=3648536","caption":"PaidRadar dashboard: last run, total recovered, and the \"Check now\" button."},{"src":"https:\/\/ps.w.org\/paidradar\/assets\/screenshot-2.png?rev=3648536","caption":"The payment audit trail with per-order events and status transitions."},{"src":"https:\/\/ps.w.org\/paidradar\/assets\/screenshot-3.png?rev=3648536","caption":"Settings: look-back window, enabled gateways and alert e-mail."}],"raw_content":"<!--section=description-->\n<p><strong>The gateway charged the customer \u2014 but your WooCommerce order is still stuck on \"pending payment\".<\/strong> This happens when the confirmation webhook never arrives (firewall, timeout, HTTP 204, live\/test key mix-up, a crash right after checkout). The money is captured, the order never fulfils, and you only notice at month-end.<\/p>\n\n<p><strong>PaidRadar<\/strong> fixes exactly this. It scans your WooCommerce orders that are stuck in <em>pending<\/em>, <em>on-hold<\/em> or <em>failed<\/em>, re-queries the payment gateway's API (read-only), and \u2014 only when the gateway <strong>unambiguously<\/strong> reports the payment as captured \u2014 completes the order the correct way via WooCommerce's own <code>payment_complete()<\/code> flow (stock, status and emails all fire correctly). Every action is written to a full <strong>payment audit trail<\/strong> and the admin is alerted.<\/p>\n\n<p>This is <strong>payment recovery<\/strong>, not dunning: it does not chase the customer for a payment that already succeeded, and it does not touch your accounting. It repairs the <em>order state<\/em> after a <strong>missed webhook<\/strong>.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Finds WooCommerce orders <strong>stuck in pending \/ on-hold \/ failed<\/strong> that carry a gateway transaction id.<\/li>\n<li>Re-queries <strong>Stripe<\/strong> (PaymentIntent) and <strong>PayPal<\/strong> (Orders API v2) \u2014 <strong>read-only<\/strong>, no money is ever moved.<\/li>\n<li>Completes only <strong>unambiguously paid<\/strong> orders via <code>payment_complete()<\/code> (never a blind status change).<\/li>\n<li>Never completes <strong>refunded<\/strong> or <strong>disputed<\/strong> payments \u2014 it flags the drift and alerts you instead.<\/li>\n<li>Writes a <strong>lasting payment audit trail<\/strong> (gateway response snapshot, before\/after status, actor, timestamp).<\/li>\n<li>Runs a <strong>daily automatic scan<\/strong> (Action Scheduler) plus a manual <strong>\"Check now\"<\/strong> button.<\/li>\n<li><strong>Idempotent<\/strong> and <strong>rate-limited<\/strong> \u2014 never double-completes an order, backs off on gateway rate limits.<\/li>\n<li><strong>HPOS-compatible<\/strong> and Cart\/Checkout-Blocks compatible.<\/li>\n<\/ul>\n\n<h4>Why PaidRadar is different<\/h4>\n\n<p>Reconciliation plugins push <em>correct<\/em> orders into your accounting. Dunning plugins email customers to <em>retry<\/em> a payment. Auto-complete plugins only finish orders WooCommerce already knows are paid. <strong>None of them recover an order that was actually paid at the gateway but got stuck because the webhook was missed.<\/strong> PaidRadar does.<\/p>\n\n<h4>Supported gateways (v1)<\/h4>\n\n<ul>\n<li>Stripe (official WooCommerce Stripe gateway)<\/li>\n<li>PayPal (WooCommerce PayPal Payments \/ PPCP)<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Self-hosted. PaidRadar uses the API keys already stored by your Stripe \/ PayPal plugin to make read-only status calls. No data leaves your store for any third-party PaidRadar service \u2014 there is none.<\/p>\n\n<h3>External services<\/h3>\n\n<p>To determine whether a stuck order was actually paid, PaidRadar contacts the payment gateway that processed the order. It uses the API credentials that are <strong>already configured in your existing Stripe and\/or PayPal plugin<\/strong> \u2014 it does not add its own account or send data to any PaidRadar-operated service (there is none).<\/p>\n\n<p><strong>Stripe<\/strong>\nPaidRadar calls the Stripe API (<code>https:\/\/api.stripe.com<\/code>) to read the status of a PaymentIntent when an order placed through the Stripe gateway is stuck. It sends the order's Stripe PaymentIntent id and authenticates with your Stripe secret key (read-only request; no charge, capture or refund is performed). This happens during a manual \"Check now\" scan and during the scheduled daily scan, only for candidate orders.\nThis service is provided by Stripe, Inc. \u2014 Terms: https:\/\/stripe.com\/legal \u2014 Privacy Policy: https:\/\/stripe.com\/privacy<\/p>\n\n<p><strong>PayPal<\/strong>\nPaidRadar calls the PayPal Orders API (<code>https:\/\/api-m.paypal.com<\/code>, or <code>https:\/\/api-m.sandbox.paypal.com<\/code> in sandbox mode) to read the status of an order placed through the PayPal (PPCP) gateway. It first requests an OAuth token using your PayPal client id and secret, then sends the order's PayPal order id to read its status (read-only request; no capture or refund is performed). This happens during a manual \"Check now\" scan and during the scheduled daily scan, only for candidate orders.\nThis service is provided by PayPal, Inc. \u2014 Terms: https:\/\/www.paypal.com\/us\/legalhub\/useragreement-full \u2014 Privacy Policy: https:\/\/www.paypal.com\/us\/legalhub\/privacy-full<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>paidradar<\/code> folder to <code>\/wp-content\/plugins\/<\/code> or install via the Plugins screen.<\/li>\n<li>Activate <strong>PaidRadar<\/strong> through the <em>Plugins<\/em> screen. WooCommerce must be active.<\/li>\n<li>Go to <strong>WooCommerce \u2192 PaidRadar<\/strong>.<\/li>\n<li>Confirm your gateways are enabled, set the look-back window and alert e-mail.<\/li>\n<li>Click <strong>Check now<\/strong> for an immediate scan, or let the daily scan run automatically.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20is%20my%20woocommerce%20order%20stuck%20on%20pending%20after%20the%20customer%20paid%3F\"><h3>Why is my WooCommerce order stuck on pending after the customer paid?<\/h3><\/dt>\n<dd><p>Almost always a missed webhook\/IPN: the gateway charged the card and tried to notify WooCommerce, but the notification never arrived or was rejected (a security plugin or firewall blocked the endpoint, a timeout, an HTTP 204, or a live\/test key mismatch). The payment succeeded; WooCommerce just never heard about it. PaidRadar asks the gateway directly and repairs the order.<\/p><\/dd>\n<dt id=\"will%20paidradar%20ever%20complete%20an%20order%20that%20was%20not%20actually%20paid%3F\"><h3>Will PaidRadar ever complete an order that was not actually paid?<\/h3><\/dt>\n<dd><p>No. It is conservative by default: an order is only completed when the gateway reports the payment as unambiguously captured <strong>and<\/strong> a transaction id is present. Unpaid, refunded, disputed or unknown results are logged and (where relevant) alerted, never completed.<\/p><\/dd>\n<dt id=\"does%20it%20move%20money%2C%20issue%20refunds%20or%20capture%20payments%3F\"><h3>Does it move money, issue refunds or capture payments?<\/h3><\/dt>\n<dd><p>No. Every gateway call is strictly read-only. PaidRadar only reads the payment status; it never captures, refunds or voids.<\/p><\/dd>\n<dt id=\"which%20gateways%20are%20supported%3F\"><h3>Which gateways are supported?<\/h3><\/dt>\n<dd><p>Stripe and PayPal (PPCP) in this free version. More gateways are planned.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Is it compatible with High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes. PaidRadar declares HPOS and Cart\/Checkout-Blocks compatibility and only uses the official <code>wc_get_orders()<\/code> \/ <code>WC_Order<\/code> API \u2014 never direct database queries against orders.<\/p><\/dd>\n<dt id=\"where%20is%20the%20audit%20trail%20stored%3F\"><h3>Where is the audit trail stored?<\/h3><\/dt>\n<dd><p>In a dedicated table, <code>wp_paidradar_log<\/code> (prefix may differ). You can view it under <strong>WooCommerce \u2192 PaidRadar<\/strong> and export it as CSV.<\/p><\/dd>\n<dt id=\"does%20it%20chase%20customers%20to%20pay%20again%3F\"><h3>Does it chase customers to pay again?<\/h3><\/dt>\n<dd><p>No. That is dunning \/ failed-order-rescue, and it is the wrong tool when the customer already paid. PaidRadar handles the <em>already-paid-but-stuck<\/em> case.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: Stripe + PayPal read-only status recovery, conservative <code>payment_complete()<\/code> reconciliation, audit trail, daily Action Scheduler scan, manual \"Check now\", admin alerts, HPOS compatibility.<\/li>\n<\/ul>","raw_excerpt":"Recover paid-but-stuck WooCommerce orders. When a webhook is missed, PaidRadar re-queries Stripe &amp; PayPal, completes the order correctly, and logs it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/348246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=348246"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/famosmedia"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=348246"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=348246"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=348246"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=348246"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=348246"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=348246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}