# GoHighLevel Lead Sync

Aktify can create leads directly from your GoHighLevel (HighLevel) contacts. Once your GoHighLevel account is connected, adding the **`aktify` tag** to a contact sends that contact to Aktify — no exports, no middleware, and no webhook URLs to configure on your side.

This page covers getting leads **into** Aktify. Aktify's GoHighLevel **appointment scheduling** integration is separate — see the [GoHighLevel appointment scheduling guide](../appointment-scheduling/gohighlevel). Both share the same account connection, so connecting once enables both.

## How it works

1. You connect your GoHighLevel account to Aktify **once**, at the company level, using GoHighLevel's OAuth authorization flow — there's no API key to copy.
2. Aktify links your GoHighLevel location's `aktify` tag to one of your campaigns.
3. Whenever the tag is added to a contact — by a GoHighLevel workflow, a bulk action, or by hand — GoHighLevel notifies Aktify immediately.
4. Aktify creates the lead in the linked campaign and begins outreach according to that campaign's configuration.

Every notification from GoHighLevel is cryptographically signed, and Aktify verifies the signature before processing it.

## Before you begin

You'll need:

- A **GoHighLevel account** with an active location (sub-account).
- The **Aktify campaign** that should receive the leads.
- Aktify Portal access with an **Admin** or **Editor** role.

## Step 1 — Connect your GoHighLevel account

This is done once per company. If you already connected GoHighLevel for appointment scheduling, skip to step 2.

1. In the Aktify Portal, go to **Settings → Integrations → GoHighLevel**.
2. In the **Connection** section, click **Connect**.
3. You'll be redirected to GoHighLevel to sign in, choose your location, and authorize Aktify's access. Approve the request.
4. You'll be returned to the Portal, where the connection now shows as connected.

## Step 2 — Set the lead sync tag on the campaign

1. Open the campaign and go to **Settings → Integrations**.
2. Under **Lead Ingestion**, select **GoHighLevel**.
3. Enter the tag `aktify` and save.

:::caution The tag must be exactly `aktify`
`aktify` (lowercase) is currently the only tag value Aktify recognizes on incoming contacts. A campaign configured with any other tag will not receive leads.
:::

A tag can feed only one campaign — because the tag is always `aktify`, each GoHighLevel location sends leads to exactly **one** Aktify campaign.

## Step 3 — Tag contacts in GoHighLevel

Any mechanism that adds the `aktify` tag to a contact triggers the sync:

- A workflow **Add Contact Tag** action — the usual choice, so your existing GoHighLevel automation decides when a contact goes to Aktify.
- A **bulk action** on a contact list.
- Adding the tag **manually** on the contact record.

The contact is sent the moment the tag is applied, with whatever field values it has at that time — make sure the phone and address fields are filled in **before** the tag is added.

## What a contact needs to qualify

Each contact must have:

- A valid **US phone number** in the **Phone** field.
- At least one valid geo signal:
  - A two-letter state code or full state name in **State** (e.g. `CA` or `California`), **or**
  - A valid US zip code in **Postal Code**.

Contacts missing either are skipped. To retry a skipped contact, fix its fields, remove the `aktify` tag, and add it again.

:::caution State and Postal Code must agree
If **both** fields are set, they must refer to the same state, or the lead is rejected. And if **State** contains a value Aktify can't recognize (an abbreviation like `Tex`, for example), the Postal Code is **not** used as a fallback — the contact is skipped. When in doubt, use a two-letter state code.
:::

## What Aktify receives

| GoHighLevel contact field | Aktify lead field |
| :--- | :--- |
| Phone | Phone number (required) |
| State / Postal Code | Region and zip code (at least one required) |
| First Name | First name |
| Last Name | Last name |
| Email | Email |
| Contact ID | External lead ID |

The GoHighLevel contact ID is stored on the Aktify lead as its **external lead ID**, so leads can be matched back to their GoHighLevel contacts — it also appears in Aktify's [webhook events](../webhooks/overview).

## Duplicates

If the contact's phone number already exists in the campaign, Aktify rejects the new lead as a duplicate and keeps working the existing one. Re-tagging a contact that already synced is therefore harmless.

## Troubleshooting

GoHighLevel doesn't display the sync outcome — Aktify acknowledges every notification, and skipped or rejected contacts are only visible to Aktify. If tagged contacts aren't showing up as leads, check:

1. **The connection is still active** — in the Portal under **Settings → Integrations → GoHighLevel**. Reconnect if it shows disconnected.
2. **The campaign's lead-ingestion tag is set, and is exactly `aktify`** (lowercase).
3. **The contact's Phone field holds a valid US number.**
4. **State / Postal Code are present and consistent** — see [What a contact needs to qualify](#what-a-contact-needs-to-qualify).
5. **The phone number isn't already in the campaign** — duplicates are rejected silently.

If everything checks out, contact Aktify support with the contact's phone number and the time the tag was added — Aktify can trace exactly what happened to the notification.
