Automation · Data operations
How to log and report on automated process runs
Someone asks who approved a payment in March, and the answer is a search through chat history. Here is how a record of every process run actually works, the prompts that build it, and what running it demands.
Built with Tray Headless
- Step Process runs
- Step Log each step
- Step Join to the request
- System Snowflake
- Step Report by stage
Every run writes one line per step to the same place, joined to the request it served, so the process can be measured and explained.
The short answer
What is process run reporting?
Process run reporting records every step of every run, including the inputs, the decision and the rule behind it, the approver and the outcome, in one place, joins each run to the request it served, and reports how long each stage takes and where requests fail. Most teams have the logs but not the record. Each tool keeps its own history, so answering "what happened to this request?" means stitching four systems together by hand.
Stage 7 of 7: Record and report. Part of Process automation, end to end : every stage, the systems it runs on and the guide that builds it.
What matters here
- Log every step of every run to one place, not to each tool's own history.
- Join each run to the request it served. A run with no request is a log; a run with its request is a record.
- Record the decision, the rule behind it and the approver, not only success or failure.
- Report time by stage. A slow process is almost always one slow stage.
- Keep the record as long as the business needs it, which is usually longer than the tool keeps its logs.
- Alert when a stage drifts, before someone notices the process is slow.
Who this is for
You run operations or data for processes that span several teams. Each tool shows its own piece, and nobody can answer how long a request really took or who decided what without a day of digging.
How it works in practice
What has to happen between a process running and someone being able to answer a question about it.
- 1
Each step writes one line
Run, step, time, inputs that matter, outcome, and who or what decided.
- 2
The line carries the request ID
So every run for one request can be found together, across workflows.
- 3
Lines land in one place
The warehouse, kept for as long as the business needs, separate from each tool's own history.
- 4
Stages are measured
Time in each stage, how many requests waited, how many failed, by request type.
- 5
Drift raises an alert
When a stage gets slower or fails more than usual, the process owner hears first.
What a process record is made of
Four pieces, and the second is the one that turns logs into answers.
One line per step
The same fields from every workflow: run, step, stage, start and end time, outcome, and the person or rule that decided.
A request ID on every line
Set at intake and carried through every workflow the request touches, so one search shows its whole history.
One place, kept long enough
A warehouse table with a retention the business chose, rather than whatever each tool happens to keep.
Stage reporting with alerts
Cycle time and failures by stage and request type, with an alert when either moves outside its normal range.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
Write one line per step, the same way everywhere
Logs in five shapes can't be read as one record.
Headless skills
build-workflowtray-patternsUse build-workflow and tray-patterns. The systems in play are Snowflake, Slack and the systems the process runs across, or whatever we run in those seats. Build one shared logging step that every workflow in the process calls after each meaningful step. It writes: request ID, run ID, workflow, step, stage, start and end time, outcome, the rule or person that decided, and the IDs of any records it created. Leave out personal data the report does not need. A run record should say who approved, not copy the customer's details.
- 2
Carry the request ID through every workflow
A run with its request is a record; without it, a log.
Set a request ID at intake and pass it to every workflow the request touches, including handoffs to other teams. Store it on the records the process creates in other systems too. If a workflow is started without a request ID, log that as a problem to fix, not as a run to ignore.
- 3
Land everything in one place
Each tool's own history disappears on its own schedule.
Headless skills
tray-gotchasUse tray-gotchas. Write the lines to one Snowflake table, in batches if the volume is high, and never drop a line because the warehouse was briefly unavailable: hold it and retry. Agree how long the record is kept with whoever owns the process, and set it on the table. Check row counts against run counts each day, so a gap in the record is found the same week.
- 4
Report time and failures by stage
A slow process is almost always one slow stage.
Build a weekly report by request type: total cycle time, time in each stage, how many requests waited for a person and for how long, how many failed and at which step, and how many finished with no manual step at all. Make "what happened to this request?" a one-line lookup by request ID that returns every step in order, with who decided and when.
- 5
Alert when a stage drifts
The process owner should hear before the requester complains.
For each stage, track its normal time and failure rate over the last month. When this week moves well outside that range, post in the process owner's Slack channel with the stage, the change and three example requests. Alert on the stage, not on every slow request. One message with the pattern is read; fifty single alerts are muted.
- 6
Validate it, then hand the report to the owner
Because the questions change after the first month.
Run the per-step checks and the whole-workflow audit before this goes live. Follow three requests end to end, including one that failed and one handed to another team, and check every step appears with the right request ID. Then open the same workflow in Tray Build so the process owner can add fields, change the stages and set the alert ranges in the visual canvas without a deployment.
What it connects to
Every workflow writes to the same record, and the record answers questions about the whole process.
Snowflake
Hold one line per step for every run, joined by request ID and kept as long as the business needs.
Writes
Salesforce
Carry the request ID on the records the process creates, so a record can be traced back to its run.
Writes
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Dynamics 365, Databricks, Microsoft Teams, HubSpot, AWS Redshift or Google Chat.
Connections in this build
Field mapping, templates and common problems for each pairing: Google BigQuery + Snowflake, Datadog + Slack, Google BigQuery + Salesforce and Salesforce + Slack.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
The record is what makes an automated process explainable, so it has to be complete.
It runs on the platform, not on your laptop
Every run writes its record, including the ones at three in the morning and the ones that failed.
Every run is logged
Each step, input and outcome, on the platform and in your warehouse, so nothing depends on one tool's retention.
Credentials are managed, never in code
Write access to one warehouse table, and nothing in the systems the process runs across.
Gaps are found the same week
Row counts are checked against run counts daily, so a missing piece of the record is caught early.
The owner decides what is measured
Stages, fields and alert ranges, all open in Tray Build.
Questions people ask
Why not use each tool's own history?
Because each tool shows only its piece and keeps it on its own schedule. Answering what happened to one request means stitching them together by hand.
What should each line record?
Request ID, run, workflow, step, stage, start and end time, outcome, who or what decided, and the IDs of records created. Leave out personal data the report does not need.
How long should the record be kept?
As long as the business needs to answer questions about the process, agreed with its owner. That is usually longer than any single tool keeps its logs.
How is this different from audit evidence collection?
That guide gathers proof that controls work, for an auditor. This records how a process runs, for the people who own it, though the same record often answers an auditor's question.
Which metric matters most?
Time in each stage by request type. It shows exactly where a process is slow, which a single cycle time never does.
Related guides
Platform engineering
How to handle exceptions and retries in automated workflows
Sort failures into ones to retry and ones a person must fix, make retries safe to repeat, park what fails with its context, and alert an owner. The prompts.
Data operations
How to build a CRM to warehouse sync
Capture history instead of current state, handle deletes and field changes, land raw then model, and prove the row counts. The Headless prompts that build it.
AI operations
How to build an agent observability pipeline
Capture whole agent runs instead of single calls, join each one to the outcome it produced, and alert on the failures that return an answer anyway. The prompts.
Last reviewed October 2026.