Spitfire
SpitfireDistributed load testing · self-hosted · version comparison

Where does your system break?Self-hosted, on-premise load testing and performance testing

Find it before your customers do. Spitfire raises the load step by step, shows where latency starts to bend, and marks the run as failed the moment a threshold breaks. Tests are built in the browser, no code needed. It compares your new release with the old one under load at the same time, and tells you before you go live.

Version comparison: the old and the new release at the same time, with the same load, and a plain verdict at the end →
curl -fsSL https://spitfire.tr/install.sh | bash -s -- dockerone command: Docker is all you need
virtual users
420
req/s
3,780
p95
194ms
p(95)<500
✓ pass
05001000150002004006008001000p95 msVUs →p(95)<500breaking point ≈ 563 VUs
example system · illustrative
Productreal screens

Fill in a test like a form.

Scenario, stages, steps and thresholds on one screen. Behind it the same test is kept as JSON, so you can also write it as a file.

spitfire.local/tests/…/edit
Spitfire: Test editor

Scenario, load model and stages, with the plan drawn on the right. Steps, thresholds, environments and JSON on the same screen. Real screenshot, dark theme.

Demoa one-minute tour

From test to verdict.

A user journey built without scripting, a run split across locations, live p95 and errors, the findings after the run, and two releases compared under the same load.

Version comparisonat the same time

Is the new release slower? Find out before it goes live.

Run the same test, with the same load, at the same time, against the environment running the old release and the one running the new release. Every runner splits its load evenly between the two, so network and timing differences do not skew the result. At the end Spitfire shows the difference step by step and says it plainly: better, no difference, or worse.

spitfire.local/comparisons/…
Spitfire: a finished comparison run. Verdict: worse; checkout p95 from 219 ms to 268 ms (+22%, 95% confidence interval ±2.4%), search from 150 ms to 130 ms (−13%, ±1.7%). Below, both releases' request rate and p95 charts.
A finished comparison run: the verdict card, the largest differences with their confidence intervals, and both releases' charts. Real screenshot.

Like for like

Before it starts it compares the two environments, and warns when they share a database or sit at different network distances.

Takes out the environment difference

A calibration run with the same release on both measures how the environments differ on their own; the result is corrected for it.

Release gate

In CI, a slower new release fails the step with exit 98, and the release does not go live.

What can it do?

Beyond HTTP, in the same test

A user journey calls the API, drops a message on a queue and queries the database. Spitfire loads all of them as steps of one test.

Reproduce the production query profile on the database: import pg_stat_statements or MySQL statistics, or a .sql file, and one SQL step runs up to 200 queries weighted by their call counts; each query's p95 and error rate are reported on their own. SQL query mix →

A realistic database load from your own schema, without writing a line of SQL: Spitfire reads the catalog and suggests queries built on primary keys, indexes and foreign keys, each checked with EXPLAIN. Your data does not leave your servers, and nothing is read before you consent. Databases behind a bastion are reached through an SSH tunnel whose host key is verified. Query suggestions from the schema → · SSH tunnel →

Kafka load testing → · gRPC load testing → · WebSocket and SSE load testing →
HTTP/HTTPSHTTP/2HTTP/3GraphQLBrowser · Web VitalsWebSocketSSEgRPCKafkaMQTT 3.1.1 · 5NATS · JetStreamAWS SQS · SNSAMQP · RabbitMQRedisPostgreSQLMySQLSQL ServerOracleMongoDB
Multi-locationone run

One run, several cities.

Split the load across locations by percentage and see each location's latency separately. Remote runners connect outbound to the controller over TLS with key pinning, so the load servers need no inbound ports.

A runner installs as a Docker image or as a single binary with a systemd unit; the UI prepares the install command.

controller
web UI · REST API · Postgres
gRPC/TLS :8471
runners dial out and verify the certificate pin
--ca-pin sha256:9f2c…e41a
istanbul
3 runner · Docker
60%
frankfurt
2 runner · systemd
40%
What you getfor a team, self-hosted

What is in Spitfire?

FeatureSpitfire
To write a testWeb editor or JSON
Single sign-on (OIDC, SAML, LDAP)✓ group → role mapping
Self-hosted team UI✓ roles, groups
SQL · Kafka · MQTT · Redis · MongoDB✓ built in
Several locations in one run✓ by percent
Tests from OpenAPI / Postman / HAR✓ in the UI, auto-correlation
Capacity (breaking point) test✓ stepped, states the capacity
Findings from a run✓ with its numbers, conservative
Production write guard✓
Shareable report✓ PDF, HTML, link
Scheduled runs + Slack / Teams / e-mail✓ built in, PDF attached
Alert on a regression against the baseline✓ Slack, Teams, e-mail, SMS, webhook
Responses of failed requests✓ samples on the run page
Two releases compared at the same time✓ with a verdict and confidence intervals
Audit log✓ tamper-proof
Pass/fail exit code for CI✓ k6-compatible, on your runners

