Skip to main content
Use this when the change is a GitHub pull request. To run a test plan you already have, use GitHub regression testing.

Set it up

GitHub App

Automatic review on every pull request. Needs a preview URL from a deployment or a @qa.tech comment.

Change Review Action

Start the review from a workflow, after a deploy job or on a label. The App must still be installed.

After merge

No preview environment. Review the merged pull request against staging or production.

Post-merge agent

After a reviewed pull request merges, promote tests from that review into the suite.

Mobile build

Upload the simulator or emulator build and pin the review to it.
To publish preview URLs from Actions, create GitHub Deployments. A preview behind Vercel deployment protection needs the Vercel preview bypass.

What works on GitHub

What this does not do

  • The GitHub App does not test the pull request’s mobile binary. CI has to upload that build.
  • The automatic App does not fail the GitHub check’s workflow job. Use the Change Review Action when the job should wait.
  • This setup does not run a test plan you picked. That is GitHub regression testing.

GitHub App

The App starts a review when a pull request opens or updates, and when someone comments @qa.tech. Install and repository settings are on GitHub App. What a review does, how it selects tests, and when it creates tests are the same on every CI. See How a review works.

What the GitHub App posts

The GitHub App needs write permissions to communicate test results back to your PR. Here is what it posts and when:
If you see permission errors when installing the app, ensure the repository grants write access for pull requests and statuses. The app only writes when tests run or when the organization is out of credits.

PR Review check

QA.tech registers a GitHub check run named QA.tech / PR Review on PR commits. You can require it in branch protection as a merge gate. Whether a check appears on PR open or sync depends on the integration settings and how the review was triggered.
Auto-run on PRs controls only the automatic PR-open trigger. It does not block explicit triggers: @qa.tech comments, the Change Review Action, and the change-review API always start a review (and create or update the check) when invoked.When Auto-run on PRs is off, QA.tech does not post a skipped check that says auto-review is disabled. The PR simply has no QA.tech check until you trigger a review manually or from CI.

Triggering a PR Review

Automatic trigger (simple)

With Run automatically on PRs enabled, QA.tech starts a review when a PR is opened or updated and its preview deployment is ready. This is the simplest option once a repository is configured.
Automatic triggering works best when you have a single application deployed via GitHub Deployments (or a provider that creates them, such as Netlify or Vercel) and you don’t need extra control over when reviews run. If you have multiple applications per PR, don’t use deployment-based previews, or need to gate reviews on labels, paths, or a specific deploy job, use the Change Review Action instead.

Manual trigger with an @qa.tech comment

You can trigger a review at any time by commenting @qa.tech on the pull request. This works on the main PR conversation and on inline code review comments, even when Run automatically on PRs is turned off or a previous review was abandoned. The mention is case-insensitive (@QA.tech, @qatech, and similar variants all match). When QA.tech picks up the comment, it reacts with an eyes emoji to acknowledge it.
Without a URL in the comment, QA.tech waits for a ready preview deployment on the PR’s latest commit. It posts a short “waiting for a preview deployment” comment and starts the review automatically once one is ready. Include a preview URL in the comment to start immediately against that environment.

Re-run from the GitHub checks UI

Every review posts a status check on the PR commit. You can re-trigger a review by using GitHub’s Re-run button on the QA.tech check, the same way you re-run any other CI check.

Change Review Action

The Change Review Action still needs the GitHub App installed at the organization level with access to the repository. The action does not replace that connection: without it, the agent cannot read the PR or post the review. Start the review from a workflow when it must wait for a deploy job, a label, or a preview URL you pass in. It runs the same review agent and posts the same native PR review as the App. Turn off Run automatically on PRs in Settings → Integrations → GitHub App when the workflow drives the review, so each pull request is not reviewed twice. The action calls POST /v1/chat/change-review with the PR URL and your per-PR environment overrides. It starts a review and creates the QA.tech / PR Review check even when Auto-run on PRs is off. A review with no preview environment is After merge. A mobile binary is Mobile build. Pass extra testing guidance with the context input the same way as on API pull request testing.

Setup

You do not need to map the repository to a project in QA.tech (that mapping only powers the App’s automatic trigger); the action passes the repo and preview URLs inline.
1

Install the GitHub App

If you haven’t already, follow Install GitHub App to connect the App at the organization level under Settings → Organization → Connections and grant it access to the repository you want reviewed. Without the App connection (or repo access), the action’s chat will start but the agent has no permission to read your PR. You do not need to create a repository mapping under Settings → Integrations → GitHub App for the action; that mapping is only needed for the App’s automatic PR trigger.
2

Disable Auto-run on PRs (optional)

