Skip to content

Saved time

Saved time adds up the estimates of the cases that were executed in a period, and says how much of that time a machine did for you. Open it from Analytics → Saved time, from the Saved time link under the title of Analytics, or at beta.plune.ai/analytics/saved-time.

The Saved time report over the last 30 days: the filters Projects, Period · Last 30 days and Label · Any, a Columns button; four cards — Estimated time, Saved by automation, Spent manually and Not estimated with a count of cases; the switch By run and By suite; and a table of runs with their date, cases, estimated, saved, manual and not-estimated figures, ending in a Total row. The Saved time report over the last 30 days: the filters Projects, Period · Last 30 days and Label · Any, a Columns button; four cards — Estimated time, Saved by automation, Spent manually and Not estimated with a count of cases; the switch By run and By suite; and a table of runs with their date, cases, estimated, saved, manual and not-estimated figures, ending in a Total row.
The report as it opens: the last 30 days over every project you are in — here a sample team of three.

A case counts when it has a current result that is passed, failed or broken in a run of the period. A blocked or skipped result does not count, and neither does a result that a retest replaced. Each counted case brings the estimate it has now: change an estimate and the report changes with it, for past runs as well. It is recalculated from the current estimates, not frozen when the run finished.

CardWhat it adds up
Estimated timethe estimates of all counted cases — Sum of estimates of executed cases
Saved by automationthe counted cases that a machine ran (a result sent by a reporter, such as the CLI or Cairn) and that passed — Automated and passed
Spent manuallythe counted cases that a person marked — Run by hand
Not estimatedhow many counted cases have no estimate — These cases have no estimate and are left out of the sums

The three times do not have to add up to the first: a case that an automated run failed is part of Estimated time but is not saved — the page says so under the table: Failed automated cases are not counted as saved.

A case with no estimate is never counted as zero minutes. It goes into Not estimated and stays out of every sum. When no counted case has an estimate, the sums show — and a notice says No case in this selection has an estimate, so there is nothing to add up. with the link Set estimates in Test cases.

By run gives a row per run, the newest first, with its date. By suite gives a row per suite of the cases, the longest estimate first, and no date; cases that belong to no suite are in No suite. The last row, Total · 16 runs or Total · 12 suites, is the sum of everything the filters let in.

The same report grouped By suite: a table of suites with their cases, estimated, saved, manual and not-estimated figures and a Total row; the sample suites are spec files, with No suite among them. The same report grouped By suite: a table of suites with their cases, estimated, saved, manual and not-estimated figures and a Total row; the sample suites are spec files, with No suite among them.
By suite: where the time sits, in the folders of the cases.

The columns are Run or Suite, Date, Cases, Estimated, Saved, Manual and Not estimated. Columns hides the ones you do not need and remembers your choice in this browser; Reset brings them all back. A table shows the first 200 rows and says so; the cards and the total still count everything. On a phone each row becomes a card.

Times are written the way estimates are: 1h 30m, 20m, 45s; nothing at all reads 0m.

The filters are those of Analytics, kept in the address of the page:

  • Projects — every project you are in, or the ones you tick;
  • Period — the last 30 days by default, or any other period;
  • Label — only runs that carry the label.

Filters that let no run in say No runs match these filters. and offer Clear filters; a project that has not run anything yet says No executed cases yet. If the report cannot be loaded, the page says Could not load the report. Check your network and try again — your filters are kept., with Try again.

Export XLSX downloads the same report as a workbook named saved-time-by-run.xlsx or saved-time-by-suite.xlsx: one sheet, Saved time, a row per run or suite and a Total row. Times there are minutes as numbers (1.5 is one minute thirty), so a spreadsheet can add them up; cases without an estimate stay in their own column. The workbook carries up to 10 000 rows; past that, a line before the total says how many are listed. A reader of the project can export it too.

Copy API link copies the address of the question the page is asking, with your filters, so a script can ask it too.

GET /v1/analytics/saved-time answers the same numbers. With a token:

Terminal window
curl -H "Authorization: Bearer $PLUNE_TOKEN" \
"https://beta-api.plune.ai/v1/analytics/saved-time?by=run&from=2026-09-01T00:00:00Z&to=2026-09-30T23:59:59Z"

The filters are the ones of GET /v1/analytics (from, to, projects, labels, environments, executedBy, suite, tags). A token reads only its own project, as on Analytics. by is run (the default) or suite; anything else is a 400. Add format=xlsx to get the workbook instead of JSON.

{
"by": "run",
"totals": { "cases": 322, "estimatedSeconds": 73200, "savedSeconds": 48900, "manualSeconds": 14700, "notEstimated": 25 },
"rows": [
{ "id": "…", "name": "nightly-e2e", "startedAt": "2026-09-29T21:00:00.000Z",
"cases": 120, "estimatedSeconds": 24000, "savedSeconds": 21000, "manualSeconds": 0, "notEstimated": 9 }
],
"truncated": false
}

Times are whole seconds. name is null for the cases that are in no suite; truncated is true when there were more than 200 rows — totals always cover everything. It is a read: a reader may ask, and the route is limited to 120 requests a minute per caller.

In CI, take the number you want and fail or report on it:

Terminal window
saved=$(curl -s -H "Authorization: Bearer $PLUNE_TOKEN" \
"https://beta-api.plune.ai/v1/analytics/saved-time?from=$(date -u -d '-7 days' +%FT%TZ)" \
| jq '.totals.savedSeconds / 3600 | floor')
echo "Automation saved ${saved}h this week"

Why is a run’s saved time smaller than its estimated time? Because some of its cases failed, or a person ran them. Saved time is only what a machine ran and passed.

Why did an old run change? The report reads the estimates the cases have now. Edit an estimate and every run that executed that case is counted with the new one.

Why is a case missing? It was not executed in the period, its result was blocked or skipped, a retest replaced it, or the filters (project, label, tag, suite) leave it out.