> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thoughtly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GoHighLevel integration

> Connect GoHighLevel to Thoughtly to trigger calls from sub-accounts, sync contacts and tags, and push call outcomes and recordings back to HighLevel pipelines.

export const IntegrationPage = ({actions, triggers, name, domain, logoOverride}) => {
  const logoOverrides = {
    acuity: 'https://cdn.thoughtly.com/integrations/acuity_scheduling.svg',
    acuityscheduling: 'https://cdn.thoughtly.com/integrations/acuity_scheduling.svg',
    'cal.com': 'https://cdn.thoughtly.com/integrations/cal.com.svg',
    calcom: 'https://cdn.thoughtly.com/integrations/cal.com.svg',
    cal: 'https://cdn.thoughtly.com/integrations/cal.com.svg',
    'fence flow': 'https://cdn.thought.ly/integrations/fence-flow.png',
    fenceflow: 'https://cdn.thought.ly/integrations/fence-flow.png',
    gohighlevel: 'https://cdn.thought.ly/integrations/highlevel.png',
    highlevel: 'https://cdn.thought.ly/integrations/highlevel.png',
    hubspot: 'https://cdn.thought.ly/integrations/hubspot.png',
    keap: 'https://cdn.thoughtly.com/integrations/keap.svg',
    mindbody: 'https://cdn.thoughtly.com/integrations/mindbody.svg',
    pipedrive: 'https://cdn.thoughtly.com/integrations/pipedrive.svg',
    salesforce: 'https://cdn.thoughtly.com/integrations/salesforce.svg',
    slack: 'https://cdn.thoughtly.com/integrations/slack.svg',
    smartsheet: 'https://cdn.thoughtly.com/integrations/smartsheet.svg',
    trello: 'https://cdn.thoughtly.com/integrations/trello.svg',
    zendesk: 'https://cdn.thoughtly.com/integrations/zendesk.svg',
    zoho: 'https://cdn.thoughtly.com/integrations/zoho.svg',
    zoom: 'https://cdn.thoughtly.com/integrations/zoom.svg',
    gmail: 'https://cdn.thoughtly.com/integrations/google-mail.png'
  };
  const normalizeKey = value => (value || '').toString().trim().toLowerCase();
  const normalizeHost = value => {
    if (!value) {
      return '';
    }
    const cleaned = value.replace(/^https?:\/\//, '').replace(/^[^@]+@/, '');
    return cleaned.split(/[/?#]/)[0];
  };
  const getLogoSrc = ({name: logoName, domain: logoDomain, logoOverride}) => {
    if (logoOverride) {
      return logoOverride;
    }
    const nameKey = normalizeKey(logoName);
    const host = normalizeHost(logoDomain);
    const hostKey = normalizeKey(host);
    const hostBase = hostKey.split('.').slice(-2, -1)[0] || '';
    return logoOverrides[nameKey] || logoOverrides[nameKey.replace(/\s+/g, '')] || logoOverrides[hostKey] || logoOverrides[hostBase] || (logoDomain ? `https://logo.clearbit.com/${logoDomain}` : undefined);
  };
  return <div>
		<div className="flex flex-row items-center h-10 pb-4">
			<img src={getLogoSrc({
    name,
    domain,
    logoOverride
  })} className="w-5 rounded-md mr-2 h-5" />
			<div className="text-xl">
				Integrate with <a href={`https://${domain}`} target={"_blank"}><span className="font-bold">{name}</span></a>
			</div>
		</div>

		By integrating Thoughtly with {name}, you can automate tasks and workflows before, during, and after calls. To integrate with {name}, head to the <a href="https://app.thoughtly.com/integration" target="_blank">Integrations</a> page and follow the instructions.

		{triggers && <div>
				<hr />
				<h3>Triggers</h3>

				Triggers are available via <a href="/automations/triggers">Automations</a>. You can use them to start your Automations, such as for initiating a call or sending an SMS.

				{triggers.map(trigger => <div className="text-sm">
						<h4 className="text-gray-600 text-md">{trigger.name}</h4>

						{trigger.description}
					</div>)}
			</div>}

		{actions && actions.length > 0 && <div>
				<hr />
				<h3>Actions</h3>

				Actions are available both via <a href="/agents/nodes">Mid-Call Actions</a> and <a href="/automations/actions">Automations</a>. You can give your Voice Agents access to these Actions so they can perform tasks in {name} during a call, or use them in Automations to automate tasks before and after calls.

				{actions.map((action, i) => <div key={i} className="text-sm">
						<h4 className={`text-gray-600 ${action.deprecated ? 'line-through text-red-500' : ''}`}>
							<span className="text-gray-600">{action.name}</span>
							{action.deprecated && <span className="ml-3 text-xs">(Deprecated)</span>}
						</h4>
						<p className={action.deprecated ? 'text-gray-400' : ''}>
							{action.description}
						</p>
					</div>)}
			</div>}
	</div>;
};

<Frame caption="Integrating GoHighLevel">
  <iframe width="560" height="315" src="https://www.loom.com/embed/2815f3b621c04c5c8fde8e5947cccb42?sid=4edd3346-5d5d-4c4c-b046-8bf4e6d91b3c" title="Loom video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style={{ borderRadius: 10 }} />
</Frame>

***

<IntegrationPage
  name="GoHighLevel"
  domain="gohighlevel.com"
  triggers={[
	{
		"name": "On Contact Created",
		"description": "Triggered when a contact is created."
	}
]}
  actions={[
    {
        "name": "Create Contact",
        "description": "This action creates a new contact in GoHighLevel."
    },
    {
        "name": "Search for Contact",
        "description": "This action searches for a contact in GoHighLevel."
    },
    {
        "name": "Create Note",
        "description": "This action creates a new note on a contact in GoHighLevel."
    },
    {
        "name": "Get Available Times",
        "description": "This action retrieves the available times for a specific service in GoHighLevel."
    },
    {
        "name": "Schedule Appointment",
        "description": "This action schedules an appointment in GoHighLevel."
    },
    {
        "name": "Retrieve Contact",
        "description": "This action retrieves a contact from GoHighLevel."
    },
    {
        "name": "Update Contact",
        "description": "This action updates a contact in GoHighLevel."
    },
    {
        "name": "Delete Contact",
        "description": "This action deletes a contact in GoHighLevel."
    }
]}
/>

## Working with Multiple Locations

GoHighLevel supports multiple sub-accounts (locations) within a single agency account. When connecting GoHighLevel to Thoughtly:

1. **Each location appears as a separate account** in your integrations list, labeled with the location name
2. **Select the correct location** when configuring actions in Automations or Agent Builder
3. **Use the search feature** to quickly find specific locations if you have many connected

<Note>
  When you connect a GoHighLevel location, Thoughtly automatically retrieves and displays the location name to help you identify the correct account.
</Note>

## Troubleshooting

### Appointment Booking Issues

If you're experiencing issues with appointment search or booking:

* **Verify the correct location is selected** in the Account tab
* **Check that the location has active calendars** configured in GoHighLevel
* **Ensure the service/calendar permissions** are properly set in GoHighLevel
* **Test the connection** by retrieving available times before attempting to book

### Wrong Location Data

If you're seeing data from the wrong location:

* **Confirm you've selected the correct location** in the Account tab when setting up the action
* **Reconnect the location** if the issue persists
* **Check that the location hasn't been renamed** in GoHighLevel (you may need to reconnect)

## Reconnect stale connections

If a GoHighLevel action fails because the connected account is stale or expired, reconnect the integration from the Integrations page and rerun the workflow.

Common signs of a stale connection include authentication errors, missing account data, or actions that previously worked but now fail without configuration changes.
