diff --git a/scipost_django/tasks/tasks/task.py b/scipost_django/tasks/tasks/task.py
index 1b40988d0b88f6f7aae37211217ea8b537c79fd0..a347abd7099b8aebb1b719daeb064c0a077c5d2f 100644
--- a/scipost_django/tasks/tasks/task.py
+++ b/scipost_django/tasks/tasks/task.py
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
 
 @dataclass
 class Task:
-    user: int
+    user: "User | None"
     kind: "type[TaskKind]"
     data: dict = field(default_factory=dict)
 
@@ -46,6 +46,7 @@ class TaskKind:
     task_title: str
     description: str = ""
     actions: Collection[Callable[[Task], "TaskAction"]]
+    user: "User | None" = None
     template_name: str = "tasks/task.html"
 
     @staticmethod
@@ -68,7 +69,9 @@ class TaskKind:
 
     @classmethod
     def get_tasks(cls) -> Collection[Task]:
-        return [Task(user=1, kind=cls, data=data) for data in cls.get_task_data()]
+        return [
+            Task(user=cls.user, kind=cls, data=data) for data in cls.get_task_data()
+        ]
 
     @classmethod
     def get_task_data(cls) -> Collection[dict]:
diff --git a/scipost_django/tasks/tasks/task_kinds.py b/scipost_django/tasks/tasks/task_kinds.py
index fa3180f3c95b48206398ee33cd3360567506bb78..a9421a420af3818bf7093ee30824f8005142a17d 100644
--- a/scipost_django/tasks/tasks/task_kinds.py
+++ b/scipost_django/tasks/tasks/task_kinds.py
@@ -20,6 +20,26 @@ from scipost.templatetags.user_groups import is_financial_admin
 from tasks.tasks.task import TaskKind
 from tasks.tasks.task_action import ViewAction
 
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from django.contrib.auth.models import User
+
+
+def get_all_task_kinds(user: "User | None" = None) -> Collection[type[TaskKind]]:
+    """Return all TaskKind classes, optionally filtered by user eligibility."""
+    classes: list[type[TaskKind]] = []
+    for cls in globals().values():
+        if isinstance(cls, type) and issubclass(cls, TaskKind) and cls != TaskKind:
+            cls.user = user
+            classes.append(cls)
+
+    # Filter the classes based on user eligibility
+    if user is not None:
+        classes = [cls for cls in classes if cls.is_user_eligible(user)]
+
+    return classes
+
 
 class ScheduleSubsidyPayments(TaskKind):
     name = "Schedule Subsidy Payments"
@@ -187,11 +207,3 @@ class CheckSubsidyPaymentTask(TaskKind):
             )
             .filter(Q(status=SUBSIDY_INVOICED))
         )
-
-
-__all__ = [
-    ScheduleSubsidyPayments,
-    ScheduleSubsidyCollectivePayments,
-    SendSubsidyInvoiceTask,
-    CheckSubsidyPaymentTask,
-]
diff --git a/scipost_django/tasks/views.py b/scipost_django/tasks/views.py
index c9e9b4777726eae8b3c9c05e833c65d6ccfd8b79..a9f1980e905d04d26b7d8d64dd40d353ecd6790f 100644
--- a/scipost_django/tasks/views.py
+++ b/scipost_django/tasks/views.py
@@ -1,14 +1,13 @@
 __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
-import importlib
 from django.contrib.auth.decorators import login_required, user_passes_test
 from django.shortcuts import render
 
 from colleges.permissions import is_edadmin_or_active_fellow
 from submissions.models.assignment import EditorialAssignment
 from submissions.models.recommendation import EICRecommendation
-from tasks.tasks.task import TaskKind
+from tasks.tasks.task_kinds import get_all_task_kinds
 
 
 @login_required
@@ -32,14 +31,11 @@ def tasklist(request):
 @user_passes_test(is_edadmin_or_active_fellow)
 def tasklist_new(request):
     """Displays a grouped list of tasks"""
-    # `task_types` should be the * import of task_kinds.py
-    task_types = importlib.import_module("tasks.tasks.task_kinds").__all__
+
     context = {
         "kinds_with_tasks": {
             task_type: task_type.get_tasks()
-            for task_type in task_types
-            if issubclass(task_type, TaskKind)
-            and task_type.is_user_eligible(request.user)
+            for task_type in get_all_task_kinds(request.user)
         }
     }
     return render(request, "tasks/tasklist_new.html", context)