Webhook Architecture
RevyOps webhook endpoints receive POST requests from your sending platforms. Each request is logged and enqueued as a Cloud Task, and the endpoint immediately returns 200 OK — it does not wait for the record write. The actual campaign, contact, and email record updates happen asynchronously, when the queued task is processed on a separate request. There is no guarantee the records are updated by the time the webhook response is sent.
All per-client webhook endpoints acknowledge with 200 OK even when the payload can’t be processed — an unknown client_id or a malformed/unrecognized payload is still answered with 200 (with the drop reason recorded in the response body, e.g. {"detail": "dropped: invalid payload"}, and in logs) rather than a 4xx status. This is intentional: Cloud Tasks retries any non-2xx response, and a payload that will never validate would otherwise retry forever. The one exception is HubSpot, whose endpoint returns 401 Unauthorized for an invalid signature.
Endpoint Reference
Per-Client Webhooks
These endpoints are scoped to a single workspace. Use them when each client has their own sending platform account.
Agency-Level (Global) Webhooks
Use these when a single sending platform account is shared across multiple client workspaces. RevyOps routes events to the correct workspace automatically.
Event Types Processed
Idempotency
Webhooks are not deduplicated. There is no unique constraint or lookup on email address + campaign + timestamp before a record is written, so a redelivered event (a platform retry, or a Cloud Tasks retry of the processor) can create a duplicate email record. If you’re seeing duplicates, check your sending platform’s delivery logs for repeated deliveries of the same event.
Debugging Webhook Events
If events are not appearing in RevyOps:
- Confirm the webhook URL includes your correct
client_id
- Check your sending platform’s webhook delivery logs for any error responses
- Verify the platform is sending the correct event types
- Use the Emails section in RevyOps to see if any records arrived with unexpected data
Most sending platforms show webhook delivery history with request/response details. Check these logs first when debugging connectivity issues.