Key takeaways
- A HighLevel workflow with an Inbound Webhook trigger can receive every PrequalFunnel lead as JSON, including the borrower's inputs, results and traffic source.
- Map the payload once with a real test lead, then create or update the contact, tag it by calculator and open an opportunity in a 'Pre-qual started' stage.
- Branch on the consent fields before any SMS or email step, and keep the first call with a person.
- A failed webhook never loses the lead: it is still saved in the PrequalFunnel CRM, so you can fix the workflow and carry on.
You can send every calculator lead straight into HighLevel by creating a workflow with an Inbound Webhook trigger, pointing PrequalFunnel's lead webhook at it, and mapping the JSON fields to a contact, tags, a pipeline opportunity and notifications. This guide walks through that build step by step, with an illustrative payload, consent-aware messaging, testing and a troubleshooting table.
A note on HighLevel's interface. HighLevel changes its menus and labels regularly. The steps below describe the interface generically as of October 2026; if a button has moved or been renamed, the concepts (trigger, mapping, actions) are the same. Lead webhooks are available on the Producer and Brokerage plans; see pricing for current details.
What does the finished workflow do?
It turns one HTTP request into a ready-to-work lead in under a few seconds. When a borrower submits the form inside a PrequalFunnel calculator, the workflow:
- Receives the lead as JSON through the Inbound Webhook trigger
- Creates the contact, or updates it if the borrower already exists
- Stores the key numbers (price, payment, DTI) and attribution in custom fields
- Tags the contact by calculator (for example
calc-fha-loan) - Creates an opportunity in a pipeline stage called "Pre-qual started"
- Sends a consent-aware confirmation by email, and by SMS only where text consent exists
- Assigns the contact to a loan officer
- Notifies that LO immediately so the first call happens fast
The speed side of this is covered in the speed-to-lead playbook; this guide is the plumbing.
What does the webhook payload look like?
PrequalFunnel posts each lead as a JSON object containing the event, the calculator, the contact, the submission (inputs and results), a timestamp, an attribution block and flat utm_*, gclid, fbclid, msclkid, landing_page and referrer fields. The flat fields exist so tools like HighLevel can map them without digging into nested objects.
The example below is illustrative: the values are invented and the exact key names and formats in your account are shown when you send a test lead. Use your own test delivery as the source of truth when mapping.
{
"event": "lead.created",
"timestamp": "2026-10-08T14:32:05Z",
"calculator": {
"slug": "affordability",
"name": "Affordability Calculator"
},
"contact": {
"first_name": "Maria",
"last_name": "Example",
"email": "[email protected]",
"phone": "+15555550123",
"consent": {
"email": true,
"sms": true,
"calls": true,
"text": "I agree to be contacted by [Company] by phone, text and email about my inquiry."
}
},
"submission": {
"page_url": "https://www.yourbrokerage.com/how-much-house/",
"inputs": {
"annual_household_income": 96000,
"down_payment": 25000,
"interest_rate": 6.75,
"loan_term": 30,
"car_payments": 650,
"student_loans": 550,
"credit_cards": 400
},
"results": {
"maximum_home_price": 240000,
"estimated_monthly_payment": 1840,
"debt_to_income_used": 43,
"front_end_dti": 23
}
},
"attribution": {
"source": "google",
"medium": "cpc",
"campaign": "fall-buyers",
"landing_page": "https://www.yourbrokerage.com/how-much-house/?utm_source=google",
"referrer": "https://www.google.com/"
},
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "fall-buyers",
"utm_term": "how much house can i afford",
"utm_content": "ad-a",
"gclid": "EXAMPLE_GCLID",
"fbclid": "",
"msclkid": "",
"landing_page": "https://www.yourbrokerage.com/how-much-house/?utm_source=google",
"referrer": "https://www.google.com/"
}
Every input the borrower entered and every result they saw are in submission, so the LO never has to ask what they were looking at. See the webhooks integration page and the lead webhook glossary entry for the general model.
How do you build the workflow, step by step?
Create the workflow first, because PrequalFunnel needs the trigger's URL. Then send a test lead so HighLevel has a sample to map from.
Step 1: Prepare custom fields, tags and the pipeline
Do this before opening the workflow builder so the fields exist when you map.
- Custom fields (contact level): Calculator, Pre-qual price, Pre-qual payment, Back-end DTI, Down payment, Rate entered, Page URL, utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, Landing page, Referrer, Lead consent text.
- Tags: one per calculator you embed, in a consistent pattern such as
calc-affordability,calc-fha-loan,calc-dti, plus a generalsource-prequalfunnel. - Pipeline: in your opportunities or pipelines settings, add (or reuse) a pipeline with a first stage named Pre-qual started, followed by stages that match your process, for example Contacted, Application sent, Pre-approved.
Step 2: Create the workflow with an Inbound Webhook trigger
- Open the automation area of your HighLevel sub-account and create a new workflow from scratch.
- Name it clearly, for example "PrequalFunnel lead intake".
- Add a trigger and choose Inbound Webhook. HighLevel generates a unique webhook URL for this trigger.
- Copy the URL. Treat it like a password: anyone who has it can post data into your workflow.
- Save the trigger. Do not publish the workflow yet.
Step 3: Point PrequalFunnel at the URL and send a test lead
- In PrequalFunnel, open the lead webhook settings and paste the HighLevel URL. You can set one URL for all calculators, or per-calculator URLs if you want FHA leads, for example, to go to a separate workflow.
- Open a page where the calculator is embedded (or the calculator's direct link), enter realistic numbers, and submit the lead form with your own test name and email.
- Back in HighLevel, use the trigger's option to fetch or select the sample request it just received. The workflow builder now knows the payload's structure.
Step 4: Create or update the contact
Add a create-or-update contact action and map:
| HighLevel field | Payload field (illustrative path) |
|---|---|
| First name | contact.first_name |
| Last name | contact.last_name |
contact.email |
|
| Phone | contact.phone |
| Calculator (custom) | calculator.name |
| Pre-qual price (custom) | the price result for that calculator, e.g. submission.results.maximum_home_price |
| Pre-qual payment (custom) | the payment result, e.g. submission.results.estimated_monthly_payment |
| Back-end DTI (custom) | submission.results.debt_to_income_used where present |
| Page URL (custom) | submission.page_url |
| utm_source … utm_content, gclid, landing page, referrer | the flat fields of the same names |
| Lead consent text (custom) | contact.consent.text |
Different calculators return different result names, so a price field that exists on the affordability calculator may be called something else, or not exist, on the DTI calculator. Either map per-calculator in branches, or store the whole results object in a large text field and map only the common ones.
Step 5: Tag by calculator
Add an add-tag action. Either add a branch per calculator slug (if calculator.slug equals fha-loan, add calc-fha-loan), or, if your HighLevel account allows dynamic values in tag names, build the tag from the slug directly. Also add source-prequalfunnel to every lead.
Tags let you run different follow-up for each program: the FHA loan calculator lead hears about down payment and mortgage insurance, while a DTI calculator lead hears about debts first. The guide to reading a calculator lead explains why that matters.
Step 6: Add the opportunity to "Pre-qual started"
Add a create-or-update opportunity action: choose your pipeline, the Pre-qual started stage, name the opportunity with the contact's name and calculator, and set the monetary value to the price result if you track pipeline value. Set the status to open.
Step 7: Send consent-aware messages
Branch before any message. An if/else condition on the consent fields keeps every channel tied to what the borrower agreed to.
- If email consent is true (or you have another lawful basis your compliance team approves): send a confirmation email that restates the borrower's numbers, includes your NMLS ID, licensing details, Equal Housing Opportunity statement and an unsubscribe method. Commercial email is governed by the CAN-SPAM Act (2003), enforced by the FTC.
- If SMS consent is true: send a short text that names your company and includes opt-out language, and only within permitted hours. The Telephone Consumer Protection Act (1991) and the FCC's rules restrict telemarketing contact before 8 a.m. and after 9 p.m. at the recipient's location, and some states are stricter. A wait-until step or business-hours window in the workflow helps here.
- If SMS consent is false: skip the text entirely. Do not send "one quick text" to ask for consent.
See TCPA consent for background, and check consent wording and automation with your compliance team or counsel. This is general information, not legal advice.
Step 8: Assign to a loan officer
Add an assign-user action. A solo LO assigns to themselves; a team can use round-robin, or branch by calculator (a jumbo specialist for large loan amounts, a bilingual LO for leads that used the calculator in Spanish if your payload or page URL indicates the language). Route on business criteria only, never on anything that could proxy for a protected class.
Step 9: Notify the LO
Add an internal notification: a push notification to the assigned user in the mobile app, an internal SMS to the LO's own phone, or an email. Include the borrower's name, calculator, price, payment, DTI and a link to the contact. The point is a first call within minutes, made by a person who already has the numbers.
Step 10: Publish
Review each step, then publish. From now on, every lead posts to HighLevel as it arrives.
How do you test the webhook properly?
Submit real test leads through the live embed, one per scenario, and check each outcome in HighLevel. A test checklist:
- New borrower, all consents: contact created, custom fields filled, tag added, opportunity in "Pre-qual started", email and SMS sent, LO notified.
- Same borrower again with new numbers: contact updated (not duplicated), custom fields refreshed, opportunity not duplicated if your settings prevent it.
- Email only, no SMS consent: no text sent.
- A second calculator: correct tag and correct price field mapping.
- UTM link: visit the calculator page with
?utm_source=test&utm_medium=test&utm_campaign=test, submit, and confirm the fields arrive. - After hours: confirm the text waits for permitted hours.
Check the workflow's execution history in HighLevel for each run; it shows which branch fired and any failed action. Delete or tag your test contacts afterwards so they do not distort reporting.
What should you do when something goes wrong?
Start with the workflow's execution history, then compare the incoming payload with your mappings. Most problems are mapping or consent-branch issues, not delivery failures.
| Symptom | Likely cause | Fix |
|---|---|---|
| Workflow never fires | Workflow not published, wrong URL pasted, or webhook not enabled for that calculator | Publish; re-copy the trigger URL; check per-calculator webhook settings |
| Contact created with blank fields | Mapping done before a sample was received, or key names differ from the illustrative ones | Re-fetch a sample request and re-map from the real payload |
| Duplicate contacts | Create step not matching on email or phone; phone format differs | Use create-or-update; keep phone in a consistent format |
| Price field empty for some leads | That calculator returns a differently named result | Map per calculator in branches, or store the full results |
| SMS not sent | Consent branch false, outside allowed hours, or messaging not set up on the sub-account | Check the consent value in the payload; check phone/messaging setup |
| SMS sent without consent | Branch condition wrong or missing | Fix the condition immediately; review affected contacts with compliance |
| Duplicate opportunities | Create-opportunity step runs on every resubmission | Use update-if-exists or check for an existing open opportunity first |
| UTM fields empty | Visitor arrived without UTM tags, or link tags stripped by a redirect | Test with a tagged URL; check redirects keep the query string |
| LO not notified | Notification sent to the wrong user, or push notifications disabled | Check assignment step order and the user's notification settings |
| Leads missing in HighLevel | HighLevel or the network was unavailable at that moment | Leads are still in the PrequalFunnel CRM; add them manually and check the run history |
Do you still need the PrequalFunnel CRM if you use HighLevel?
Yes, as the system of record for the calculator data. Every lead is saved in the built-in CRM with its full calculation history, whether or not the webhook succeeds, and you still get the email alert. HighLevel then becomes the place where your follow-up runs. If you want both in one view, keep the most useful numbers in HighLevel custom fields as above and open PrequalFunnel when you need the detailed history.
Where can you go from here?
Once the intake workflow runs, add the parts that suit your business: a 14-day follow-up workflow triggered by the "Pre-qual started" stage, a separate workflow for refinance calculators, or a report on leads by utm_source. The HighLevel integration page covers embedding the calculators in HighLevel funnels and websites, and HighLevel users shows how the pieces fit together. If you would rather route through Zapier or Make instead, see the Zapier and Make integration.