formbasedocs
Go to appApp

Requests

Decisions & approvals

Plenty of requests exist to get one thing: a yes, a no, or a 'not like that'. The decision question captures that verdict in a shape your automation can branch on directly, without guessing which field held the answer.


Why a special question

Every choice already has an option key, so a workflow can branch on any radio. What a workflow cannot do is know, across every form that has an approval, which key means “yes”: one author’s radio says sign_off, another’s approved.

The decision question fixes the names. It is a single-choice question with the field key decision, whose three options carry the option keys approve, decline and changes. Its labels stay yours to reword and translate; the keys underneath never move. When the recipient picks one, the request ends with an outcome. Any radio keyed decision whose options carry those three keys counts — the preset just sets them for you.

Add one to your form

  1. 1

    Open the block menu

    Press / in the editor and pick Decision — "Approve, decline, or request changes".

  2. 2

    Reword the labels

    You get a question titled "Do you approve?" with the choices Approve, Decline, and Request changes. Rewrite any of them to your own wording — "Sign off", "Reject", "Send back for edits". Translate them like any other content.

  3. 3

    Ask why, if you need to

    A verdict alone rarely explains itself. Add a long-text question after it, and show it only for decline and changes with conditional logic.

  4. 4

    Publish

    Requests created from this published version end with an outcome. Like every field key, decision only exists once the form is published.

The three values

ValueDefault labelMeans
approveApproveThe recipient agreed. Your run continues down the happy path.
declineDeclineThey said no. The request still completes — decline is a verdict, not a failure.
changesRequest changesThey want something altered before they agree. Usually the cue to send a new request.

These three values are a public contract, like a field key: an automation, an agent, and a spreadsheet formula all read them. Add a fourth option and picking it is an ordinary answer, not a verdict — that request completes with no outcome, rather than with a value your receiver has never heard of.

Where the outcome shows up

SurfaceWhat you get
Callbackoutcome on the request block of the request.completed payload — absent when there is no verdict.
requests.getoutcome next to status, plus the answers keyed by field key.
requests.listAn outcome filter; passing one implies completed requests only.
Requests pageAn Outcome filter, and Approved / Declined / Changes requested on the request itself.
SubmissionsThe verdict is also an ordinary answer, under the field key decision.
request.completed, trimmed
json
{
  "id": "evt_...",
  "type": "request.completed",
  "test": false,
  "data": {
    "request": {
      "id": "kd7...",
      "externalId": "run-42",
      "status": "completed",
      "outcome": "changes",
      "context": { "case_id": "CASE-9" }
    },
    "answers": {
      "decision": "changes",
      "reason": "Please split the line items per site."
    }
  }
}

Branch on data.request.outcome. status says whether the request finished; outcome says what the recipient decided. An expired or canceled request has a status and no outcome, and so does a completed request on a form without a decision question.

From an agent

The MCP tool is editor_insertDecisionQuestion, taking a title and the three labels in the form’s language. An agent that cannot host a callback endpoint polls request_get instead and reads outcome when the status leaves pending. Requests on the MCP server →