diff --git a/conduwuit-example.toml b/conduwuit-example.toml
index 8ea1d4789ce38905620a99fa4cb02bdf192a7620..0e718521a376c713845cd042606ef8f1cc3a1858 100644
--- a/conduwuit-example.toml
+++ b/conduwuit-example.toml
@@ -264,6 +264,7 @@ url_preview_check_root_domain = false
 #query_trusted_key_servers_first = true
 
 # List/vector of room **IDs** that conduwuit will make newly registered users join.
+# The room IDs specified must be rooms that you have joined at least once on the server, and must be public.
 #
 # No default.
 #auto_join_rooms = []
diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs
index 4fcd45f8b44516599eb61105892362ee427c087b..1b30a33c18cd427fbe909373037cf68cf193d1ad 100644
--- a/src/service/admin/mod.rs
+++ b/src/service/admin/mod.rs
@@ -30,7 +30,9 @@
 use super::pdu::PduBuilder;
 use crate::{
 	api::{
-		client_server::{get_alias_helper, leave_all_rooms, leave_room, AUTO_GEN_PASSWORD_LENGTH},
+		client_server::{
+			get_alias_helper, join_room_by_id_helper, leave_all_rooms, leave_room, AUTO_GEN_PASSWORD_LENGTH,
+		},
 		server_server::parse_incoming_pdu,
 	},
 	services,
@@ -900,6 +902,35 @@ async fn process_admin_command(&self, command: AdminCommand, body: Vec<&str>) ->
 						.expect("to json value always works"),
 					)?;
 
+					if !services().globals.config.auto_join_rooms.is_empty() {
+						for room in &services().globals.config.auto_join_rooms {
+							if !services().rooms.state_cache.server_in_room(services().globals.server_name(), room)? {
+								warn!("Skipping room {room} to automatically join as we have never joined before.");
+								continue;
+							}
+
+							if let Some(room_id_server_name) = room.server_name() {
+								match join_room_by_id_helper(
+									Some(&user_id),
+									room,
+									Some("Automatically joining this room upon registration".to_owned()),
+									&[room_id_server_name.to_owned(), services().globals.server_name().to_owned()],
+									None,
+								)
+								.await
+								{
+									Ok(_) => {
+										info!("Automatically joined room {room} for user {user_id}");
+									},
+									Err(e) => {
+										// don't return this error so we don't fail registrations
+										error!("Failed to automatically join room {room} for user {user_id}: {e}");
+									},
+								};
+							}
+						}
+					}
+
 					// we dont add a device since we're not the user, just the creator
 
 					// Inhibit login does not work for guests