diff --git a/src/app/constant/JamiQmlUtils.qml b/src/app/constant/JamiQmlUtils.qml
index 968f98ca9fe114f604e3c17f79a23e3e30a3c48e..d0e3a49d3a3edc02eb49cf1c0e4768f382ac29a5 100644
--- a/src/app/constant/JamiQmlUtils.qml
+++ b/src/app/constant/JamiQmlUtils.qml
@@ -71,12 +71,26 @@ Item {
         return Math.min(Math.max(val, min), max);
     }
 
-    function isDonationBannerVisible() {
+    property bool isDonationBannerVisible: getIsDonationBannerVisible()
+    Connections {
+        target: UtilsAdapter
+        function onDonationCampaignSettingChanged() {
+            // Changing any of the donation campaign settings will trigger a recompute of the banner visibility.
+            updateIsDonationBannerVisible();
+        }
+    }
+
+    function updateIsDonationBannerVisible() {
+        isDonationBannerVisible = getIsDonationBannerVisible();
+    }
+
+    function getIsDonationBannerVisible() {
         // The banner is visible if the current date is after the date set in the settings and before the end date
         // And if the donation toggle is checked
-        var isDonationVisible = UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible);
-        var endDonationDate = new Date(Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023EndDate)));
-        var donationVisibleDate = new Date(Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023VisibleDate)));
-        return new Date() < endDonationDate && new Date() > donationVisibleDate && isDonationVisible;
+        const isVisible = UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible);
+        const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023EndDate));
+        const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023VisibleDate));
+        const now = new Date();
+        return isVisible && now < endDate && now >= startDate;
     }
 }
