Run reports: how they work and what they cost

Run reports count every finished run of your decision agents' flows, so the console's Runs and Paths views, sf flows and the flow tools can show exact paths, step times and outcomes instead of a sample. They are on for every App from its next deploy, in every environment, and they cannot be turned off.

How they work

  • The agent that runs a flow already saves each run, with its full step detail, in its own storage. That copy stays the source of truth: reports never copy it again, and a run's page reads its detail from the agent that ran it.
  • At the end of each piece of work (when a run starts, pauses or ends), the agent sends one small note to your App's report keeper, in one call: which run, which step, how it ended. When the note goes through, the agent writes nothing extra to its own storage.
  • The keeper saves notes in batches, a few seconds at a time, shared by many runs. It keeps counts per hour and per day, ready to add up, and a compact list of finished runs. Old data is removed a whole day at a time.

Where they run

Run reports run inside your App, as a Durable Object the platform adds to your App's worker: the report keeper, class SpikeReportCollector. A second class, SpikeReportScope, is declared too and stays empty. Your App's team pays for them the same way it pays for the App's own Durable Objects. Nothing changes until you deploy.

What you pay

Run reports are billed at the Durable Object rates: Cloudflare's list price plus 15%, the same rates as your App's own Durable Objects. Cloudflare's included free allowances are not passed through.

What is measuredRate
Requests$0.1725 per million
Duration$14.375 per million GB-seconds
SQLite rows written$1.15 per million
SQLite rows read$0.00115 per million
Storage$0.23 per GB-month

Reading reports (the console's Runs and Paths, sf flows, the MCP flow tools and our support tools) also uses your App's Worker requests ($0.345 per million) and CPU time ($0.023 per million CPU-milliseconds), plus rows read. A note that does not go through (we estimate about 1 in 1,000) stays in your App and is sent again, which writes about five rows to your agent's own storage. With reports on, your agents also stop writing their separate runs index, which today costs more than reports do (about $5–16 per million runs, estimated from our code). The current rates are always on the usage pricing page under Infrastructure.

What it usually costs

These are estimates, not quotes; we will replace them with figures measured on live Apps. Each piece of work is one billed call, so the number of pauses in a run matters more than anything else.

  • Order-style runs (one pause): about $0.6 per million runs at 1 million runs a day and above (about $1 at 100,000 a day).
  • Short runs (no pause): about $0.4–0.6 per million runs at volume.
  • Long runs with several pauses: about $1.2 per million runs. Every pause is reported, so the live view can show where each run is waiting.
  • A small App (about 10,000 runs a day): about $0.5–1.35 a month.
  • An App that never runs a flow pays nothing. 1,000 report queries a day cost about $0.02–0.05 a month.

Worked example: a busy App

1 million order-style runs a day (about 30 million a month), one pause each, default setting:

ItemUsage per monthCost
Requestsabout 70 million (2.3 per run: one per piece of work, plus re-checks after a restart)about $12.10
Durationagents waiting about one round trip for each answer, and the keeper while awakeabout $3.70
Rows writtenabout 2 million (notes are saved in batches)about $2.30
Storageabout 3 GB (35 days of the runs list, day history)about $0.70
Rows readabout 33 millionabout $0.04
Totalabout $19 a month (about $0.62 per million runs)

The live view after a rare restart

Now and then Cloudflare restarts a Durable Object without warning (a runtime update or a host failure). Your own deploys are prepared for and are not affected. When your report keeper restarts this way:

  • Recovering. The keeper asks each unfinished run's agent for its latest state. For those minutes (about 7 minutes per million unfinished runs), answers say recovering: counts and the live view may be briefly low, never silently wrong.
  • The live view may be missing runs that started in the last few seconds. With the default setting, runs whose first note arrived in the last few seconds before the restart (at most 8) and that are still paused can be missing from "running / waiting now" until they next move. At 1 million runs a day that is up to about 90 runs. The view says so, with the time window and an upper bound. Counts, paths, the list of finished runs and run pages stay exact.

If your live view must be exact even then, ask support for the exact setting: the keeper saves every new run before its agent finishes the run's first piece of work. It costs more, about $0.9 instead of $0.6 per million order-style runs at 1 million a day (about $1.5 instead of $0.74 at 300,000 a day). Short runs cost the same in both settings.

Limits

Each App environment has these caps by default:

  • 1,000,000 finished runs per keeper shard per UTC day, and at most 10,000,000 report notes (a run sends one when it starts, one at each pause and one when it ends)
  • 2 GB of new report data per keeper shard per UTC day
  • 50,000 report queries a day (at most 20 a second)

When a cap is reached, new notes are refused. Notes already accepted are never dropped, and a refused note stays in your App and is sent again later (for up to 30 days). At the default caps, one shard's reporting of ordinary runs stays under roughly $2 a day; the note limit bounds reports that never finish at roughly $17 a day. Waiting past a cap is billed to your App too, but it is small: each agent with refused runs asks again once, after the next UTC day (about $1.5 per million waiting runs a day). Most Apps use one shard; more shards are added only at a deploy, when a shard nears its limits. If you need higher limits, contact support.

How long data is kept

  • The runs list and run pages: 35 days after a run ends. While reports are on, your agents keep each finished run for 35 days (up from 30), and a run's page reads its full detail from there.
  • Day history (daily totals, paths and step numbers): up to 400 days, which keeps a small storage cost.
  • Deleting an App or an environment deletes its reports, and their cost stops.

Your data

Report data belongs to your App: code in your App can read it and change it. Spikefrost labels reports "reported by your App" and never uses them for billing, service levels or audits.

If your balance reaches zero

Your App is suspended, as with any usage. Reports stop, reading them shows "Reports unavailable while the App is suspended", and storage keeps accruing like any Durable Object.

Where the charges appear

Until Usage lists run reports on their own line, their charges appear in Usage under Cloudflare infrastructure → Durable Objects, together with your App's other Durable Objects.

Questions

Can I turn run reports off?

No. They are part of how flows are measured on Spikefrost. The caps above limit what they can cost.

What happens at my App's next deploy?

The deploy adds the Durable Object classes to your App and turns reports on. Runs that were already in flight are counted when they next move.

Why does a run's page show only a summary?

A run's page reads the full step detail from the agent that ran it. If that agent no longer holds the run (your App's code deleted it, or one conversation key ran more than 2,000 runs in 35 days, about 57 a day), the page shows the report's summary instead (path, visits, timings, outcome and error class) and says so.

I rolled back to an older build and reports stopped. Why?

A build older than your stored reports cannot write them, so that build runs without reports: runs that happen on it are not counted, and once you are back on a current build the views mark that time as a gap. Deploy a build from the current platform to resume.

Do Apps built outside Spikefrost report?

No. Only Apps deployed with Spikefrost report; for other builds the views show a sample of recent runs.