The short answer
An IDX website produces leads: registrations, property inquiries, saved homes and searches. Each of the three CRMs below documents its own way to receive them, and the right path is the one the vendor documents, not the one that happens to work in a quick test:
- Follow Up Boss: send every lead and activity to its Events API. Its documentation calls
POST /v1/eventsthe only correct option to send leads and their activity to Follow Up Boss from an IDX website. - HubSpot: either let HubSpot collect submissions from your existing HTML forms with its non-HubSpot forms tool, or post each lead to its Submit data to a form endpoint from your own code.
- GoHighLevel (HighLevel): post the lead as JSON to a workflow's Inbound Webhook URL, or create it through the Upsert Contact API.
Before building anything, check whether your IDX vendor already has a native connection. Follow Up Boss, for example, has an IDX WEBSITES category in its integrations directory, which lists IDX Broker. A custom connection is worth building when the vendor has none, when it sends only a name and an email, or when the website is your own build.
The three documented paths side by side
| Follow Up Boss | HubSpot | GoHighLevel (HighLevel) | |
|---|---|---|---|
| Where leads go | POST https://api.followupboss.com/v1/events | Non-HubSpot forms tool, or POST /submissions/v3/integration/submit/{portalId}/{formGuid} on api.hsforms.com | A workflow's Inbound Webhook URL, or POST /contacts/upsert |
| How you authenticate | The customer's API key as the HTTP Basic username, plus your registered X-System and X-System-Key headers | The standard submit endpoint takes no credentials; a second endpoint requires authentication and has higher rate limits | The webhook URL itself, which is unique for each trigger; the API uses its own authorization |
| Existing contacts | Follow Up Boss will automatically search for existing contacts and update them | The forms tool will either create a new contact or update any existing contact record with the same email address | Upsert follows the “Allow Duplicate Contact” setting at the Location level |
| Required to create a contact | The lead's details in the event's person object; providing an ID in the Person object links the event to a known contact | For the forms tool, the form must have an email input field; for the API, the fields your HubSpot form requires | For the webhook, an Email or Phone is required to Find or Create the Contact |
Follow Up Boss
Use the Events API, not the People API
Follow Up Boss is explicit: use the Events API, not the People API to send all data from an IDX website. Its lead guide warns that POST /v1/people will create a person but will not run any automations. Sending an event instead gets the lead deduplicated, recorded with its activity, assigned (correct agent is assigned as per Lead Flow screen) and announced to the agent.
Its IDX integration page lists the events to send: Registration, Inquiry, Saved Property, Viewed Property, Property Search and Visited Open House, plus any other forms on the website that send data to Follow Up Boss.
The event type matters for automation. New leads created by an event will only trigger action plans if they are of the following types: Registration, Seller Inquiry, Property Inquiry, General Inquiry or Visited Open House. A plain “Inquiry” is converted to a Property Inquiry when the request includes a property, so send the listing with every property inquiry.
Fields and credentials
- Register your system. If you are accessing the FUB API in order to provide services to a FUB customer, you MUST register your system. Every request then carries your
X-SystemandX-System-Keyheaders. - Authenticate as the customer. Each customer generates an API key in Follow Up Boss, and authentication is done with HTTP Basic Authentication over HTTPS, with the key as the username.
- Keep the key on the server. Follow Up Boss asks you to ensure the API key is secure and not exposed in the browser, so the website posts to your backend and the backend calls Follow Up Boss.
- Set source and system. Set the source field to be the domain of the website without “www.”, include the system field in every call, and link back to the lead in your own system with
sourceUrl. - Pass campaign data. The IDX checklist includes all PPC data (“campaign” section), so carry UTM parameters from the landing page to the event.
Responses to handle
- 204 with no body: the lead flow associated with this source has been archived and ignored. Log it and alert someone; the lead did not reach an agent.
- 429: clients that exceed a limit will receive a 429 (Too Many Requests) response code, and a Retry-After header, and the request was not processed. Retry after the stated delay. Rate limits are applied based on a sliding 10 second window, and the limits for requests without a valid system key are lower.
HubSpot
Option 1: the non-HubSpot forms tool
HubSpot can collect submissions from forms it did not build. To use the non-HubSpot forms tool, you must install the HubSpot tracking code on your external page, then turn on collection in the settings. It is quick to set up, but IDX forms often break its rules. Among the requirements:
- The form must not be in an <iframe>. Many hosted IDX search pages are framed.
- The form must not have JavaScript bound to the form submit event or submit button click event.
- The form must not be on a single-page app.
- The form must not contain hidden fields. A hidden listing ID would not be collected.
Field mapping is automatic only: submitted fields will only match to single-line text field type properties in HubSpot, and non-HubSpot form fields cannot be manually mapped. Submissions also depend on the tracking script loading in the visitor's browser. HubSpot itself suggests, as an alternative, working with a developer to connect your non-HubSpot forms directly using HubSpot's Submit data to a form API.
Option 2: submit each lead through the Forms API
Create a form in HubSpot with the fields you need (including properties for the listing), then post each lead to https://api.hsforms.com/submissions/v3/integration/submit/{portalId}/{formGuid}. The request carries a list of form field names and the values for those fields, up to 1000 fields, and a context object with the page URL and hutk, the tracking cookie token value used for HubSpot lead activity tracking. Pass hutk from the visitor's browser to your backend so the submission joins the visitor's page history.
Two details catch integrations. The standard endpoint supports cross-origin (CORS) AJAX requests, so it can be called from a browser, but posting from your server lets you validate, log and retry. And a backdated submittedAt more than one month old will result in an error, so a retry queue that holds failures longer than a month will need a different route.
GoHighLevel (HighLevel)
Option 1: an Inbound Webhook workflow trigger
The trigger captures incoming POST/GET/PUT requests sent to a HighLevel Webhook URL (unique for each trigger), and HighLevel lists lead capture from web forms among its uses. The rules from its help center:
- Send JSON: the only supported data format.
- Keys must be a single string without space separations.
- Providing an Email or Phone number in the payload is mandatory.
- If the data structure changes, re-select the mapping reference in the trigger setup so later workflow actions read the right fields.
- If the URL leaks, delete the trigger and add a new one; incoming requests from the old URL won't enter your workflow.
Because the URL is the only credential, keep it on your server rather than in website JavaScript. The Inbound Webhook is one of HighLevel's premium triggers: once enabled, sub-accounts get 100 free executions, and the article tells agencies how to avoid accruing execution costs through rebilling. It does not state a per-execution price, so check the agency's billing settings before sending high volumes through it.
Option 2: the Upsert Contact API
POST /contacts/upsert creates or updates a contact in one call and will adhere to the configuration defined under the “Allow Duplicate Contact” setting at the Location level. The request needs a locationId and accepts a source and custom fields for the listing. One trap: the tags field will overwrite all current tags associated with the contact, so a repeat inquiry can wipe tags an agent added. Use the separate tag endpoints to add tags instead.
What every IDX-to-CRM connection needs
Whichever CRM you use, the same design keeps leads from going missing:
- The website posts to your own backend first; the backend stores the lead, then calls the CRM. Credentials stay on the server.
- Each lead gets an ID in your system before the CRM call, so a retry after a timeout does not create a second lead on your side.
- Failed calls go to a retry queue that respects 429 responses and gives up into an alert, not into silence.
- The listing travels with the lead: MLS listing ID, address, price, listing URL and the search that led there.
- Campaign and UTM values from the landing page are kept and sent with the lead.
- Consent choices are recorded as shown on the form, with the time and the page.
- A weekly check compares leads stored on your side with leads in the CRM, so a revoked key or archived lead source is noticed.
The retry, idempotency and reconciliation patterns are covered in detail in our guide to reliable webhook and event-driven integrations, and the CRM side of the design (deduplication, routing, a single timeline per contact) in real estate CRM architecture. Getting the listings onto the site in the first place is covered in how to get MLS data access.
Questions to ask your IDX vendor
- Does it have a native connection to our CRM, and which events does it send: registration only, or inquiries, saved homes and searches too?
- Does it send the listing ID and URL with each property inquiry?
- Can it post to a webhook URL we control, so our backend can forward leads to the CRM and keep a copy?
- What happens to a lead when the CRM is down or rejects the request: is it retried, and are we told?
- Are its forms in an iframe or a single-page app? (This decides whether HubSpot's forms tool can see them.)
Frequently Asked Questions
How do I send IDX leads to Follow Up Boss?
Send them to the Events API, POST /v1/events, from your server. Follow Up Boss calls it the only correct option to send leads and their activity to Follow Up Boss from an IDX website and says POST /v1/people will create a person but will not run any automations.
Can HubSpot capture leads from IDX plugin forms without an integration?
Sometimes. Its non-HubSpot forms tool collects HTML form submissions once the tracking code is installed, but the form must not be in an <iframe> and the form must not be on a single-page app, which rules out many IDX forms. The alternative is HubSpot’s Submit data to a form API called from your own code.
How do website leads get into GoHighLevel?
Through a workflow’s Inbound Webhook trigger, which captures incoming POST/GET/PUT requests sent to a HighLevel Webhook URL (unique for each trigger), or through the Upsert Contact API. For the webhook, an Email or Phone is required to Find or Create the Contact.
Should the website call the CRM directly from the browser?
No. Post to your own backend and call the CRM from there, so credentials stay private and failed calls can be retried. Follow Up Boss asks integrators to ensure the API key is secure and not exposed in the browser.
Statements about Follow Up Boss, HubSpot and GoHighLevel were read from the vendors' own documentation, linked above, on October 21, 2026. Endpoints, limits, plan terms and premium-feature billing change; confirm them in each vendor's documentation and your account before you build. This guide describes the vendors' documented options and does not describe a Peregrine client project.
Connecting an IDX website or MLS feed to your CRM? See our API integration service or talk to an engineer.
