diff --git a/src/sbbs3/mqtt.c b/src/sbbs3/mqtt.c
index 2fd029ea5e745a8759b5b1d571412041d7e23cf3..ffbccc7ad6a66ae7634427cecbb370d2e44900db 100644
--- a/src/sbbs3/mqtt.c
+++ b/src/sbbs3/mqtt.c
@@ -534,6 +534,10 @@ static void mqtt_connect_callback(struct mosquitto* mosq, void* cbdata, int rc)
 		mqtt_subscribe(mqtt, TOPIC_HOST, str, sizeof(str), "pause");
 		mqtt_subscribe(mqtt, TOPIC_SERVER, str, sizeof(str), "resume");
 		mqtt_subscribe(mqtt, TOPIC_HOST, str, sizeof(str), "resume");
+		if (mqtt->server_version != NULL) {
+			mqtt_server_startup(mqtt);
+			mqtt->server_version = NULL;
+		}
 	}
 	else
 		mqtt->connect_error = rc;
@@ -648,6 +652,7 @@ static void mqtt_message_received(struct mosquitto* mosq, void* cbdata, const st
 }
 #endif // USE_MOSQUITTO
 
+// 'version' argument should not point to stack memory as it'll be read later (i.e. in connect callback)
 int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const char* version
                  , int (*lputs)(int level, const char* str))
 {
@@ -674,6 +679,7 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const
 				lprintf(lputs, LOG_ERR, "MQTT error %d starting pub/sub thread", result);
 				mqtt_close(mqtt);
 			} else {
+				mqtt->server_version = version;
 #ifdef USE_MOSQUITTO
 				if (mqtt->handle != NULL) {
 					mosquitto_connect_callback_set(mqtt->handle, mqtt_connect_callback);
@@ -692,13 +698,6 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const
 			}
 		}
 	}
-	mqtt_server_state(mqtt, SERVER_INIT);
-	mqtt_pub_strval(mqtt, TOPIC_BBS_LEVEL, NULL, mqtt->cfg->sys_name);
-	mqtt_pub_strval(mqtt, TOPIC_HOST_LEVEL, NULL, startup->host_name);
-	mqtt_pub_strval(mqtt, TOPIC_SERVER, "version", version);
-	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "served", mqtt->served);
-	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "highwater", 0);
-	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "error_count", mqtt->error_count);
 
 #ifdef USE_MOSQUITTO
 	if (mqtt->handle != NULL)
@@ -708,6 +707,18 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const
 	return result;
 }
 
+int mqtt_server_startup(struct mqtt* mqtt)
+{
+	int result = mqtt_server_state(mqtt, SERVER_INIT);
+	mqtt_pub_strval(mqtt, TOPIC_BBS_LEVEL, NULL, mqtt->cfg->sys_name);
+	mqtt_pub_strval(mqtt, TOPIC_HOST_LEVEL, NULL, mqtt->startup->host_name);
+	mqtt_pub_strval(mqtt, TOPIC_SERVER, "version", mqtt->server_version);
+	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "served", mqtt->served);
+	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "highwater", 0);
+	mqtt_pub_uintval(mqtt, TOPIC_SERVER, "error_count", mqtt->error_count);
+	return result;
+}
+
 int mqtt_server_state(struct mqtt* mqtt, enum server_state state)
 {
 	char str[128];
diff --git a/src/sbbs3/mqtt.h b/src/sbbs3/mqtt.h
index 088e728936c6ea05c6ec968132866d737a356596..3a7492a0943b6f4e8d12dd52dc1790f31ee66ecc 100644
--- a/src/sbbs3/mqtt.h
+++ b/src/sbbs3/mqtt.h
@@ -52,6 +52,7 @@ struct mqtt {
 	link_list_t client_list;
 	struct startup* startup;
 	enum server_state server_state;
+	const char* server_version;
 };
 
 enum topic_depth {
@@ -78,6 +79,7 @@ DLLEXPORT int mqtt_init(struct mqtt*, scfg_t*, struct startup*);
 DLLEXPORT int mqtt_startup(struct mqtt*, scfg_t*, struct startup*, const char* version
                            , int (*lputs)(int level, const char* str));
 DLLEXPORT int mqtt_online(struct mqtt*);
+DLLEXPORT int mqtt_server_startup(struct mqtt*);
 DLLEXPORT int mqtt_server_state(struct mqtt*, enum server_state);
 DLLEXPORT int mqtt_errormsg(struct mqtt*, int level, const char*);
 DLLEXPORT int mqtt_terminating(struct mqtt*);