> ## Documentation Index
> Fetch the complete documentation index at: https://docs.prflow.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# FAQ

> Answers to common PRFlow questions — setup and permissions, notifications that didn't arrive, Slack channels and threads, and disconnecting or uninstalling.

Short answers to the questions we get most, grouped by topic. Each answer
links to the page with the full detail. Can't find yours? Email
[hello@prflow.dev](mailto:hello@prflow.dev).

## Setup & permissions

### Why does PRFlow only ask for read-only access?

Everything PRFlow does — posting the Slack card, showing CI status, syncing
comments — only requires reading merge request, comment, and pipeline
metadata, so that is all the access it requests. On GitLab that is the single
[`read_api` scope](/gitlab-integration); on GitHub the App requests four
[read-only permissions](/github-integration#permissions-&-data) (Pull
requests, Checks, Issues, Metadata). PRFlow cannot modify anything on your
code platform, and it never reads repository code or diffs.

### GitHub is asking me to approve a new "Issues" permission for PRFlow. Why?

The PRFlow GitHub App added the read-only **Issues** permission in August
2026 to sync comments from a pull request's Conversation tab: GitHub
delivers those as issue comments, and an App can only receive them with
Issues access — there is no PR-scoped alternative. It is still read-only,
and PRFlow still has no access to repository code. Comments on plain issues
are received and immediately discarded. Your notifications keep working
while the request is pending; once an organization owner approves it,
conversation comments start appearing in the PR's Slack thread. Details in
[Permissions & data](/github-integration#permissions-&-data).

### Can I connect both GitLab and GitHub to the same workspace?

No — a PRFlow workspace connects one source provider, GitHub or GitLab, plus
one Slack workspace. If your team uses both platforms, create a separate
PRFlow organization for each; the organization switcher in the navbar moves
you between them, and more than one organization can post into the same
Slack workspace.

### I added PRFlow to Slack first, from an "Add to Slack" link. Did I do it in the wrong order?

No harm done — no partial or dangling Slack connection is created. PRFlow
works source-first: you connect a GitLab or GitHub repository, then add Slack
from within PRFlow, so a Slack-first install lands on a guided sign-in page
that explains exactly that. Create an account or sign in and continue from
the [quickstart](/quickstart).

### I installed the GitHub App from the GitHub Marketplace first. What now?

That path is fully supported: after installing, GitHub sends you to PRFlow to
link the installation to your workspace. Sign in (or sign up) and the
Connections page shows a "Finish connecting GitHub" prompt with GitHub
pre-selected — press **Connect GitHub** and you're linked. The end result is
identical to starting from inside PRFlow.

### Does PRFlow work with self-managed GitLab or GitHub Enterprise?

Self-managed GitLab works: any instance reachable over HTTPS, connected with
a `read_api` personal access token (gitlab.com additionally supports OAuth).
GitHub Enterprise Server is not supported — the
[GitHub App](/github-integration) works with github.com organizations and
personal accounts.

## When a notification doesn't arrive

### A merge request didn't show up in Slack. What should I check first?

Check whether events are reaching PRFlow at all: the webhook panel on
**Settings → Connections** shows **"Last event received N hours ago"** once
deliveries flow, or "No events received yet" before the first one — on
GitLab, press **Test** on the webhook and refresh the page to watch the
timestamp update. If events are arriving, check your
[notification rules](/channel-routing): rules are evaluated top to bottom and the
first match wins, so make sure an enabled rule matches the repository — and
check which rule is actually catching it.

### Why is there no message for my draft merge request?

By default, drafts stay silent: the card appears when the MR is marked
ready for review (on GitHub, the "Ready for review" action). To get drafts
in the channel, turn on the **Draft PRs** switch in the matching
[notification rule](/channel-routing).

### Why weren't MRs that were already open announced when I connected the project?

PRFlow only announces activity it sees after a project is connected — merge
requests opened earlier are not posted retroactively. If you want a card for
an MR that predates the connection, closing and reopening it posts one: a
reopen event creates the message just like an open does.

### A comment never appeared in the Slack thread. Why?

Comments need a parent message: if the MR has no Slack card — the project was
connected after the MR was opened, or the comment was made while the MR was
still a draft — the comment is not posted, and not retroactively either.
Also check it's something PRFlow syncs: GitLab notes on issues, commits, and
snippets are ignored, as are GitHub comments on plain issues. The full rules
are on the [comment sync](/comment-sync) page.

### GitLab shows webhook deliveries failing with a 404. What's wrong?

A 404 means the delivery URL doesn't match your workspace's unique webhook
endpoint — usually a typo from editing the URL by hand. PRFlow rejects
unrecognized webhook paths with 404 precisely so the mistake shows up in
GitLab's delivery log instead of looking like a success. Copy the URL again
from the webhook panel on **Settings → Connections** and update the webhook
in GitLab.

## Slack channels & threads

### Why doesn't a private channel show up in the channel picker?

PRFlow can only see private channels it has been invited to. Run
`/invite @PRFlow` in the channel, then refresh the page — the channel appears
in the picker like any other. Public channels never need an invite; the
`chat:write.public` scope covers them. More in the
[Slack integration](/slack-integration) reference.

### If I reply in the Slack thread, does my reply appear on the MR?

No — comment sync is one-way, from GitLab or GitHub into Slack. PRFlow has
read-only access to your code platform, so nothing written in Slack is
posted back. Reply on the merge request itself and your comment will be
synced into the thread for everyone following along in Slack.

## Disconnecting & uninstalling

### What happens if I uninstall PRFlow from my Slack workspace?

PRFlow is notified immediately and disconnects on its side: the stored
access token is deleted and posting stops. If the Slack workspace was
connected to more than one PRFlow organization, every one of them is
disconnected — no organization is left showing "Connected" with a dead
token.

### What happens if I disconnect Slack from inside PRFlow?

**Disconnect** on the Slack card (admin-only, with a confirmation step)
removes the connection and also revokes the bot token at Slack immediately,
so it doesn't linger — unless another of your PRFlow organizations shares
the same Slack workspace, in which case revocation is safely skipped and
only your connection is removed. Your repository and channel-mapping setup
is kept, and notifications resume when you reconnect.

### What happens if I uninstall the PRFlow GitHub App on GitHub?

The App reports its own lifecycle events, so uninstalling it from GitHub's
settings cleanly disconnects the integration in PRFlow automatically — there
is nothing to clean up on the PRFlow side. Changing the App's repository
selection works the same way: PRFlow picks up added and removed repositories
on its own.

### What happens if I disconnect GitHub from inside PRFlow?

Disconnect on the Connections page removes the integration and every
repository tracked under it. It does not uninstall the App on GitHub's
side — if you no longer want it installed, remove it from GitHub's App
settings too.

### What happens if I disconnect GitLab from inside PRFlow?

PRFlow deletes its stored copy of your credential (OAuth tokens or personal
access token), releases the claim on your top-level group, and removes its
record of your projects. Because PRFlow has no write access to GitLab, two
things are left for you: the webhook you created stays configured in GitLab
until you remove it there, and a personal access token remains valid until
you revoke it in GitLab.

### What happens when my GitLab token expires or is revoked?

PRFlow validates a personal access token when you save it (scope, expiry,
and revocation status) and refreshes OAuth tokens automatically before they
expire. If GitLab starts rejecting the credential anyway — a revoked or
expired token answers 401/403 — the connection is flagged as unhealthy on
your dashboard so you can rotate it. Re-entering a new token works without
disconnecting first, even if you also spell out `https://gitlab.com` as the
instance URL.

## Still stuck?

Email [hello@prflow.dev](mailto:hello@prflow.dev) — include a link to the
MR/PR and the channel you expected the notification in, and we'll get you
sorted.