How Spitfire works →

Enterprisesecurity · governance

Works by your organization's rules.

Spitfire runs on your infrastructure; identity, permissions and audit plug into your organization's processes.

Data stays in your network

The controller, database and runners run on your servers; test definitions and results are not sent out. The license is verified offline and works air-gapped.

Runners dial out

No inbound port on the load servers. The runner checks the controller's key against a SHA-256 pin, which protects against man-in-the-middle attacks.

Production write guard

SQL/MongoDB writes, dangerous Redis commands and data-changing HTTP requests are flagged; the test does not start until the person starting it sees the list and confirms. It asks again on every run.

Append-only audit log

Who did what, when and from where. A database trigger refuses updates and deletes; exports as CSV.

Encrypted secrets

Connection passwords, tokens and certificate keys are encrypted with AES-256-GCM in the database; the API never shows them again.

Database access by consent, least privilege

Query suggestions from the schema are for installation admins only; nothing is read until a consent is recorded: who, when, from where. A ready read-only user script is provided and only the catalog is read.

Read the full security statement → · Self-hosted load testing →

Single sign-on

OIDCSAML 2.0Entra IDOktaGoogleKeycloakLDAP / Active DirectorySCIM 2.0

Roles and groups are mapped from your identity provider. Password sign-in can be limited to admins; SSO users have no local password. On Enterprise, SCIM closes a leaver's access at once.

Roles and groups

Admins write the tests. Groups decide who sees which test and who may run it. Reports are shared with people without an account through a link valid for 1–90 days.

Audit log

Tests, connections, users, permissions, sign-ins, run start and stop, write confirmations, report shares. You set the retention period (at least 30 days). On Enterprise it streams live to a SIEM over syslog or a signed webhook.

Kubernetes or Docker

Installs with one command in your own data center, private cloud or AWS/Azure VPC; amd64 and arm64.

Multiple locations

Split a run's load across locations by percentage. Remote runners install with Docker or without it (systemd, Windows service) and dial out to the controller.

MobileAndroid

The run in your pocket

Follow the run live on your phone and stop it with one tap if it goes wrong. When it ends, the result and findings are in front of you; notifications reach your phone encrypted. Free.

Coming soon to Google Play Mobile app →
Spitfire mobile: live runSpitfire mobile: result and findings
InstallDocker · Kubernetes

Your first test in three steps.

All you need is Docker (plus kubectl for Kubernetes). No Go or Node required.

STEP 1

Install

curl -fsSL https://spitfire.tr/install.sh | bash -s -- docker

Starts Postgres, the controller, the web UI and 2 runners.

STEP 2

Create the admin

Setup code: K7QM-2XRT-9WHP

Open the address printed at the end and create the first admin with the one-time setup code.

STEP 3

Add a test, press Run

Tests → New → Run

Have Swagger/OpenAPI or Postman? Tests → From API document. For another location, Runners → registration key; the command is ready there.

What it doesat a glance

From load to verdict, in one place.

Tests, connections, runners and every run's result live in one interface. Your team looks at the same number.

Built-in OpenTelemetry: closer to the root causeNo agent: your systems' own traces, metrics and logs, aligned with the load stages. ↓

Real user journeys

Log in, list, order. A value from one response becomes the next step's variable, and every response is checked.

extract $.tokenBearer {{token}}check status = 200

Tests from your API docs, a browser recording, or k6/JMeter

Point it at an OpenAPI 3, Swagger 2.0 or Postman collection, or a HAR file recorded in the browser; the requests you pick become steps. In a recording, tokens and ids a response returned and a later request sent back become variables automatically, and pauses become think time. Methods that change data need a separate approval. Existing k6 scripts and JMeter plans become tests with Open file.

OpenAPI 3Swagger 2.0PostmanHARk6 .jsJMeter .jmxPOST · PUT · DELETE → approve
Load tests from OpenAPI and Postman → · Moving from JMeter → · Moving from k6 →

Realistic data and sessions

Upload a CSV and every iteration takes a row: in order, at random, or unique across runners. Each virtual user keeps its own cookies, so logged-in web flows work without passing headers by hand.

