Skip to main content
Coming soon. Webhook delivery is not switched on yet. This page describes the contract that will ship — event types, payload shape, signing and delivery behaviour — so you can build your receiver ahead of time. Until then, poll with updated filters and deleted_entities (see Querying). The changelog will announce availability.
Goal: an HTTPS endpoint that PracticeHub can deliver events to reliably: it rejects anything not signed with your endpoint secret, answers 2xx immediately so retries and disabling never kick in, does the real work in the background exactly once per event, and fetches the current record with your own key because the event only carries the id. Key: read-only (the receiver only reads). Needs: an endpoint created under Developers → Webhooks (2.0 accounts) with its signing secret, and the standardwebhooks package.

The shape of a delivery

Three headers carry the Standard Webhooks signature; the body is the event: a unique id, a type ({resource}.created|updated|deleted plus the semantic appointment events), when it happened, and only the entity name and id. Nothing personal or clinical is in the payload by design.

The receiver

And the worker:

Why each step is there

Testing it

  1. Portal → Send test event delivers a real signed message to your endpoint.
  2. Portal → Replay any past delivery — the same id, so this also proves your de-duplication.
  3. Locally, run the receiver behind a tunnel (ngrok, cloudflared) and add that URL as a second endpoint on a test account; delete it afterwards.
  4. Every attempt, with your response code and body, is visible in the portal — start there when “webhooks aren’t arriving”.

Gotchas