diff --git a/aleksis/core/migrations/0010_dashboardwidget_broken.py b/aleksis/core/migrations/0010_dashboardwidget_broken.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca49d4e15837270f9658936e3f7bdaa66fbcd758
--- /dev/null
+++ b/aleksis/core/migrations/0010_dashboardwidget_broken.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.1.4 on 2021-02-19 13:43
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0009_default_dashboard'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='dashboardwidget',
+            name='broken',
+            field=models.BooleanField(default=False, verbose_name='Widget is broken'),
+        ),
+    ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 24b6c8ca1c5f18889679d9c81b972eaac6cd72c4..04bc77b7a6f3e89a345bd2e54f60e0842bfed296 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -698,10 +698,12 @@ class DashboardWidget(PolymorphicModel, PureDjangoModel):
         return media
 
     template = None
+    template_broken = None
     media = Media()
 
     title = models.CharField(max_length=150, verbose_name=_("Widget Title"))
     active = models.BooleanField(verbose_name=_("Activate Widget"))
+    broken = models.BooleanField(verbose_name=_("Widget is broken"), default=False)
 
     size_s = models.PositiveSmallIntegerField(
         verbose_name=_("Size on mobile devices"),
@@ -736,8 +738,13 @@ class DashboardWidget(PolymorphicModel, PureDjangoModel):
         """Get template.
 
         Get the template to render the widget with. Defaults to the template attribute,
-        but can be overridden to allow more complex template generation scenarios.
+        but can be overridden to allow more complex template generation scenarios. If
+        the widget is marked as broken, the template_broken attribute will be returned.
         """
+        if not self.template:
+            raise NotImplementedError("A widget subclass needs to define a template.")
+        if self.broken and self.template_broken:
+            return self.template_broken
         return self.template
 
     def __str__(self):