{{users.email}}sequential · random · uniquecookie jar

Load from several cities

Split a run across locations by percentage. Remote runners dial out over TLS with key pinning, so no inbound ports are needed.

istanbul 60%frankfurt 40%--ca-pin sha256:…

Capacity and findings

"Find the breaking point" climbs the load in steps, judges each step on its own p95 and error rate, and states the rate at which the system misses the criteria. Every finished run draws findings from its own numbers: the slowest step, kinds of errors, throughput that stopped following the load, differences between locations, a regression against the baseline. A finding appears only when the effect is clear and shows its numbers; it never claims an internal cause it cannot see. With your systems' own data connected, it also writes what they measured (below).

200/s ✓ · 230/s ✗ p955xx · 429 · timeoutslowest step: Checkout
Breakpoint testing guide →
Capacity and findings · observability

Built-in OpenTelemetry: closer to the root cause

Spitfire installs no agent on your systems. It reads the data they already produce: during the run your OpenTelemetry Collector also sends traces, metrics and error logs to Spitfire over OTLP; when the run ends, Spitfire queries Prometheus-compatible sources (Grafana Mimir, Thanos, VictoriaMetrics), Tempo or Jaeger, and Loki for the run's window. If you use another OpenTelemetry-based system, one more exporter on the Collector is all it takes.

All of it is aligned with the load stages. The run's Backend tab shows, stage by stage, which service and database slowed down, its slowest operation and its errors; the findings write it with the numbers and say so when data is missing. At the breaking point, the resources that jumped most are ranked. Resource series (CPU, memory, connection pool) are drawn over the run's charts.

Example finding

The system broke at 560 VUs; at the same time the orders-db connection pool filled up and checkout pod CPU reached 97%.

no agentOTLPPrometheus · MimirTempo · JaegerLokiBackend tab
OpenTelemetry root-cause hints →

Scheduled runs, instant news

Run a test every night or every weekday morning. When a threshold breaks, a run fails or a scheduled run does not start, Slack, Teams, SMS or e-mail hears about it; the e-mail carries the PDF report. When a run is clearly worse than its baseline run (p95, p99, error rate, requests/s), you hear before any threshold breaks: while the system slows down, before users notice. Only on problems and only for the tests you pick, if you like.

0 2 * * *SlackTeamse-mail + PDFp95 +39% → run.regressed

Sign in with the company identity

Single sign-on with Entra ID, Okta, Google, Keycloak (OpenID Connect), ADFS and other SAML 2.0 providers, or Active Directory / LDAP. Accounts open on first sign-in; the admin role and group memberships come from the identity provider's groups. If you like, password sign-in stays for admins only. On Enterprise, SCIM lets the identity provider create and deactivate users: a leaver's access ends at once.

OIDC + PKCESAML 2.0LDAP · ADSCIMgroup → role

A guard against production writes

SQL and MongoDB writes, dangerous Redis commands and HTTP requests that change data are flagged; the run does not start until the person starting it has seen the list and confirmed, and it asks again on every run. Passwords stay in an encrypted vault.

SELECT ✓INSERT → approveFLUSHALL ✕

Live results, compared with history

Per-second charts with per-step and per-location breakdowns. Mark a baseline and regressions show side by side.

p50 · p90 · p95 · p99baseline
How to read p95 and p99 →

Old release or new?

Run two releases on two equivalent environments at the same time with the same load. Spitfire shows the difference step by step and ends with a plain verdict: better, no difference, or worse. Details →

v2.3 vs v2.4A/A calibrationexit 98

Not just "500": what the server said

The run page keeps samples of failed requests: a few per step and outcome, with the target, the error, the failed check, a few response headers and the first 2 KB of the body. Tokens in the address are masked, cookies are never kept, and steps that do not fail cost nothing.

503 · card service unavailabletoken=***2 KB

Every save is a version

The test page lists versions, who saved them and the diff with the current one; an old version comes back as a new one in one click. When two people edit the same test, the second save warns instead of overwriting. Every run knows which version it ran.

v7 → v8diffrestore

APIs that want a client certificate

When internal or partner APIs are protected with mTLS and a private CA, put the certificate and key in the connection vault once; HTTP, WebSocket and SSE steps pick it. The key is stored encrypted and never enters the test definition; the Test button checks the certificate has not expired.

mTLSprivate CAclient.pem · key 🔒

A report ready for your manager or customer

Every run becomes an HTML or PDF report in one click: charts, thresholds, steps, locations and the change against the baseline run. Send it to someone without an account through a time-limited, revocable link; raw data downloads as CSV.

