Webhook vs email

Same event, two channels with different audiences and SLAs. Here's how we route each.

Decision tree

Event fires
    ↓
Is it system-relevant?
    ↓                          ↓
   Yes                        No
    ↓                          ↓
Send webhook                 (don't send)
to every endpoint
subscribed to it
    ↓
Is it human-relevant?
    ↓                          ↓
   Yes                        No
    ↓                          ↓
Render React Email           (skip email)
template via Resend
    ↓
Send to audience defined
in the template config

Examples

Card minted

  • Webhook: yes — your backend wants to record the card_id
  • Email: yes — the cardholder wants confirmation + the (last 4) of their card

Agent intent rejected

  • Webhook: yes — your monitoring stack wants to track rejection rates
  • Email: no — this is operational noise, not customer-relevant

KYB approved

  • Webhook: yes — your workflow may unlock live-mode features
  • Email: yes — the workspace owner has been waiting for this answer

Webhook delivery failed (after all retries)

  • Webhook: yes — but to a different endpoint (your "ops" endpoint), not the broken one
  • Email: yes — to the workspace owner so a human notices

Reconciliation break detected

  • Webhook: no — internal compliance event
  • Email: yes — to workspace owner + Soren Pay on-call

Audience rules per email template

| Event | Audience | Reasoning | |---|---|---| | KYB / KYC decisions | Workspace owner OR account holder | Compliance — they need to know | | Card lifecycle | Cardholder | They carry the card | | Money movement (deposits, withdrawals, intl, checkout) | Workspace owner | They own the ledger | | Disputes | Workspace owner | They submit the evidence | | Recon breaks | Workspace owner + Soren Pay on-call | Both need to investigate |

Frequency caps

To avoid noise:

  • card.authorization.declined → email never (too noisy); webhook only if opt-in
  • webhook_delivery.failed → 1 email per endpoint per 24h (not per attempt)
  • reconciliation.break → 1 email per workspace per day max

How to subscribe

Webhooks

Dashboard → Developers → Outbound webhooks → add URL + select events. Or API: POST /api/webhook-endpoints.

Emails

Per-workspace settings → Notifications → choose which categories. Compliance emails (KYB / KYC / OFAC) cannot be disabled.

Related