Search all guides

Reference · Tools

HighLevel integration

Manage contacts, opportunities, tasks, and calendar appointments in HighLevel (GoHighLevel) CRM

Action Marketing v1

The HighLevel node manages contacts, opportunities, tasks and calendar appointments in GoHighLevel. Contact creation is an upsert, so it is safe to run repeatedly over the same list. A typical build is syncing inbound leads into HighLevel and opening an opportunity for each one without creating duplicates.

Works as
Action
Tool name
high_level
Parameters
54
Outputs
Output, Error
Credentials
HighLevel OAuth2
Official docs
HighLevel docs marketplace.gohighlevel.com

What you can build with HighLevel

  • Create or update a contact in HighLevel by email.
  • Create an opportunity in a pipeline.
  • List all contacts matching a search query.
  • Book an appointment in a HighLevel calendar.
  • Update a task assigned to a contact.

Overview

HighLevel (GoHighLevel) is an all-in-one CRM and marketing automation platform. This tool provides CRUD operations for contacts, opportunities (deals/pipelines), tasks, and calendar appointments via the HighLevel API v2. It uses OAuth2 authentication and automatically refreshes tokens on 401 errors. Contacts support upsert (create or update based on email/phone match). Opportunities track deals through pipeline stages. Tasks are associated with contacts. Calendar operations support booking appointments and checking free slots.

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires HighLevel OAuth2 credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Calendarcalendar
Contactcontact
Opportunityopportunity
Tasktask

Operations

Each resource has its own Operation list, and three of them reuse the same operation values (create, delete, get, getAll, update). Pick the resource first, then the operation.

ResourceOperationValueDescription
CalendarBook AppointmentbookAppointmentBook an appointment in a calendar
CalendarGet Free SlotsgetFreeSlotsList bookable slots in a date range
ContactCreate or UpdatecreateCreate a contact, or update the existing one that matches the email or phone
ContactDeletedeleteDelete a contact
ContactGetgetGet a contact
ContactGet ManygetAllSearch and list contacts
ContactUpdateupdateUpdate a contact by ID
OpportunityCreatecreateCreate an opportunity in a pipeline
OpportunityDeletedeleteDelete an opportunity
OpportunityGetgetGet an opportunity
OpportunityGet ManygetAllSearch and list opportunities
OpportunityUpdateupdateUpdate an opportunity
TaskCreatecreateCreate a task on a contact
TaskDeletedeleteDelete a task
TaskGetgetGet a task
TaskGet ManygetAllList a contact’s tasks
TaskUpdateupdateUpdate a task

Parameters

Top-level fields accept expressions, so IDs and text can be driven from the incoming item. Values you put inside the Additional Fields, Update Fields, Filters and Options collections are sent exactly as typed — expressions there are not evaluated.

All Operations

ParameterTypeRequiredDefaultDescription
HighLevel Account (credentialId)credentialNo—Connect your HighLevel account via OAuth2.
Max ConcurrencynumberNo10Maximum number of items to process concurrently (1–100).

Calendar: Book Appointment

ParameterTypeRequiredDefaultDescription
Calendar IDstringYes—The calendar to book in.
Location IDstringYes—The HighLevel location ID.
Contact IDstringYes—The contact the appointment is for.
Start Time (startTime)stringYes—Appointment start time. Example: 2021-06-23T03:30:00+05:30.
Additional Fields (additionalFields)collectionNo{}Optional appointment properties.
— Address (address)stringNo—Where the appointment takes place.
— Appointment Status (appointmentStatus)optionsNonewThe status the appointment is created with.
Options: cancelled, confirmed, invalid, new, noshow, showed
— Assigned User ID (assignedUserId)stringNo—The user the appointment is assigned to.
— End Time (endTime)stringNo—Example: 2021-06-23T04:30:00+05:30.
— Ignore Date Range (ignoreDateRange)booleanNofalseBook outside the calendar’s configured availability.
— Notify (toNotify)booleanNotrueWhether HighLevel sends its notifications for this booking.
— Title (title)stringNo—Title of the appointment.

Calendar: Get Free Slots

