Skip to main content
Caratuva surfaces meaningful events through a few channels:
  • In-product — a per-user inbox behind the bell in the dashboard, plus a Notifications delivery log.
  • Email — automatic transactional emails for key lifecycle events.
  • WhatsApp — settlement alerts to the seller’s phone, when one is on file.
  • Outbound webhooks — signed HTTP callbacks to your ERP for machine-to-machine reconciliation.
There are no per-user notification preferences today — transactional messages are event-driven, with recipients derived from the invoice/event rather than configured. For the webhook contract and signature verification, see the Webhooks reference.

In-product notifications

The bell in the dashboard top bar opens a per-user inbox (powered by Courier) showing your unread alerts; read/unread state is per user, so two teammates on the same organization keep independent read state. There are no native filter-by-type or clear-all controls beyond what the inbox widget itself provides. Separately, the Notifications page (/notifications) is a read-only delivery log of every message this organization has dispatched — with its channel, template, recipient, status, and reference — filterable by channel, status, and date range. It’s the place to verify that a buyer invitation actually went out and answer “did the customer receive the link?”

Email notifications

Caratuva automatically sends transactional emails for specific lifecycle events — for example buyer KYC approved/rejected, buyer invited, fiat received, on-chain confirmed, settled, and off-ramp failed. Recipients are derived from the invoice/event (the buyer or the seller, as appropriate); there are no per-event toggles, quiet hours, digest batching, or role-based opt-in settings. Emails are sent from no-reply@caratuva.com — add it to your safe-sender list to avoid spam-filter delays.
There is no KYB/onboarding status-change email today — the seller’s KYB status is shown live on the dashboard Payout page instead.

WhatsApp notifications

When a seller phone number is on file, Caratuva also sends the seller WhatsApp alerts for settlement-phase events (fiat received, on-chain confirmed, settled, off-ramp failed). This is automatic and not org-configurable. (SMS templates exist in the catalog but are not wired to any live flow — the buyer magic-link, for instance, is delivered by email.)

Outbound webhooks

For machine reconciliation, register a URL that receives POST callbacks for the events you care about. Example use cases:
  • Marking the order paid in your ERP when an invoice settles.
  • Surfacing a payment-failed status to your sales team.
  • Triggering downstream fulfillment when KYC clears.

Subscribe

From the dashboard, Developers → Webhooks. Or via API — see Webhooks reference. You provide:
  • A URL (must be HTTPS).
  • A list of event types.
  • (Generated for you) A signing secret. Shown exactly once at creation — copy it into your secret manager immediately.

Event types

Two parallel namespaces:
  • payment_intent.* — fires for invoices created via the integrator API. Use these if you’re an ERP/platform.
  • invoice.* — fires for every invoice (both API-created and dashboard-created). Use these if your team operates the dashboard primarily.
The two namespaces are not symmetric: invoice.* exposes more granular states (e.g. on_ramp_started, fiat_received, offramp_initiated, offramp_failed) than payment_intent.*. Subscribe to one namespace or both, depending on how your team works. The events you almost certainly want:
EventWhy
*.createdAn invoice came into existence.
*.buyer_kyc_approvedBuyer cleared KYC; payment is imminent.
*.buyer_kyc_rejectedBuyer failed KYC; this invoice won’t be paid.
*.on_chain_confirmedCross-border transfer confirmed on the settlement layer.
*.settledFunds in your bank account. The big one.
*.failedTerminal failure. Surface or refund.
*.cancelledCancelled by you, your team, or our ops.
*.expiredBuyer didn’t pay by the due date.
The full event list and payload schemas are in the Webhooks reference.

Delivery guarantees

  • Caratuva attempts immediate delivery, then retries on any non-2xx response or transport error with exponential backoff: 30s, 2m, 10m, 1h, 6h, 24h. After seven attempts the delivery moves to dead_letter and we stop retrying.
  • Each delivery carries a stable X-Caratuva-Delivery-Id — use it as an idempotency key on your side. Replays are inevitable; design for them.
  • Each delivery carries an HMAC-SHA256 signature header. Always verify it against the raw request body before acting. Re-serializing the body breaks the signature.
  • Endpoints must respond within 10 seconds.

Inspecting deliveries

The dashboard shows recent deliveries per subscription, with status (pending, delivered, dead_letter), the upstream response code, and the next retry timestamp. Useful for diagnosing endpoint outages or signature mismatches. You can manually replay any delivery from the dashboard.

Rotating the secret

If your webhook secret leaks, rotate it from Developers → Webhooks → [subscription] → Rotate secret. The new secret is shown once. Rotation is immediate and atomic — Caratuva stores one secret per subscription, so the old one stops verifying on the very next delivery; there is no dual-secret overlap window. Deploy the new secret to your verifier first (or atomically with the rotate call).

Choosing a channel

Use caseChannel
You want to confirm a buyer invitation actually sentIn-product (the Notifications delivery log)
Buyer/seller need a heads-up on a lifecycle eventEmail (sent automatically)
Seller wants a settlement ping on their phoneWhatsApp (when a phone is on file)
Finance needs to mark orders paid in the ERPWebhook
Compliance needs an immutable trailWebhook (and the audit log)
A typical setup leans on automatic email/WhatsApp for awareness and webhooks for ERP-level reconciliation.