Reference · Tools

HighLevel

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.

Node type
Action
Parameters
54
Outputs
Output, Error
Credentials
HighLevel OAuth2

HighLevel

Manage contacts, opportunities, tasks, and calendars in HighLevel CRM

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.

Category: Marketing
Tool Name: high_level
Version: 1

Appearance: Icon: lucide-Megaphone | Color: #FF6D39

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)credentialNoConnect your HighLevel account via OAuth2.
Max ConcurrencynumberNo10Maximum number of items to process concurrently (1–100).

Calendar: Book Appointment

ParameterTypeRequiredDefaultDescription
Calendar IDstringYesThe calendar to book in.
Location IDstringYesThe HighLevel location ID.
Contact IDstringYesThe contact the appointment is for.
Start Time (startTime)stringYesAppointment start time. Example: 2021-06-23T03:30:00+05:30.
Additional Fields (additionalFields)collectionNo{}Optional appointment properties.
— Address (address)stringNoWhere 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)stringNoThe user the appointment is assigned to.
— End Time (endTime)stringNoExample: 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)stringNoTitle of the appointment.

Calendar: Get Free Slots

ParameterTypeRequiredDefaultDescription
Calendar IDstringYesThe calendar to check.
Start Date (startDate)numberYesStart date as epoch milliseconds. Example: 1548898600000.
End Date (endDate)numberYesEnd 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)stringNoTimezone for returned slots. Example: America/Chihuahua.
— User ID (userId)stringNoFilter by a single user.
— User IDs (userIds)collectionNo{}Filter by several users.
— — User IDs (userIds)stringNoComma-separated list of user IDs to filter the slots.

Contact: Create or Update

ParameterTypeRequiredDefaultDescription
EmailstringNoEmail or Phone are required to create/upsert contact.
PhonestringNoPhone 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)stringNoStreet address.
— City (city)stringNoCity.
— Custom Fields (customFields)fixedCollectionNo{}Custom field values to set. Add as many as you need.
— — Field ID (fieldId)stringYesThe custom field ID. Find in HighLevel: Settings > Custom Fields.
— — Field Value (fieldValue)stringNoThe 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)stringNoFirst name.
— Last Name (lastName)stringNoLast name.
— Name (name)stringNoFull name, will be overwritten by First Name and Last Name if set.
— Note (notes)stringNoA note to add to the contact after creation.
— Postal Code (postalCode)stringNoPostal or ZIP code.
— Source (source)stringNoWhere the contact came from, e.g. Public API.
— State (state)stringNoState or region.
— Tags (tags)stringNoComma separated list of tags; an array of strings can be set in an expression.
— Timezone (timezone)stringNoTimezone for the contact. Example: America/New_York.
— Website (website)stringNoWebsite URL.

Contact: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact to delete.

Contact: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe 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)stringNoSearch 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 IDstringYesThe contact to update.
Update FieldscollectionNo{}Fields to change. Only the fields you add are sent.
— Address (address1)stringNoStreet address.
— City (city)stringNoCity.
— Custom Fields (customFields)fixedCollectionNo{}Custom field values to set. Add as many as you need.
— — Field ID (fieldId)stringYesThe custom field ID.
— — Field Value (fieldValue)stringNoThe value to store in that field.
— Do Not Disturb (dnd)booleanNofalseTrue means no outbound messages.
— Email (email)stringNoNew email address.
— First Name (firstName)stringNoFirst name.
— Last Name (lastName)stringNoLast name.
— Name (name)stringNoFull name, overwritten by First/Last Name if set.
— Phone (phone)stringNoNew phone number, with country code.
— Postal Code (postalCode)stringNoPostal or ZIP code.
— State (state)stringNoState or region.
— Tags (tags)stringNoComma separated list of tags.
— Timezone (timezone)stringNoTimezone for the contact.
— Website (website)stringNoWebsite URL.

Opportunity: Create

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

Opportunity: Delete

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe opportunity to delete.

Opportunity: Get

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe 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)stringNoUser ID to filter by.
— Campaign ID (campaignId)stringNoFilter by campaign.
— End Date (endDate)stringNoFilter opportunities created before this date (ISO string).
— Pipeline ID (pipelineId)stringNoFilter by pipeline.
— Query (query)stringNoSearch Name, Phone, Email, Tags, and Company Name.
— Stage ID (stageId)stringNoFilter by pipeline stage.
— Start Date (startDate)stringNoFilter opportunities created after this date (ISO string).
— Status (status)optionsNoopenFilter by deal status.
Options: open, won, lost, abandoned

Opportunity: Update

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe 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)stringNoUser ID to assign.
— Monetary Value (monetaryValue)numberNoMonetary value of the deal.
— Name (name)stringNoNew name for the opportunity.
— Pipeline ID (pipelineId)stringNoPipeline ID.
— Stage ID (stageId)stringNoPipeline stage ID. Select pipeline first.
— Status (status)optionsNoopenNew deal status.
Options: open, won, lost, abandoned

Task: Create

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact ID this task belongs to.
TitlestringYesTitle of the task.
Due Date (dueDate)stringYesISO 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)stringNoUser ID to assign the task to.
— Body (body)stringNoTask description/body text.

Task: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact the task belongs to.
Task IDstringYesThe task to delete.

Task: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact ID this task belongs to.
Task IDstringYesThe task to retrieve.

Task: Get Many

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe 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 IDstringYesThe contact the task belongs to.
Task IDstringYesThe task to update.
Update FieldscollectionNo{}Fields to change. Only the fields you add are sent.
— Assigned To (assignedTo)stringNoUser ID to assign the task to.
— Body (body)stringNoTask description/body text.
— Completed (completed)booleanNofalseWhether the task is done.
— Due Date (dueDate)stringNoISO 8601 datetime.
— Title (title)stringNoNew 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.

Usage Examples

  • 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

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

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

  • 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 the HighLevel node

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 updated . Spotted something wrong? Tell us.