ParameterTypeRequiredDefaultDescription
Calendar IDstringYes—The calendar to check.
Start Date (startDate)numberYes—Start date as epoch milliseconds. Example: 1548898600000.
End Date (endDate)numberYes—End date as epoch milliseconds. Example: 1601490599999.
Additional Fields (additionalFields)collectionNo{}Optional slot filters.
— Apply Look Busy (enableLookBusy)booleanNofalseApply Look Busy to the slots.
— Timezone (timezone)stringNo—Timezone for returned slots. Example: America/Chihuahua.
— User ID (userId)stringNo—Filter by a single user.
— User IDs (userIds)collectionNo{}Filter by several users.
— — User IDs (userIds)stringNo—Comma-separated list of user IDs to filter the slots.

Contact: Create or Update

ParameterTypeRequiredDefaultDescription
EmailstringNo—Email or Phone are required to create/upsert contact.
PhonestringNo—Phone or Email are required to create contact. Must start with a valid country code with + sign.
Additional Fields (additionalFields)collectionNo{}Optional contact properties.
— Address (address1)stringNo—Street address.
— City (city)stringNo—City.
— Custom Fields (customFields)fixedCollectionNo{}Custom field values to set. Add as many as you need.
— — Field ID (fieldId)stringYes—The custom field ID. Find in HighLevel: Settings > Custom Fields.
— — Field Value (fieldValue)stringNo—The value to store in that field.
— Do Not Disturb (dnd)booleanNofalseWhether automated/manual outbound messages are permitted. True means NO outbound messages.
— First Name (firstName)stringNo—First name.
— Last Name (lastName)stringNo—Last name.
— Name (name)stringNo—Full name, will be overwritten by First Name and Last Name if set.
— Note (notes)stringNo—A note to add to the contact after creation.
— Postal Code (postalCode)stringNo—Postal or ZIP code.
— Source (source)stringNo—Where the contact came from, e.g. Public API.
— State (state)stringNo—State or region.
— Tags (tags)stringNo—Comma separated list of tags; an array of strings can be set in an expression.
— Timezone (timezone)stringNo—Timezone for the contact. Example: America/New_York.
— Website (website)stringNo—Website URL.

Contact: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact to delete.

Contact: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact to retrieve.

Contact: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
FilterscollectionNo{}Narrow the search.
— Query (query)stringNo—Search on Name, Phone, Email, Tags, and Company Name.
OptionscollectionNo{}Result ordering.
— Order (order)optionsNodescSort direction.
Options: asc, desc
— Sort By (sortBy)optionsNodate_addedField to sort on.
Options: date_added, date_updated

Contact: Update

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact to update.
Update FieldscollectionNo{}Fields to change. Only the fields you add are sent.
— Address (address1)stringNo—Street address.
— City (city)stringNo—City.
— Custom Fields (customFields)fixedCollectionNo{}Custom field values to set. Add as many as you need.
— — Field ID (fieldId)stringYes—The custom field ID.
— — Field Value (fieldValue)stringNo—The value to store in that field.
— Do Not Disturb (dnd)booleanNofalseTrue means no outbound messages.
— Email (email)stringNo—New email address.
— First Name (firstName)stringNo—First name.
— Last Name (lastName)stringNo—Last name.
— Name (name)stringNo—Full name, overwritten by First/Last Name if set.
— Phone (phone)stringNo—New phone number, with country code.
— Postal Code (postalCode)stringNo—Postal or ZIP code.
— State (state)stringNo—State or region.
— Tags (tags)stringNo—Comma separated list of tags.
— Timezone (timezone)stringNo—Timezone for the contact.
— Website (website)stringNo—Website URL.

Opportunity: Create

ParameterTypeRequiredDefaultDescription
Pipeline IDstringYes—The pipeline ID. Find in HighLevel: Settings > Pipelines.
Contact IDstringYes—The contact ID to associate with this opportunity. One opportunity per contact.
NamestringYes—Name of the opportunity.
StatusoptionsYesopenThe stage the deal is in.
Options: open, won, lost, abandoned
Additional Fields (additionalFields)collectionNo{}Optional opportunity properties.
— Assigned To (assignedTo)stringNo—User ID to assign. Find via HighLevel Users list.
— Company Name (companyName)stringNo—Company associated with the deal.
— Monetary Value (monetaryValue)numberNo—Monetary value of lead opportunity.
— Stage ID (stageId)stringNo—Pipeline stage ID. Depends on selected pipeline.
— Tags (tags)stringNo—Comma separated list of tags.

Opportunity: Delete

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYes—The opportunity to delete.

Opportunity: Get

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYes—The opportunity to retrieve.

