diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/README.md b/app/code/Magento/ReCaptchaPurchaseOrder/README.md
new file mode 100644
index 0000000..82f73cd
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/README.md
@@ -0,0 +1,3 @@
+# Magento_ReCaptchaPurchaseOrder module
+
+Please refer to: <https://github.com/magento/security-package-b2b>
diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/composer.json b/app/code/Magento/ReCaptchaPurchaseOrder/composer.json
new file mode 100644
index 0000000..c491910
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/composer.json
@@ -0,0 +1,23 @@
+{
+    "name": "magento/module-re-captcha-purchase-order",
+    "description": "Google reCAPTCHA integration for Magento2",
+    "require": {
+        "php": "~8.2.0||~8.3.0||~8.4.0",
+        "magento/framework": "*"
+    },
+    "suggest": {
+        "magento/module-purchase-order": "*",
+        "magento/module-re-captcha-admin-ui": "*",
+        "magento/module-re-captcha-frontend-ui": "*"
+    },
+    "type": "magento2-module",
+    "license": "OSL-3.0",
+    "autoload": {
+        "files": [
+            "registration.php"
+        ],
+        "psr-4": {
+            "Magento\\ReCaptchaPurchaseOrder\\": ""
+        }
+    }
+}
diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/etc/module.xml b/app/code/Magento/ReCaptchaPurchaseOrder/etc/module.xml
new file mode 100644
index 0000000..842b54a
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/etc/module.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!--
+/**
+ /************************************************************************
+ *
+ * ADOBE CONFIDENTIAL
+ * ___________________
+ *
+ * Copyright 2024 Adobe
+ * All Rights Reserved.
+ *
+ * NOTICE: All information contained herein is, and remains
+ * the property of Adobe and its suppliers, if any. The intellectual
+ * and technical concepts contained herein are proprietary to Adobe
+ * and its suppliers and are protected by all applicable intellectual
+ * property laws, including trade secret and copyright laws.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Adobe.
+ * ************************************************************************
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
+    <module name="Magento_ReCaptchaPurchaseOrder"/>
+</config>
diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/registration.php b/app/code/Magento/ReCaptchaPurchaseOrder/registration.php
new file mode 100644
index 0000000..9b55048
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/registration.php
@@ -0,0 +1,27 @@
+<?php
+/**
+/************************************************************************
+ *
+ * ADOBE CONFIDENTIAL
+ * ___________________
+ *
+ * Copyright 2024 Adobe
+ * All Rights Reserved.
+ *
+ * NOTICE: All information contained herein is, and remains
+ * the property of Adobe and its suppliers, if any. The intellectual
+ * and technical concepts contained herein are proprietary to Adobe
+ * and its suppliers and are protected by all applicable intellectual
+ * property laws, including trade secret and copyright laws.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Adobe.
+ * ************************************************************************
+ */
+declare(strict_types=1);
+
+\Magento\Framework\Component\ComponentRegistrar::register(
+    \Magento\Framework\Component\ComponentRegistrar::MODULE,
+    'Magento_ReCaptchaPurchaseOrder',
+    __DIR__
+);
diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/requirejs-config.js b/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/requirejs-config.js
new file mode 100644
index 0000000..1a918b0
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/requirejs-config.js
@@ -0,0 +1,31 @@
+/**
+ /************************************************************************
+ *
+ * ADOBE CONFIDENTIAL
+ * ___________________
+ *
+ * Copyright 2024 Adobe
+ * All Rights Reserved.
+ *
+ * NOTICE: All information contained herein is, and remains
+ * the property of Adobe and its suppliers, if any. The intellectual
+ * and technical concepts contained herein are proprietary to Adobe
+ * and its suppliers and are protected by all applicable intellectual
+ * property laws, including trade secret and copyright laws.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Adobe.
+ * ************************************************************************
+ */
+
+// eslint-disable-next-line no-unused-vars
+var config = {
+    config: {
+        mixins: {
+            'Magento_PurchaseOrder/js/model/place-order-purchase-quote': {
+                'Magento_ReCaptchaPurchaseOrder/js/model/place-order-purchase-quote-mixin': true
+            }
+        }
+    }
+};
+
diff --git a/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/web/js/model/place-order-purchase-quote-mixin.js b/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/web/js/model/place-order-purchase-quote-mixin.js
new file mode 100644
index 0000000..566cbfe
--- /dev/null
+++ b/app/code/Magento/ReCaptchaPurchaseOrder/view/frontend/web/js/model/place-order-purchase-quote-mixin.js
@@ -0,0 +1,71 @@
+/**
+ /************************************************************************
+ *
+ * ADOBE CONFIDENTIAL
+ * ___________________
+ *
+ * Copyright 2024 Adobe
+ * All Rights Reserved.
+ *
+ * NOTICE: All information contained herein is, and remains
+ * the property of Adobe and its suppliers, if any. The intellectual
+ * and technical concepts contained herein are proprietary to Adobe
+ * and its suppliers and are protected by all applicable intellectual
+ * property laws, including trade secret and copyright laws.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Adobe.
+ * ************************************************************************
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/utils/wrapper',
+    'Magento_ReCaptchaWebapiUi/js/webapiReCaptchaRegistry'
+], function ($, wrapper, recaptchaRegistry) {
+    'use strict';
+
+    return function (placeOrder) {
+        return wrapper.wrap(placeOrder, function (originalAction, serviceUrl, payload, messageContainer) {
+            var recaptchaDeferred,
+                reCaptchaId,
+                $activeReCaptcha;
+
+            $activeReCaptcha = $('.recaptcha-checkout-place-order:visible .g-recaptcha');
+
+            if ($activeReCaptcha.length > 0) {
+                reCaptchaId = $activeReCaptcha.last().attr('id');
+            }
+
+            if (reCaptchaId !== undefined && recaptchaRegistry.triggers.hasOwnProperty(reCaptchaId)) {
+                //ReCaptcha is present for checkout
+                recaptchaDeferred = $.Deferred();
+                recaptchaRegistry.addListener(reCaptchaId, function (token) {
+                    //Add reCaptcha value to place-order request and resolve deferred with the API call results
+                    payload.xReCaptchaValue = token;
+                    originalAction(serviceUrl, payload, messageContainer).done(function () {
+                        recaptchaDeferred.resolve.apply(recaptchaDeferred, arguments);
+                    }).fail(function () {
+                        recaptchaDeferred.reject.apply(recaptchaDeferred, arguments);
+                    });
+                });
+                //Trigger ReCaptcha validation
+                recaptchaRegistry.triggers[reCaptchaId]();
+
+                if (
+                    !recaptchaRegistry._isInvisibleType.hasOwnProperty(reCaptchaId) ||
+                    recaptchaRegistry._isInvisibleType[reCaptchaId] === false
+                ) {
+                    //remove listener so that place order action is only triggered by the 'Place Order' button
+                    recaptchaRegistry.removeListener(reCaptchaId);
+                }
+
+                return recaptchaDeferred;
+            }
+
+            //No ReCaptcha, just sending the request
+            return originalAction(serviceUrl, payload, messageContainer);
+        });
+    };
+});
