Connect Zapier, Make.com, Salesforce, or any system that can send an HTTP request — and every new lead lands in Hoot as a patient, automatically enrolled in the nurture campaign you choose.
What the Patient Intake Webhook does and when to use it.
The Patient Intake Webhook lets any external system that can send an HTTP POST request push new leads directly into Hoot CRM as patients — automatically enrolling them into a nurture campaign you choose ahead of time. It's the standard way to connect lead-gen forms, ad platforms, and automation tools (Zapier, Make.com, Salesforce Flow, custom scripts, etc.) to Hoot without manual data entry.
Each webhook URL is unique to one doctor and one service in your Hoot account, and every submission is automatically checked for duplicates before a new patient record is created.
POST request with the lead's details to your Hoot webhook URL.Done once per service, from inside your Hoot portal.
Open your profile page.
Choose the service you want to receive leads for.
Find the Patient Intake Webhook card and click Generate Webhook URL.
Paste it into your external system (Zapier, Make.com, Salesforce, etc.).
Select a nurture campaign and click Save Campaign. A webhook cannot receive leads until a campaign is assigned.
| Status shown in portal | Meaning |
|---|---|
| Not Configured | No webhook URL has been generated yet for this service. |
| URL Ready — Campaign Needed | URL exists, but no campaign is assigned. Incoming leads will be rejected until you assign one. |
| Fully Configured | URL and campaign are both set. The webhook is live and accepting leads. |
Every webhook URL contains a unique, unguessable token that identifies your doctor and service:
If a URL is ever exposed, or you simply want to rotate it, click Revoke in the webhook card and generate a new one. The old URL stops working immediately (any request returns 401 Unauthorized), so remember to update every external system that uses it.
No authentication headers are required — the token in the URL path is sufficient. Send a JSON body with Content-Type: application/json.
| Field | Type | Required | Notes |
|---|---|---|---|
firstName | string | Yes | Lead's first name. |
lastName | string | Yes | Lead's last name. |
phone | string | One of phone / email | Digits only; Hoot stores it in +1 format. |
email | string | One of phone / email | Used for duplicate matching if phone is not provided. |
id | string | No | Your own external record ID, stored for reference (e.g. Salesforce lead ID). |
leadFormName | string | No | Name of the form or ad that generated the lead. |
leadSource | string | No | Where the lead came from (e.g. "Facebook Ad", "Website Form"). |
leadSourceDetail | string | No | Additional detail about the source. |
resultNurture | string | No | Optional tag/code carried over from your source system. |
curl -X POST "https://api.app-hoot.com/webhook/patient-intake/6f2c9a3e-51e0-4b3f-9d2a-8e0c4a7b1d90" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Christian",
"lastName": "Espigadera",
"phone": "7202190414",
"email": "chrespi14@gmail.com",
"id": "0013h000005CumzAAC",
"leadFormName": "Self-Test",
"leadSource": "Already Knew About LEC",
"leadSourceDetail": null,
"resultNurture": "CLR-7"
}'
All fields except firstName and lastName are optional, and Hoot only requires one of phone or email. Any extra fields you send (leadFormName, leadSource, leadSourceDetail, resultNurture, id) are stored on the patient record for reference and reporting.
{"message":"Patient created successfully","patientId":74165}
A matching patient already exists, so no duplicate was created. This is expected and safe on retries. {"message":"Patient already exists, skipped"}
No firstName/lastName, or missing both phone and email.
The token is invalid or has been revoked. {"message":"Invalid webhook token"}
The webhook URL is valid, but no nurture campaign has been assigned yet. No patient is created for this request. {"message":"Webhook is not fully configured. Contact Hoot support."}
Unexpected internal error.
Hoot is the receiver in this integration, so it does not re-send or retry requests — that responsibility sits with your automation tool (Zapier, Make.com, Salesforce, etc.). What Hoot does guarantee is that re-sending the same lead is safe:
200 with "Patient already exists, skipped" instead of creating a duplicate.This means you can safely configure automatic retries on timeouts or network errors in your source system without worrying about duplicate patient records.
json and map your trigger's fields to firstName, lastName, phone/email, and any optional fields.200 response and the lead should appear as a patient in Hoot.200 response before turning the scenario on.id).200 in Flow debug logs.If your platform can send an HTTP POST request with a JSON body, it can integrate with this webhook — website form handlers, custom scripts, ad-platform lead sync tools, and other CRMs all work the same way.
| Symptom | Likely cause | Fix |
|---|---|---|
Getting 401 on every request | Token was revoked/regenerated, or copied incorrectly | Re-copy the current URL from the Hoot portal and update your integration |
Getting 503 on every request | No campaign assigned to the webhook | Assign a campaign in the webhook card in your profile |
Getting 400 | Missing firstName/lastName, or missing both phone and email | Check your field mapping in the source system |
| Lead not appearing as a new patient | An existing patient already matched by name + phone/email | Expected behavior — check for the existing patient record rather than a new one |
401 Unauthorized response. Update your integration with the newly generated URL to resume delivery.