Skip to main content
Every event in both directions is logged and inspectable — from the dashboard or through the administrative API.

Where to look

In the dashboard: Integrations → Custom Integrations → Configure, then the inbound and outbound log tabs.

Log endpoints

Both require an admin dashboard session and support cursor pagination.
Inbound logs record every event you sent: the event type, your eventId, the raw payload, the processing status (processing, processed, failed, plus deduplicated ones) and the error message when it failed. Outbound logs record every delivery attempt: destination URL, payload, attempt count, HTTP status, latency, next scheduled retry and the last error.

Inbound errors

These are returned synchronously to your request. A 202 with "status": "failed" means the event was accepted, stored and then rejected during processing — for example a missing required field inside data. The reason is in message and in the inbound log.
Resending a failed event with the same eventId returns skipped, not a retry. Fix the payload and send it with a new eventId.

Outbound delivery failures

A delivery is retried when your endpoint returns a non-2xx status, times out after 15 seconds, or is unreachable. After 10 failed attempts the delivery is marked failed and Ringee emails the workspace to say the endpoint is down.

Common causes

You parsed the body before verifying. Read the raw text and HMAC exactly those bytes — a JSON.parse followed by JSON.stringify produces different bytes and a different digest.Also confirm you are hashing `${timestamp}.${rawBody}`, not the body alone, and that you are using the whsec_ signing secret rather than the cik_live_ API key.
Rotating the API key invalidates the old one immediately — and also revokes every Dialer SDK publishable key on that integration. Update both.
You are sending a different externalId for the same record, or omitting it. Dedup runs on externalId first, then phoneNumber. Keep externalId stable for the lifetime of the record.
That is intentional. null, undefined and empty strings never overwrite existing values on upsert — this protects Ringee data from partial CRM payloads.
Expected. Retries and redeliveries reuse the eventId. Deduplicate on it with a UNIQUE constraint — see Outbound webhooks.
recording.ready is a separate opt-in event that can arrive minutes after call.completed. Confirm it is selected in the outbound event list, and that recording is enabled for the workspace.

Self-hosted debugging

When running Ringee yourself, deliveries are drained by the Temporal orchestrator (apps/orchestrator). If outbound events queue up but never send, check that the orchestrator is running and connected to Temporal — see How it works.