diff --git a/CRM/Stripe/Check.php b/CRM/Stripe/Check.php
index b975cc03f4108c2c2f7a06c1f18e2d5d1043084f..91bd7c19a6bd8d47e8e282efb67a7a3735fa0a1d 100644
--- a/CRM/Stripe/Check.php
+++ b/CRM/Stripe/Check.php
@@ -26,10 +26,14 @@ class CRM_Stripe_Check {
    * @var string
    */
   const MIN_VERSION_MJWSHARED = '0.8';
+  const MIN_VERSION_SWEETALERT = '1.2';
 
   public static function checkRequirements(&$messages) {
+    // mjwshared: required. Requires min version
+    $extensionName = 'mjwshared';
+
     $extensions = civicrm_api3('Extension', 'get', [
-      'full_name' => "mjwshared",
+      'full_name' => $extensionName,
     ]);
 
     if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
@@ -41,23 +45,30 @@ class CRM_Stripe_Check {
         'fa-money'
       );
     }
+    self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']);
+
+    // mjwshared: Recommended
+    $extensionName = 'firewall';
+
+    $extensions = civicrm_api3('Extension', 'get', [
+      'full_name' => $extensionName,
+    ]);
 
-    if (version_compare($extensions['values'][$extensions['id']]['version'], CRM_Stripe_Check::MIN_VERSION_MJWSHARED) === -1) {
+    if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
       $messages[] = new CRM_Utils_Check_Message(
-        'stripe_requirements',
-        E::ts('The Stripe extension requires the mjwshared extension version %1 or greater but your system has version %2.',
-          [
-            1 => CRM_Stripe_Check::MIN_VERSION_MJWSHARED,
-            2 => $extensions['values'][$extensions['id']]['version']
-          ]),
-        E::ts('Stripe: Missing Requirements'),
-        \Psr\Log\LogLevel::ERROR,
-        'fa-money'
+        'stripe_recommended',
+        E::ts('If you are using Stripe to accept payments on public forms (eg. contribution/event registration forms) it is recommended that you install the <strong><a href="https://lab.civicrm.org/extensions/firewall">firewall</a></strong> extension.
+        Some sites have become targets for spammers who use the payment endpoint to try and test credit cards by submitting invalid payments to your Stripe account.'),
+        E::ts('Recommended Extension: firewall'),
+        \Psr\Log\LogLevel::NOTICE,
+        'fa-lightbulb-o'
       );
     }
 
+    // sweetalert: recommended. If installed requires min version
+    $extensionName = 'sweetalert';
     $extensions = civicrm_api3('Extension', 'get', [
-      'full_name' => 'firewall',
+      'full_name' => $extensionName,
     ]);
 
     if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
@@ -70,6 +81,31 @@ class CRM_Stripe_Check {
         'fa-lightbulb-o'
       );
     }
+
+    self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_SWEETALERT, $extensions['values'][$extensions['id']]['version']);
+  }
+
+  /**
+   * @param array $messages
+   * @param string $extensionName
+   * @param string $minVersion
+   * @param string $actualVersion
+   */
+  private static function requireExtensionMinVersion(&$messages, $extensionName, $minVersion, $actualVersion) {
+    if (version_compare($actualVersion, $minVersion) === -1) {
+      $messages[] = new CRM_Utils_Check_Message(
+        'stripe_requirements',
+        E::ts('The Stripe extension requires the %1 extension version %2 or greater but your system has version %3.',
+          [
+            1 => $extensionName,
+            2 => $minVersion,
+            3 => $actualVersion
+          ]),
+        E::ts('Stripe: Missing Requirements'),
+        \Psr\Log\LogLevel::ERROR,
+        'fa-money'
+      );
+    }
   }
 
 }
diff --git a/docs/releasenotes.md b/docs/releasenotes.md
index 02acf4aa0d5823c9d83f9edd869df3526baf2d77..6b53568abec33474aa1f23e4835061d455b14a26 100644
--- a/docs/releasenotes.md
+++ b/docs/releasenotes.md
@@ -24,6 +24,8 @@ Where:
 * civicrmStripeConfirm.js is now a library available at CRM.payment.confirm and builds on CRM.payment.
 * Initial support for \Civi\Payment\PropertyBag.
 * Improve handling of network errors when loading Stripe elements and add a new jquery event: *crmBillingFormReloadFailed*.
+* Improve user notifications during pre-authentication and confirmation.
+* Add check for recommended SweetAlert extension.
 
 ## Release 6.4
 **This release REQUIRES that you upgrade mjwshared to 0.7 and your Stripe API version must be 2019-12-03 or newer.**
diff --git a/info.xml b/info.xml
index b53bc877f2a23c347ae5a0fe9d75e472281a5653..f0127062120d0ee825d3690cd7ed2eeff9d4652e 100644
--- a/info.xml
+++ b/info.xml
@@ -14,8 +14,8 @@
     <author>Matthew Wire (MJW Consulting)</author>
     <email>mjw@mjwconsult.co.uk</email>
   </maintainer>
-  <releaseDate>2020-06-06</releaseDate>
-  <version>6.4.1-beta2</version>
+  <releaseDate>2020-06-08</releaseDate>
+  <version>6.4.1-beta3</version>
   <develStage>beta</develStage>
   <compatibility>
     <ver>5.24</ver>