diff --git a/arkindex/dataimport/providers.py b/arkindex/dataimport/providers.py
index 09f7e5b35c5cd503bb3df40edf885573f54e6857..370527a19d4ab9ff44bfeefdee51eb34993f5e9b 100644
--- a/arkindex/dataimport/providers.py
+++ b/arkindex/dataimport/providers.py
@@ -394,7 +394,16 @@ class GitLabProvider(GitProvider):
             return
 
         if not sha:
-            raise ValidationError('Missing checkout SHA')
+            # If there isn't any SHA it means that a branch was deleted
+            ref = request.data.get('ref')
+            if not ref:
+                raise ValidationError('Missing branch reference')
+
+            # Delete existing branch
+            branch_name = ref[11:] if ref.startswith('refs/heads/') else ref
+            repo.refs.filter(name=branch_name, type=GitRefType.Branch).delete()
+
+            return
 
         # Already took care of this event
         if repo.revisions.filter(hash=sha).exists():
diff --git a/arkindex/dataimport/tests/test_gitlab_provider.py b/arkindex/dataimport/tests/test_gitlab_provider.py
index 8d6877623d7b8e1dfbada32485d0d7529e50bd2c..1e9bf7766b7c40233faa49ec5f8ba18ad7ce25ac 100644
--- a/arkindex/dataimport/tests/test_gitlab_provider.py
+++ b/arkindex/dataimport/tests/test_gitlab_provider.py
@@ -484,14 +484,6 @@ class TestGitLabProvider(FixtureTestCase):
         self.assertFalse(rev.exists())
         self.assertFalse(repo_imports.exists())
 
-        # Missing SHA
-        request_mock.data['object_kind'] = 'push'
-        del request_mock.data['checkout_sha']
-        with self.assertRaises(ValidationError):
-            glp.handle_webhook(self.repo, request_mock)
-        self.assertFalse(rev.exists())
-        self.assertFalse(repo_imports.exists())
-
         # Breaking change: a list!
         request_mock.data = [request_mock.data]
         with self.assertRaises(ValidationError):
@@ -499,6 +491,39 @@ class TestGitLabProvider(FixtureTestCase):
         self.assertFalse(rev.exists())
         self.assertFalse(repo_imports.exists())
 
+    def test_handle_webhook_delete_branch(self):
+        """
+        Test GitLabProvider properly handles a branch deletion
+        """
+        rev = Revision(
+            repo=self.repo,
+            hash='1',
+            message='commit message',
+            author='bob',
+        )
+        rev.save()
+        self.assertTrue(self.repo.revisions.filter(hash='1').exists())
+        repo_imports = DataImport.objects.filter(revision__repo_id=str(self.repo.id))
+
+        glp = GitLabProvider(url='http://aaa', credentials=self.creds)
+        glp.update_or_create_ref(self.repo, rev, 'test', GitRefType.Branch)
+        self.assertEqual(len(self.repo.refs.all()), 1)
+        request_mock = MagicMock()
+        request_mock.META = {
+            'HTTP_X_GITLAB_EVENT': 'Push Hook',
+            'HTTP_X_GITLAB_TOKEN': 'hook-token',
+        }
+        request_mock.data = {
+            'object_kind': 'push',
+            'ref': 'refs/heads/test',
+            'commits': []
+        }
+
+        glp.handle_webhook(self.repo, request_mock)
+        self.assertTrue(self.repo.revisions.filter(hash='1').exists())
+        self.assertEqual(len(self.repo.refs.all()), 0)
+        self.assertFalse(repo_imports.exists())
+
     def test_retrieve_repo_type(self):
         """
         Gitlab provider allow to retrieve a project type