diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py
index ccaf83b8ca09c1301a61497aeae27216a3da82a2..f5357b097ae1a95ef0078a7443d4bd4ecd470357 100644
--- a/brian_dashboard_manager/grafana/dashboard.py
+++ b/brian_dashboard_manager/grafana/dashboard.py
@@ -10,6 +10,7 @@ from brian_dashboard_manager.grafana.utils.request import TokenRequest
 
 logger = logging.getLogger(__name__)
 
+NUM_RETRIES = 3
 
 def get_dashboard_definitions(dir=None):
     """
@@ -231,9 +232,17 @@ def create_dashboard(request: TokenRequest, dashboard: dict, folder_id=None):
     if folder_id:
         payload['folderId'] = folder_id
 
-    try:
-        r = request.post('api/dashboards/db', json=payload)
-        return r.json()
-    except HTTPError:
-        logger.exception(f'Error when provisioning dashboard {title}')
+    # retry up to NUM_RETRIES times
+    for _ in range(NUM_RETRIES):
+        try:
+            r = request.post('api/dashboards/db', json=payload)
+            return r.json()
+        except HTTPError as e:
+            message = ''
+            if e.response is not None and e.response.status_code == 412:
+                message = e.response.json()
+            logger.exception(f'Error when provisioning dashboard {title}: {message}')
+            if e.response is not None and e.response.status_code < 500:
+                # only retry on server side errors
+                break
     return None