diff --git a/strolchibot/migrations/0012_command_permissions.py b/strolchibot/migrations/0012_command_permissions.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce364cb0ffd34bbde14a1cc02f23b4a7c9a4d37c
--- /dev/null
+++ b/strolchibot/migrations/0012_command_permissions.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0.7 on 2022-08-26 19:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('strolchibot', '0011_auto_20211220_2354'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='command',
+            name='permissions',
+            field=models.CharField(choices=[('EO', 'Everyone'), ('SUB', 'Subscriber'), ('MOD', 'Moderator')], default='EO', max_length=5),
+        ),
+    ]
diff --git a/strolchibot/models.py b/strolchibot/models.py
index 5ec2286ef7510da8868c23d509392d18b181dc29..f2d26f07422e0ed206c4d00d6ca567c530a638f8 100644
--- a/strolchibot/models.py
+++ b/strolchibot/models.py
@@ -7,8 +7,11 @@ from .managers import TwitchUserManager
 
 
 class Command(models.Model):
+    PERMISSION_CHOICES = (("EO", "Everyone"), ("SUB", "Subscriber"), ("MOD", "Moderator"))
+
     command = models.CharField(max_length=20)
     text = models.TextField(max_length=500)
+    permissions = models.CharField(max_length=5, choices=PERMISSION_CHOICES, default="EO")
     active = models.BooleanField(default=True)
 
     def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
diff --git a/strolchibot/templates/commands/list.html b/strolchibot/templates/commands/list.html
index 29b493db9fab211c63003cc1678377c19fdf845c..902787f83ab31d395320329d9f04a9145b68c835 100644
--- a/strolchibot/templates/commands/list.html
+++ b/strolchibot/templates/commands/list.html
@@ -22,7 +22,7 @@
                     <tr>
                         <td>{{ command.command }}</td>
                         <td>{{ command.text }}</td>
-                        <td>Everyone</td>
+                        <td>{{ command.get_permissions_display }}</td>
                         <td>
                             <label class="switch">
                                 <input class="w3-switch" type="checkbox" {% if command.active %}checked{% endif %}
diff --git a/strolchibot/views.py b/strolchibot/views.py
index 6259d5df6fd0d0ba3cd8ea9fc14b081ce00c12bf..0165c52e3727fdff96522877da8216843ecdd773 100644
--- a/strolchibot/views.py
+++ b/strolchibot/views.py
@@ -207,7 +207,7 @@ def exchange_code(code):
 @login_required(login_url="/login")
 def commands(request: HttpRequest) -> HttpResponse:
     return render(request, "commands/list.html",
-                  {"title": "Commands", "commands": Command.objects.all(), "active": "commands"})
+                  {"title": "Commands", "commands": Command.objects.all().order_by("command"), "active": "commands"})
 
 
 @login_required(login_url="/login")
diff --git a/twitchbot/chat_commands.py b/twitchbot/chat_commands.py
index 44290061692baec76507cae461d277c14f824e32..3be4208e2e9511c312c1b477e826b600ab03e947 100644
--- a/twitchbot/chat_commands.py
+++ b/twitchbot/chat_commands.py
@@ -10,6 +10,17 @@ import config
 DB_PATH = "db.sqlite3"
 
 
+def check_permissions(message, permissions):
+    if permissions == "EO":
+        return True
+    elif permissions == "SUB":
+        return message.author.is_subscriber or message.author.is_mod
+    elif permissions == "MOD":
+        return message.author.is_mod
+
+    return False
+
+
 class Commands(commands.Cog):
     def __init__(self, bot):
         self.bot = bot
@@ -27,13 +38,15 @@ class Commands(commands.Cog):
             conn = sqlite3.connect(DB_PATH)
 
             c = conn.cursor()
-            c.execute('SELECT text from strolchibot_command where command = ? and active is true', (command,))
-            texts = c.fetchall()
+            c.execute('SELECT text, permissions from strolchibot_command where command = ? and active is true',
+                      (command,))
+            eligible_commands = c.fetchall()
             conn.close()
-            if len(texts) > 0:
-                text = random.choice(texts)[0]
-                text = self.process_variables(text, args)
-                await message.channel.send(text)
+            if len(eligible_commands) > 0:
+                cmd = random.choice(eligible_commands)
+                if check_permissions(message, cmd[1]):
+                    text = self.process_variables(cmd[0], args)
+                    await message.channel.send(text)
 
     def process_variables(self, text, args):
         variables = re.findall("\{[\w\d\s+-]+}", text)