Opportunity: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo20Max number of results to return (1–100). (shown when Return All is false)
FilterscollectionNo{}Narrow the search.
— Assigned To (assignedTo)stringNo—User ID to filter by.
— Campaign ID (campaignId)stringNo—Filter by campaign.
— End Date (endDate)stringNo—Filter opportunities created before this date (ISO string).
— Pipeline ID (pipelineId)stringNo—Filter by pipeline.
— Query (query)stringNo—Search Name, Phone, Email, Tags, and Company Name.
— Stage ID (stageId)stringNo—Filter by pipeline stage.
— Start Date (startDate)stringNo—Filter opportunities created after this date (ISO string).
— Status (status)optionsNoopenFilter by deal status.
Options: open, won, lost, abandoned

Opportunity: Update

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYes—The opportunity to update. You cannot update an opportunity’s pipeline ID.
Update FieldscollectionNo{}Fields to change. Only the fields you add are sent.
— Assigned To (assignedTo)stringNo—User ID to assign.
— Monetary Value (monetaryValue)numberNo—Monetary value of the deal.
— Name (name)stringNo—New name for the opportunity.
— Pipeline ID (pipelineId)stringNo—Pipeline ID.
— Stage ID (stageId)stringNo—Pipeline stage ID. Select pipeline first.
— Status (status)optionsNoopenNew deal status.
Options: open, won, lost, abandoned

Task: Create

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact ID this task belongs to.
TitlestringYes—Title of the task.
Due Date (dueDate)stringYes—ISO 8601 datetime string, e.g. 2024-01-15T10:00:00Z.
CompletedbooleanYesfalseWhether the task starts out completed.
Additional Fields (additionalFields)collectionNo{}Optional task properties.
— Assigned To (assignedTo)stringNo—User ID to assign the task to.
— Body (body)stringNo—Task description/body text.

Task: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact the task belongs to.
Task IDstringYes—The task to delete.

Task: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact ID this task belongs to.
Task IDstringYes—The task to retrieve.

Task: Get Many

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact ID to list tasks for.
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo20Max number of results to return (1–100). (shown when Return All is false)

Task: Update

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact the task belongs to.
Task IDstringYes—The task to update.
Update FieldscollectionNo{}Fields to change. Only the fields you add are sent.
— Assigned To (assignedTo)stringNo—User ID to assign the task to.
— Body (body)stringNo—Task description/body text.
— Completed (completed)booleanNofalseWhether the task is done.
— Due Date (dueDate)stringNo—ISO 8601 datetime.
— Title (title)stringNo—New title for the task.

Output Data

The HighLevel response is merged onto the input item’s JSON at the top level — the fields the item already carried survive, and a response key with the same name overwrites the item’s value, so downstream nodes read the record directly ({{ $json.id }}). Binary data on the input item is forwarded unchanged.

The number of output items follows the shape of the reply: a list reply fans out to one output item per record, and anything else produces exactly one output item.

OperationOutput
Contact Get Many, Opportunity Get Many, Task Get ManyOne output item per contact, opportunity or task. A search that matches nothing produces no output items at all, so that branch of the workflow stops there. Task records also carry the contactId they were listed for.
Contact Create or Update, Contact Get, Contact Update, Opportunity Create, Opportunity Get, Opportunity Update, Task Create, Task Get, Task Update, Calendar Book AppointmentOne output item carrying the record HighLevel returned.
Calendar Get Free SlotsOne output item carrying the free-slots response for the date range.
Contact Delete, Opportunity Delete, Task DeleteOne output item carrying success: true — these calls confirm the change instead of returning a record.

Example Configuration

Upsert a contact from a form submission — an existing contact with the same email is updated rather than duplicated:

{
  "type": "high_level",
  "parameters": {
    "resource": "contact",
    "operation": "create",
    "email": "{{ $json.email }}",
    "phone": "{{ $json.phone }}",
    "additionalFields": {
      "firstName": "Jane",
      "lastName": "Doe",
      "source": "Public API",
      "tags": "webinar,2026",
      "timezone": "America/New_York"
    }
  }
}

Search contacts, newest first:

{
  "type": "high_level",
  "parameters": {
    "resource": "contact",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "filters": {
      "query": "acme"
    },
    "options": {
      "order": "desc",
      "sortBy": "date_added"
    }
  }
}

Open a deal in a pipeline for the contact an upstream node just created:

