Short answer: No built-in field keeps an approver and timestamp for every step. Add tracking fields to the form and fill them with an integration each time a step is approved.
Why it happens
_modified_byand_modified_athold only the latest action.- Formulas that use
now()ortoday()recalculate when the item moves, so they can't freeze a time. lastCompletedStep()only describes the most recent step, and its value changes after every approval.
How to fix it
For the submission date, use the system field _submitted_at in a Date-time field instead of today(). See System fields.
To record each step in its own fields:
- Add a Text field for the approver and a Date-time field for the time, one pair per step.
- Create an integration with the Kissflow Process trigger When an item is approved by an assignee at this step, and select the step.
- Add the action Update an item. From the trigger data, map
_modified_by.Nameinto the approver field and Last Action Performed At into the time field. - Repeat for each step, with one integration per step.
To keep a log of every step in one table:
- Add a table with columns such as Approval step and Approved by.
- Create an integration with the trigger When an item advances to next step.
- Add Update an item and choose
_current_contextas the table source. Map Approval step to_current_context.Nameand Approved by to_modified_by.Name. - Each run adds one row. If rows double up, check that the source is the current context, not the table itself.
You can insert this table into a document template to print approvers on a PDF.
If you only need the latest step, use a computed field with lastCompletedStep(), for example lastCompletedStep().approvers() or lastCompletedStep().approvedAt(). The value changes after each approval.
For boards, use the trigger When the status of an item is updated, then a condition and Update an item.
