# GoHighLevel Integration

> Set up the GoHighLevel and AnyTrack integration to automatically track conversions from forms, orders, invoices, and pipeline opportunities, then send that data server-side to Google Ads, Facebook Ads, and TikTok Ads.

## What is the GoHighLevel Integration?

The AnyTrack integration for GoHighLevel automatically captures conversion data from forms, orders, invoices, and pipeline opportunities, then forwards it server-side to your ad platforms ([Google Ads](/docs/google-ads), [Facebook Ads](/docs/facebook-ads), [TikTok Ads](/docs/tiktok-ads)) for campaign optimization and attribution.

<Prerequisites
  title="Before you begin"
  items={[
    { label: "You have an active AnyTrack account", done: true },
    { label: "You have admin access to your GoHighLevel account", done: true },
    { label: "You can edit your website or funnel settings", done: true },
    { label: "You have admin access to your ad platform accounts", done: true },
    { label: "Your leads are captured on GoHighLevel funnel pages or native forms — if you use external forms or a Zapier-type import, see the note below", done: true },
  ]}
/>

> ❗ What the native GoHighLevel integration means for AnyTrack
>
> The native integration works because contacts are created on GoHighLevel's **own funnel pages or native forms**, where the AnyTrack Tracking Tag runs and captures the click ID at session time. AnyTrack then matches the server-side conversion back to that visit.
>
> If you instead capture leads on an **external form** (Typeform, Jotform) or push contacts in through **Zapier or Make**, that automatic link is broken — the contact is created with no tracked session and lands under [Unknown](/docs/conversions-showing-as-unknown). In that case, follow the [Form Tracking](/docs/form-tracking) guidelines: capture the AnyTrack click ID as a hidden field on the form and pass it into the contact's `_atid` custom field.

## Setup Guide

### Step 1: Create a New Property

1. Navigate to your AnyTrack dashboard
2. Create a new property
3. Assign a descriptive name to the property
4. Enter the main URL for your website or funnel
5. Copy the AnyTrack Tracking Tag provided

### Step 2: Install the AnyTrack Tracking Tag

1. Log into your GoHighLevel account
2. Navigate to the funnel you want to connect
3. Open the funnel settings
4. Locate the "Head Tracking Code" section
5. Paste the AnyTrack Tracking Tag in the head tracking code field
6. Save your settings

> 📘 **Alternative Installation**
>
> You can also install the Tracking Tag using [Google Tag Manager](/docs/google-tag-manager).

### Step 3: Install the AnyTrack App in GoHighLevel

1. Navigate to the AnyTrack Integration Catalog
2. Search for "GoHighLevel" (or "HighLevel")
3. Click "Install Integration"
4. Select the property
5. Click "Next" to proceed
6. Authenticate with your GoHighLevel account
7. Select the GoHighLevel sub-account to connect
8. Save the integration settings

### Step 4: Verify Your Setup

1. Visit your funnel from a new browser window
2. Navigate through the funnel as a potential customer would
3. Submit a form or complete a checkout
4. Open the AnyTrack dashboard and check the Event Log for recorded events
5. Verify that the conversion data and attribution source appear correctly

