Represent the proposed action as a versioned record, collect an explicit reviewer decision, and verify the approved content and recipient before execution. Return changed or expired proposals to review.
In this guide
What does a completed approval record contain?
The addresses use the reserved .invalid domain and the people are training roles. The send step must load the same saved version that was reviewed and compare the intended destination. If it loads the latest draft instead, the record no longer authorizes that action. The table describes the business control to implement; it is not a claim that Activepieces supplies this exact transaction queue.
| Proposal | Reviewed content and destination | Decision | Execution |
|---|---|---|---|
| REPLY-A / v1 | reply-v1.md; customer-A@example.invalid; standard policy only | Nora: approve v1 | Not sent |
| REPLY-A / v2 | reply-v2.md; customer-B@example.invalid; adds a discount | Pending: recipient and offer changed | Blocked pending review |
| FLOW / release-4 | Automation configuration only | Publication approved | Does not approve REPLY-A v2 |
What state must be checked before sending?
- Produce the draft and save its immutable review version with the destination and evidence.
- Send a review request through the approved channel with enough information to assess the proposed action.
- Store approve, reject, or request changes with reviewer identity and the exact version reviewed.
- Before execution, compare the current proposal with the approved version and verify any expiry or authority rule your process requires.
- Execute the action using duplicate protection and record the result or uncertain state.
- If content, recipient, or a material condition changes, create a new review version rather than borrowing the old approval.
Define exactly what the reviewer is approving
Record the action type, intended recipient or destination, proposed content, relevant source references, version, and reviewer. Keep a draft distinct from a completed action. Approval of an email's general purpose does not automatically authorize a changed body or a different recipient.
Use the host application's actual permissions and execution controls to enforce the boundary. An instruction in a prompt describes desired behavior; it is not a substitute for a checked approval state at the action step. Start with a manual review route if your chosen platform cannot express the required control reliably.
Does flow approval review each message?
Activepieces documents a flow-publication approval feature with plan and role conditions. That is a governance decision about making a flow live, not proof that each customer message inside the flow receives individual approval. Check the current product documentation for the feature and plan you actually use.
The business-transaction pattern here is a design you implement and inspect in your own setup. Test rejected, changed, missing, and repeated approvals, as well as the normal path, before relying on the process for external actions.
Use a minimal approval record
proposal_id: [stable ID] version: [reviewed version] action: [draft/send/update] destination: [exact approved destination] content_reference: [saved draft] source_references: [evidence] reviewer_and_authority: [state] decision: [pending/approve/reject/changes] reviewed_at_and_expiry_rule: [state] execution_status: [not started/succeeded/failed/uncertain] Check approval against the exact proposal before execution. Keep the action blocked or manual when the required approval evidence is absent.
What happens when this input changes?
Change only the destination in v1 and replay the approval check in a nonproduction test. The expected result is a request for review, with no send action. Record that result separately from whether a flow administrator approved publication of the automation.
Make uncertainty a state the team can handle
If the destination may have accepted the action but the workflow lost the response, mark the result uncertain and inspect the external record. Reapproval or blind resending does not resolve whether the first attempt already happened.
