Browse the Knowledge Hub211 resources

BrowserStack review: pricing, alternatives and setup
BrowserStack is a commercial cloud of real iOS and Android devices and desktop browsers on Windows and macOS. Live and App Live give testers an interactive session on a device or browser they do not own; Automate and App Automate run Selenium, Playwright, Cypress, Appium and other suites against the same grid. The Local tunnel lets those remote browsers reach staging and localhost.
QAble runs this tool on client engagements. The assessment below is from that experience.
- last reviewed
- 13 October 2026
- version covered
- BrowserStack Automate and App Automate with the BrowserStack SDK, October 2026
- licence
- Commercial
At a glance
BrowserStack at a glance
- Vendor
- BrowserStack
- Category
- Device clouds
- Licence
- Commercial
- Platforms
- Real devices, Browsers, Emulators
- Integrates with
- Selenium, Playwright, Cypress, Appium, Jenkins
- First released
- 2011
- Version reviewed
- BrowserStack Automate and App Automate with the BrowserStack SDK, October 2026
Verdict
Our verdict on BrowserStack
Strengths
- Real iOS and Android devices and Safari on macOS without buying or maintaining hardware
- The SDK runs an existing suite in the cloud by prefixing the normal test command
- Video, logs and network capture for every session make remote failures diagnosable
- The Local tunnel reaches localhost and staging without opening the firewall
- Free for open-source projects, with a free trial for everyone else
Weaknesses
- Automation is priced per parallel test, so speed costs money directly
- Remote execution adds latency to every command compared with a local browser
- Playwright’s desktop Safari option runs Playwright’s WebKit build, not Safari
- Builds and test data leave your network; only desktop grids can be self-hosted
Best for
Teams that need breadth they cannot justify owning: real iPhones and Android devices across OS versions, Safari on macOS, and old browser versions, without a device lab or a fleet of Macs. Interactive sessions on a real device are the feature testers use most, because reproducing a customer’s bug on the exact model and OS version usually settles an argument in minutes. For automation, it is the quickest way we know to run an existing Selenium, Playwright or Appium suite in parallel across that matrix.
Not for
High-volume execution on a narrow matrix, such as thousands of Chrome-only tests on every commit, where a self-hosted grid or containers on your own CI cost far less per run. Also a hard sell where test builds and data must not leave your network: the Automate self-hosted option keeps desktop browser grids in your own AWS, Azure or GCP account, but it does not cover real devices.
Setup cost
Low for a first run, moderate to do properly. The SDK writes a browserstack.yml, and prefixing your normal test command sends the suite to the cloud. Most of the first week goes elsewhere: getting Local tunnels stable in CI, choosing a platform matrix that fits the parallel licence, naming builds so results group sensibly, and raising timeouts written for local execution.
Maintenance burden
Low on infrastructure, which is the main point: browser and device upkeep is BrowserStack’s job. The ongoing work is commercial and organisational. Parallel limits are shared across the account, so teams queue behind each other; the matrix drifts as OS versions age out; and spend rises quietly as suites grow, so someone should own the plan and check usage before renewal.
Honest limitations
Every command crosses the internet, so remote runs are slower than local ones and interactive sessions feel laggy. Playwright’s Safari option on desktop is the WebKit build, not Safari itself. Uploaded apps are kept for 30 days. Queued sessions are capped, and beyond the cap new sessions fail outright. Cost scales with parallel tests, so the pricing conversation tends to arrive just as the suite becomes valuable.
How it works
How BrowserStack works
A remote grid that speaks your framework’s protocol
Automate is, at heart, a very large remote grid. A Selenium or Appium session is a WebDriver session opened against BrowserStack’s hub instead of a local driver, with capabilities naming the OS, browser or device. Playwright connects to browsers BrowserStack launches, and Cypress specs are run on their machines. For each session BrowserStack records video, logs, and optionally network and console output alongside it. Because the protocol is the same one your framework already uses, the test code rarely changes; what changes is latency, since every command now travels to a data centre and back.
The SDK wraps your test runner
The BrowserStack SDK, available for Node.js, Java, Python and C#, sits between your test runner and the grid. You keep your existing command and prefix it, for example npx browserstack-node-sdk playwright test, and the SDK reads browserstack.yml, multiplies your suite across the listed platforms, sets session names and pass or fail status from the test results, and starts the Local tunnel if asked. That removes most of the capability plumbing teams used to write by hand. The cost is one more layer: when something odd happens, you are debugging the SDK as well as your framework.
Parallel tests are the unit of capacity
An Automate plan buys a number of parallel tests, meaning sessions that can run at once across the whole account. With the SDK, the threads you use are the number of platforms multiplied by parallelsPerPlatform, so three platforms at two each use six. Sessions beyond the limit queue: up to five for plans with five parallels or fewer, otherwise as many as the plan’s parallels. Beyond the queue, new sessions fail. The Plan API reports running, maximum and queued sessions, which is the number to watch when several teams share an account.
Local testing through a tunnel
Remote browsers cannot see localhost or a staging site behind your firewall. BrowserStack Local is a binary that runs on your machine or CI agent and opens an outbound tunnel; sessions started with Local enabled resolve requests through it, so a phone in BrowserStack’s data centre can load http://localhost:3000. The SDK starts and stops the binary when browserstackLocal is true. Several tunnels from the same account need distinct local identifiers, otherwise parallel CI jobs can route through each other’s connections.
Strengths
What it does well
Interactive sessions on real hardware
Live and App Live open a real browser or device inside your own browser window and let a tester drive it by hand. For bug reproduction this is the most valuable thing BrowserStack does: you can test the exact iPhone model and iOS version from a customer report within minutes, without owning it.
App Automate for native apps
Upload an .apk, .aab or .ipa through the REST API and receive a bs:// app URL, or let the SDK upload a local file named in browserstack.yml. Appium, Espresso, XCUITest and other suites then run on real devices. Uploaded apps are kept for 30 days, which matters for pipelines that reuse an old upload.
Session artefacts for remote debugging
Every session has a video, text logs and framework logs, and you can switch on network logs as HAR files and browser console logs. When a test fails only in the cloud, these are the difference between a quick diagnosis and guessing, because you cannot attach a debugger to a phone in another country.
Visual and accessibility testing in the same account
Percy and App Percy add visual snapshot comparison, and BrowserStack sells accessibility testing alongside Automate. Running them on the same grid and credentials as functional tests means one vendor, one set of secrets and one dashboard, though each is a separately priced product.
Self-hosted desktop grids
Automate self-hosted, also called TurboScale in the docs, runs a BrowserStack-managed browser grid inside your own AWS, Azure or GCP account, with artefacts stored in your cloud storage. It is aimed at teams that want BrowserStack’s tooling for desktop browsers but must keep traffic and data in their own estate.
Pricing
BrowserStack pricing and licensing
BrowserStack is commercial and sold per product. Live, the interactive product, is priced per user; Automate and App Automate are priced per parallel test, with plans differing by browser and device coverage; Percy, accessibility and other products are separate. Prices on the pricing page are shown per month and billed annually, with Enterprise and volume deals on enquiry. There is a free trial, a small Freelancer plan for Live, and free access for open-source projects.
- Automate: plans named Chrome, Desktop, Desktop & Mobile and Desktop & Mobile Pro, each sold with 1, 2, 5 or more parallel tests. On 13 October 2026 the list price for Automate Desktop with one parallel test was $99 a month, billed annually.
- Live: per-user plans from Desktop to Team and Team Pro; the list price for Live Desktop for one user was $29 a month, billed annually.
- Free options: a free trial, a Freelancer plan with 100 minutes of Live, and free access for qualifying open-source projects.
- How cost scales: by parallel tests for automation and by users for live testing. Doubling suite speed through parallelism roughly means buying more parallels.
- Enterprise: SSO, access controls and priority support are sold as an add-on on enquiry; Automate self-hosted moves desktop grids into your own cloud account, where you also pay the cloud bill.
- Hidden costs: CI time spent waiting on remote sessions, and engineering time tuning timeouts, tunnels and the platform matrix.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
Getting started with BrowserStack
Setup, step by step
- Copy your username and access key from the BrowserStack account settings.
- Export them as BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY.
- Install the Node.js SDK as a dev dependency and run its setup command.
- Edit browserstack.yml: two or three platforms, parallelsPerPlatform, and browserstackLocal if the app is not public.
- Prefix your usual test command with npx browserstack-node-sdk and watch the build in the Automate dashboard.
Install
npm i -D browserstack-node-sdk@latest
npx setup --username "$BROWSERSTACK_USERNAME" --key "$BROWSERSTACK_ACCESS_KEY"
# then run your existing command through the SDK
npx browserstack-node-sdk playwright testA first example
# browserstack.yml (Playwright with the Node.js SDK)
userName: YOUR_USERNAME # keep real keys out of the repository
accessKey: YOUR_ACCESS_KEY
framework: playwright
projectName: Checkout # keep project and build names static
buildName: checkout-e2e
buildIdentifier: '#${BUILD_NUMBER}' # varies per run instead
platforms:
- os: Windows
osVersion: 11
browserName: chrome
browserVersion: latest
- os: OS X
osVersion: Sonoma
browserName: playwright-webkit # Playwright's WebKit build, not Safari
browserVersion: latest
parallelsPerPlatform: 2 # 2 platforms x 2 = 4 parallel tests used
browserstackLocal: true # start the Local tunnel for localhost or staging
debug: false
networkLogs: true # HAR files help with cloud-only failures
consoleLogs: errorsWhat trips people up first
The application is not reachable from the cloud. Tests that pass locally fail on BrowserStack with timeouts or a browser error page, because the remote browser is trying to load localhost or an internal hostname from BrowserStack’s data centre. Set browserstackLocal to true so the SDK starts the Local tunnel, make sure the app is running before the suite starts, and keep the base URL the same as locally; the tunnel resolves it from your side. If it still fails, check that a corporate proxy is not blocking the tunnel’s outbound connection. The second hurdle is speed: raise timeouts tuned for a local browser.
In practice
Using BrowserStack in practice
Choosing a matrix that fits the parallel licence
Start from analytics, not from the device list: the three or four browser and device combinations that carry most of your traffic, plus one old version you still support. With the SDK, every test runs on every platform listed, so the matrix multiplies run time and parallel usage together. A useful split is a fast pull-request run on one or two desktop platforms and a nightly run across the full matrix including real devices. Work out platforms times parallelsPerPlatform against the plan before committing the file, and remember the parallel pool is shared with every other team on the account. If a run regularly queues, it will eventually exceed the queue and fail.
Running the suite from GitHub Actions
The pipeline looks like any other Node.js job with two additions: credentials as repository secrets, and the SDK prefix on the test command. Start the application on the runner before the tests and let the SDK open the Local tunnel to it. Set a build identifier from the run number so builds stay grouped under one name in the dashboard but remain distinguishable. If several matrix jobs each open a tunnel from the same account, give each a distinct localIdentifier under browserStackLocalOptions. Upload Playwright’s own report as an artefact too; BrowserStack’s dashboard is the place to watch sessions, but the framework report is the one developers already know how to read.
# .github/workflows/cross-browser.yml
name: cross-browser
on:
pull_request:
schedule:
- cron: '0 2 * * *' # nightly full matrix
jobs:
browserstack:
runs-on: ubuntu-latest
env:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
BUILD_NUMBER: ${{ github.run_number }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
- run: npm ci
- name: Start the app for the Local tunnel
run: |
npm run build
npm start &
npx wait-on http://localhost:3000
- name: Run Playwright on BrowserStack
run: npx browserstack-node-sdk playwright test
- uses: actions/upload-artifact@v7
if: always()
with:
name: playwright-report
path: playwright-reportNative app runs on real devices
For App Automate, upload the build once per pipeline run rather than reusing an old bs:// URL, since uploads expire after 30 days and a stale build is a confusing source of failures. The SDK can upload a local file named under app in browserstack.yml; outside the SDK, the REST upload returns the app URL to pass as a capability. Choose devices by your users’ models and OS versions, and keep the real-device run to journeys where hardware matters, such as camera, biometrics, push notifications and performance on older phones. Emulators or simulators in your own CI are cheaper for everything else.
# browserstack.yml for App Automate (Appium with the SDK)
userName: YOUR_USERNAME
accessKey: YOUR_ACCESS_KEY
framework: testng
projectName: Mobile app
buildName: android-regression
buildIdentifier: '#${BUILD_NUMBER}'
app: ./build/app-release.apk # the SDK uploads it for you
platforms:
- deviceName: Google Pixel 8 Pro
osVersion: 14.0
platformName: android
- deviceName: Samsung Galaxy S22 Ultra
osVersion: 12.0
platformName: android
parallelsPerPlatform: 1
# Without the SDK, upload and keep the returned bs:// URL:
# curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" -X POST \
# "https://api-cloud.browserstack.com/app-automate/upload" \
# -F "file=@build/app-release.apk"Debugging failures that only happen in the cloud
Most cloud-only failures fall into four groups: the app was unreachable, so check the tunnel; the test was too impatient for remote latency, so wait on conditions rather than fixed sleeps and raise timeouts; the platform really differs, which is the bug you were paying to find; or the session state leaked between tests. Open the session video first, then the network log, then the console. Turn on networkLogs for runs you are investigating rather than permanently, since it adds overhead. When a failure is genuinely device-specific, reproduce it by hand in App Live on the same model, which is often faster than iterating on the automated test.
Keeping spend and usage visible
Parallel tests are shared across the account, so one team’s nightly run can starve another’s pull-request checks. Give each pipeline a fixed share by setting parallelsPerPlatform deliberately, schedule full-matrix runs outside working hours, and check the Plan API before large runs if several teams trigger builds. Review the platform list every quarter and remove OS versions your analytics no longer show. Keep the fast feedback on local browsers or containers and treat the cloud as the coverage layer; teams that send every unit-level browser check to BrowserStack pay for parallels they could have avoided.
Pitfalls
Common pitfalls
All parallel tests are currently in use
Why it happens: Platforms multiplied by parallelsPerPlatform, plus other teams’ runs, exceeded the plan. Excess sessions queue up to a limit, five for small plans, and beyond the queue BrowserStack refuses new sessions with this error.
The fix: Size the matrix against the plan, stagger pipelines, check the Plan API for running and queued sessions, and buy parallels only after cutting duplicated platforms.
Treating playwright-webkit as Safari
Why it happens: Playwright drives its own WebKit build, so the playwright-webkit option on macOS tests the engine, not Apple’s Safari application with its own features and quirks.
The fix: Run Safari-critical journeys through Selenium or WebdriverIO against real Safari on macOS, or on real iOS devices, and keep WebKit runs as a cheaper early signal.
Every session marked as passed, or none marked at all
Why it happens: BrowserStack cannot know whether your assertions passed. Without the SDK, sessions are not marked unless the test sends the setSessionStatus executor, so the dashboard misleads.
The fix: Use the SDK, which marks status and names from test results by default, or send browserstack_executor setSessionStatus with passed or failed and a reason at the end of each test.
Parallel CI jobs sharing one Local tunnel
Why it happens: Several jobs from the same account each start BrowserStack Local without an identifier, so sessions can route through another job’s tunnel and hit the wrong app instance.
The fix: Give each job a unique localIdentifier under browserStackLocalOptions, for example including the run and job number, and stop the tunnel at the end of the job.
A new build name for every run
Why it happens: Putting a timestamp or commit in buildName looks tidy, but BrowserStack’s reporting groups and compares runs by project and build name, which the docs say must stay static.
The fix: Keep projectName and buildName fixed and put the run number or commit in buildIdentifier, which supports environment variable expressions.
Stale app uploads in App Automate
Why it happens: BrowserStack keeps uploaded apps for 30 days. Pipelines that hard-code an old bs:// URL either fail when it expires or quietly test an outdated build.
The fix: Upload the app in every pipeline run, or let the SDK upload the local build, and log the returned app URL with the test results.
Compared
BrowserStack alternatives compared
| Tool | Real mobile devices | Desktop browsers | Automation pricing | Free option |
|---|---|---|---|---|
| BrowserStack | Yes, iOS and Android | Windows and macOS, incl. real Safari | Per parallel test, annual plans | Trial; free for open source |
| Sauce Labs | Yes, Real Device Cloud | Windows and macOS virtual machines | Per parallel test, monthly or annual | Trial; free for qualifying open source |
| LambdaTest | Yes, iOS and Android | Yes, including a Linux-only plan | Plans by parallel count, billed annually | 100 free automation minutes; now TestMu AI |
| AWS Device Farm | Yes, iOS and Android | Yes, desktop browser testing via Selenium | Per device minute or unmetered slot | One-time free trial of device minutes |
FAQ
Frequently asked questions
What are the best BrowserStack alternatives?
The alternatives most often weighed against BrowserStack are Sauce Labs, LambdaTest and AWS Device Farm. The comparison on this page sets them side by side on real mobile devices, desktop browsers, automation pricing and free option, and the verdict above says where BrowserStack is the wrong choice and which of them to pick instead.
Is BrowserStack free?
Not for general commercial use, but there are free routes. BrowserStack offers a free trial, a small Freelancer plan for Live, and free access for qualifying open-source projects through its open-source programme. Paid Automate plans are priced per parallel test and Live plans per user, with list prices on the pricing page shown per month and billed annually.
BrowserStack vs Sauce Labs: which is better?
They are close in capability: both offer real devices, desktop browsers, a tunnel for private apps, and support for the major frameworks. Differences tend to be commercial terms, specific device availability, data centre location and enterprise options such as Sauce Labs’ private device cloud or BrowserStack’s self-hosted desktop grids. Run a two-week trial of your own suite on both and compare stability, speed and price for your matrix.
Can BrowserStack test localhost?
Yes, through BrowserStack Local. The Local binary runs on your machine or CI agent and opens a tunnel, so remote browsers and devices can load localhost, staging servers and other internal addresses. With the SDK, set browserstackLocal to true and it starts and stops the binary for you; in GitHub Actions there is also an official setup-local action.
Does BrowserStack run Playwright and Cypress?
Yes. The Node.js SDK runs an existing Playwright suite by prefixing the command, for example npx browserstack-node-sdk playwright test, and BrowserStack supports Cypress through its own runner integration. For Playwright, check which browser you select: playwright-chromium, playwright-firefox and playwright-webkit are Playwright’s bundled engines, while chrome and edge are the branded browsers.
Is BrowserStack worth it compared with running our own grid?
For breadth, usually yes: real iOS devices, many Android models and macOS Safari are expensive to own and maintain. For volume on a narrow matrix, usually no: thousands of Chrome runs a day are cheaper in containers on your own CI. Many teams split the work, running fast checks locally and sending the cross-browser and real-device layer to BrowserStack.
How do I upload an app to BrowserStack App Automate?
Send it to the upload endpoint with your credentials, for example a POST to api-cloud.browserstack.com/app-automate/upload with the file as form data, and use the bs:// URL in the response as the app capability. Supported formats are .apk, .aab and .xapk for Android and .ipa for iOS. With the SDK, set app to a local path in browserstack.yml and it uploads for you.
Alternatives
BrowserStack alternatives worth weighing
Sauce Labs
Established cross-browser and device cloud with strong enterprise features and analytics.
LambdaTest
Cross-browser and device cloud, now rebranded as TestMu AI, with an AI-assisted test orchestration layer.
AWS Device Farm
Real device testing inside AWS, billed per device minute with no subscription commitment.
Resources
Where to go next
Keep going
Prepare, or get it done
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.