> 📘 **Pro Tip**
>
> Install the [AnyTrack Pixel Helper Chrome extension](https://chromewebstore.google.com/detail/anytrack-pixel-helper/ojmhkmdpagjeopleoeihbhgejcfoijjn) to verify the AnyTrack Tracking Tag is working correctly and to see real-time client-side events.

## Disconnect Other Integrations

Once the AnyTrack integration is active, you must disconnect any direct tracking integrations between GoHighLevel and your ad platforms to prevent duplicate conversions.

1. **Disable Facebook pixel tracking** on your GoHighLevel forms and workflows
2. **Remove Google Ads conversion tags** from GoHighLevel form submission automations
3. **Disable any direct TikTok or other ad platform tracking** configured in GoHighLevel

AnyTrack handles all conversion data forwarding and deduplication. Keeping other integrations active alongside AnyTrack will result in duplicate conversions being sent to your ad platforms, which inflates your metrics and confuses the ad algorithms.

> ❗ **Important: Legacy Automations**
>
> If you previously set up AnyTrack with manual webhooks and automations in GoHighLevel, disable those automations. The app handles all webhook management automatically.

## Conversion Events

AnyTrack tracks the following events from GoHighLevel. Events are organized into three categories: web tracking events (captured client-side by the Tracking Tag), standard server-side events (captured via the AnyTrack app), and advanced events that can be enabled in the integration settings.

### Web Tracking Events

These events are automatically captured by the AnyTrack Tracking Tag installed on your funnel. They cannot be remapped.

| GoHighLevel Event   | AnyTrack Event     | Description                                                                                         |
| :------------------ | :----------------- | :-------------------------------------------------------------------------------------------------- |
| `Form submit`       | `FormSubmit`       | When a visitor submits a form                                                                       |
| `Initiate Checkout` | `InitiateCheckout` | When a checkout page is loaded. For 2-step forms, triggered when the second step button is clicked. |

### Server-Side Events

These events are sent from GoHighLevel to AnyTrack via the app integration.

| GoHighLevel Event      | AnyTrack Event     | Default Status | Description                                     |
| :--------------------- | :----------------- | :------------- | :---------------------------------------------- |
| `Contact created`      | `Lead`             | ✅ Enabled      | When a new contact is added to GoHighLevel      |
| `Appointment created`  | `Schedule`         | ✅ Enabled      | When a customer books an appointment or meeting |
| `Order created`        | `Purchase`         | ✅ Enabled      | When an order is completed (excludes upsells)   |
| `Order upsell created` | `Upsell`           | ✅ Enabled      | When a customer purchases an upsell             |
| `Invoice created`      | `InitiateCheckout` | ✅ Enabled      | When an invoice is created                      |
| `Invoice fully paid`   | `Purchase`         | ✅ Enabled      | When an invoice is fully paid                   |
| `Opportunity created`  | `DealNew`          | ✅ Enabled      | When a new opportunity is created in a pipeline |
| `Opportunity won`      | `DealWon`          | ✅ Enabled      | When an opportunity status is changed to won    |

### Advanced Events

These events are available in the integration settings but are unmapped by default. Enable them if your workflow requires tracking these actions.

| GoHighLevel Event          | Default Status | Description                                                                                                      |
| :------------------------- | :------------- | :--------------------------------------------------------------------------------------------------------------- |
| `Invoice sent`             | ⚙️ Unmapped    | When an invoice is sent to the client                                                                            |
| `Invoice partially paid`   | ⚙️ Unmapped    | When an invoice is partially paid. The last payment triggers "Invoice fully paid" instead, with the full amount. |
| `Opportunity status: open` | ⚙️ Unmapped    | When an opportunity is opened or reopened                                                                        |
| `Pipeline stage changes`   | ⚙️ Unmapped    | Individual stage transitions within your pipelines (see Pipeline Tracking below)                                 |

### How Event Mapping Works

Event mapping in AnyTrack follows a two-step chain:

**Step 1: GoHighLevel → AnyTrack** — Each GoHighLevel event maps to an AnyTrack event (standard or custom). Once mapped, the event appears in your AnyTrack dashboard, reports, and becomes available in the ad platform event mapping section.

**Step 2: AnyTrack → Ad Platforms** . Each AnyTrack event can then be mapped to an ad platform event (standard or custom).

AnyTrack standard events like `Purchase`, `Lead`, and `Schedule` are **automatically mapped** to the corresponding standard events in your ad platforms. Custom events like `DealNew` and `DealWon` appear in the ad platform mapping section but require **manual mapping** before they flow to ad platforms.

## Pipeline and Opportunity Tracking

AnyTrack integrates with GoHighLevel's pipeline and opportunity system to track deal progression as conversion events. This is especially useful for service businesses, agencies, and sales teams where conversions happen through a sales pipeline rather than a checkout page.

### How It Works

When you connect the AnyTrack app, it automatically fetches your GoHighLevel pipelines and their stages. For each pipeline stage, AnyTrack creates a mapping entry in your integration settings so you can select which stages trigger conversion events.

For example, if you have a "Sales Pipeline" with stages "New Lead → Qualified → Proposal Sent → Closed Won", AnyTrack creates a mapping entry for each stage. You can then map "Closed Won" to an AnyTrack event like `Purchase` or a custom event, which then flows to your ad platforms.

### Opportunity Data

When an opportunity event fires, AnyTrack captures and forwards:

* **Monetary value** . the deal amount, passed as the conversion value to ad platforms
* **Contact data** . email, phone, name, and location for enhanced matching
* **Opportunity details** . opportunity name and ID for attribution tracking

This data enables your ad platforms to optimize campaigns based on actual deal values rather than just lead counts.

> 📘 **Custom Events Require Manual Ad Platform Mapping**
>
> Pipeline stage events and opportunity events default to custom AnyTrack events. After enabling them, go to your ad platform integration settings in AnyTrack to map them to the appropriate ad platform events (standard or custom).

## Advanced Configuration

### Tracking Embedded Forms on External Websites

If you embed GoHighLevel forms on WordPress, Elementor, Unbounce, or other website builders, you need to add a custom field so AnyTrack can attribute form submissions back to the original traffic source.

1. In GoHighLevel, go to CRM > Contacts and add a new custom field named `_atid` with scope set to "contact"
2. Edit each embedded form and add the `_atid` custom field as a hidden field
3. Make sure the AnyTrack Tracking Tag is installed in the `head` section of the external website

### Leads Showing as "Unknown" in the Campaign Report

If your GoHighLevel leads land under **Unknown** (or **Direct**) in the [Campaign Report](/docs/campaign-report) even though the contacts have UTM values in GoHighLevel, the cause is almost always **how the contact is created**.

AnyTrack attributes a lead by matching it back to the browser session where the ad click happened — that session is what stores the click ID (`_atid`) and UTM data as first-party data. If a contact is created **server-to-server** (for example, pushed in by Zapier, Make, or another app), it never had that tracked session, so AnyTrack has nothing to match it to and correctly reports it as Unknown.

The diagram below shows both paths from a single lead: when the click ID travels with the form submission it attributes correctly, and when it is dropped it lands under Unknown.

<HTMLBlock html={"\n<style>\n:root {\n  --bg: #0f1117; --surface: #1a1d27; --surface2: #242836; --border: #2e3346;\n  --text: #e4e6f0; --text-dim: #8b90a5; --accent: #4a7dff; --accent-glow: rgba(74,125,255,0.15);\n  --green: #34d399; --green-bg: rgba(52,211,153,0.1); --orange: #f59e0b; --orange-bg: rgba(245,158,11,0.1);\n  --red: #ef4444; --red-bg: rgba(239,68,68,0.1); --cyan: #22d3ee; --cyan-bg: rgba(34,211,238,0.1);\n  --src-meta: #1877f2; --src-web: #22d3ee;\n}\n.atfork * { margin: 0; padding: 0; box-sizing: border-box; }\n.atfork {\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n  background: var(--bg); color: var(--text); line-height: 1.6;\n  border-radius: 14px; overflow: hidden;\n}\n.atfork .doc-frame { padding: 28px; max-width: 1100px; margin: 0 auto; }\n.atfork .doc-title { font-size: 22px; font-weight: 700; margin-bottom: 8px; }\n.atfork .doc-subtitle { font-size: 14px; color: var(--text-dim); margin-bottom: 24px; }\n.atfork .doc-subtitle code, .atfork .node-desc code, .atfork .alert code, .atfork .lane-title code { font-family: 'JetBrains Mono','SF Mono',Consolas,monospace; font-size: 0.9em; color: var(--accent); }\n.atfork .badge { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px; border-radius: 100px; font-size: 11px; font-weight: 600; }\n.atfork .badge-cyan { background: var(--cyan-bg); color: var(--cyan); border: 1px solid rgba(34,211,238,0.3); }\n.atfork .source-pill { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 500; background: var(--surface); border: 1px solid var(--border); }\n.atfork .source-dot { width: 6px; height: 6px; border-radius: 50%; }\n.atfork .source-dot-meta { background: var(--src-meta); }\n.atfork .source-dot-web { background: var(--src-web); }\n.atfork .alert { padding: 12px 16px; border-radius: 8px; font-size: 13px; display: flex; align-items: flex-start; gap: 10px; margin-top: 8px; }\n.atfork .alert-info { background: var(--accent-glow); border: 1px solid rgba(74,125,255,0.3); color: var(--accent); }\n.atfork .alert-icon { font-size: 16px; flex-shrink: 0; margin-top: 1px; }\n.atfork .data-chip { font-size: 11px; font-weight: 500; padding: 2px 8px; border-radius: 4px; background: var(--surface); border: 1px solid var(--border); color: var(--text-dim); font-family: 'JetBrains Mono','SF Mono',Consolas,monospace; white-space: nowrap; }\n.atfork .data-chip-on { color: var(--green); border-color: rgba(52,211,153,0.3); background: var(--green-bg); }\n.atfork .data-chip-off { color: var(--red); border-color: rgba(239,68,68,0.3); background: var(--red-bg); text-decoration: line-through; }\n.atfork .node { background: var(--surface2); border: 1px solid var(--border); border-radius: 10px; padding: 13px 16px; }\n.atfork .node-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }\n.atfork .node-num { width: 24px; height: 24px; flex-shrink: 0; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; background: var(--surface); border: 1px solid var(--border); color: var(--text-dim); }\n.atfork .node-title { font-size: 14px; font-weight: 600; }\n.atfork .node-desc { font-size: 12.5px; color: var(--text-dim); margin-top: 6px; }\n.atfork .node-data { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 6px; }\n.atfork .node-web { border-color: var(--cyan); box-shadow: 0 0 16px var(--cyan-bg); }\n.atfork .node-web .node-num { color: var(--cyan); border-color: var(--cyan); }\n.atfork .connector { display: flex; justify-content: center; padding: 6px 0; }\n.atfork .connector::after { content: '↓'; color: var(--text-dim); font-size: 20px; line-height: 1; }\n.atfork .split-label { text-align: center; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: var(--text-dim); margin: 4px 0 14px; }\n.atfork .lanes { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }\n.atfork .lane { border-radius: 14px; padding: 16px; border: 1px solid var(--border); }\n.atfork .lane-good { background: rgba(52,211,153,0.04); border-color: rgba(52,211,153,0.35); }\n.atfork .lane-bad { background: rgba(239,68,68,0.04); border-color: rgba(239,68,68,0.35); }\n.atfork .lane-title { font-size: 13px; font-weight: 700; display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }\n.atfork .lane-good .lane-title { color: var(--green); }\n.atfork .lane-bad .lane-title { color: var(--red); }\n.atfork .lane .node { background: var(--surface); }\n.atfork .lane-good .node { border-color: rgba(52,211,153,0.25); }\n.atfork .lane-bad .node { border-color: rgba(239,68,68,0.25); }\n.atfork .lane-good .connector::after { color: var(--green); }\n.atfork .lane-bad .connector::after { color: var(--red); }\n.atfork .outcome { margin-top: 4px; border-radius: 10px; padding: 13px 16px; border: 1px solid var(--border); }\n.atfork .outcome-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; font-weight: 700; font-size: 14px; }\n.atfork .outcome-good { background: var(--green-bg); border-color: rgba(52,211,153,0.4); }\n.atfork .outcome-good .outcome-head { color: var(--green); }\n.atfork .outcome-bad { background: var(--red-bg); border-color: rgba(239,68,68,0.4); }\n.atfork .outcome-bad .outcome-head { color: var(--red); }\n.atfork .outcome-desc { font-size: 12.5px; color: var(--text); margin-top: 6px; }\n.atfork .merge-label { text-align: center; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; color: var(--accent); margin: 16px 0 10px; display: flex; align-items: center; gap: 10px; justify-content: center; }\n.atfork .merge-label::before, .atfork .merge-label::after { content: ''; height: 1px; flex: 1; max-width: 120px; background: var(--border); }\n.atfork .legend { display: flex; flex-wrap: wrap; gap: 16px; font-size: 12px; color: var(--text-dim); margin-top: 22px; }\n.atfork .legend-item { display: flex; align-items: center; gap: 6px; }\n.atfork .legend-swatch { width: 12px; height: 12px; border-radius: 3px; }\n@media (max-width: 720px) { .atfork .doc-frame { padding: 18px 14px; } .atfork .lanes { grid-template-columns: 1fr; } }\n</style>\n\n<div class=\"atfork\">\n<div class=\"doc-frame\">\n  <h2 class=\"doc-title\">The Click ID Fork: One Lead, Two Outcomes</h2>\n  <p class=\"doc-subtitle\">Every GoHighLevel lead that comes through an external form (Typeform, Jotform) follows the same start. What decides whether it lands as an <strong>attributed conversion</strong> or as <strong>Unknown</strong> is one thing: does the AnyTrack click ID (<code>_atid</code>) travel with it?</p>\n\n  <div class=\"node node-web\">\n    <div class=\"node-head\"><span class=\"node-num\">1</span><span class=\"node-title\">Visitor lands from Facebook</span><span class=\"source-pill\"><span class=\"source-dot source-dot-meta\"></span>Facebook Ad</span><span class=\"badge badge-cyan\">Tracking Tag fires</span></div>\n    <div class=\"node-desc\">AnyTrack starts a session, captures the click ID and UTM parameters, and stores them as first-party data on the visitor.</div>\n    <div class=\"node-data\"><span class=\"data-chip data-chip-on\">click ID captured</span><span class=\"data-chip data-chip-on\">utm parameters</span><span class=\"data-chip data-chip-on\">first-party session</span></div>\n  </div>\n\n  <div class=\"connector\"></div>\n\n  <div class=\"node node-web\">\n    <div class=\"node-head\"><span class=\"node-num\">2</span><span class=\"node-title\">Visitor fills an external form</span><span class=\"source-pill\"><span class=\"source-dot source-dot-web\"></span>Typeform / Jotform</span></div>\n    <div class=\"node-desc\">This is the decision point. The form carries the email and answers — but the click ID only rides along if you add it as a hidden field.</div>\n  </div>\n\n  <div class=\"split-label\">⑂ The path splits here — is the click ID attached?</div>\n\n  <div class=\"lanes\">\n    <div class=\"lane lane-good\">\n      <div class=\"lane-title\">✓ Click ID attached (<code>_atid</code>)</div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">3</span><span class=\"node-title\">Form submits with the click ID</span></div><div class=\"node-desc\">A hidden <code>_atid</code> field carries the AnyTrack click ID out with the submission.</div><div class=\"node-data\"><span class=\"data-chip data-chip-on\">email + data</span><span class=\"data-chip data-chip-on\">_atid</span></div></div>\n      <div class=\"connector\"></div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">4</span><span class=\"node-title\">Zapier → GoHighLevel</span></div><div class=\"node-desc\">Zapier maps the hidden field into the GoHighLevel contact's <code>_atid</code> custom field (created when you installed the AnyTrack app).</div><div class=\"node-data\"><span class=\"data-chip data-chip-on\">_atid → GHL contact</span></div></div>\n      <div class=\"connector\"></div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">5</span><span class=\"node-title\">GHL \"Contact created\" → AnyTrack</span></div><div class=\"node-desc\">The <code>Lead</code> event arrives carrying the click ID.</div><div class=\"node-data\"><span class=\"data-chip data-chip-on\">_atid present</span></div></div>\n    </div>\n    <div class=\"lane lane-bad\">\n      <div class=\"lane-title\">✕ Click ID dropped</div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">3</span><span class=\"node-title\">Form submits without the click ID</span></div><div class=\"node-desc\">No hidden field, so the session identifiers stay behind. Only the email and answers leave.</div><div class=\"node-data\"><span class=\"data-chip data-chip-on\">email + data</span><span class=\"data-chip data-chip-off\">_atid</span></div></div>\n      <div class=\"connector\"></div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">4</span><span class=\"node-title\">Zapier → GoHighLevel</span></div><div class=\"node-desc\">Server-to-server: no browser, no session. The contact is created with no AnyTrack identifier.</div><div class=\"node-data\"><span class=\"data-chip\">sessionSource: \"Third Party\"</span><span class=\"data-chip\">medium: \"zapier\"</span></div></div>\n      <div class=\"connector\"></div>\n      <div class=\"node\"><div class=\"node-head\"><span class=\"node-num\">5</span><span class=\"node-title\">GHL \"Contact created\" → AnyTrack</span></div><div class=\"node-desc\">The <code>Lead</code> event arrives, but with no click ID to match on.</div><div class=\"node-data\"><span class=\"data-chip data-chip-off\">_atid</span></div></div>\n    </div>\n  </div>\n\n  <div class=\"merge-label\">Both paths return to AnyTrack</div>\n\n  <div class=\"lanes\">\n    <div class=\"outcome outcome-good\"><div class=\"outcome-head\">🟢 Attributed conversion</div><div class=\"outcome-desc\">AnyTrack matches the click ID to the original Facebook click, credits the right campaign, and forwards the conversion to your ad platform via the Conversion API.</div></div>\n    <div class=\"outcome outcome-bad\"><div class=\"outcome-head\">🔴 Unknown</div><div class=\"outcome-desc\">The lead is real and still recorded, but with nothing to match it falls under Unknown — no campaign credit, even though the contact has UTM values in GoHighLevel.</div></div>\n  </div>\n\n  <div class=\"alert alert-info\"><span class=\"alert-icon\">💡</span><div><strong>The whole difference is one field.</strong> Attribution rides on the click ID, not the UTM values stored on the GoHighLevel contact. Capture <code>_atid</code> at the visit and carry it through the form and Zapier, and the same lead that would have been Unknown becomes fully attributed.</div></div>\n\n  <div class=\"legend\">\n    <span class=\"legend-item\"><span class=\"legend-swatch\" style=\"background:var(--cyan);\"></span>Shared tracked start</span>\n    <span class=\"legend-item\"><span class=\"legend-swatch\" style=\"background:var(--green);\"></span>Click ID carried → attributed</span>\n    <span class=\"legend-item\"><span class=\"legend-swatch\" style=\"background:var(--red);\"></span>Click ID dropped → Unknown</span>\n  </div>\n</div>\n</div>\n"} />

You can confirm this in the contact's source. A contact created by a third-party tool shows an attribution source like `sessionSource: "Third Party"`, `medium: "zapier"` and an empty `_atid`.

To fix it, make sure the click ID travels with the lead:

1. **Best:** capture the lead directly on a page that has the AnyTrack Tracking Tag (a native GHL funnel form). The click ID is set at session time and stored on the contact automatically.
2. **If an automation must create the contact:** add the `_atid` hidden field to your form (see Tracking Embedded Forms above) and map it through your automation into the GoHighLevel contact's `_atid` custom field, so the original click ID is preserved.

> ⚠️ **Warning**
>
> Reapplying the UTM template or running Verify Ads Settings will not fix Unknown leads created server-to-server. Those settings only affect ad-click sessions, not contacts injected by another app.

### Tracking Calendar Links

If you share GoHighLevel calendar links via email or outside your website:

<Image align="center" alt="Add the Tracking Tag in the custom code section of the calendar settings." caption="Add the Tracking Tag in the custom code section of the calendar settings." src={readmeAsset1} />

1. Navigate to your calendar settings > Customization
2. Paste the AnyTrack Tracking Tag in the Custom Code field
3. Save the settings

> ❗ **Important: Team Calendars**
>
> Add the Tracking Tag to each team member's calendar settings individually.

<FaqAccordion
  title="FAQ and Troubleshooting"
  icon="fa-duotone fa-circle-question"
  items={[
    {
      question: "Do I need to set up webhooks manually?",
      answer: "No. The AnyTrack app automatically configures all necessary webhooks when you install it from the GoHighLevel marketplace. No manual webhook or automation setup is required."
    },
    {
      question: "Can I import past conversions into AnyTrack?",
      answer: "No. AnyTrack can only track conversions that occur after a visitor session on your website. Historical data cannot be imported."
    },
    {
      question: "How do I change which AnyTrack event a GoHighLevel action triggers?",
      answer: "Go to your integration settings in AnyTrack and update the Event Mapping. For example, you can change Contact Created from Lead to CompleteRegistration, or map a pipeline stage to a custom event."
    },
    {
      question: "Why are my pipeline stage events not showing in Facebook Ads?",
      answer: "Pipeline stage events default to custom AnyTrack events, which require manual mapping to ad platform events. Go to your Facebook Ads integration settings in AnyTrack and map the custom event to a Facebook standard or custom event."
    },
    {
      question: "What if I have existing Facebook or Google tracking on my GoHighLevel forms?",
      answer: "You must disable any direct pixel or tag-based tracking on your GoHighLevel forms to prevent duplicate conversions. AnyTrack handles all conversion forwarding and deduplication."
    },
    {
      question: "Integration Event Log shows errors after installation",
      answer: "Check that the AnyTrack Tracking Tag is in the head section of each funnel, verify the app is properly connected, and confirm the correct GoHighLevel sub-account is selected. Some initial errors are normal if conversions were triggered before the integration was installed."
    },
    {
      question: "Conversions are not appearing in AnyTrack",
      answer: "Verify the AnyTrack app is installed on the correct GoHighLevel sub-account and that the Tracking Tag is present on the funnel. Server-side events from GoHighLevel typically appear within seconds of the action occurring."
    },
    {
      question: "Why do my GoHighLevel leads show as Unknown even though they have UTM data in GoHighLevel?",
      answer: "Because the contact was created server-to-server (for example, by Zapier or Make) instead of through a tracked visitor session. AnyTrack attributes a lead by matching it to the browser session where the click happened; a contact pushed in by another app never had that session, so it falls under Unknown. Capture the lead on a page with the AnyTrack Tracking Tag, or pass the original click ID into the GoHighLevel contact's <code>_atid</code> custom field. See <a href='/docs/conversions-showing-as-unknown'>Why Conversions Show as Unknown or Direct</a>."
    }
  ]}
/>

<Cards columns={2}>
  <Card title="Install Tracking Tag" href="/docs/install-anytrack-tag" icon="fa-code" iconColor="blue-500">
    Step-by-step guide to installing the AnyTrack Tracking Tag on your website.
  </Card>

  <Card title="Facebook Ads Integration" href="/docs/facebook-ads" icon="fa-bullhorn" iconColor="blue-500">
    Connect your Facebook Ads account to receive GoHighLevel conversion data.
  </Card>

  <Card title="Google Ads Integration" href="/docs/google-ads" icon="fa-bullhorn" iconColor="blue-500">
    Send GoHighLevel conversions to Google Ads via the Conversion API.
  </Card>

  <Card title="Event Mapping" href="/docs/event-mapping" icon="fa-sitemap" iconColor="blue-500">
    Map GoHighLevel events to ad platform events for standard and custom conversions.
  </Card>
</Cards>
