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