FixControl delivers approved patches to four kinds of code host. GitHub has its own dedicated guide; this page covers GitLab and Bitbucket. The flow is the same for every host: you click Run fix on an issue, an agent produces a patch, the sandbox verifies it, and once the patch is approved a merge or pull request is opened on a new branch. Only the way you connect differs.
| Provider | Opens a | How you connect |
|---|---|---|
| GitHub | Pull request | Install the GitHub App, device code, or personal access token |
| GitLab (gitlab.com) | Merge request | Sign in with GitLab, or personal access token |
| GitLab (self-hosted) | Merge request | Personal access token with your GitLab URL |
| Bitbucket Cloud | Pull request | Sign in with Bitbucket, or access token / App Password |
| Bitbucket Server / Data Center | Pull request | Set up with your FixControl contact (see below) |
You need to be an admin of your FixControl organization to connect a code host. All connections live under Settings → Channels → Code & patch delivery.
GitLab
Sign in with GitLab (recommended for gitlab.com)
- Open Settings → Channels → Code & patch delivery → GitLab and click Connect GitLab.
- Choose Sign in with GitLab and click Continue with GitLab.
- On GitLab, review the requested scopes (
apiandread_user) and approve. - You return to FixControl and the connection shows as connected.
Merge requests are attributed to your GitLab user, and tokens refresh automatically. The OAuth application belongs to FixControl; you don't register one yourself.
Personal access token (self-hosted GitLab, or as an alternative)
Use this path for a self-hosted GitLab instance, or when you prefer a token over signing in.
- In GitLab, create a personal access token with the scope
api. - In FixControl, open Connect GitLab and choose Advanced: paste a Personal Access Token.
- For a self-hosted instance, fill in GitLab URL. Leave it blank for gitlab.com.
- Paste the token and click Save token.
A token is tied to the user who created it. If that user leaves or the token expires, delivery stops until someone connects again.
What FixControl does when it delivers
- Creates a new branch named like
fix/<issue-key>-<slug>-…from the codebase's branch. - Commits the approved patch to that branch.
- Opens a merge request with a title and description taken from the issue.
- Never merges. Merging stays with your team.
Webhooks
GitLab has one webhook URL per project with a checkbox per event type, so FixControl uses one too: the CI/CD webhook you set up under Settings → DevOps. See DevOps & CI/CD for the exact URL, the events to enable and where the secret goes. Tick Merge request events and Pipeline events on that webhook; there is no second webhook to create.
What each event does:
| GitLab event | What FixControl does with it |
|---|---|
| Merge request | Updates the patch's delivery state when its merge request is opened, closed, merged or reopened, recording when it was merged and by whom (or when it was closed). A merged MR also links back to the originating issue's external records. |
| Pipeline | Two readings of the same delivery, written to two different places: the CI/CD lane governs it as a pipeline run for deployment gates, and the code lane copies its rollup onto the patch's CI state. |
| Push, Note (comments) | Not handled. Nothing in FixControl reacts to a push or to a comment on a merge request. |
Three properties of that path are worth knowing, because they are what makes a webhook trustworthy:
- It is verified, not trusted. The code-lane reading re-resolves the connection and re-verifies the signature over the same raw bytes the CI/CD lane verified. No "already checked" flag crosses between them.
- A redelivery is not a second effect. Each lane claims its own deduplication key, so GitLab re-sending a delivery is processed at most once per lane.
- A delivery is clamped to its own project, and state does not go backwards. An event cannot move a patch belonging to another project, and a late-arriving older event cannot undo a newer one.
The patch's delivery state is not the FixControl issue's state: merging the merge request does not close the issue. That stays a decision somebody makes.
If no webhook is set up, you can still refresh a merge request's state by clicking Check on the patch.
Bitbucket Cloud
Sign in with Bitbucket (recommended)
- Open Settings → Channels → Code & patch delivery → Bitbucket and click Connect Bitbucket.
- Choose Sign in with Bitbucket and click Continue with Bitbucket.
- On Bitbucket, approve the requested access to repositories and pull requests.
- You return to FixControl and the connection shows as connected.
The OAuth consumer belongs to FixControl; you don't create one yourself.
Access token or App Password
- In Bitbucket, create a workspace or repository access token (recommended), or an App Password. Give it read and write access to repositories and pull requests.
- In FixControl, open Connect Bitbucket and choose Advanced: paste an access token or App Password.
- Paste the token. For an App Password, also fill in Bitbucket username; leave it blank for an access token.
- Click Save token.
Pull request state
Merged and declined pull requests, and commit build status, can reach FixControl through a Bitbucket webhook. The webhook secret is managed by FixControl: ask your FixControl contact for the webhook URL and secret if you want this. Without a webhook, click Check on the patch to refresh a pull request's state.
Bitbucket Server / Data Center
FixControl can deliver patches to Bitbucket Server and Data Center, but there is no separate card for it under Settings → Channels today. Contact your FixControl contact to set it up. Have these ready:
- The base URL of your instance, for example
https://bitbucket.internal.acme/. It must be reachable from FixControl. - An HTTP access token with read access to the project and read and write access to the repositories.
Multiple providers in one organization
You can connect any combination of providers. For example: GitHub for product repositories, GitLab for an internal tools monorepo, Bitbucket for a legacy product. Each codebase points at exactly one provider, and agents use the right one automatically when a Run fix runs.
Common errors
| Symptom | Cause and fix |
|---|---|
The connection shows Reconnect required, or 401 unauthorized on delivery | Token expired or revoked. Connect again from Settings → Channels → Code & patch delivery. |
404 not found opening a merge or pull request | The repository moved or the codebase points at the wrong project. Check the codebase settings. |
403 forbidden on push | The token lacks write access. For GitLab, use a token with the api scope; for Bitbucket, a token with repository write access. Connect again with the right access. |
| GitLab webhook deliveries return 401 | The secret in GitLab doesn't match. Use Rotate secret on the GitLab CI card under Settings → DevOps and paste the new secret into GitLab. |
FAQ
Can a single repository use multiple providers? No. Each codebase resolves to exactly one provider. If you mirror a repository across hosts, pick the canonical one and let the others sync from it outside FixControl.
Are tokens encrypted at rest? Yes. Every credential (OAuth tokens, refresh tokens, personal access tokens, App Passwords) is encrypted with AES-256-GCM before it is stored.
Can I replace a credential without losing in-flight patches? Yes. Connecting again replaces the stored credential. Patches already pushed are unaffected; new deliveries use the new credential.
Related: GitHub · Codebases · DevOps & CI/CD