diff --git a/CHANGELOG.md b/CHANGELOG.md
index 281aec8fd0f5e412575be96e32ac24db81c6ccab..89b31ac472280822f79e20c299b0fa1e966820f0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
+### Changed
+- Allow inviting participants to multiple Matrix rooms
 
 ## [1.4.1] - 2022-05-26
 
diff --git a/pretix_matrix_inviter/forms.py b/pretix_matrix_inviter/forms.py
index a667734179622a118a9781f7072149e0264862e5..79daae09ea7903540fc64fb7fd7f2b8f274f38bb 100644
--- a/pretix_matrix_inviter/forms.py
+++ b/pretix_matrix_inviter/forms.py
@@ -50,7 +50,7 @@ class MatrixInviterForm(SettingsForm):
     )
     matrix_inviter_matrix_room = RegexField(
         label=_("Matrix room"),
-        regex="(!|#)[^:]+:.+",
+        regex="(?:!|#)[^:]+:[^:,]+(?:\\s*,\\s*(?:!|#)[^:]+:[^:,]+)*",
         strip=True,
     )
 
@@ -61,22 +61,32 @@ class MatrixInviterForm(SettingsForm):
         ]
 
         room_info = matrix_room_info_for_event(self.obj)
-        if not room_info["room_id"]:
-            room_help_text = ""
-        elif self.obj.settings.matrix_inviter_matrix_room.startswith("!"):
-            if room_info["canonical_alias"]:
-                room_help_text = _(
-                    '"{name}" (main address: <code>{canonical_alias}</code>)'
-                )
-            else:
-                room_help_text = _('"{name}"')
+        if not room_info:
+            room_help_text = _(
+                "Comma-separated list of room IDs or aliases to invite users to."
+            )
         else:
-            if room_info["canonical_alias"]:
-                room_help_text = _(
-                    '"{name}" (<code>{room_id}</code>, main address: <code>{canonical_alias}</code>)'
-                )
-            else:
-                room_help_text = _('"{name}" (<code>{room_id}</code>)')
-        self.fields["matrix_inviter_matrix_room"].help_text = room_help_text.format_map(
-            room_info
-        )
+            room_help = []
+            for room in room_info:
+                if room["room_id"].startswith("!"):
+                    if room["canonical_alias"]:
+                        room_help.append(
+                            _(
+                                '"{name}" (main address: <code>{canonical_alias}</code>)'
+                            ).format_map(room)
+                        )
+                    else:
+                        room_help.append(_('"{name}"').format_map(room))
+                else:
+                    if room["canonical_alias"]:
+                        room_help.append(
+                            _(
+                                '"{name}" (<code>{room_id}</code>, main address: <code>{canonical_alias}</code>)'
+                            ).format_map(room)
+                        )
+                    else:
+                        room_help.append(
+                            _('"{name}" (<code>{room_id}</code>)').format_map(room)
+                        )
+            room_help_text = ", ".join(room_help)
+        self.fields["matrix_inviter_matrix_room"].help_text = room_help_text
diff --git a/pretix_matrix_inviter/helpers.py b/pretix_matrix_inviter/helpers.py
index c3dfed256731b3510be1158073b683d0a1c04aed..49bd1ff9cca761e4b86ca837f69c50a58db09065 100644
--- a/pretix_matrix_inviter/helpers.py
+++ b/pretix_matrix_inviter/helpers.py
@@ -2,14 +2,23 @@ import requests
 from urllib.parse import quote as url_quote
 
 
+def matrix_parse_room_ids(room_ids):
+    return [room_id.strip() for room_id in room_ids.split(",")]
+
+
 def matrix_room_info_for_event(event):
     return event.cache.get_or_set(
         "matrix_room_info",
-        matrix_room_info(
-            event.settings.matrix_inviter_matrix_server,
-            event.settings.matrix_inviter_authorization_token,
-            event.settings.matrix_inviter_matrix_room,
-        ),
+        [
+            matrix_room_info(
+                event.settings.matrix_inviter_matrix_server,
+                event.settings.matrix_inviter_authorization_token,
+                room_id,
+            )
+            for room_id in matrix_parse_room_ids(
+                event.settings.matrix_inviter_matrix_room
+            )
+        ],
         120,
     )
 
