{"id":393194,"date":"2026-10-26T16:22:51","date_gmt":"2026-10-26T16:22:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/buddypilot-order-webhook-guard\/"},"modified":"2026-10-26T16:22:34","modified_gmt":"2026-10-26T16:22:34","slug":"buddypilot-order-webhook-guard","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/buddypilot-order-webhook-guard\/","author":23496788,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"BuddyPilot Order Webhook Guard","header_author":"BuddyPilot","header_description":"Stops the WooCommerce order.updated webhook from firing while past guest orders are linked to a customer account after email verification, which would otherwise re-notify external integrations such as invoicing services.","assets_banners_color":"474e5d","last_updated":"2026-10-26 16:22:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/buddypilot-io\/buddypilot-order-webhook-guard","header_author_uri":"https:\/\/buddypilot.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"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":"buddypilot","date":"2026-10-26 16:22:34","revision":3766898}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3766898,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3766898,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3766898,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3766898,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[597,12480,16281,15439,286],"plugin_category":[45],"plugin_contributors":[263726,263727],"plugin_business_model":[],"class_list":["post-393194","plugin","type-plugin","status-publish","hentry","plugin_tags-integration","plugin_tags-invoice","plugin_tags-orders","plugin_tags-webhook","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-buddypilot","plugin_contributors-domkawula","plugin_committers-buddypilot","plugin_committers-domkawula"],"banners":{"banner":"https:\/\/ps.w.org\/buddypilot-order-webhook-guard\/assets\/banner-772x250.png?rev=3766898","banner_2x":"https:\/\/ps.w.org\/buddypilot-order-webhook-guard\/assets\/banner-1544x500.png?rev=3766898","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/buddypilot-order-webhook-guard\/assets\/icon-128x128.gif?rev=3766898","icon_2x":"https:\/\/ps.w.org\/buddypilot-order-webhook-guard\/assets\/icon-256x256.gif?rev=3766898","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>BuddyPilot Order Webhook Guard<\/strong> fixes one specific WooCommerce side effect. Since WooCommerce 11.0, verifying a customer's email address (a completed password reset, a set-password link for a new account, or a clicked verification link) reassigns every matching guest order to that account. Each reassigned order is saved, and every save fires the <code>order.updated<\/code> webhook.<\/p>\n\n<p>If an external integration listens to <code>order.updated<\/code> and acts on it, for example an invoicing service that issues an invoice per order update, a single password reset can produce a burst of unwanted webhooks and duplicate documents, one for each past guest order on that email address.<\/p>\n\n<p>This plugin suppresses the <code>order.updated<\/code> webhook only while that linking routine runs. The orders are still reassigned to the account, so the customer keeps their order history and download permissions; only the webhook delivery for those particular saves is skipped. Every other <code>order.updated<\/code> event, such as a status change or a manual edit in the admin, is delivered as usual.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Suppresses the <code>order.updated<\/code> webhook only during guest-order linking, and nothing else<\/li>\n<li>Keeps the account linking intact, so customers keep their past orders and download permissions<\/li>\n<li>Covers both linking paths: automatic (after email verification) and manual (the admin \"link orders\" action on the Customers report)<\/li>\n<li>Leaves every other webhook topic, and every other <code>order.updated<\/code> event, untouched<\/li>\n<li>Uses only public WooCommerce extension points and does not modify WooCommerce core<\/li>\n<li>Zero configuration: no settings page, no options, no database writes<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<p>WooCommerce links past guest orders through its <code>wc_update_new_customer_past_orders()<\/code> routine. The plugin wraps that routine with a short-lived, process-local flag and, while the flag is raised, returns false from the <code>woocommerce_webhook_should_deliver<\/code> filter for the <code>order.updated<\/code> topic. WooCommerce evaluates that decision synchronously as each order is saved, so no matching webhook is queued for delivery. The flag is always cleared afterwards, even if an order save throws.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>buddypilot-order-webhook-guard<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin ZIP via <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>There is nothing to configure. WooCommerce must be active.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20stop%20guest%20orders%20from%20being%20linked%20to%20customer%20accounts%3F\"><h3>Does this stop guest orders from being linked to customer accounts?<\/h3><\/dt>\n<dd><p>No. The linking still happens, so customers keep their past guest orders and any download permissions. Only the <code>order.updated<\/code> webhook that would fire during the linking is suppressed.<\/p><\/dd>\n<dt id=\"does%20it%20affect%20normal%20order.updated%20webhooks%3F\"><h3>Does it affect normal order.updated webhooks?<\/h3><\/dt>\n<dd><p>No. Suppression is active only during the guest-order linking routine. Status changes, manual edits, and every other order update deliver their webhooks normally.<\/p><\/dd>\n<dt id=\"which%20integrations%20does%20this%20help%3F\"><h3>Which integrations does this help?<\/h3><\/dt>\n<dd><p>Any integration that consumes the WooCommerce <code>order.updated<\/code> webhook and reacts to it, for example invoicing services that create a document per order update.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>No. The plugin registers nothing meaningful unless WooCommerce is active, and does nothing otherwise.<\/p><\/dd>\n<dt id=\"does%20it%20write%20anything%20to%20the%20database%3F\"><h3>Does it write anything to the database?<\/h3><\/dt>\n<dd><p>No. There are no options, no custom tables, and no settings screen. Deactivating the plugin fully restores the default WooCommerce behaviour.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Suppress the <code>order.updated<\/code> webhook while past guest orders are linked to a customer account, on both the email-verification path and the admin \"link orders\" path.<\/li>\n<\/ul>","raw_excerpt":"Stops a burst of WooCommerce order.updated webhooks (and the duplicate invoices they cause) when past guest orders are linked to a customer account.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393194","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=393194"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/buddypilot"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393194"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393194"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393194"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393194"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393194"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}