PDFHTMLCSVshare linkTR · EN

A release gate in CI

GitHub Actions, GitLab CI or Jenkins run the saved test on the controller with an API token and pass or fail on its thresholds; the UI prepares the steps. The CLI also runs the same test file without a controller. Exit codes match k6.

spitfire cloud runSPITFIRE_TOKENexit 0exit 99 · threshold
Performance testing in CI/CD →

Synthetic monitoring

The same scenario runs on production at low load, every 1 to 60 minutes: do sign-in, add to cart and checkout still work? The dashboard shows uptime and step duration trends; consecutive failures or a slow step send one alert to your channels, and a "recovered" message when it is back.

uptimestep durationdown · recovered
Synthetic monitoring →

Performance diff on every PR

The test run in CI compares itself with the reference run and posts the result as a pull or merge request comment: p95, p99 and error rate per step. A breached per-endpoint performance budget fails the pipeline; the test page charts the p95 trend of recent runs by version.

/checkout p95 212 → 250 ms ⚠️GitHub · GitLab

Mock services and Turkish test data

Keep the load test off the real payment, SMS or cargo provider: mock services answer with templated responses at the latency and error rate you set. Scenarios use synthetic Turkish ID numbers, IBANs, phones, cities and names that pass the checks but belong to no one.

{{fake.tckn}}{{fake.iban}}latency · error rate

Talks to your monitoring

Run events go out as signed webhooks, live metrics over OTLP and Prometheus; your monitoring sees the load test on its own charts.

webhookOTLPPrometheus

Built for teams

Admin and user roles; groups grant run rights per test. The audit log keeps who did what and when, tamper-proof and exportable to CSV; on Enterprise it streams live to a SIEM over syslog or a signed webhook. The interface speaks Turkish and English.

audit logappend-onlyCSVSIEM · syslog
Costcalculator

What does a month of load testing cost?

Don't let your bill grow with your virtual users: on Enterprise, VUs, requests/s and retention are unlimited at a flat price.

Example: 2,000 VUs · 60 min · 20 runs a month
Spitfire Growth license (the yearly plan, per month)₺4,000billed yearly: ₺48,000 + VAT (₺57,600 incl. VAT)
Your own runner VMs (2 runners, estimated)₺196 ($4)
Monthly total with Spitfire₺4,196
Yearly total with Spitfire (license + 12 months of runners)₺50,352
Rather not commit: Growth monthly subscription, no commitment₺5,500 / mo
Just one month: the Growth one-time month (no stored card, no renewal); the runner cost is the same₺5,500

License: list price before VAT; the yearly and one-time monthly plans are paid once, the monthly subscription renews automatically every month; there is no usage-based Spitfire fee (per VU or per run hour). Runners run on your servers or in your cloud account; you pay your provider for those machines, not Spitfire. The calculator counts one runner per 1,000 VUs and assumes $0.10 for a runner VM hour. An estimate, not a quote.

Start free

Every testing feature and protocol is open in every edition. Team and organisation features (SSO, audit log, multiple runners) are in the paid plans. Growth and Scale come yearly, as a monthly subscription or as a one-time month. On the yearly and one-time monthly plans the payment is taken once and the license does not renew itself. The monthly subscription renews automatically every month from your card; you cancel whenever you like. License keys are verified offline; your test data and results never leave your servers.

No extra charges for test time, virtual-user hours or metric volume: you generate the load on your own servers, and the license price is fixed.

Free

$0with a free key, no expiry
  • Active users1
  • Runs at a time1
  • Concurrent virtual users100
  • Requests / second500
  • Run length15 min
  • Browser VUs (Web Vitals)1
  • Runners · locations per run1 · 1
  • Per-second results kept7 days
  • Scheduled tests1
  • Notification channels1
  • Synthetic monitors1 · every 15 min at most
  • SSO · LDAP · audit log—
  • Version comparison1 a month
  • Performance budgets · PR comments1 test · 1 repository
  • PDF / shared report“Free” mark
  • SupportCommunity

Growth

$158/mo incl. taxes · Growth yearly

billed yearly: $1,900 (taxes included)

Yearly: paid once, the license does not renew itself

