updated_at filters.
Webhooks are available on accounts created on PracticeHub 2.0. Existing accounts get them when they complete their move to 2.0 — until then, poll
deleted_entities and updated_at filters as before.Setting up an endpoint
1
Open the portal
In PracticeHub go to Developers → Webhooks. The page is the account’s webhook portal. Nothing is sent for an account until someone opens this page for the first time — that is what switches delivery on.
2
Add your endpoint
Enter your HTTPS URL, choose which event types it should receive (or all), and save. The portal shows the endpoint’s signing secret — copy it into your service.
3
Watch it work
The portal lists every delivery attempt with the response your endpoint returned, lets you replay any message, and can send a test event.
What you receive
Payloads are deliberately thin — the event type and the record’s id, never the record itself — so no clinical or personal data leaves PracticeHub through a webhook. Fetch the record from the API with your own key:id is unique per event — use it to de-duplicate, since a delivery may be retried after a timeout. Events for one record are not guaranteed to arrive in order; the record you fetch is always current.
Event types
The current event set covers patients and appointments:
A few cases worth knowing:
- Creating a record sends one event. PracticeHub’s own follow-up writes while it creates a patient or an appointment are part of the create — you get
.created, not.createdthen.updated. - Merging two patients sends
patients.deletedfor the record that was merged away andpatients.updatedfor the one that was kept. - Restoring a deleted patient sends
patients.updated, notpatients.created— the id is the one you already know.
Verifying signatures
Every delivery is signed. Verify it before trusting it — the signature scheme is Standard Webhooks, so use the library for your language with the endpoint’s signing secret from the portal:Delivery and retries
Respond with any2xx within a few seconds — do the work afterwards. Non-2xx responses and timeouts are retried with exponential backoff over roughly a day; an endpoint that keeps failing is disabled and you are notified in the portal, where you can re-enable it and replay what was missed.