Workflows and approvals

How do I record who approved each step and when?

Add a field per step and fill it with an integration that runs when the step is approved, or keep an approval log table.

How-to

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_by and _modified_at hold only the latest action.
  • Formulas that use now() or today() 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:

  1. Add a Text field for the approver and a Date-time field for the time, one pair per step.
  2. Create an integration with the Kissflow Process trigger When an item is approved by an assignee at this step, and select the step.
  3. Add the action Update an item. From the trigger data, map _modified_by.Name into the approver field and Last Action Performed At into the time field.
  4. Repeat for each step, with one integration per step.

To keep a log of every step in one table:

  1. Add a table with columns such as Approval step and Approved by.
  2. Create an integration with the trigger When an item advances to next step.
  3. Add Update an item and choose _current_context as the table source. Map Approval step to _current_context.Name and Approved by to _modified_by.Name.
  4. 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.

Related answers