This step only applies if you have also mapped the repository under Settings → Integrations → GitHub App to enable the App’s automatic trigger. If you want the action to be the only thing that triggers reviews on this repo, open that page and turn off Auto-run on PRs. With auto-run off, QA.tech does not create a QA.tech / PR Review check on PR open; the check appears when this action (or a @qa.tech comment) runs. Leave auto-run on if you want both the automatic trigger and on-demand action runs. If you never mapped the repository, there is no automatic trigger to disable.
3

Configure Secrets

Add a secret to your GitHub repository (Settings → Secrets and variables → Actions). Create the token in Organization Settings → API Keys. Store it as QATECH_API_TOKEN. Pass project_short_id from the project URL or Settings (for example proj_abc123).
4

Find your application short IDs

Copy application short IDs from Settings → Applications & Envs (three-dot menu → Copy Short ID), for example app_abc123. Test Plans → API Integration is a shortcut only when the app is already on a plan. New mobile apps often have no plan yet. Projects with more than one application should pass one entry per app so the agent knows which URL to test against.
5

Create Workflow

Create .github/workflows/qatech-change-review.yml:
On pull_request events the action reads the PR URL from github.event.pull_request.html_url automatically, so pr_url is optional.

Change Review Action reference

Inputs

Each environment in applications_config must include one of:
  • url (plus optional name) to point the application at a preview URL.
  • shortId to reference an existing environment short ID.
  • applicationBuildShortId to reference a previously uploaded mobile build.
Optional customHeaders on any of those shapes persist host-pattern header rules on the environment (auth and protection bypass). Omit the field to leave stored headers unchanged; pass [] to clear them. See Environment custom headers. See Start change review chat API for the request schema this maps to.

How runs are attributed

Runs started by a change review are labelled with the branch, commit, and author of the change under review, the same way Test Run Action runs are. The action reads branch, commit_hash, commit_message, actor, and repository from the workflow’s github context and sends them with the request, so no extra inputs are needed. When the action cannot supply them — for example on older action versions — QA.tech falls back to the head branch and head commit recorded for the pull request, so PR-mode reviews stay attributable either way.

Outputs

The agent posts its review natively on the PR. These outputs let you link to or log the chat conversation from your workflow; they are not the PR review body.

How polling works

When blocking: true, the action polls GET /v1/chat/{chat_short_id} every 20 seconds until the latest assistant message reaches a terminal status: Polling stops after an internal 60-minute timeout. Set a shorter timeout-minutes on the step if you need a tighter cap.

Change review implementation patterns

Block the workflow until the review finishes

By default the action returns as soon as the chat conversation is created and the agent starts working. Set blocking: true to wait for the agent to finish (and post its native PR review) before the workflow step completes. The step fails when the review ends in FAILED or CANCELLED, which makes it suitable as a deployment gate.
The native review is posted to the PR by the agent itself. chat_response is the agent’s final assistant text in the chat (which may summarize what it did but is not the GitHub review body); use it for logging or further automation, not as a replacement for the PR review.

Route multiple applications to per-PR preview URLs

The most common reason to reach for this action over the GitHub App’s automatic trigger: projects with more than one application per PR (for example a frontend, a backend, and an admin dashboard). Pass one entry per application so the agent knows which preview URL to use for each. Each entry must include an environment with at least one of url, shortId, or applicationBuildShortId.

Override the device preset

Pass devicePresetShortId alongside environment to run the review against a specific device preset:

Add free-form context

Use the context input to guide the review with PR-specific or repo-wide instructions. You can also generate this context automatically with an AI agent — see PR Testing best practices.

Review a different PR

Set pr_url when the workflow runs outside a pull_request event (for example on workflow_dispatch):

After merge

