GoHighLevel Installation
Track GoHighLevel funnels end-to-end: install the TrueTracked base pixel on every funnel page, configure a workflow webhook that fires on Order Submitted, and add a GTM bridge that links browser sessions to GHL contacts via localStorage._ud.id.
Prerequisites: Your TrueTracked workspace ID, admin access to a GoHighLevel sub-account, and (recommended) a GTM container installed on your funnel pages.
Step 1: Install the base pixel on funnel pages
In your GHL funnel, open Funnel Settings > Tracking Code > Header (or use a GTM Custom HTML tag triggered on All Pages). Paste:
<link rel="preconnect" href="https://t.ttrkd.com">
<link rel="preconnect" href="https://t.ttrkd.com" crossorigin>
<script>
(function(w, d, id) {
var t = w.truetracked = w.truetracked || function() {
(t.q = t.q || []).push(arguments);
};
t._w = id;
var s = d.createElement('script');
s.async = true;
s.src = 'https://t.ttrkd.com/tt.js?w=' + id;
d.head.appendChild(s);
})(window, document, 'YOUR_WORKSPACE_ID');
</script>Step 2: Add the GoHighLevel bridge tag
After the base pixel, add this small script that passes GHL's contact ID to TrueTracked as external_id. This is how browser sessions get stitched to webhook orders - without it, your order-to-session attribution falls back to email matching only.
<script>
window.truetracked('track', 'page_viewed', {
external_id: JSON.parse(localStorage.getItem('_ud') || '{}').id
});
</script>GHL sets localStorage._ud after a contact opts in via any form. Before opt-in, external_id arrives empty - that's fine; once the contact is created, subsequent page views carry it.
Step 3: Configure the Order Submitted webhook
- In your GHL sub-account, open or create a workflow
- Set the trigger to Order Submitted
- Add a Webhook action with method
POSTand URL:https://t.ttrkd.com/webhook/gohighlevel?workspace_id=YOUR_WORKSPACE_ID - Add header
Content-Type: application/json - Save and Publish the workflow
Step 4: Add Custom Data fields
Under Custom Data on the webhook action, add the following fields. Only order_total is required - the rest improve dashboard reporting and CAPI match quality.
| Key | Value | Required? |
|---|---|---|
order_total | {{order.total_price}} | Yes |
currency | USD (hardcoded) or {{order.currency}} | No (defaults to USD) |
order_source | {{order.source}} | No |
product_id | {{product.id}} | No |
product_name | {{product.name}} | No |
product_price | {{product.price}} | No |
product_quantity | {{product.quantity}} | No (defaults to 1) |
Important: The workflow MUST be triggered by Order Submitted - not by a form-fill trigger and not by the "Test Workflow" button. Other triggers don't carry real {{order.*}} context, so order_total arrives empty and the order lands in TrueTracked with value 0.
What gets fired
When the Order Submitted webhook reaches TrueTracked, we automatically:
- Write an order row with
platform=gohighlevel - Stitch the order to the visitor's browser session via
external_id(the contact ID) - falls back to email if the GTM bridge isn't installed - Fire Meta CAPI
Purchase+NewCustomerPurchase/ReturnCustomerPurchaseevents (if Meta is configured) - Fire TikTok CAPI + GA4 Measurement Protocol events (if configured)
Verifying
- Run a real $1 test purchase through your funnel (not the Test Workflow button - see warning above)
- Check your TrueTracked dashboard orders list - the new order should appear within a few seconds with
platform=gohighlevel - Open Meta Events Manager > Test Events - confirm one Purchase event arrived (if Meta CAPI is configured)
Troubleshooting
order_totalarrives empty / order shows $0: The workflow trigger isn't Order Submitted (or you're using the Test Workflow button which has no real order context). Switch to a real purchase trigger.- Order arrives but isn't linked to the visitor's browser session: The GTM bridge from Step 2 isn't installed, or the visitor hadn't opted in (so
_ud.iddidn't exist when they browsed). Email-based fallback usually catches it on the next batch. - Webhook URL returns 400: The
workspace_idquery parameter is missing or malformed. Double-check the URL exactly matches the format above.