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.
invoice.paid advancedSetup steps
- Expose an HTTPS endpoint that accepts POST requests with a JSON body.
- 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.
- Copy the signing secret that appears. It is shown once.
- 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.
- 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.
- 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
ideventoccurred_atworkspace.idclient.idinvoice.idinvoice.numberinvoice.total_centsinvoice.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
Airtable
Log every sorted document to Airtable
Each file you upload is sorted into a document type, such as bank statement or contract. Keep a row per file in Airtable with that type and how sure the sorting was.
Notion
Log filed deadlines in a Notion database
Every deadline you mark filed adds a row to a Notion database: a yearly record of what was filed when, useful for next year's planning.