Yearly only:
  • price lockRenew with your current key in the last 30 days before the end and the new year costs what you first paid, or the list price if it went down. It covers one period.
  • synthetic monitoringYour scenario runs on production at low load every 1–60 minutes and alerts when it breaks or slows down. Yearly: 10 monitors on Growth, 30 on Scale; other plans 1 monitor, every 15 minutes at most.
  • PR commentsThe CI run is compared with the baseline run and posted as a pull/merge request comment; a breached per-endpoint performance budget fails the pipeline. Unlimited on yearly plans; 1 test and 1 repository on the others and the free edition.
  • add-on packsRaise the limits without changing plan: +5 users, +2,000 virtual users (+10,000 requests/s), +4 hours of run length, +5 runners · +2 locations.
  • Active users5
  • Runs at a time1
  • Concurrent virtual users2,000
  • Requests / second10,000
  • Run length4 h
  • Browser VUs (Web Vitals)5
  • Runners · locations per run10 · 3
  • Per-second results keptunlimited
  • Scheduled testsunlimited
  • Notification channelsunlimited
  • Synthetic monitors10
  • SSO · LDAP · audit log✓
  • Version comparison✓ · CI and schedules on yearly
  • Performance budgets · PR commentsunlimited
  • PDF / shared reportunbranded
  • SupportE-mail support, answered within 2 business days
Buy now

Scale

$408/mo incl. taxes · Scale yearly

billed yearly: $4,900 (taxes included)

Yearly: paid once, the license does not renew itself

Yearly only:
  • price lockRenew with your current key in the last 30 days before the end and the new year costs what you first paid, or the list price if it went down. It covers one period.
  • synthetic monitoringYour scenario runs on production at low load every 1–60 minutes and alerts when it breaks or slows down. Yearly: 10 monitors on Growth, 30 on Scale; other plans 1 monitor, every 15 minutes at most.
  • PR commentsThe CI run is compared with the baseline run and posted as a pull/merge request comment; a breached per-endpoint performance budget fails the pipeline. Unlimited on yearly plans; 1 test and 1 repository on the others and the free edition.
  • add-on packsRaise the limits without changing plan: +5 users, +2,000 virtual users (+10,000 requests/s), +4 hours of run length, +5 runners · +2 locations.
  • Active users15
  • Runs at a time3
  • Concurrent virtual users10,000
  • Requests / second50,000
  • Run length8 h
  • Browser VUs (Web Vitals)20
  • Runners · locations per run30 · 6
  • Per-second results keptunlimited
  • Scheduled testsunlimited
  • Notification channelsunlimited
  • Synthetic monitors30
  • SSO · LDAP · audit log✓
  • Version comparison✓ · CI and schedules on yearly
  • Performance budgets · PR commentsunlimited
  • PDF / shared reportunbranded
  • SupportE-mail support, answered within 1 business day
Buy now

Enterprise

By quote

Priced for your scale and number of installations

  • Active usersunlimited
  • Runs at a timeunlimited
  • Concurrent virtual usersunlimited
  • Requests / secondunlimited
  • Run lengthunlimited
  • Browser VUs (Web Vitals)unlimited
  • Runners · locations per rununlimited
  • Per-second results keptunlimited
  • Scheduled testsunlimited
  • Notification channelsunlimited
  • Synthetic monitorsunlimited
  • SSO · LDAP · audit log✓
  • Version comparison✓ + CI and schedules
  • Performance budgets · PR commentsunlimited
  • PDF / shared reportunbranded
  • SupportPriority support, answered within 1 business day

1 production + 1 test installation (same legal entity) · support by e-mail, weekdays 09:00–18:00 (Istanbul time); 1 business day is the time to a first response, not to a fix · 10–15% off for several years

Request a quote

On the yearly and one-time plans the term starts the day you first enter the key. When you upgrade, what you paid is taken off. Project pass and Quarter licenses bought before remain valid for their term.

Frequently asked

