Notifications
Soren Pay notifies you of every meaningful event via two channels:
- Webhooks — machine-readable JSON, HMAC-signed, sent to your endpoint
- Emails — human-readable, sent via Resend, optional per-workspace
See webhook vs email for when to use each.
Event matrix
| Event | Webhook | Email (default audience) |
|---|---|---|
| workspace.created | ✓ | Workspace owner |
| kyb.submitted | ✓ | Workspace owner |
| kyb.approved / kyb.rejected | ✓ | Workspace owner |
| personal_account.created | ✓ | Account holder |
| personal_account.kyc.approved / .rejected | ✓ | Account holder |
| card.minted | ✓ | Cardholder + workspace owner |
| card.frozen / card.terminated | ✓ | Cardholder |
| physical_card.shipped / .delivered | ✓ | Cardholder |
| card.authorization.declined | ✓ (opt-in) | — |
| card.dispute.opened | ✓ | Workspace owner |
| agent.registered | ✓ | Workspace owner |
| agent.intent.rejected | ✓ | — |
| deposit.credited (onramp completed) | ✓ | Workspace owner |
| withdrawal.completed / .failed (offramp) | ✓ | Workspace owner |
| intl_payment.rail_settled / .failed | ✓ | Workspace owner |
| checkout.session.completed | ✓ | Merchant + customer (success page) |
| webhook_delivery.failed (after all retries) | ✓ | Workspace owner |
| reconciliation.break | — (internal) | Workspace owner + on-call |
Webhook delivery
- HMAC-SHA256 signature in
Soren-Signature: t=<unix>,v1=<hmac>header - ±5min replay window
- Retries: exponential backoff, up to 6 attempts over 24h
- 200 OK = delivered (any other status = retry)
- After 6 failed attempts, the endpoint is paused and you're emailed
Email delivery
- Transactional via Resend
- HTML + plaintext per template
- Each email has an "unsubscribe from this notification type" footer
- Critical compliance notifications (KYB decision, OFAC freeze) are not unsubscribable
Subpages
- Webhook vs email — choosing the right channel