HighLevel workflow → EMR inbound webhook · 10 min read
Send review requests from a HighLevel workflow directly to EMR
Written by Mannie Gill, Founder & Lead Developer at EmbedMyReviews. LinkedInPublished
HighLevel can send a completed-job event straight to an EMR inbound webhook using its Webhook workflow action. EMR receives the customer’s details and starts the review campaign. You do not need Zapier, Make or an EMR API key for this route. The example below follows a roofing job into a dedicated Job completed pipeline stage.
TL;DR
The short version
- HighLevel sends; EMR receives. Paste the URL from EMR’s Webhooks card into HighLevel’s Webhook action.
- Use a completed-work stage and check the customer’s email and contact preferences before the webhook action. A quote marked Won can be too early.
- This walkthrough asks once per HighLevel contact. Keep re-entry and multiple opportunities off initially; recurring workflows need a deliberate repeat-customer setup.
Worked client example
A roofing business using HighLevel
“Our office moves a roofing job to Job completed after the final inspection. Can that send the customer into our EMR review campaign?”
Their starting point: The business already manages jobs in a HighLevel pipeline. The customer is attached to the opportunity, and staff distinguish completed work from a quote accepted or a deposit paid.
Why this route: HighLevel can already send the event and customer details. Its standard Webhook action can post directly to EMR, so a separate bridge is unnecessary.
What happens automatically?
- 01
Office moves the job into Job completed
- 02
HighLevel checks eligibility and posts the customer details
- 03
EMR waits one hour, then runs the review campaign
Choose this when: A client already uses HighLevel workflows and a pipeline stage that reliably means the work has finished.
Choose another route when: A sales pipeline where Won only means the customer agreed to buy. This example also does not ask after every repeat opportunity.
Who does what?
The business owner
Confirms which pipeline and stage represent finished work, keeps the attached customer accurate and authorises the agency to configure that sub-account.
You, the agency
Adds the trigger and eligibility branch in HighLevel, creates EMR’s receiving URL, maps the sample and tests allowed and blocked contacts.
Set up EMR Automations while signed in as the agency owner and working in the intended client location. The business owner handles access to their own software. They do not need your agency login or a daily EMR task.
A message you can send the business owner
“You can keep recording finished jobs in HighLevel. We will connect the stage that means the work is complete to your review campaign. I will set up the connection, check the recipient rules and test delivery. This first version asks each contact once and uses your existing workflow tool without adding Zapier.”
Once it is connected
The office records genuine completion and maintains the attached customer. HighLevel sends the event; EMR handles the review campaign. The agency monitors both activity screens and investigates failed runs before replaying them.
Have these ready
- Access to the correct HighLevel sub-account’s Automation → Workflows and its standard Webhook action.
- A dedicated completed-work stage and a test opportunity attached to a contact with your own email.
- An EMR email campaign in the intended client location, and a configured domain so EMR can generate its receiving URL.
First client? Prepare the review campaign first
From your agency, open Business → Customers → Manage Customers → Open dashboard (or the Customer tab if shown). Select the business location you are setting up.
A campaign is the review message and any follow-ups you want EMR to send. A feedback form controls where the customer is invited to leave their review.
Use Grow → Review Tools → Feedback Forms to prepare the customer’s review destination, then Grow → Campaigns → Request Reviews to create the campaign. Choose its feedback form, message and working sender. Start with one email step for this walkthrough. Add your own test contact through Grow → Campaigns → Invites and verify the message and link.
Set the campaign’s sending window and duplicate-request window. Honour opt-outs. For Google review campaigns, ask eligible customers consistently, leave review gating off and offer no incentives.
Do I need to understand APIs or write code?
A webhook is an automatic message between systems. HighLevel sends it to the private URL supplied by EMR. Mapping tells EMR which value is the customer email. This is configuration in two screens, not writing an API integration.
A key or token is a private connection credential. A webhook is an automatic notice that something happened, such as a payment completing. Keep connection credentials private; the business owner does not need to share their everyday login password.
The walkthrough
Set it up, step by step
Choose a completed-work stage and paste one receiving URL. Work through this together the first time.
Together
Choose a stage that means the roof is finished
Agree which existing pipeline and stage represent completed work. In this example we call them Roofing jobs and Job completed; these are your business’s labels, not built-in HighLevel defaults.
If the business uses Won for a signed quote, do not use that as completion. Make the review trigger follow actual finished work. Check that another workflow is not already asking these customers for reviews.
Before moving on: The owner can point to the stage staff use after the finished job, not the sale.
Agency
Create the receiving URL in EMR
Open the client dashboard and correct location. Go to Connect → Integrations → Automations. On the Webhooks card, click Set Up Webhooks, or Manage Webhooks → New Webhook if one already exists.
Name it HighLevel completed roofing jobs and select the email campaign. Continue and copy the Endpoint URL. Leave the wizard waiting for its sample. Leave the optional signing setting at its default for this basic setup and keep the whole receiving URL private.
Use the Webhooks card for this workflow. The separate HighLevel card connects appointment calendars; this guide receives a notice sent by a HighLevel workflow.
Before moving on: You have a private receiving URL tied to the right client and campaign.
Agency
Create the completed-stage trigger
In the HighLevel sub-account, open Automation → Workflows and create a workflow from scratch. Add Pipeline Stage Changed as the trigger.
Add In Pipeline = the agreed roofing pipeline and Pipeline Stage = the agreed completed-work stage, then save the trigger. Both conditions should match the same client workflow.
In workflow Settings, switch Allow Re-entry and Allow multiple Opportunities off for this first-request example. A returning contact will not enter again. Do not rely on the default toggle positions.
Before moving on: Only a move into the selected completion stage qualifies, and the one-request-per-contact choice is intentional.
Agency
Check the recipient before sending anything to EMR
After the trigger, click + → If / Else → Build My Own. Name the branch Eligible for review email. Add the email condition and choose the option that means the value is not empty. Add the contact’s email Do Not Disturb and any recorded permission checks using AND: all checks must allow this follow-up. Leave the None branch ending without a webhook.
Keep the check immediately before the send action. A webhook sends data to another system; do not assume the rules that block a HighLevel Send Email action will also stop an external EMR campaign.
Use your own test contacts to prove that a missing email and an email opt-out each take the blocked path. Keep this workflow unpublished until both exclusions work.
Before moving on: You can identify the eligible path, and an opted-out customer cannot reach its webhook action.
Agency
Add HighLevel’s outgoing Webhook action
On the eligible path, add the Webhook action. Select POST and paste the EMR Endpoint URL into URL. Save the action. The standard action already includes the contact’s first_name and email, so leave Custom Data empty for this example.
Use Test Workflow with your own eligible contact. In EMR, wait for Submission received and inspect the sample. It should show your contact’s first name and email. A successful setup sample does not send a review request.
Open HighLevel’s Execution Logs if nothing arrives. Confirm you used the outgoing Webhook action: an Inbound Webhook trigger in HighLevel receives data in the opposite direction.
Before moving on: EMR shows the correct customer email from HighLevel.
Agency
Map the contact and set the delay
In EMR, map First Name to the sample’s first_name and Email to its email. Check the actual value: the contact’s address is the recipient, not a nested user or location email.
Leave Phone Number and Appointment or order date unmapped for this email-only example. Choose A set time after the moment → 1 hour later → Activate Webhook.
Publish the HighLevel workflow. Keep first-request timing in EMR and check its campaign sending hours. You do not need a separate one-hour Wait action in HighLevel as well.
Before moving on: EMR is active, HighLevel is published and the customer fields match.
The fields to map
- EMR First Name ← first_name
- Choose the contact’s first name from the captured sample.
- EMR Email ← email
- Choose the contact’s actual email. Do not map user.email or a location address.
Together
Test an actual stage move after activation
Create a fresh safe test contact with another inbox you control and an opportunity outside the completed stage. Move it into the selected completed stage. This proves the trigger; manually testing the workflow alone does not.
Follow the run from HighLevel Execution Logs into EMR’s Webhooks → Recent requests, then Grow → Campaigns → Invites. Open the delivered message after the delay and allowed sending window.
Run the exclusion tests below. Record the two workflow names and who checks failures. Staff keep moving finished jobs to the agreed stage; they do not paste contact details into EMR.
Before moving on: A real stage change sends the right request, while unfinished or opted-out test contacts do not.
One finished roof, one direct connection
The office completes the final inspection and moves the opportunity into Job completed. The workflow checks the attached contact and sends the standard customer data to EMR. EMR starts its one-hour timer on receipt. The review campaign sends during its allowed hours. HighLevel records completion and sends the notice; EMR owns the review message, link and delivery.
How to know it is working
Follow the event all the way to a message you receive. A green connection or a successful test response is only part of that journey.
Where to look: Use HighLevel Execution Logs, then EMR Automations → Manage Webhooks → this connection → Recent requests. Finally check Grow → Campaigns → Invites and the test inbox.
When to expect the message: The one-hour delay starts when EMR receives the event. It replaces the campaign’s first-step delay. Sending hours still apply, and later follow-ups keep their campaign timing.
Testing again? Use another email address you control for a second successful-send test. Reusing the first address can correctly trigger your duplicate-request rule. Keep that protection on for real customers.
Test 1: Move a fresh eligible test opportunity into the completed stage
Expected result: The workflow runs, EMR receives the right email, and your inbox receives the correct review request.
Test 2: Leave another test opportunity at quote accepted or in progress
Expected result: It does not enter this completion workflow and no request is created.
Test 3: Move an email-opted-out test contact into the completed stage
Expected result: The If/Else check takes the blocked path. No webhook reaches EMR for that contact.
Test 4: Move the original test contact out and back into the stage
Expected result: With re-entry and multiple opportunities off, the workflow does not create another request. Use a fresh contact for subsequent successful-send tests.
If something does not work
HighLevel executed but EMR did not send
Check the response and EMR Recent requests first. A paused endpoint can respond successfully while declining the invite. Then check mapping, campaign sender, duplicate rules and sending hours.
The customer email is missing from the sample
The opportunity must be attached to the correct contact, and that contact needs an email. Do not map a contact ID or the staff member’s email. Fix the source record and capture a fresh sample.
The manual test works but moving the job does nothing
Check the published state, selected pipeline and stage, attached contact and workflow enrollment settings. A contact that has already run through this one-time workflow will not re-enter.
Another system can send a webhook, but it only contains a customer ID
An ID is not an email. Use a bridge or developer to retrieve that exact customer before sending to EMR. The receiving URL does not look the ID up in the source system for you.
At handover, record the connection name, source account, client location, campaign, timing, test result and person responsible for failures. Test again after changing the workflow. Keep passwords, API keys and private webhook URLs out of the handover notes.
Cost, reliability and the simpler alternatives
Cost: No separate Zapier or Make subscription is required. Use the standard Webhook action rather than adding Custom Webhook or other premium actions for this example. Check the client’s existing HighLevel workflow access and account charges, plus EMR and message delivery; avoiding a bridge does not make the source account free.
Reliability: HighLevel must publish and run the workflow with the correct contact. EMR receives the data you send; it does not independently check the job stage or HighLevel contact preferences. Map from the captured sample, and use both systems’ activity screens when a run fails. Later source changes do not automatically withdraw a queued EMR invitation.
When to use something else: For HighLevel calendar appointments, use the native appointment guide when its timing and attendance rules fit. For a different CRM, a direct inbound webhook is suitable only if its completed event includes the customer contact data and its source workflow can enforce eligibility. Use a bridge for missing lookups, field changes or filters; use a developer for a custom API workflow.
Common questions
Need help with a setting?
Another workflow to connect?
HighLevel
How to automate review requests after HighLevel appointments
Read the walkthrough →
Jotform + Make
How to send review requests from a completed-job form with Make
Read the walkthrough →
Google Forms + Sheets
Send review requests from a staff form with Google Forms and Sheets
Read the walkthrough →