diff --git a/lib/workers/branch/automerge.ts b/lib/workers/branch/automerge.ts
index 707d4e8fa11e173912e3933a24fa718c05878541..a6298c078046d75c3aca7f2cd4e453c385f4080f 100644
--- a/lib/workers/branch/automerge.ts
+++ b/lib/workers/branch/automerge.ts
@@ -38,13 +38,40 @@ export async function tryBranchAutomerge(
       }
       logger.info({ branch: config.branchName }, 'Branch automerged');
       return 'automerged'; // Branch no longer exists
-    } catch (err) {
-      // istanbul ignore if
+    } catch (err) /* istanbul ignore next */ {
       if (err.message === 'not ready') {
         logger.debug('Branch is not ready for automerge');
         return 'not ready';
       }
-      logger.info({ err }, `Failed to automerge branch`);
+      if (
+        err.message.includes('refusing to merge unrelated histories') ||
+        err.message.includes('Not possible to fast-forward')
+      ) {
+        logger.warn({ err }, 'Branch is not up to date - cannot automerge');
+        return 'not ready';
+      }
+      if (err.message.includes('Protected branch')) {
+        if (err.message.includes('status check')) {
+          logger.debug(
+            { err },
+            'Branch is not ready for automerge: required status checks are remaining'
+          );
+          return 'not ready';
+        }
+        if (err.stack?.includes('reviewers')) {
+          logger.info(
+            { err },
+            'Branch automerge is not possible due to branch protection (required reviewers)'
+          );
+          return 'failed';
+        }
+        logger.info(
+          { err },
+          'Branch automerge is not possible due to branch protection'
+        );
+        return 'failed';
+      }
+      logger.warn({ err }, 'Unknown error when attempting branch automerge');
       return 'failed';
     }
   } else if (branchStatus === BranchStatus.red) {