diff --git a/CRM/Stripe/Check.php b/CRM/Stripe/Check.php
index 91bd7c19a6bd8d47e8e282efb67a7a3735fa0a1d..490209f0b981cf3b25f2b301d773ae1712837648 100644
--- a/CRM/Stripe/Check.php
+++ b/CRM/Stripe/Check.php
@@ -29,6 +29,17 @@ class CRM_Stripe_Check {
   const MIN_VERSION_SWEETALERT = '1.2';
 
   public static function checkRequirements(&$messages) {
+    self::checkExtensionMjwshared($messages);
+    self::checkExtensionFirewall($messages);
+    self::checkExtensionSweetalert($messages);
+  }
+
+  /**
+   * @param array $messages
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  private static function checkExtensionMjwshared(&$messages) {
     // mjwshared: required. Requires min version
     $extensionName = 'mjwshared';
 
@@ -37,17 +48,32 @@ class CRM_Stripe_Check {
     ]);
 
     if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
-      $messages[] = new CRM_Utils_Check_Message(
+      $message = new CRM_Utils_Check_Message(
         'stripe_requirements',
         E::ts('The Stripe extension requires the mjwshared extension which is not installed (https://lab.civicrm.org/extensions/mjwshared).'),
         E::ts('Stripe: Missing Requirements'),
         \Psr\Log\LogLevel::ERROR,
         'fa-money'
       );
+      $message->addAction(
+        E::ts('Install now'),
+        NULL,
+        'href',
+        ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]]
+      );
+      $messages[] = $message;
     }
-    self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']);
+    if ($extensions['values'][$extensions['id']]['status'] === 'installed') {
+      self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_MJWSHARED, $extensions['values'][$extensions['id']]['version']);
+    }
+  }
 
-    // mjwshared: Recommended
+  /**
+   * @param array $messages
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  private static function checkExtensionFirewall(&$messages) {
     $extensionName = 'firewall';
 
     $extensions = civicrm_api3('Extension', 'get', [
@@ -55,7 +81,7 @@ class CRM_Stripe_Check {
     ]);
 
     if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
-      $messages[] = new CRM_Utils_Check_Message(
+      $message = new CRM_Utils_Check_Message(
         '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.'),
@@ -63,8 +89,22 @@ class CRM_Stripe_Check {
         \Psr\Log\LogLevel::NOTICE,
         'fa-lightbulb-o'
       );
+      $message->addAction(
+        E::ts('Install now'),
+        NULL,
+        'href',
+        ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]]
+      );
+      $messages[] = $message;
     }
+  }
 
+  /**
+   * @param array $messages
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  private static function checkExtensionSweetalert(&$messages) {
     // sweetalert: recommended. If installed requires min version
     $extensionName = 'sweetalert';
     $extensions = civicrm_api3('Extension', 'get', [
@@ -72,17 +112,27 @@ class CRM_Stripe_Check {
     ]);
 
     if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
-      $messages[] = new CRM_Utils_Check_Message(
+      $message = new CRM_Utils_Check_Message(
         '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'),
+        E::ts('It is recommended that you install the <strong><a href="https://civicrm.org/extensions/sweetalert">sweetalert</a></strong> extension.
+        This allows the stripe extension to show useful messages to the user when processing payment.
+        If this is not installed it will fallback to the browser "alert" message but you will
+        not see some messages (such as <em>we are pre-authorizing your card</em> and <em>please wait</em>) and the feedback to the user will not be as helpful.'),
+        E::ts('Recommended Extension: sweetalert'),
         \Psr\Log\LogLevel::NOTICE,
         'fa-lightbulb-o'
       );
+      $message->addAction(
+        E::ts('Install now'),
+        NULL,
+        'href',
+        ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]]
+      );
+      $messages[] = $message;
+    }
+    if ($extensions['values'][$extensions['id']]['status'] === 'installed') {
+      self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_SWEETALERT, $extensions['values'][$extensions['id']]['version']);
     }
-
-    self::requireExtensionMinVersion($messages, $extensionName, CRM_Stripe_Check::MIN_VERSION_SWEETALERT, $extensions['values'][$extensions['id']]['version']);
   }
 
   /**
@@ -93,7 +143,7 @@ class CRM_Stripe_Check {
    */
   private static function requireExtensionMinVersion(&$messages, $extensionName, $minVersion, $actualVersion) {
     if (version_compare($actualVersion, $minVersion) === -1) {
-      $messages[] = new CRM_Utils_Check_Message(
+      $message = 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.',
           [
@@ -105,6 +155,13 @@ class CRM_Stripe_Check {
         \Psr\Log\LogLevel::ERROR,
         'fa-money'
       );
+      $message->addAction(
+        E::ts('Upgrade now'),
+        NULL,
+        'href',
+        ['path' => 'civicrm/admin/extensions', 'query' => ['action' => 'update', 'id' => $extensionName, 'key' => $extensionName]]
+      );
+      $messages[] = $message;
     }
   }
 
diff --git a/docs/releasenotes.md b/docs/releasenotes.md
index 93236dfc783f215ec88db2a58de67707de7c5046..343229e285a7ea1fb6671917a5334c6b5392e070 100644
--- a/docs/releasenotes.md
+++ b/docs/releasenotes.md
@@ -14,6 +14,7 @@ Where:
 * Fix [#210](https://lab.civicrm.org/extensions/stripe/-/issues/210): If there are multiple reCaptcha on the page check and validate the one on the Stripe billing form only.
 * Update implementation for cancel subscription. Option to notify (default Yes) is now available on the backend cancel subscription form.
 * Fix [#218](https://lab.civicrm.org/extensions/stripe/-/issues/218): Ensure disallowed characters in description don't stop contributions from being processed.
+* Fixes to system checks (check for sweetalert was showing description for firewall extension).
 
 ## Release 6.4.1
 **This release REQUIRES that you upgrade mjwshared to 0.8.**