TrueTrackedTrueTracked

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

  1. In your GHL sub-account, open or create a workflow
  2. Set the trigger to Order Submitted
  3. Add a Webhook action with method POST and URL:
    https://t.ttrkd.com/webhook/gohighlevel?workspace_id=YOUR_WORKSPACE_ID
  4. Add header Content-Type: application/json
  5. 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.

KeyValueRequired?
order_total{{order.total_price}}Yes
currencyUSD (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 / ReturnCustomerPurchase events (if Meta is configured)
  • Fire TikTok CAPI + GA4 Measurement Protocol events (if configured)

Verifying

  1. Run a real $1 test purchase through your funnel (not the Test Workflow button - see warning above)
  2. Check your TrueTracked dashboard orders list - the new order should appear within a few seconds with platform=gohighlevel
  3. Open Meta Events Manager > Test Events - confirm one Purchase event arrived (if Meta CAPI is configured)

Troubleshooting

  • order_total arrives 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.id didn't exist when they browsed). Email-based fallback usually catches it on the next batch.
  • Webhook URL returns 400: The workspace_id query parameter is missing or malformed. Double-check the URL exactly matches the format above.