No preview environment. Review the merged pull request against staging or production. If you do not have per-PR preview environments, run the change review after merging to your main branch. The workflow deploys to staging/production, extracts the PR number from the merge commit, and reviews the merged PR’s changes against the deployed environment. Results are posted back on the merged PR as a comment.
Notes:
  • Pass environment.shortId for the existing staging environment; pass url only when staging is not already an environment in the project.
  • The PR number is extracted from GitHub’s default merge/squash commit message format ((#123)).
  • Direct pushes to main without a PR are skipped automatically (the review step is gated on steps.pr.outputs.found).
  • Results are posted back on the merged PR as a comment, since the PR is already closed.

Post-merge agent

When a pull request is merged, QA.tech can run an autonomous post-merge agent to keep your test suite healthy — before the internal review retrospective runs. Configure it under Settings → Integrations → GitHub App with the Run post-merge agent toggle, which reveals a Post-merge prompt you can edit. These settings live on the GitHub App integration (alongside Auto-run on PRs and other merge-review options). New GitHub integrations default the agent on with the default prompt prefilled. Existing integrations keep the agent off until you enable it (the default prompt is still prefilled in the form). You can also pass per-PR options when starting a change review via the Start change review chat API or the Change Review Action. See API and CI options below. The key idea: the prompt is the agent’s entire goal. The agent only changes tests when the prompt asks it to. If you point the prompt at something else (for example, “open a Linear issue summarizing the merge”), that is all it does — it will not touch your tests. The default prompt focuses on conservative regression maintenance. The agent runs in the same conversation as the PR review, so it already has the review history — the tests that ran, their results, and the diff — as context. It reuses your existing test tools; there is nothing new to configure beyond the prompt.

What it can do

Depending on your prompt, the agent can:
  • Promote review tests into the regression suite. Only tests this PR’s own reviews created — surfaced to the agent as “main candidates,” still drafts and not last seen failing — can be promoted. Promoting activates a test (and its dependencies) and labels it regression + auto-added automatically, so you can filter for them in the test list. Promoting nothing is a normal outcome.
  • Update tests whose behavior the merge changed so they match the merged state.
  • Convert to draft tests that the merge made stale or irrelevant — cautiously, and only with strong, diff-grounded evidence. If another active test depends on one being drafted, the agent must confirm and draft the whole chain together; it never archives tests automatically.
  • Add tests to a test plan (for example Smoke or Regression) when your prompt asks for it and defines the criteria.
  • Use connected integrations — for example open a tracker issue, post or read a Slack update (when Enable Slack Tools in Chat is on), or (when you have connected MCP servers) run one of their tools — when your prompt asks for something other than test maintenance.
Before promoting or creating anything, the agent checks for an equivalent existing test to avoid duplicates, and it only keeps tests that will run reliably in a regression suite (no hard-coded names, IDs, or other data tied to a single PR). Labels are applied automatically on promotion — you do not manage them in the prompt.

Example prompts

Use these as inspiration — copy, combine, or adapt them: Conservative regression maintenance (default):
Only cover normal end-user flows, not admin tooling:
Add to the Smoke plan when criteria are met:
Be more aggressive about removing stale tests:
Do something other than test maintenance:
Post a Slack summary after merge: Requires Slack tools in chat to be enabled for the project.
The post-merge agent runs before the internal review retrospective, which always runs afterward regardless of whether the post-merge agent is enabled, skipped, or fails. Non-merged (closed) PRs skip the post-merge agent and go straight to the retrospective.

Post-merge via API or CI

When you trigger a merge review with POST /v1/chat/change-review (mode: "pr"), you can pass optional postMerge options. Those options are stored on the review conversation and override the GitHub App integration settings for that PR only when it merges.
Omit postMerge entirely to use the GitHub App integration toggle and prompt. From CI, pass the same JSON body to the change-review API (or wrap it in your own workflow step). Promoted tests are labelled auto-added for provenance today; a durable, structured link back to the originating pull request, and per-test-plan opt-in controls for automatic additions, are planned follow-ups.

Mobile build

Store QATECH_API_TOKEN under Settings → Secrets and variables → Actions. Upload the build first. The shared upload script is on API pull request testing.

Run a change review on the PR

Use this when you want the review agent to select tests from the diff and post a native GitHub review. Install the GitHub App at the organization level with access to the repository. Turn off Auto-run on PRs for that repo in Settings → Integrations → GitHub App so QA.tech does not also start a review against the default environment.
Without the GitHub App, the action can create a chat but never comment on the PR. Install it at the organization level with access to the repository. The Change Review Action reads the PR URL from github.event.pull_request.html_url on pull_request events. Set blocking: true if the job should wait for the verdict. Inputs and outputs are in Change Review Action reference. Write a PR description that names the user-facing flows to test. The agent uses that context the same way it does for web PRs. See PR Testing. To run a known test plan against the same build, see GitHub regression testing.

Common questions

Can I control which tests run? The GitHub App selects tests on its own. Steer a run by commenting @qa.tech <instructions> on the pull request, for example @qa.tech test the checkout flow. See Triggering a PR Review. To choose the tests yourself, run a test plan with GitHub regression testing. You can use both. How do I trigger or re-run a review manually? Comment @qa.tech on the pull request. Add instructions to focus the review, or a preview URL to test a specific environment (@qa.tech https://preview.example.com). You can also use GitHub’s Re-run button on the QA.tech check. My project has more than one application per pull request. What can I do? Keep the GitHub App installed, turn off Auto-run on PRs in Settings → Integrations → GitHub App, and start reviews from the Change Review Action. Pass one applications_config entry per application so each one gets its own preview URL. With auto-run off, the QA.tech / PR Review check appears when the action runs. Can I gate reviews on labels, paths, or a specific deploy job? Yes. Use the Change Review Action and put the gating in your workflow (if: on labels or paths, needs: on a deploy job). Turn off Auto-run on PRs if only the action should start reviews. How do I review a native iOS or Android app? Automatic App reviews look for a preview URL. A mobile pull request is a new binary. Upload the build from CI and pin the review to it. See Mobile build. Turn off Auto-run on PRs for that repository so the App does not also review the default build.