diff --git a/src/app/mainview/components/DonationBanner.qml b/src/app/mainview/components/DonationBanner.qml
index 061a377517c9b82bd7e623959d5efcd94fc12496..b45d3b066a65ad95a2b8f67d15c7f136826a7c68 100644
--- a/src/app/mainview/components/DonationBanner.qml
+++ b/src/app/mainview/components/DonationBanner.qml
@@ -25,9 +25,7 @@ import "../../commoncomponents"
 import "../../settingsview/components"
 
 Rectangle {
-    id: donation
-
-    property bool donationVisible: JamiQmlUtils.isDonationBannerVisible()
+    id: root
 
     width: parent.width - 30
     height: donationTextRect.height + 45 > donationIcon.height + 20 ? donationTextRect.height + 45 : donationIcon.height + 20
@@ -35,6 +33,17 @@ Rectangle {
 
     color: JamiTheme.donationBackgroundColor
 
+    function bumpDonationReminderVisibility() {
+        // Calculate the time 7 days from now
+        var futureDate = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000);
+
+        // Format the date to 'yyyy-MM-dd hh:mm' format
+        var formattedDate = Qt.formatDateTime(futureDate, "yyyy-MM-dd hh:mm");
+
+        // Set the application value
+        UtilsAdapter.setAppValue(Settings.Key.Donation2023VisibleDate, formattedDate);
+    }
+
     GridLayout {
         id: donationLayout
 
@@ -102,16 +111,13 @@ Rectangle {
 
             color: JamiTheme.transparentColor
 
+            // When the user clicks on "Not now", we set the donation date to 7 days from now
             Text {
                 id: notNowText
                 MouseArea {
                     cursorShape: Qt.PointingHandCursor
                     anchors.fill: parent
-                    onClicked: {
-                        // When the user clicks on "Not now", we set the donation date to 7 days from now (1 for the test)
-                        UtilsAdapter.setAppValue(Settings.Key.Donation2023VisibleDate, new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 16).replace("T", " "));
-                        donation.donationVisible = Qt.binding(() => JamiQmlUtils.isDonationBannerVisible());
-                    }
+                    onClicked: bumpDonationReminderVisibility()
                 }
                 text: JamiStrings.notNow
                 color: JamiTheme.donationButtonTextColor
diff --git a/src/app/mainview/components/SidePanel.qml b/src/app/mainview/components/SidePanel.qml
index 1312089fe7b920d9e851f8430870231c42c756b7..f40897a9d0f69d6d4af385e46405e60c660be188 100644
--- a/src/app/mainview/components/SidePanel.qml
+++ b/src/app/mainview/components/SidePanel.qml
@@ -185,9 +185,7 @@ SidePanelBase {
         Item {
             anchors.fill: parent
 
-            onVisibleChanged: {
-                donation.donationVisible = Qt.binding(() => JamiQmlUtils.isDonationBannerVisible());
-            }
+            onVisibleChanged: JamiQmlUtils.updateIsDonationBannerVisible()
 
             RowLayout {
                 id: titleBar
@@ -331,21 +329,21 @@ SidePanelBase {
             }
 
             DonationBanner {
-                id: donation
+                id: donationBanner
                 anchors.horizontalCenter: parent.horizontalCenter
                 anchors.leftMargin: 15
                 anchors.rightMargin: 15
                 anchors.top: sidePanelTabBar.bottom
                 anchors.topMargin: 10
-                visible: donation.donationVisible
+                visible: JamiQmlUtils.isDonationBannerVisible
             }
 
             ColumnLayout {
                 id: smartListLayout
 
                 width: parent.width
-                anchors.top: donation.visible ? donation.bottom : searchStatusRect.bottom
-                anchors.topMargin: !donation.visible && (sidePanelTabBar.visible || searchStatusRect.visible) ? 0 : 12
+                anchors.top: donationBanner.visible ? donationBanner.bottom : searchStatusRect.bottom
+                anchors.topMargin: !donationBanner.visible && (sidePanelTabBar.visible || searchStatusRect.visible) ? 0 : 12
                 anchors.bottom: parent.bottom
 
                 spacing: 4
@@ -398,7 +396,7 @@ SidePanelBase {
                 visible: inNewSwarm
 
                 width: parent.width
-                anchors.top: donation.donationVisible ? donation.bottom : sidePanelTabBar.bottom
+                anchors.top: donationBanner.visible ? donationBanner.bottom : sidePanelTabBar.bottom
                 anchors.topMargin: (sidePanelTabBar.visible || searchStatusRect.visible) ? 0 : 12
                 anchors.bottom: parent.bottom
 
diff --git a/src/app/utilsadapter.cpp b/src/app/utilsadapter.cpp
index dbf8ee6b6ba7df71dc1566dba2e98e302cfa2e49..f8918186b996cc35a41c195a5f5b58b0b86ca463 100644
--- a/src/app/utilsadapter.cpp
+++ b/src/app/utilsadapter.cpp
@@ -92,6 +92,11 @@ UtilsAdapter::setAppValue(const Settings::Key key, const QVariant& value)
         Q_EMIT chatviewPositionChanged();
     else if (key == Settings::Key::AppTheme)
         Q_EMIT appThemeChanged();
+    // Any donation campaign-related keys can trigger a donation campaign check
+    else if (key == Settings::Key::IsDonationVisible
+             || key == Settings::Key::Donation2023VisibleDate
+             || key == Settings::Key::Donation2023EndDate)
+        Q_EMIT donationCampaignSettingChanged();
 }
 
 QVariant
diff --git a/src/app/utilsadapter.h b/src/app/utilsadapter.h
index 35a326e1c128d130ba5d0fdb248af9f2e2b4d314..b5644f8bd19e6adc963a2ebafe99c75bd80a6f33 100644
--- a/src/app/utilsadapter.h
+++ b/src/app/utilsadapter.h
@@ -67,6 +67,7 @@ class UtilsAdapter final : public QmlAdapterBase
     Q_OBJECT
     QML_PROPERTY(QStringList, logList)
     QML_RO_PROPERTY(bool, isRTL)
+
 public:
     explicit UtilsAdapter(AppSettingsManager* settingsManager,
                           SystemTray* systemTray,
@@ -170,6 +171,7 @@ Q_SIGNALS:
     void appThemeChanged();
     void showExperimentalCallSwarm();
     void changeLanguage();
+    void donationCampaignSettingChanged();
 
 private:
     QClipboard* clipboard_;