diff --git a/aleksis/apps/alsijil/data_checks.py b/aleksis/apps/alsijil/data_checks.py
index a3e3edd1cff1900e4a404c7894efe25e322f85b9..54abf4678345b1bdb63596f19f31a4125e523cc1 100644
--- a/aleksis/apps/alsijil/data_checks.py
+++ b/aleksis/apps/alsijil/data_checks.py
@@ -7,6 +7,8 @@ from django.utils.translation import gettext as _
 import reversion
 from calendarweek import CalendarWeek
 
+from aleksis.core.util.core_helpers import celery_optional
+
 
 class SolveOption:
     name: str = "default"
@@ -90,6 +92,7 @@ DATA_CHECKS_BY_NAME = {check.name: check for check in DATA_CHECKS}
 DATA_CHECKS_CHOICES = [(check.name, check.verbose_name) for check in DATA_CHECKS]
 
 
+@celery_optional
 def check_data():
     for check in DATA_CHECKS:
         logging.info(f"Run check: {check.verbose_name}")
diff --git a/aleksis/apps/alsijil/templates/alsijil/data_check/list.html b/aleksis/apps/alsijil/templates/alsijil/data_check/list.html
index 3d84d259528f6f11923d2400d0d871079a29d1e6..e1d763f5cf409db2fea9fa3792a2ac177700502e 100644
--- a/aleksis/apps/alsijil/templates/alsijil/data_check/list.html
+++ b/aleksis/apps/alsijil/templates/alsijil/data_check/list.html
@@ -10,7 +10,7 @@
 {% block page_title %}{% blocktrans %}Data checks{% endblocktrans %}{% endblock %}
 
 {% block content %}
-  <a class="btn green waves-effect waves-light" href="#">
+  <a class="btn green waves-effect waves-light" href="{% url "data_check_run" %}">
     <i class="material-icons left">refresh</i>
     {% trans "Check data again" %}
   </a>
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 1fab7d4e76210ac1dd094cc06382ff061d0924d0..16f8a43ddc3438fdfbbc73729611a6249c8f5fa3 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -69,6 +69,7 @@ urlpatterns = [
         name="delete_excuse_type",
     ),
     path("data_check/", views.DataCheckView.as_view(), name="check_data",),
+    path("data_check/run/", views.run_data_checks, name="data_check_run",),
     path(
         "data_check/<int:id_>/<str:solve_option>/",
         views.solve_data_check_view,
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 875207aaaaae85f5e184da0360cbd0e912a6f4e4..cb4ca7ab796b7c7452d0a25f578bb716becb9be5 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -23,7 +23,11 @@ from aleksis.apps.chronos.util.date import get_weeks_for_year, week_weekday_to_d
 from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
 from aleksis.core.models import Group, Person, SchoolTerm
 from aleksis.core.util import messages
-from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional
+from aleksis.core.util.core_helpers import (
+    get_site_preferences,
+    is_celery_enabled,
+    objectgetter_optional,
+)
 
 from .forms import (
     ExcuseTypeForm,
@@ -765,15 +769,25 @@ class DataCheckView(ListView):
     template_name = "alsijil/data_check/list.html"
     context_object_name = "results"
 
-    def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
-        context = super().get_context_data(**kwargs)
-        check_data()
-        return context
-
     def get_queryset(self) -> QuerySet:
         return DataCheckResult.objects.filter(solved=False).order_by("check")
 
 
+def run_data_checks(request: HttpRequest) -> HttpResponse:
+    check_data()
+    if is_celery_enabled():
+        messages.success(
+            request,
+            _(
+                "The data check has been started. Please note that it may take "
+                "a while before you are able to fetch the data on this page."
+            ),
+        )
+    else:
+        messages.success(request, _("The data check has been finished."))
+    return redirect("check_data")
+
+
 def solve_data_check_view(
     request: HttpRequest, id_: int, solve_option: str = "default"
 ):