{
  "type": "high_level",
  "parameters": {
    "resource": "opportunity",
    "operation": "create",
    "pipelineId": "kFrZL2Wf6VOyRQlM5Xtg",
    "contactId": "{{ $json.id }}",
    "name": "Website enquiry",
    "status": "open",
    "additionalFields": {
      "monetaryValue": 2500,
      "stageId": "e93ba61a-4d4f-4f13-8a1a-11f4bbd0a2fd",
      "companyName": "Acme Ltd"
    }
  }
}

Mark a deal as won:

{
  "type": "high_level",
  "parameters": {
    "resource": "opportunity",
    "operation": "update",
    "opportunityId": "{{ $json.id }}",
    "updateFields": {
      "status": "won",
      "monetaryValue": 3200
    }
  }
}

Add a follow-up task to a contact:

{
  "type": "high_level",
  "parameters": {
    "resource": "task",
    "operation": "create",
    "contactId": "{{ $json.contactId }}",
    "title": "Follow up on quote",
    "dueDate": "2026-01-15T10:00:00Z",
    "completed": false,
    "additionalFields": {
      "body": "Call back after the trial ends"
    }
  }
}

Close a task:

{
  "type": "high_level",
  "parameters": {
    "resource": "task",
    "operation": "update",
    "contactId": "{{ $json.contactId }}",
    "taskId": "{{ $json.taskId }}",
    "updateFields": {
      "completed": true
    }
  }
}

Check what a calendar has free in a date range:

{
  "type": "high_level",
  "parameters": {
    "resource": "calendar",
    "operation": "getFreeSlots",
    "calendarId": "BqTwX8QFwXzpegMve9EQ",
    "startDate": 1548898600000,
    "endDate": 1601490599999,
    "additionalFields": {
      "timezone": "America/Chihuahua"
    }
  }
}

Book an appointment:

{
  "type": "high_level",
  "parameters": {
    "resource": "calendar",
    "operation": "bookAppointment",
    "calendarId": "BqTwX8QFwXzpegMve9EQ",
    "locationId": "ve9EPM428h8vShlRW1KT",
    "contactId": "{{ $json.contactId }}",
    "startTime": "2026-06-23T03:30:00+05:30",
    "additionalFields": {
      "title": "Discovery call",
      "appointmentStatus": "confirmed",
      "toNotify": true
    }
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

This tool manages contacts, opportunities, tasks, and calendar appointments in HighLevel. It is ideal for creating, updating, deleting, and retrieving contacts, opportunities, and tasks, and for booking appointments and finding free slots on calendars. It produces updated CRM records, new appointments, and lists of existing data.

  • Contact Create is really an upsert. A contact whose email or phone already exists is updated instead of duplicated, so it is safe to run repeatedly over the same list. One of Email or Phone must be filled in.
  • Adding a Note costs a second call. The Note field on contact creation is posted to the contact after it is created, so it only appears when the contact itself was created successfully.
  • Opportunities are one per contact. Each opportunity is associated with a single contact, so plan the pipeline around one open deal per contact.
  • Pipeline stays put. Opportunity Update cannot move a deal to a different pipeline, only to a different stage within it.
  • Tasks always need their contact. Every task operation takes the Contact ID as well as the Task ID — a task ID on its own is not enough.
  • Free-slot dates are epoch milliseconds, not ISO strings; appointment times are ISO strings with an offset. The two calendar operations do not use the same format.
  • Tokens refresh themselves. An expired access token is refreshed automatically when a call comes back unauthorized, so long-running schedules keep working.

Frequently asked questions

Will running Contact Create twice duplicate people?

No — it is really an upsert. A contact whose email or phone already exists is updated rather than duplicated, which makes it safe for repeated syncs. One of Email or Phone must be provided.

Why did my note not appear on a failed contact create?

The Note field is posted to the contact as a second call after creation, so it only lands when the contact itself was created successfully. A failed create leaves no note behind.

Can an opportunity span several contacts?

No. Each opportunity is associated with a single contact, so model multi-contact deals by choosing a primary contact or by creating separate opportunities.

Which credential does it need?

A HighLevel OAuth2 credential, which covers contacts, opportunities, tasks and calendar operations from the one connection.

Build with HighLevel

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need HighLevel OAuth2 credentials first.

Open BusyBot

Last reviewed . Spotted something wrong? Tell us.