Is my test data sent anywhere?
No. The controller, runners and results run on your own servers, and the license key is verified offline.
Do I need to write code?
No. A test is built step by step in the web editor. If you prefer, write the same test as a JSON file and run it with the CLI.
Can I bring my k6 or JMeter tests?
Yes. Tests → Open file turns a k6 script or a .jmx plan into a Spitfire test and opens it in the editor; the file is read, not run. Load model, requests, checks, values taken from responses, think times and thresholds are converted; what has no equivalent, like loops, conditions and custom metrics, is reported with its line. Details in the migration guide.
How much load can my system take?
"Find the breaking point" in the Run dialog climbs one scenario's load in steps (say 10, 20, 30… iterations a second) and judges each step on its own numbers against the p95 and error rate you give. The first step that fails stops the run; the run page says "met the criteria at 200 iterations/s, not at 230". If the climb stopped because virtual users ran out, it also says that this is not the system's limit.
Can I run the same test against staging and production?
Yes. On the test's Environments tab each environment gives its own address and variables and maps the steps' connections to its own (orders-db → orders-db-staging). You pick the environment when starting a run or a schedule and can scale the load (10% for a smoke test); the run shows which environment and scale it used. The test stays one test with one version history.
Can I test live screens that use WebSocket or Server-Sent Events?
Yes. In a WebSocket step every virtual user keeps one connection, like a browser tab: it sends a message, waits for the reply or for a message the server pushes (containing a given text), and the message goes to checks and extraction. The connection carries the cookies from login and reconnects on the next step if it drops; the handshake is measured as ws_connecting. An SSE step opens the event stream and reads until the given number of events (by type or content) arrived; the time to the first event is the sse_time_to_first_event metric. Both can have thresholds. More: the WebSocket and SSE load testing guide.
What if a runner or the controller drops during a run?
A runner whose connection drops and comes back within 10 seconds carries on; if it does not, the run stops, or continues without it if the test says so. If the controller is stopped (an update, a restart), it stops the active runs and stores their results first; if it goes down unexpectedly, the run closes as interrupted when it starts again. Either way the runners drop the load at once and webhook receivers get the end notice. Stop and thresholds work even while the database is slow; if some data could not be stored, the run says so as a warning.
Can I run a fixed number of operations instead of a duration?
Yes. "Shared iterations" splits a fixed number of iterations among the VUs; "per-VU iterations" has every VU run the same number. The test ends when the work is done, with a max duration as the ceiling. Across several runners the work is split exactly by each runner's share of the VUs. Good for data loading, smoke tests and one-off jobs.
I have a Swagger document, a Postman collection or a browser recording. Do I write the test from scratch?
No. Tests → Import API / HAR: give an OpenAPI 3, Swagger 2.0 or Postman v2.x collection, or a HAR recording (browser DevTools → Network → "Save all as HAR"), and pick requests. In a HAR, static files are dropped, tokens and ids become variables automatically, and cookies stay separate per virtual user. Only GET requests are taken by default; POST, PUT/PATCH and DELETE need a per-group approval plus the target host name, the approval is written to the audit log, and the test asks again on every run. More: the OpenAPI and Postman guide.
Our monitoring alarms during load tests. What can we do?
On the Integrations page, announce run start and end with a webhook and send live metrics over OTLP or Prometheus. Your monitoring can mark the test window from these events and tell symptoms during the test apart from real incidents.
Can people sign in with their company account (Entra ID, Okta, Active Directory)?
Yes. On the single sign-on page set up your OpenID Connect provider (Entra ID, Okta, Google, Keycloak…) or your LDAP / Active Directory. Accounts can open on first sign-in, or only accounts an admin created may enter; you can limit sign-in to groups, map admin groups to the admin role and sync memberships into Spitfire groups of the same name. Password sign-in can be left to admins only; LDAP passwords are never stored in Spitfire.
Can a test run every night and tell us when something is wrong?
Yes. On the test's page, Schedule: pick a cron and time zone; the run starts with the rights of whoever created the schedule. Under Integrations → Notification channels add a Slack, Microsoft Teams, e-mail or SMS channel (SMS works with any SMS service's HTTP API or your own gateway) and turn on "Only notify on problems": you hear when a threshold breaks, a run fails, or a scheduled run does not start (no runners, missed). The e-mail carries the run's PDF report.
How do I send results outside the team?
On the run page, Report → Download PDF or Share link. The link shows the HTML and PDF report without signing in; it lasts 1–90 days, can be revoked at any time, and every view is written to the audit log. Reports come in Turkish or English.
How do I run tests from my CI/CD pipeline?
Create a token under profile menu → API tokens, add it to the pipeline as the SPITFIRE_TOKEN secret, and run spitfire cloud run "Test name" in a step. The CLI comes from the controller or the Docker image; the CI button on a test's page prepares GitHub Actions and GitLab CI steps. The step exits 0 (passed) or 99 (thresholds failed).
Where can I install it?
Docker or Kubernetes, on amd64 and arm64; Linux, macOS and Windows (Docker Desktop, one PowerShell command). A runner in a remote location can also run without Docker: with systemd on Linux, as a Windows service on Windows.
I lost the setup code shown after installation. What now?
The code stays valid until the first admin exists and is stored: SPITFIRE_SETUP_CODE in ~/spitfire/deploy/docker/.env on Docker, the spitfire-secrets Secret on Kubernetes. The controller log also prints setup_code=, and re-running the installer shows the same code.
Our API wants a client certificate (mTLS); can I test it?
Yes. Save the certificate, the key and, if needed, the private CA to trust once under Connections → Client certificate (mTLS); HTTP, WebSocket and SSE steps pick it under "Client certificate". The key is stored encrypted and never enters the test definition; saving checks the certificate and key belong together, and the Test button checks the certificate has not expired.
How long are results kept?
You decide: the Data retention setting on the License page keeps per-second chart data, run logs and error samples (90 days by default), whole runs and the audit log for their own number of days; what you leave empty is kept forever. Tests' baseline runs are never deleted, and the page shows what would go before you save. The audit log is append-only: only entries older than 30 days are deleted this way, and the deletion is recorded too. On the free edition per-second results are kept for at most 7 days.
What happens when the license expires?
The yearly plans and the one-time month (and Project pass and Quarter licenses bought before) do not renew automatically; we remind you by e-mail 14 and 3 days before the end. When the license ends, a 14-day grace period starts and the application says so. On the monthly subscription the last key ends 4 days after the period end, and its grace is 1 day: an unpaid month returns to the free edition 5 days after the period end. After it Spitfire runs within the free edition's limits (1 user, 1 run at a time, 100 virtual users, 500 requests/s, 15-minute runs, 1 runner and 1 location, 7 days of results, 1 scheduled test, 1 notification channel and 1 synthetic monitor (at most every 15 minutes)); starting new runs needs a free key or a new license. Nothing is deleted: tests, runs and reports stay, extra users become read-only, extra schedules pause, the SSO settings are kept. Paste the new key on the License page and the limits open again at once, without reinstalling.
How do I hear about new releases, and is updating hard?
The application tells you about a new release itself (from a signature-checked release list), and security updates are marked. Updating is the same single install command: the database is backed up first and the settings kept; if anything goes wrong, --rollback returns to the previous release and its data. Runners installed without Docker update themselves from the Runners page or with auto-update.
How does the monthly subscription (Growth, Scale) work, and how do I cancel?
No commitment: you pay the first month by card and the subscription renews automatically every month from your card until you cancel. The limits are those of the plan's yearly edition (Growth or Scale); price lock, synthetic monitoring, PR comments and add-on packs come with the yearly plan. To cancel, use the “Cancel the subscription” link in any subscription e-mail or write to us: the subscription runs to the end of the period begun, then does not renew and nothing more is charged; the period begun is not refunded. To move to yearly, cancel the monthly one and buy the yearly plan.
Is my card stored for the monthly subscription?
Your card is stored by the payment institution PayTR; we never see or store it. The first payment uses 3-D Secure; later months are charged to the same card at each period end. 3 days and 1 day before every renewal we e-mail you the amount and the date the card will be charged. If a charge fails we tell you and retry 1, 3 and 5 days later; if the last retry fails too, the subscription ends and Spitfire returns to the free edition's limits 5 days after the period end. Nothing is deleted.
How do the monthly subscription's keys arrive?
Every month, a few minutes after the payment, a new key arrives by e-mail; paste it on the License page in Spitfire. Each key is valid until 4 days after the end of the period it was paid for, so there is time to paste the next one. Growth monthly keys need Spitfire 0.13.1 or later, Scale monthly keys 0.16.0 or later; the key is still verified offline.
When does the license term start?
For the yearly plans and the one-time month, the day you first enter the key on Spitfire's License page (on the monthly subscription each key starts the day it is issued). Install a week after you got the key and you still lose no days; just enter it within 30 days of it being issued. The License page shows the activation date, the end and the days left; the key is still verified offline.
What happens to what I paid when I upgrade?
It is taken off. Paste your key under “Upgrade my license” on the buy page: upgrade a Project pass or a one-time month within 30 days of issue and all you paid comes off; for the Quarter, Growth and Scale yearly, the value of the days left does (Growth to Scale too). It shows as its own line on the invoice. Days left are rounded up in your favour; the credit never exceeds the new plan's price and nothing is refunded. The new key replaces the old one.
Does the price change when I renew?
Growth, Scale and Enterprise yearly have a price lock: renew with your current key within the last 30 days before the end and the new year costs what your original order paid (or the list price, if it went down). The lock covers one period. The new period starts the day after the current one ends, so renewing early loses no days.
What is the price lock? What else comes with yearly?
Price lock: renew your yearly license with your current key in the last 30 days before the end and the new year costs what you first paid, or the list price if it went down. If you bought Growth yearly today for $1,900 incl. taxes, you pay $1,900 incl. taxes again when you renew on time, even if the list price has gone up. The lock covers one period; a license bought as a renewal renews at the current price next time. Synthetic monitoring: your scenario runs on production at low load every 1–60 minutes and tells Slack, Teams, SMS or e-mail when it breaks or slows down; yearly gives 10 monitors on Growth and 30 on Scale, other plans 1. PR comments: the CI run is compared with the baseline run and posted as a pull/merge request comment; a breached per-endpoint performance budget fails the pipeline. Add-on packs: raise the limits without changing plan: +5 users ($279 / year), +2,000 virtual users (+10,000 requests/s) ($499 / year), +4 hours of run length ($199 / year), +5 runners · +2 locations ($339 / year).
If Growth's limits are not enough, must I move to Enterprise?
Not necessarily. Growth and Scale yearly take add-on packs: +5 users ($279 / year), +2,000 virtual users (+10,000 requests/s) ($499 / year), +4 hours of run length ($199 / year), +5 runners · +2 locations ($339 / year); prices include taxes. Packs added to a running license are priced for the days left and come with a new key. If Growth with packs comes near the Scale price and fits within Scale's limits, the buy page suggests Scale; if it does not fit, or Scale with packs reaches Enterprise level, it suggests Enterprise.
Can we pay by bank transfer or get a quote?
Growth and Scale are bought by card; bank transfer and proforma are not taken on the buy page at the moment. If your organisation pays only by transfer, write to us. Enterprise is sold by quote: quote form; 1 production + 1 test installation, support by e-mail weekdays 09:00–18:00 (Istanbul time); 1 business day is the time to a first response, not to a fix.
Which plan fits me?
For one testing period (before a launch or a campaign), the monthly subscription or the one-time month; for continuous testing (CI, nightly runs), yearly: it costs less a month, and only the yearly plan has price lock, synthetic monitoring, PR comments, add-on packs. All three have the plan's same limits. Growth: 5 users, 1 run at a time; per run 2,000 virtual users, 10,000 requests/s, 4-hour runs, 10 runners and 3 locations; e-mail support, answered within 2 business days. For several teams, several runs at once or more load, Scale: 15 users, 3 concurrent runs; per run 10,000 virtual users, 50,000 requests/s, 8-hour runs, 30 runners and 6 locations; e-mail support, answered within 1 business day. If you need more than that, unlimited concurrent runs or priority support, Enterprise yearly has no limits, by quote. On the yearly and one-time monthly plans the payment is taken once and the license does not renew itself. The monthly subscription renews automatically every month from your card; you cancel whenever you like. Every testing feature and protocol is open in every edition. Team and organisation features (SSO, audit log, multiple runners) are in the paid plans.
What is the difference between the monthly subscription and the one-time month?
The product and the limits are the same. The subscription renews automatically every month from your card and you cancel whenever you like. With the one-time payment your card is not stored and the license does not renew itself when it ends. They cost the same.
What does the free edition limit?
Scale and team features: 1 user, 1 run at a time, 100 virtual users, 500 requests/s, 15-minute runs, 1 runner and 1 location, 7 days of results, 1 scheduled test, 1 notification channel and 1 synthetic monitor (at most every 15 minutes). SSO / LDAP, the audit log and multiple runners are in the paid plans; PDF and shared reports say "Made with Spitfire Free". Every testing feature, all protocols and CI pass/fail are open. 14 days after installing, new runs need a free key: you get it by e-mail, it does not expire and is verified offline. Your tests and results never leave your servers; the only request Spitfire makes on its own is a daily version check that sends just its version number and can be turned off.
How do I know whether the new release is slower than the old one?
With a comparison run. Pick the environment running the old release as A and the one running the new release as B. Spitfire runs the same test against both at the same time, and every runner splits its load evenly between them. The result shows the difference and the verdict for every step: better, no difference, or worse. Version comparison →
My two environments are not identical. Can I still trust the result?
Before it starts, Spitfire compares the two environments and warns about the differences it sees. To measure how the environments differ on their own, run a calibration with the same release on both; later comparisons show that difference apart from the result.
Why not run twice and compare the two runs?
Between two runs at different times the network, the caches and the load on shared infrastructure can change. Running both at once spreads those outside effects evenly over the two sides; what is left is the difference the release makes.
I have one test environment. Can I still use it?
Yes. In sequential mode the two releases take turns on the same environment (A, B, A, B); each time you switch the release, Spitfire moves on to the next round.
Can CI stop the deployment when the new release is slower?
Yes. Give spitfire cloud run the --compare flag; if the new release is worse the step exits with 98 and the deployment stops.