---
title: Migrate from Bulldozer to Mergify
description: Move from Bulldozer automerge to Mergify's Merge Queue for safer, faster merges.
---

[Bulldozer](https://github.com/palantir/bulldozer) focuses on automerging pull
requests based on labels, reviews, and status checks. Mergify's [Merge
Queue](/merge-queue) covers that and more, with automatic PR updates,
prioritization, batching, and parallel checks.

This page shows a practical path to move from Bulldozer to Mergify's Merge
Queue.

:::tip[Need help?]

We've migrated many teams from Bulldozer. [Reach
out](mailto:support@mergify.com) and we'll review your Bulldozer configuration
and propose an equivalent Mergify setup.

:::

## Typical Migration Plan

1. Keep your labels and branch protections as-is
2. Set up a Mergify merge queue with conditions matching your Bulldozer config
3. Start with a low-impact setup and expand gradually

## Common Bulldozer config → Mergify Merge Queue

Example Bulldozer snippet:

```yaml
merge:
  trigger:
    label: ["merge when ready"]
    branch_patterns: ["feature/.*"]
  method: squash
  required_statuses:
    - "ci/circleci: ete-tests"
```

Equivalent Mergify configuration:

```yaml title=.mergify.yml
merge_protections_settings:
  auto_merge_conditions:
    - label = merge when ready
    - head ~= ^feature/

merge_protections:
  - name: bulldozer-equivalent
    if:
      - base = main
      - head ~= ^feature/
    success_conditions:
      - "check-success = ci/circleci: ete-tests"

queue_rules:
  - name: default
    merge_method: squash
```

Notes:
- [`auto_merge_conditions`](/merge-protections/auto-merge) is where Bulldozer's
  `trigger` goes: a pull request that matches it is queued without anyone
  commenting [`@mergifyio queue`](/commands/queue). Set the field to `true`
  instead and every pull request is queued, including ones that match no
  [merge protection](/merge-protections) rule. Those reach the queue gated by
  your branch protections and the queue's own `queue_conditions` alone

- Bulldozer's `required_statuses` become `check-success = <name>` conditions
  (or `check-skipped`, `check-neutral`) under `success_conditions`, where they
  gate both entry to the queue and the merge

- Required labels map to `label = <name>` conditions

- Approvals map to review count or specific reviewers

- The merge queue keeps PRs updated automatically, so no manual rebases are
  needed

## Going Further with Merge Queue

Once you have basic automerge working, you can take advantage of features
Bulldozer doesn't offer:

- [Priorities](/merge-queue/priority): urgent PRs jump ahead in the queue

- [Batches](/merge-queue/batches): merge multiple PRs at once to reduce CI
  load

- [Parallel checks](/merge-queue/performance#parallel-checks): test multiple queue
  entries simultaneously

## Feature parity quick table

- Merge methods: squash/merge/rebase → supported via `merge_method`

- Delete branch after merge → use GitHub's "Automatically delete head branches"
  repository setting

- Rebase/update before merge → automatic in merge queue

- Require labels → `label =` in `auto_merge_conditions` to trigger the queue,
  or in `success_conditions` to require the label as a merge protection

- Restrict by authors/paths → `author =`, `files ~=`, etc. in
  `success_conditions` or `if`
