> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linkiasoft.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks for non-developers

> Sending events to n8n, Zapier or your own system, with signing secrets and a delivery log.

A webhook tells another system when something happens here — no polling, no API code on
your side beyond receiving a request.

## Setting one up

<Steps>
  <Step title="Get a URL from the receiving system">
    In n8n, a Webhook node. In Zapier, a "Catch Hook" trigger. In your own system, any
    endpoint that accepts a POST.
  </Step>

  <Step title="Add the endpoint">
    **Integrations → Webhooks → Add.** The URL must be publicly reachable over http(s) —
    internal and private addresses are rejected.
  </Step>

  <Step title="Choose the events">
    Only the ones you need. Every extra event is traffic the receiver has to ignore.
  </Step>

  <Step title="Choose the fields">
    Per event, you can pick which fields to send.
  </Step>

  <Step title="Send a test">
    Confirms the endpoint accepts what we send before anything real depends on it.
  </Step>
</Steps>

## Events

**Messaging:** message received, sent, delivered, read, failed; comment received.

**CRM:** lead created, updated, stage changed, assigned, won, lost.

## The signing secret

Each endpoint has a secret used to sign every request. Your receiver should verify it —
otherwise anyone who learns your URL can post fake events to it.

You can **rotate** the secret. Update the receiver at the same time; requests signed with
the new secret will fail verification against the old one.

## The delivery log

The last 300 attempts per endpoint, with what was sent and what came back.

<AccordionGroup>
  <Accordion title="Failures that never reached the endpoint">
    DNS, TLS or connection problems. The URL is wrong, or the receiver is not publicly
    reachable.
  </Accordion>

  <Accordion title="The endpoint rejected it">
    It responded with an error status. The body in the log is the receiver's own message —
    that is where the reason will be.
  </Accordion>

  <Accordion title="Nothing at all in the log">
    No event matching your subscription has occurred yet. Send a test to confirm the wiring.
  </Accordion>
</AccordionGroup>

## Keeping it healthy

* **Respond quickly, with a 2xx.** Do the slow work after acknowledging. A receiver that
  takes seconds to reply will look like a failure.
* **Expect the same event more than once.** Make your handler safe to run twice on the same
  event rather than assuming exactly-once delivery.
* **Subscribe narrowly.** It is easier to add an event later than to work out which of
  fifteen is causing a problem.
