Skip to main content
ClientNest365

Your HTTPS endpoint

Receive events on your own server

Point a webhook straight at your own HTTPS endpoint, check the signature and handle any event. Every event works the same way; invoice.paid is the example here.

20 min setup Trigger: invoice.paid advanced
works with Direct webhook

Setup steps

  1. Expose an HTTPS endpoint that accepts POST requests with a JSON body.
  2. In ClientNest365, open Settings → Integrations and choose Add webhook. Paste your endpoint as the Target URL, tick the events you want under Events and choose Add webhook.
  3. Copy the signing secret that appears. It is shown once.
  4. For each request, compute an HMAC-SHA256 of the raw body with the secret and compare it, in constant time, with the X-ClientNest365-Signature header (format sha256=<hex>). Reject the request if they differ.
  5. Route on the event field (also sent as the X-ClientNest365-Event header). Use the id field to ignore a request you have already handled: a retried delivery keeps the same id.
  6. Answer with any 2xx status within 10 seconds. Anything else is retried after 30 seconds, 5 minutes and 30 minutes, then given up. Recent deliveries in Settings → Integrations shows each attempt.

Payload fields you'll use

  • id
  • event
  • occurred_at
  • workspace.id
  • client.id
  • invoice.id
  • invoice.number
  • invoice.total_cents
  • invoice.currency

Example invoice.paid payload

Made-up values, real shape. Amounts are in cents.

{
  "id": "evt_3f6a1c9e-8b2d-4e7f-a5c3-1d9b7e2f4a60",
  "event": "invoice.paid",
  "occurred_at": "2026-10-20T14:05:00.000Z",
  "workspace": {
    "id": "1d4f7a2c-9e3b-4c8d-b6a1-7e5c3f9d2b40",
    "name": "Your workspace"
  },
  "client": {
    "id": "8f0c2a64-1b7e-4c1d-9a55-3e2f6b1d7c90",
    "name": "Example Client Ltd",
    "email": "accounts@example.com",
    "url": "https://clientnest365.com/app/clients/8f0c2a64-1b7e-4c1d-9a55-3e2f6b1d7c90"
  },
  "invoice": {
    "id": "2b7d9e10-5c3a-4f8e-b1d2-7a6c5e4f3d21",
    "number": "INV-0042",
    "status": "paid",
    "currency": "EUR",
    "subtotal_cents": 120000,
    "tax_cents": 0,
    "total_cents": 120000,
    "total_formatted": "€1,200.00",
    "due_at": "2026-10-31T00:00:00.000Z",
    "sent_at": "2026-10-17T09:30:00.000Z",
    "paid_at": "2026-10-20T14:05:00.000Z",
    "days_overdue": null,
    "line_items": [
      {
        "description": "October retainer",
        "quantity": 1,
        "unit_price_cents": 120000,
        "total_cents": 120000
      }
    ],
    "url": "https://clientnest365.com/app/invoices/2b7d9e10-5c3a-4f8e-b1d2-7a6c5e4f3d21"
  }
}

Where to add it in ClientNest365

In your workspace, open Settings → Integrations and choose Add webhook. Paste the webhook address from Zapier, Make or n8n (or your own endpoint) as the Target URL, tick invoice.paid under Events and choose Add webhook. The signing secret appears once; copy it if you want to check signatures on the receiving end. You can pause, resume or delete the webhook from the same list, and Recent deliveries shows what was sent.

Checking the signature

Each request carries an X-ClientNest365-Signature header with the value sha256=<hmac>, where the HMAC-SHA256 is computed over the raw request body with the webhook's signing secret. Compare it in constant time and reject a mismatch.

Related recipes