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

# HighLevel

> Connect HighLevel (GoHighLevel) with Framer Forms using the Forms Plugin to automatically add form submissions to your HighLevel sub-account.

# Connect HighLevel with Framer Forms

Capture leads from your Framer forms and automatically add them as contacts in HighLevel using the Forms Plugin.

***

## Step 1 - Create a Private Integration Token

HighLevel uses a Private Integration Token (PIT) for server-to-server access. This is what lets the Forms Plugin send submissions to your sub-account.

1. Login to your HighLevel account
2. Navigate to **Settings** → **Other Settings** → **Private Integrations**
3. Click **Create new Integration**
4. Give it a name, for example `Framer Forms`
5. Select these scopes:
   * **View Contacts** (`contacts.readonly`)
   * **Edit Contacts** (`contacts.write`)
6. Create the integration and copy the token

### Required Scopes

| Scope | Why it is needed |
| - | - |
| Edit Contacts | Creates and updates the contact on every submission |
| View Contacts | Used when **Update Existing** is off, to detect an existing contact |

<Warning>
  Only select the scopes above. A token with broader access than it needs is a larger risk if it is ever exposed.
</Warning>

<Tip>
  Private Integration Tokens do not refresh automatically. Rotate yours roughly every 90 days, and revoke it immediately if you think it has leaked.
</Tip>

***

## Step 2 - Find Your Location ID

A HighLevel Location is a sub-account. Every contact has to belong to one, so the integration needs its ID.

1. Open the sub-account you want form submissions to land in
2. Navigate to **Settings** → **Business Profile**
3. Copy the **Location ID**

***

## Step 3 - Insert HighLevel Component Into Your Form

Select your form in the Framer canvas and insert the HighLevel component.

The component connects your form to HighLevel and automatically detects the form fields in your form layout.

***

## Step 4 - Configure HighLevel API Settings

After inserting the HighLevel component, configure the API settings in the component properties panel.

1. Select the **HighLevel Integration** component in your form
2. Open the properties panel on the right side
3. Paste your **Private Integration Token**
4. Enter your **Location ID**

### Required Fields

* **Token** - The Private Integration Token created in Step 1.
* **Location ID** - The sub-account contacts are created in.

### Optional Fields

* **Source** - Recorded on each contact so you can tell HighLevel leads apart by origin. Defaults to `Framer Form`.
* **Update Existing** - When on, a submission from a known email updates that contact. When off, a duplicate submission is rejected instead.

Tags are configured under **Field Mappings** — see Step 6.

***

## Step 5 - Configure Field Mapping

Map your form fields to HighLevel contact fields.

The component automatically detects your form field names. You connect each one to the matching HighLevel field, and one mapping must target **Email**.

### Example Mapping

| Form Field | HighLevel |
| - | - |
| email | Email |
| name | First Name |
| phone | Phone |
| company | Company Name |

### Custom Fields

To send a value to one of your own HighLevel fields, set the mapping to **Custom Field** and enter the field key.

1. In HighLevel, go to **Settings** → **Custom Fields**
2. Open the field and copy its **Key**
3. Paste it into **Custom Key** on the mapping

***

## Step 6 - Add Tags (Optional)

Two tag controls sit under **Field Mappings**. Both are optional, and they combine.

### Static Tags

Tags applied to **every** submission. Click **+** to add one per row.

```
warm-lead
website
```

### Dynamic Tag Fields

Tags taken from what the visitor actually chose. Each row is a form field name plus a format.

| Format | Use for |
| - | - |
| **Comma** | One hidden input holding joined values — ButtonChoice, Select, Checkbox, ImageButtonChoice |
| **Array** | Several inputs sharing one name — native HTML checkbox groups |

The field's **value** becomes the tag, so set option values to the tag name itself rather than the display label.

Static and dynamic tags are merged and de-duplicated (case-insensitively) before sending:

| Source | Tags |
| - | - |
| Static | `warm-lead`, `Newsletter` |
| Dynamic (`interests`) | `coffee-beans`, `tea` |
| **Sent to HighLevel** | `warm-lead`, `Newsletter`, `coffee-beans`, `tea` |

<Warning>
  HighLevel replaces **all** of a contact's tags whenever tags are sent — it does not append. If you manage tags inside HighLevel, leave both tag controls empty: with nothing configured no tags are sent at all, and your existing tags are left untouched.
</Warning>

***

## Step 7 - Result

When a user submits the form, their details are added as a contact in your HighLevel sub-account. Verify new contacts under **Contacts** in your HighLevel dashboard.

***

## Troubleshooting

| Message | What it means |
| - | - |
| HighLevel rejected the Private Integration Token | The token is wrong, or it has been revoked. Create a new one. |
| Missing the Contacts scopes | The token exists but was created without **View Contacts** and **Edit Contacts**. Recreate it with both. |
| Could not find that Location ID | The Location ID belongs to a different account, or was pasted with extra characters. |
| Contact already exists | **Update Existing** is off and this email is already a contact. Turn it on to update instead of rejecting. |
| HighLevel rate limit reached. Try again shortly. | HighLevel is throttling requests. The submission that hit the limit is not retried. |

## Next Steps

* [Integrations Overview](/docs/integrations/overview)
* [Contact Support](https://go.formsplugin.com/contact) if you need help
