diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 50eb362cd2e9c0e79882d923b3386fd680b5338c..1e911c7b84e771bbfe7c7d886519d551262da477 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -63,6 +63,7 @@ Fixed
 * 2FA via messages or phone calls didn't work.
 * [Dev] Site reference on extensible models can no longer cause name clashes
   because of its related name.
+* GraphQL mutations did not return errors in case of exceptions.
 
 Removed
 ~~~~~~~
diff --git a/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue b/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d99b5466c485c7774dd173bcd5f4d986e8f38558
--- /dev/null
+++ b/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue
@@ -0,0 +1,47 @@
+<template>
+  <v-menu
+    v-model="model"
+    :close-on-content-click="false"
+    :activator="selectedElement"
+    offset-x
+  >
+    <v-card color="grey lighten-4" min-width="350px" flat>
+      <v-toolbar :color="selectedEvent.color" dark>
+        <v-toolbar-title>{{ selectedEvent.name }}</v-toolbar-title>
+        <v-spacer></v-spacer>
+        <v-btn icon @click="model = false">
+          <v-icon>mdi-close</v-icon>
+        </v-btn>
+      </v-toolbar>
+      <v-card-text>
+        <span><v-icon>mdi-cake</v-icon>{{ selectedEvent.start }}</span>
+        <span><v-icon>mdi-cake-layered</v-icon>{{ selectedEvent.start }}</span>
+      </v-card-text>
+    </v-card>
+  </v-menu>
+</template>
+
+<script>
+export default {
+  name: "Birthdays2",
+  props: {
+    selectedElement: {
+      required: true,
+    },
+    selectedEvent: {
+      required: true,
+    },
+    value: { type: Boolean, required: true },
+  },
+  computed: {
+    model: {
+      get() {
+        return this.value;
+      },
+      set(value) {
+        this.$emit("input", value);
+      },
+    },
+  },
+};
+</script>
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index c12ae3371376a0836bdd9898753e7f8d28317daa..63f51b137a21baa17ec83e71f088e453e4d0da01 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -433,6 +433,7 @@ REST_FRAMEWORK = {
 # Configuration for GraphQL framework
 GRAPHENE = {
     "SCHEMA": "aleksis.core.schema.schema",
+    "MIDDLEWARE": ["graphene_django.debug.middleware.DjangoDebugMiddleware"],
 }
 
 # LDAP config
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index f5e5899063678abc338ac971d1df3f55db3d0430..47f3cf259a4228e7e0c718bd39fbd169826e2ed3 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -26,7 +26,7 @@ urlpatterns = [
     path("sw.js", views.ServiceWorkerView.as_view(), name="service_worker"),
     path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")),
     path("__icons__/", include("dj_iconify.urls")),
-    path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True)), name="graphql"),
+    path("graphql/", csrf_exempt(views.GQLView.as_view(graphiql=True)), name="graphql"),
     path("logo", force_maintenance_mode_off(views.LogoView.as_view()), name="logo"),
     path(
         ".well-known/openid-configuration/",
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index e9536003df379d5f97d1cf895d27c2a7b1623600..79f1ba689b6cd381273258724001930d1b8ced52 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -45,6 +45,7 @@ from django_celery_results.models import TaskResult
 from django_filters.views import FilterView
 from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView
 from dynamic_preferences.forms import preference_form_builder
+from graphene_django.views import GraphQLView, graphene_settings
 from guardian.shortcuts import GroupObjectPermission, UserObjectPermission, get_objects_for_user
 from haystack.generic_views import SearchView
 from haystack.inputs import AutoQuery
@@ -1543,3 +1544,9 @@ class TwoFactorLoginView(two_factor_views.LoginView):
         other_devices = list(filter(lambda x: not isinstance(x, type(main_device)), other_devices))
 
         return other_devices
+
+
+class GQLView(GraphQLView):
+    def __init__(self, *args, **kwargs):
+        kwargs.update({"middleware":[graphene_settings.MIDDLEWARE]})
+        super().__init__(*args, **kwargs)