Pure-reference for designing and reviewing a browser / OS / device test matrix from traffic data - the T1/T2/T3 tier-membership heuristics (T1 >=5% traffic, T2 1-5% or statutory, T3 <1% with customer demand), the traffic-share sources (own analytics, StatCounter, MDN browser-compat-data), a worked matrix template with tier-change log, the matrix review checklist (staleness, T1 oversize, below-threshold T1 entries, missing real-device coverage), how to justify dropping a legacy browser (IE11, old iOS Safari), and the compatibility budget (tier caps, CI cost formula, published support statement) in references/compatibility-budget.md. Use when designing an initial matrix, capping or publishing a support policy, running a quarterly re-tier review, or making the case to drop a browser. This is the WHAT-to-test strategy reference - to execute the matrix use playwright-testing browser projects (bundled engines), selenium-grid-4-runner (self-hosted), or cloud-grid-e2e (managed grids).
70
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
A real browser matrix tiers browsers by traffic share, regulatory requirement, and team budget, then runs each tier at its own cadence - not "test on everything".
This skill is a pure reference consumed by the sibling execution
skills: cloud-grid-e2e (BrowserStack / Sauce Labs / LambdaTest),
the self-hosted selenium-grid-4-runner, and playwright-testing
browser projects (bundled engines; references/browser-matrix.md).
Capping the matrix and publishing the support statement is covered in
references/compatibility-budget.md.
Cadence per tier; exact traffic thresholds are defined once in the Tier-membership heuristic section below.
| Tier | Cadence | Coverage criterion | Example |
|---|---|---|---|
| T1 - Must pass every PR | Per-PR + main | Highest-traffic, must-not-break combos | Chrome current + Chrome-1 |
| T2 - Pre-release / nightly | Nightly + pre-release | Mid-traffic OR statutory (regulated industries) | Firefox / Safari / Edge current |
| T3 - Quarterly / on-demand | Quarterly | Long-tail with customer demand | Safari iOS 16 / IE11 / niche Android |
| Source | Use for |
|---|---|
| Your product's own analytics (GA / Plausible / etc.) | Definitive ground truth for your users |
| StatCounter (gs.statcounter.com) | Global / regional baseline when own data thin |
| MDN browser-compat-data (github.com/mdn/browser-compat-data) | Per-feature compatibility map - which versions support a given Web API |
| caniuse.com | Same purpose as MDN, easier UI |
| web-platform.org browser support (webstatus.dev) | Web Platform features cross-browser readiness |
| GitHub Actions browser-default versions (github.com/actions/runner-images) | What CI runners ship with by default |
Use your own analytics for traffic-share decisions; supplement with StatCounter when slicing geographies you don't have own data for.
A hypothetical SaaS B2B web app builds its first matrix from its own analytics:
Result: a 3-combo T1, 5-combo T2, 4-combo T3 matrix with a documented reason per row. The filled-in artifact is references/matrix-template.md.
The single authoritative traffic thresholds, referenced by the three-tier model and worked example above. A browser belongs in:
T1 if any of:
T2 if any of:
T3 if any of:
Out of scope if all of:
Where to test each tier:
| Tier | Recommended infrastructure | Reason |
|---|---|---|
| T1 | Bundled engines (Playwright + Chromium / Firefox / WebKit) on CI runner | Free; fast; sufficient for engine-level coverage |
| T2 | Cloud grid (BrowserStack / Sauce / LambdaTest) | Real devices + real OS; manageable cost at nightly cadence |
| T3 | Cloud grid on-demand | Real device + low-frequency; budget-friendly |
| Internal apps | Self-hosted Selenium Grid 4 + tunnels | Data residency or cost-control |
For very high-volume + cost-sensitive teams, self-hosted Selenium Grid 4 for T1 + cloud grid for T2 / T3 is the optimum mix.
A T1 entry "Chrome latest" can mean:
For T1 the bundled-engine path is usually sufficient; for T2 / T3, real-browser via cloud grid is the choice when the difference matters (some bugs are real-Chrome-only).
The tiering above decides WHICH combos to test; the budget decides HOW MANY the team can afford to commit to, and publishes that commitment. references/compatibility-budget.md carries the four-tier commitment model (per-PR / nightly / pre-release / unsupported), the CI cost formula, example budgets per product type, the external "what we support" statement template, and the telemetry-to-tier mapping.
When auditing a committed matrix (quarterly review, or before relying on it for a release), check four failure modes:
| # | Check | Severity | Rule |
|---|---|---|---|
| 1 | Staleness | BLOCK | The matrix must carry a Reviewed: date under 90 days old and a Next review: date, per the quarterly-review convention. Absent or older = STALE. |
| 2 | T1 oversize | WARN | T1 runs on every PR and dominates CI cost (budget reference §3). More than 6 T1 combos with no written cost rationale = review trigger. |
| 3 | Below-threshold T1 entries | BLOCK | T1 requires >=5% own traffic (heuristic above). Any T1 entry below 1% in both own analytics and StatCounter, with no contractual obligation, belongs in T3 or unsupported. Same-engine duplicates (Brave beside Chrome) count as one. |
| 4 | Missing real-device coverage | WARN | If the audience includes mobile and iOS Safari / Chrome on Android sits in T1/T2, a bundled-engine-only CI config is insufficient - bundled WebKit is not Safari; those rows need a cloud-grid or real-device leg. |
Refuse to treat a matrix as PASS while any BLOCK finding stands, and flag own-analytics data older than 90 days as stale telemetry.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| "Test on all browsers" without tiering | Wastes resources; nothing actually gates the release | Tier explicitly |
| Tier membership never reviewed | Drift: T3 browsers stay in T3 long after traffic dies | Quarterly review |
| Same tests across all tiers | Some tests are environment-specific; running all everywhere is wasteful | Smoke at T1 / T2 / T3; full regression at T1 only |
| Counting Chromium-engine browsers separately (Chrome, Brave, Vivaldi, Opera) | Same engine; one test covers them | Group by engine; test the dominant browser only |
| IE11 in 2026 | Trivial traffic in nearly all contexts | Audit own analytics before committing |
| Mobile and desktop in same tier | Different breakage surfaces | Treat mobile as its own dimension |
| No tier-change log | "Why is Safari 14 in T2?" - nobody remembers | Always log tier changes |
playwright-testing (bundled engines; references/browser-matrix.md),
selenium-grid-4-runner,
cloud-grid-e2e (BrowserStack / Sauce Labs / LambdaTest).