Release a payout
A payout instruction is a request to a licensed provider to send money to a registered destination. Pehmen writes the instruction, decides about it, and hands it over. The money never passes through Pehmen.
Click any step to read what happens there and what can refuse it.
The dual-control threshold
TRUST_DUAL_CONTROL_THRESHOLD_MINOR, SGD 10,000.00 by default. At or above it, one approval opens a request and a second person must complete it. The demo's SGD 24,000.00 payout to Cassia Ticketing exists to show exactly this.
Approving with the dashboard
- Open the instruction from Payouts → Waiting on someone.
- Read Why it is held and What the Gate decided. If the reasons include
FULFILLMENT_EVIDENCE_TIER_TOO_LOW, look for fulfillment evidence on the orders named in Release conditions before approving. - Press Approve. Answer the second-factor prompt if it appears.
- If the page says waiting for a second approver, send the approval id to a colleague with
payouts:approve. They open the same page, paste it into Approval id (second approver only), and press Approve. - Someone with
payouts:releasepresses Release.
Fulfillment evidence
The protective template holds a large payout unless fulfillment evidence of tier 2 or better exists for the orders in its release condition:
| Tier | What it is | Who can supply it |
|---|---|---|
| 1 | A source-authenticated system event (ticketing gate scan, carrier API) | A platform-operated SYSTEM_API source. Not yet available to tenants. |
| 2 | A signed event from your platform, with replay protection | You: POST /v1/fulfillment-sources (kind PLATFORM_SIGNED) gets a signing secret shown once; then POST /v1/fulfillment-events with the signature. |
| 3 | Buyer confirmation | You: a BUYER_CONFIRMATION source. Supporting evidence only; never the sole basis for release. |
Reversal events (reversal_of) cancel the evidence they name. A held payout re-evaluates on release, so evidence attached after the hold counts.
What refuses
| Refusal | Why |
|---|---|
step_up_required | Your second factor is older than five minutes. |
approver_must_differ | The same person tried to be both approvers. |
approval_stale | The instruction changed between approval and release. Approve again. |
connection_not_active / connection_kind_invalid | The payout connection is not ACTIVE, or is a pooled demo connection. |
cooling_off_active | The beneficiary has a change still cooling off. |