Playwright reporter configuration
Every setting is an option of the reporter in playwright.config, and most have a PROBARA_*
environment variable too. Keep the token in the environment, the project in the config (or the
environment), and set the rest where it fits your pipeline.
Quick path
Section titled “Quick path”- Create an app token from the Playwright card in Workspace › Integrations
(get started) and store it as a
CI secret named
PROBARA_API_TOKEN. - Set the Project ID:
projectIdin the reporter options, orPROBARA_PROJECT. It is a capital letter followed by capital letters or digits (SHOP,E2E); any other value turns reporting off with an error. - Leave the rest to its default. The run is named after the CI build, and its branch, commit and build URL come from the CI.
import { defineConfig } from '@playwright/test';
export default defineConfig({ reporter: [['list'], ['@probara/playwright-reporter', { projectId: 'SHOP' }]],});apiToken exists for code that reads the token from its own secret store. Do not write the token
into playwright.config: the file is committed.
Sources and precedence
Section titled “Sources and precedence”The first source that sets a value wins:
| Order | Source | Example |
|---|---|---|
| 1 | An option in playwright.config | { run: { name: 'Release 2.4' } } |
| 2 | A PROBARA_* variable | PROBARA_RUN_NAME=Nightly |
| 3 | CI detection | CI #42 from the workflow and run number |
| 4 | The default | Automated run 2026-09-29 14:05 UTC |
- An option set to
undefinednever hides its variable, and a blank variable counts as unset. To let a variable override an option, leave the option out (or passprocess.env.X ?? default). - Booleans accept
true,1,yes,onandfalse,0,no,off. Lists are comma-separated in variables (PROBARA_RUN_TAGS=nightly,smoke), and records arekey=valuepairs (PROBARA_RUN_ULIDS=WEB=<ulid>,API=<ulid>). - CI detection only fills the run’s name and its source (branch, commit, build URL, and in GitHub Actions the workflow run that groups parallel jobs): see what each CI fills in.
Options and variables can be mixed. This config sets the project and the tags, and the pipeline
adds the environment with PROBARA_ENVIRONMENT=staging:
reporter: [ ['list'], ['@probara/playwright-reporter', { projectId: 'SHOP', run: { tags: ['e2e', 'nightly'] } }],],Options
Section titled “Options”| Option | Variable | Type | Default | What it does |
|---|---|---|---|---|
enabled | PROBARA_ENABLED | boolean | on | false turns reporting off: nothing is sent, and nothing is logged |
apiToken | PROBARA_API_TOKEN | string | none (required) | The app token. Keep it in the environment |
projectId | PROBARA_PROJECT | string | none (required) | The Project ID (capital letters and digits), such as SHOP |
baseUrl | PROBARA_BASE_URL | string | https://app.probara.net | The Probara host to report to (base URL) |
run.ulid | PROBARA_RUN_ULID | string | none: a new run | Report into an existing run (sharding) |
run.name | PROBARA_RUN_NAME | string | the CI build name, else Automated run <date> | Name of a new run |
run.description | PROBARA_RUN_DESCRIPTION | string | none | Description of a new run |
run.environment | PROBARA_ENVIRONMENT | string | none | Environment of a new run by name, created when none matches (run options) |
run.environmentId | PROBARA_ENVIRONMENT_ID | string | none | Environment of a new run by ULID |
run.milestone | PROBARA_MILESTONE | string | none | Milestone of a new run by display id (M-3) or name |
run.milestoneId | PROBARA_MILESTONE_ID | string | none | Milestone of a new run by ULID |
run.plan | PROBARA_PLAN | string | none | Test plan of a new run by display id (PLAN-2) or name: the run starts with its cases |
run.configurations | PROBARA_CONFIGURATIONS | { group, name }[] | none | Configurations of a new run by name (Browser=Chrome,OS=Linux), each group once |
run.configurationUlids | PROBARA_CONFIGURATION_ULIDS | string[] | none | Configurations of a new run by ULID |
run.tags | PROBARA_RUN_TAGS | string[] | none | Tags of a new run |
run.ulids | PROBARA_RUN_ULIDS | Record<string, string> | none | The run to reuse in each project (WEB=<ulid>,API=<ulid>) (several projects) |
projects | PROBARA_PROJECTS | string[] | none | Other projects results may go to (WEB,API) (several projects) |
source | — | false | object (GitHub fields below) | detected from the CI | false sends no source; an object overrides the detected fields one by one |
source.branch | PROBARA_BRANCH | string | detected from the CI | Branch of the run source |
source.commit | PROBARA_COMMIT | string | detected from the CI | Commit of the run source |
source.buildUrl | PROBARA_BUILD_URL | string | detected from the CI | CI build URL of the run source |
createMissingCases | PROBARA_CREATE_MISSING_CASES | boolean | true | Create a case for a test that matches none (missing cases) |
suiteUlid | PROBARA_SUITE_ULID | string | the project root | Suite that created cases go under |
closeRun | PROBARA_CLOSE_RUN | boolean | true for a new run, false for a reused one | Close the run at the end |
closeRuns | — | Record<string, boolean> | none | Close the run of each project ({ SHOP: true, WEB: false }) when closeRun is not set |
uploadAttachments | PROBARA_UPLOAD_ATTACHMENTS | boolean | true | false uploads no file (attachments) |
captureOutput | PROBARA_CAPTURE_OUTPUT | boolean | false | Attach each attempt’s stdout and stderr as stdout.log and stderr.log |
statusMapping | PROBARA_STATUS_MAPPING | { passed, failed, skipped, blocked } | none | Send a status as another (failed=blocked) (statuses) |
statusFilter | PROBARA_STATUS_FILTER | string[] | none | Send no result with these statuses, after the mapping (skipped) |
resultsFile | PROBARA_RESULTS_FILE | string | none | JSON file for what could not be sent (results file) |
assignFailedTo | PROBARA_ASSIGN_FAILED_TO | string[] | none | Assign each failed result without an assignee to one of these members, in turn (assigning failures) |
debug | PROBARA_DEBUG | boolean | false | Log every request (debugging) |
rootDir | — | string | Playwright’s rootDir | Directory the file paths of automation keys are relative to (keys) |
chunkSize | — | number | 500 | Results per report request, 1 to 500 |
timeoutMs | — | number | 30000 | Timeout of one HTTP attempt, in milliseconds, 1 to 600000 (network) |
maxRetries | — | number | 4 | Retries of a failed request, 0 to 10 |
attachmentConcurrency | — | number | 2 | Results whose attachments upload at the same time, 1 to 8 |
The reporter sends its own name and version in the User-Agent (such as
probara-playwright-reporter/0.1.0 probara-core/0.2.0 node/22.12.0); there is no option for it.
In GitHub Actions the source also gets these fields, detected from GITHUB_* variables:
| Option | Variable | Type | Default | What it does |
|---|---|---|---|---|
source.provider | — | string | detected from GitHub Actions | github_actions (detected) or other |
source.repository | — | string | detected from GitHub Actions | Repository of the run source, owner/name |
source.commitAuthor | — | string | detected from GitHub Actions | Who triggered the build |
source.pullRequestNumber | — | number | detected from GitHub Actions | Pull request of the build |
source.workflow | — | string | detected from GitHub Actions | CI workflow of the run source |
source.ciRunId | — | string | detected from GitHub Actions | CI run id: the jobs of one GitHub Actions run share one run |
source.ciRunAttempt | — | number | detected from GitHub Actions | Attempt of the CI run: a re-run reports into a run of its own |
source.ciJob | — | string | detected from GitHub Actions | CI job of the run source |
Runtime options
Section titled “Runtime options”For code and tests, the reporter also takes the runtime options of @probara/core, the library it
is built on. They have no variable, and a playwright.config rarely needs them:
| Option | Type | Default | What it does |
|---|---|---|---|
logger | { debug, info, warn, error } | [probara] lines on stderr | Where the reporter logs |
env | Record<string, string> | process.env | Where PROBARA_* and CI variables are read from |
fetch | function | the global fetch | The HTTP client |
sleep | function | setTimeout | Waits between retries |
random | function | Math.random | Jitter of the retry backoff |
now | function | the current time | Clock of the default run name and of Retry-After dates |
What happens with each setup
Section titled “What happens with each setup”| Setup | What the reporter does |
|---|---|
No token and no project, or enabled: false | Stays off and quiet: nothing is sent, nothing is logged (except at debug). |
| Only one of them, or an invalid value | Reporting is off; each problem is logged, and the tests run as usual. |
| A token and a project, every value valid | Reports. |
A value of the wrong type, such as run.tags: 'nightly' instead of a list, is an invalid value:
reporter: [['@probara/playwright-reporter', { projectId: 'SHOP', run: { tags: 'nightly' } }]],$ npx playwright test[probara] Probara reporting is off: run.tags must be a list of stringsProblems name the option or the variable at fault, never its value, so a token never shows up in the log.
Turn reporting off
Section titled “Turn reporting off”Set enabled: false or PROBARA_ENABLED=false, or leave the token out: the reporter sends nothing
and stays quiet. Builds that get no secrets, such as pull requests from forks on most CIs, report
nothing on their own. To keep what a run would have sent, even with reporting off, set a
results file.
Base URL
Section titled “Base URL”baseUrl (PROBARA_BASE_URL) is the Probara host the reporter talks to: the URL of the app,
without a path. It defaults to https://app.probara.net, and requests go to that host and nowhere
else. Leave it unset unless Probara gives you another host.
Network
Section titled “Network”The reporter talks HTTPS to one host, the base URL, from Playwright’s main process.
Timeouts
Section titled “Timeouts”| Setting | Default | Range | What it bounds |
|---|---|---|---|
timeoutMs | 30000 ms | 1 to 600000 | One attempt of a request, the response body included |
| Uploads | 120000 ms, or timeoutMs if larger | — | One attempt of an attachment upload (a large file on a slow link) |
A timed-out attempt is retried like a network error.
Retries and backoff
Section titled “Retries and backoff”| Answer | What happens |
|---|---|
| Network error, timeout, 408, 429, 500, 502, 503, 504 | Retried |
409 with a Retry-After (the same request is still in flight) | Retried |
A 201 whose body never arrived | Retried; the idempotency key replays it |
| Any other answer (400, 401, 403, 404, 409, 413, 422…) | Not retried: the request fails |
maxRetries(0 to 10, default 4) sets the retries after the first attempt: 5 attempts in all by default.- The wait before retry n is 1 s × 2ⁿ⁻¹, at most 30 s, plus up to 20 % of random jitter.
- A
Retry-Afterheader (seconds or an HTTP date) replaces that wait, capped at 120 s. - Each retry is logged, with the attempt and the wait.
With the defaults, a request that keeps failing gives up after about 15 s of waiting (1 + 2 + 4 +
8 s, up to 18 s with the jitter), plus the attempts themselves, each at most timeoutMs. The worst
case is a Retry-After on every answer: 120 s before each retry, so 8 minutes of waiting with the
default 4 retries (20 minutes with maxRetries: 10). That is per request, and a failed report stops
the later ones of its project. Playwright waits for the reporter before it exits, so lower
maxRetries or timeoutMs to bound a CI step.
Rate limit
Section titled “Rate limit”Probara limits API requests per organization (60 requests per minute on Free, 1,200 on Pro, and 3,000 on Enterprise), for every token of the organization together. What a run costs:
| Request | How many |
|---|---|
| Report | 1 per chunk of up to 500 results (chunkSize) |
| Attachment stage | 1 per result with files (per 20 files or 64 MiB) |
| Attachment commit | 1 per result with files |
| Close | 1, when attachments were queued (otherwise the last report closes the run) |
A run of 2000 attempts without files costs 4 requests; one where 100 attempts have a trace costs
about 200 more. 429 answers are retried after their Retry-After. To spread uploads, lower
attachmentConcurrency; to send fewer files, keep traces and videos for failures
(retain-on-failure) or set uploadAttachments: false.
Chunks and ordering
Section titled “Chunks and ordering”- Results go out in chunks of
chunkSize(1 to 500, default 500), one after another, in the order the attempts ended. A run case keeps the last outcome recorded, so the order matters. A chunk also stays within Probara’s totals of steps and tags per report. - The first chunk creates the run (unless
run.ulidnames one); the others reuse it. - When a chunk fails after its retries, the later chunks of that project are not sent and the run is left open; a results file keeps them.
- Uploads start once their report is recorded,
attachmentConcurrencyresults at a time (1 to 8, default 2), and the run is closed after the uploads.
Idempotency
Section titled “Idempotency”Every report, run creation, run close and attachment commit carries an Idempotency-Key, the same
on each retry of that request. A retried report whose first attempt was recorded after all is
replayed by Probara, never recorded twice (idempotency).
Running playwright test again is a new run, with every result recorded again.
Proxies
Section titled “Proxies”The reporter uses Node’s built-in fetch and has no proxy option of its own:
| Node.js | Proxy support |
|---|---|
| 22.21 or later, 24 or later | Set NODE_USE_ENV_PROXY=1 with HTTPS_PROXY (and NO_PROXY); fetch goes through it |
| 22.12 to 22.20 | Not supported: fetch ignores HTTPS_PROXY and HTTP_PROXY |
NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://proxy.example.com:8080 npx playwright testThe setting applies to the whole Node process (Node’s docs):
put localhost in NO_PROXY if your tests reach a local server through fetch. On older Node
versions, upgrade Node or allow app.probara.net through the firewall.
Custom certificate authorities
Section titled “Custom certificate authorities”When your network inspects TLS with a private certificate authority (a corporate proxy, say), give Node the CA certificate (PEM) when it starts:
NODE_EXTRA_CA_CERTS=/etc/ssl/certs/company-ca.pem npx playwright testNode reads NODE_EXTRA_CA_CERTS once at startup, so set it in the environment of the step. On
Node 22.19 and later, NODE_USE_SYSTEM_CA=1 trusts the operating system’s certificate store
instead. There is no option to turn TLS verification off.
Next: link your tests to cases, or see the run options.