How to track leads and sales from GoHighLevel
Leads and sales reported to NEMO server to server.
AT A GLANCE
| What NEMO tracks | Leads · Sales |
|---|---|
| Connection | Guided — step by step, no server code involved |
| Method | “Direct notice from the platform” · Server-side · highest reliability |
| Steps | 7 in total, with a one-minute check at the end |
| Worth knowing | The “Query key” reads the URL of the first page. If your form lives on a later step of the funnel, use a Custom HTML element that copies the NEMO cookie into the field (official GoHighLevel doc in the sources). |
With GoHighLevel, NEMO tracks which link brings each lead and which link brings each sale with no pixels and no Google Analytics. Know which link, video or ad brought you each lead and each sale from your GoHighLevel funnels — with a direct platform-to-platform notice. GoHighLevel captures the source in a contact field and tells NEMO itself, with a direct server-to-server notice. Nothing depends on anyone's browser. The method is “Direct notice from the platform” (server-side · highest reliability): The platform itself notifies NEMO of every sale — and every refund — with a direct server-to-server message (no dependence on anyone's browser). Stripe, Hotmart, ThriveCart, SamCart, Gumroad and Lemon Squeezy ship with it (native connection); the “Sales webhook” opens it to any tool that can send a POST. The “Query key” reads the URL of the first page. If your form lives on a later step of the funnel, use a Custom HTML element that copies the NEMO cookie into the field (official GoHighLevel doc in the sources). The full connection is 7 steps and you verify it with a single test click.
How does each GoHighLevel lead arrive with its source?
Direct notice from the platform · Server-side · highest reliability
GoHighLevel captures the source in a contact field and tells NEMO itself, with a direct server-to-server notice. Nothing depends on anyone's browser.
- Paste the NEMO script into your funnel: Sites → your funnel → Settings → “Head Tracking Code” (it runs on every page of the funnel): Open GoHighLevel
<script src="https://nemolink.app/nemo.js" defer></script> - Create the custom field nm_id (Settings → Custom Fields → text type).
- In your form, add the nm_id field, mark it as Hidden and set nm_id as its “Query key”: it fills itself in from the NEMO link.
- Create a workflow: trigger “Form submitted” → action “Custom Webhook” → method POST → URL {{ORIGIN}}/api/track → type Custom (Raw Body JSON), with this EXACT body:
{ "click_id": "{{contact.nm_id}}", "event": "lead", "event_name": "GoHighLevel Signup", "customer_external_id": "{{contact.id}}" }
Note: The “Query key” reads the URL of the first page. If your form lives on a later step of the funnel, use a Custom HTML element that copies the NEMO cookie into the field (official GoHighLevel doc in the sources).
Note: “Custom Webhook” is a Premium Action: on some plans it's billed per execution.
How is each GoHighLevel sale attributed?
Direct notice from the platform · Server-side · highest reliability
The sale notice goes to YOUR authenticated “Sales webhook” URL (a card in this same catalog) — with a safety net: if nm_id arrives empty, NEMO attributes by the buyer's email if they're already one of your leads.
- Connect the “Sales webhook” card in the catalog and copy YOUR URL (it carries your token — that's your authentication).
- Create a workflow: trigger “Payment Received” (or “Order Submitted”) → action “Custom Webhook” → method POST → that URL → type Custom (Raw Body JSON) with this body:
{ "event": "sale", "email": "{{contact.email}}", "nm_id": "{{contact.nm_id}}", "external_id": "{{contact.id}}" } - If your product has a fixed price, add to the JSON: "amount_cents": 4900 (cents, with its comma).
Check it in one minute
- Click your own NEMO link and submit the funnel form with a test email.
- The lead shows up in your NEMO dashboard with its source within seconds (the workflow must be in Publish).
Frequently asked questions
- What do I do if the webhook fires but NEMO records nothing?
- The JSON must go without extra fields and with the exact names (a 400 in the workflow's history gives it away). For sales, if nm_id arrives empty NEMO tries to attribute by email — and failing that too, the sale counts as “no source”.
- What do I do if the nm_id field arrives empty on the contact?
- Check the field's “Query key” in the form, and that the NEMO link points at the funnel page where the form lives (or use the Custom HTML copy if it's on later steps).
- What do I do if the workflow doesn't fire?
- Is it published (Publish), not in draft? Does the trigger point at the right form/product?
OFFICIAL SOURCES
- GoHighLevel · Workflow Action: Custom Webhook
- GoHighLevel · Tracking scripts / pixel code
- GoHighLevel · Populate custom fields with HTML/JS
- GoHighLevel · Trigger: Payment Received
Guide verified against the official documentation on 2026-07-21.
ALSO INTEGRATES WITH
Track GoHighLevel from your very first link.
Free during early access. Early users get special terms when paid plans launch.