# Why Conversions Show as Unknown or Direct

> Conversions land under Unknown or Direct when AnyTrack can't match them to a tracked click. Learn the common causes and how to fix attribution.

## What "Unknown" and "Direct" Mean

In the [Campaign Report](/docs/campaign-report), a conversion shows under **Unknown** or **Direct** when AnyTrack received the conversion but could not match it back to a tracked ad click. The conversion is real — AnyTrack just has no click and no UTM data to attribute it to a specific campaign.

AnyTrack uses [click-based attribution](/docs/anytrack-attribution-explained): when a visitor lands on a page that has the Tracking Tag, the tag captures the click ID and UTM parameters and stores them as first-party data. When a conversion fires later, AnyTrack matches it to that stored session. No tracked session means no attribution.

<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"} />

## This Applies to Any CRM + External Form Setup

This is not specific to GoHighLevel and Zapier. The same break happens in any flow where a contact is created **outside** a tracked browser session — for example HubSpot, GoHighLevel, or any CRM fed by Typeform, Jotform, an external form builder, or a no-code automation like Zapier or Make.

The native [HubSpot](/docs/hubspot) and [GoHighLevel](/docs/highlevel) integrations work because contact creation happens on the platform's **own forms or native integration**, where the AnyTrack Tracking Tag is present and the click ID is captured at session time. The moment you move form capture to an external form, or push the contact in through Zapier, that built-in link is gone — you have to recreate it yourself.

> ❗ **Important**
>
> If you use an external form or a Zapier-type automation, follow the [Form Tracking](/docs/form-tracking) guidelines: capture the AnyTrack [click ID](/docs/anytrack-click-id) as a hidden field on the form submission, and pass that same click ID through to the contact record in your CRM. Without it, the lead cannot be attributed.

## Common Causes

| Cause | What happens |
| :--- | :--- |
| Contact created server-to-server | A lead pushed in by Zapier, Make, or another app never had a tracked session, so there is no click ID to match. |
| Ad URLs have no UTM template | If the ad click that started the session carried no UTM (or only `fbclid`), AnyTrack has no campaign to credit. |
| Tracking Tag missing on the landing page | If the page where the click landed has no Tracking Tag, the session is never captured. |
| External form or CRM without the click ID | A HubSpot, GoHighLevel, or other CRM contact created from an external form (Typeform, Jotform) or a Zapier-type automation needs the click ID passed as a hidden field to carry attribution. |
| Intermediate source overwrote UTM | A redirect through PayPal, an email tool, or a checkout can replace the UTM. Use [Ignored Sources](/docs/ignored-sources) to protect attribution. |

## How to Fix It

1. **Confirm how the conversion is created.** If it comes from an automation (Zapier, Make, a webhook), the click ID must be passed with it. Capture the lead on a Tracking-Tag page instead, or map the original click ID into the contact's `_atid` field.
2. **Apply a UTM template to every ad.** Each paid campaign URL should include `utm_source`, `utm_medium`, `utm_campaign`, and `utm_id`. See [Facebook UTM Parameters](/docs/facebook-utm).
3. **Verify the Tracking Tag is on every landing page**, including funnel and thank-you pages.
4. **Check the date range.** Conversions from before you connected the pixel or added UTM parameters cannot be attributed retroactively — narrow the report to dates after setup.
5. **Allow up to 72 hours.** Attribution can lag, so very recent conversions may show as Unknown until processing catches up.

> ❗ **Important**
>
> Reapplying a UTM template or running Verify Ads Settings only affects ad-click sessions. Neither will attribute a conversion that was created server-to-server without a click ID.

<FaqAccordion
  title="FAQ & Troubleshooting"
  icon="fa-duotone fa-circle-question"
  items={[
    {
      question: "My lead has UTM data in my CRM but still shows as Unknown. Why?",
      answer: "UTM data sitting on the CRM contact is not the same as a tracked AnyTrack session. If the contact was created server-to-server (for example by Zapier), there was no browser session for AnyTrack to match, so it stays Unknown. The click ID must travel with the lead — capture it on a Tracking-Tag page or pass it into the <code>_atid</code> field."
    },
    {
      question: "Is an Unknown conversion lost?",
      answer: "No. The conversion is still recorded and still sent to your ad platforms via the Conversion API. It just is not credited to a specific campaign in the AnyTrack Campaign Report."
    },
    {
      question: "Will reapplying my UTM template fix existing Unknown conversions?",
      answer: "No. Attribution cannot be applied retroactively. New conversions will attribute correctly once the click ID and UTM are captured at session time, but past Unknown conversions stay as they are."
    },
    {
      question: "Why do some conversions show as Direct instead of Unknown?",
      answer: "Direct means the session started with no referrer and no UTM — the visitor arrived without a trackable source. Unknown means AnyTrack could not match the conversion to any session at all. Both point to missing click or UTM data."
    },
    {
      question: "Does this only affect GoHighLevel and Zapier?",
      answer: "No. It affects any CRM (HubSpot, GoHighLevel, and others) when the contact is created outside a tracked browser session — for example from an external form like Typeform or Jotform, or through a Zapier or Make automation. The native CRM integrations work because contact creation happens on the platform's own forms where the Tracking Tag runs. For any external form or automation, follow the <a href='/docs/form-tracking'>Form Tracking</a> guidelines and pass the click ID through to the CRM. See the <a href='/docs/hubspot'>HubSpot</a> and <a href='/docs/highlevel'>GoHighLevel</a> integration guides for native setup."
    }
  ]}
/>

<Cards columns={2}>

  <Card title="Attribution Explained" href="/docs/anytrack-attribution-explained" icon="fa-diagram-project" iconColor="blue-500">
    How AnyTrack matches conversions to campaigns using click-based attribution.
  </Card>

  <Card title="HighLevel Integration" href="/docs/highlevel" icon="fa-plug" iconColor="blue-500">
    Set up GoHighLevel tracking and fix lead attribution.
  </Card>

</Cards>
