Skip to main content

← All docs

Webhooks (outbound)

EdenClick sends a signed POSTto your endpoint whenever a deal is created, won, or updated, or a new contact is captured. This is the foundation for Slack notifications, Zapier, n8n, Make, and your own backend integrations.

Events

deal.createdFired when a deal is created (API, tracking, postback, or app).
deal.wonFired when a deal moves into the Won stage.
deal.updatedFired on any other deal update (value, status, notes).
contact.createdFired when a new contact is captured.

Setup

  1. Go to Settings → Webhooks and add an endpoint URL.
  2. Select the events you care about and save. Copy the signing secret — it is shown only once.
  3. The endpoint receives a POSTwith JSON. Verify the signature and respond with2xx.

Payload

{
  "event": "deal.won",
  "eventId": "9f7e…",
  "timestamp": "2026-08-08T00:00:00.000Z",
  "workspace": { "id": "…", "slug": "acme" },
  "data": {
    "id": "…",
    "title": "Big deal",
    "value": 5000,
    "stage": "Won",
    "status": null,
    "conversionType": "purchase",
    "currency": "USD",
    "commissionAmount": 250,
    "site": "store.example.com",
    "contact": { "id": "…", "name": "Jane Doe", "email": "jane@example.com", "companyId": null },
    "partner": { "id": "…", "name": "Jane Doe", "email": "jane@partner.io" },
    "link": { "id": "…", "slug": "jane-link", "productLabel": "Day Tour" }
  }
}

data for contact.created contains the contact fields instead. Requests are sent with headersX-EdenClick-Event,X-EdenClick-Event-Id, andX-EdenClick-Signature.

Verify the signature (Node.js)

import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(req, secret) {
  const body = JSON.stringify(req.body);
  const expected = createHmac('sha256', secret)
    .update(body).digest('hex');
  const actual = req.headers['x-edenclick-signature'];
  return actual && timingSafeEqual(
    Buffer.from(actual), Buffer.from(expected)
  );
}

Quick example: Slack

Create an Incoming Webhook in Slack, then set the EdenClick webhook URL to it. Slack accepts arbitrary JSON and will render a message for a textfield, so the payload above displays directly.

REST API reference