diff --git a/pretix_matrix_inviter/signals.py b/pretix_matrix_inviter/signals.py
index 1c46966cef06187b5b70385d89dd593b52486504..a91bd8f0d4e90a2ecced49478b120b08ac3d3825 100644
--- a/pretix_matrix_inviter/signals.py
+++ b/pretix_matrix_inviter/signals.py
@@ -16,6 +16,7 @@ from pretix.base.templatetags.rich_text import rich_text_snippet
 from pretix.control.signals import nav_event_settings
 from pretix.presale.signals import question_form_fields
 
+from .helpers import matrix_parse_room_ids
 from .tasks import matrix_inviter_invite, matrix_inviter_kick
 
 settings_hierarkey.add_default("matrix_inviter_items", [], list)
@@ -83,14 +84,18 @@ def matrix_inviter_invite_async(sender, order, **kwargs):
         ):
             continue
 
-        matrix_inviter_invite.apply_async(
-            args=(
-                sender.pk,
-                order.pk,
-                order_position.pk,
-                str(sender.settings.matrix_inviter_reason),
+        for room_id in matrix_parse_room_ids(
+            sender.settings.matrix_inviter_matrix_room
+        ):
+            matrix_inviter_invite.apply_async(
+                args=(
+                    sender.pk,
+                    order.pk,
+                    order_position.pk,
+                    str(sender.settings.matrix_inviter_reason),
+                    room_id,
+                )
             )
-        )
 
 
 @receiver(order_canceled, dispatch_uid="matrix_inviter_order_canceled")
@@ -114,13 +119,12 @@ def matrix_inviter_kick_async(sender, order, **kwargs):
         ):
             continue
 
-        matrix_inviter_kick.apply_async(
-            args=(
-                sender.pk,
-                order.pk,
-                order_position.pk,
+        for room_id in matrix_parse_room_ids(
+            sender.settings.matrix_inviter_matrix_room
+        ):
+            matrix_inviter_kick.apply_async(
+                args=(sender.pk, order.pk, order_position.pk, room_id)
             )
-        )
 
 
 @receiver(nav_event_settings, dispatch_uid="matrix_inviter_nav_settings")
diff --git a/pretix_matrix_inviter/tasks.py b/pretix_matrix_inviter/tasks.py
index 14e9d9c8eaae545ae1045c585c2fd669dd1a0383..0c62c9d5a4969f34c70a865fea5afd392e5a2822 100644
--- a/pretix_matrix_inviter/tasks.py
+++ b/pretix_matrix_inviter/tasks.py
@@ -19,7 +19,12 @@ logger = logging.getLogger(__name__)
     retry_backoff_max=3600,
 )
 def matrix_inviter_invite(
-    self, event: int, order: int, order_position: int, invitation_reason: str
+    self,
+    event: int,
+    order: int,
+    order_position: int,
+    invitation_reason: str,
+    room_id: str,
 ):
     order_position = OrderPosition.objects.get(pk=order_position)
 
@@ -30,10 +35,13 @@ def matrix_inviter_invite(
     if not user_matrix_id:
         return
 
+    if not room_id:
+        return
+
     order = Order.objects.get(pk=order)
     server = event.settings.matrix_inviter_matrix_server
     token = event.settings.matrix_inviter_authorization_token
-    room_id = matrix_room_id(server, event.settings.matrix_inviter_matrix_room)
+    room_id = matrix_room_id(server, room_id)
     payload = {"user_id": user_matrix_id}
     if invitation_reason:
         payload["reason"] = invitation_reason
@@ -96,7 +104,9 @@ def matrix_inviter_invite(
     retry_backoff=True,
     retry_backoff_max=3600,
 )
-def matrix_inviter_kick(self, event: int, order: int, order_position: int):
+def matrix_inviter_kick(
+    self, event: int, order: int, order_position: int, room_id: str
+):
     order_position = OrderPosition.objects.get(pk=order_position)
 
     user_matrix_id = order_position.meta_info_data.get("question_form_data", {}).get(
@@ -106,10 +116,13 @@ def matrix_inviter_kick(self, event: int, order: int, order_position: int):
     if not user_matrix_id:
         return
 
+    if not room_id:
+        return
+
     order = Order.objects.get(pk=order)
     server = event.settings.matrix_inviter_matrix_server
     token = event.settings.matrix_inviter_authorization_token
-    room_id = matrix_room_id(server, event.settings.matrix_inviter_matrix_room)
+    room_id = matrix_room_id(server, room_id)
     payload = {"user_id": user_matrix_id}
 
     try: