A Complete GoHighLevel Skip Tracing Workflow
Wire Acquired Data webhooks into a GoHighLevel workflow so traced sellers land in your pipeline, tagged and ready for campaigns.
If GoHighLevel is your CRM, the goal is simple: every list you skip trace should show up in a GHL pipeline automatically — contacts created, tagged by list, dropped into the right campaign — with no CSV downloads and no manual imports in between. Acquired Data's webhooks were built to make this a copy-paste job: every payload field is flat and top-level, exactly the shape GHL's webhook trigger likes. Here's the full recipe.
How the pieces fit
Acquired Data fires a webhook when a bulk trace job finishes. GHL workflows can start from an Inbound Webhook trigger. Point the first at the second and every completed trace becomes a workflow run carrying the job's stats and a download_url / results_url for the traced contacts.
Step-by-step setup
- Create the GHL workflow. In GoHighLevel, create a new workflow and choose Inbound Webhook as the trigger. GHL generates a unique URL — copy it.
- Paste it into Acquired Data. Go to Dashboard → Webhooks and save the GHL URL as your default webhook. The default fires for every bulk trace on your account — including jobs you run from the dashboard UI, not just API jobs — so this one paste covers your whole operation.
- Send a test payload. Use the test delivery from the Webhooks page (or run a small real job) while the GHL trigger is in mapping mode. GHL captures the sample and lists every field.
- Map the fields. Because the payload is flat —
event,job_id,filename,total_rows,matched_rows,credits_charged,download_url,results_url,completed_at,error_message— each field maps directly to a contact field or custom field with no JSON path digging. A common pattern: storefilenameas a tag source anddownload_urlin a custom field. - Branch on event type. Add an If/Else on the
eventfield:job.completedcontinues down the happy path;job.failed(which arrives witherror_messageset) routes to an internal notification so someone re-runs the list. Failed jobs auto-refund their credits, so the failure branch is purely operational, not billing cleanup. - Use the results. On the completed branch,
download_urlis a signed CSV link you can send to yourself or feed into your import automation, andresults_urlreturns the traced rows as flat JSON (authenticated with your API key) if you're creating contacts one by one via GHL's API or a middleware step. Tag the created contacts with the list name and enroll them in the campaign that matches the list.
Per-job routing with callback_url
The account-wide default webhook is the right tool for "everything goes to one pipeline." If different lists should hit different GHL workflows — say, probate lists into a nurture pipeline and preforeclosure into a fast-response one — submit those jobs through the API and pass each workflow's inbound-webhook URL as callback_url on the job. An explicit callback_url takes precedence over the default for that job, so both mechanisms coexist cleanly.
Practical notes
- Deliveries are attempted up to 3 times with a 10-second timeout, so a brief GHL hiccup won't lose the event. There's also a retry-webhook endpoint to re-send the completion event for a finished job.
- Payloads are signed with an
X-AcquiredData-Signatureheader. GHL's inbound trigger won't verify it for you, which is fine for most setups — but if you route through middleware (n8n, Make, a small function), verify the HMAC there. - Single lookups work too:
POST /api/v1/tracereturns flat result fields synchronously, handy for tracing one inbound lead from inside a GHL workflow rather than waiting for a batch.
Next steps
The GoHighLevel guide covers this setup with screenshots, the webhooks guide documents the default-webhook settings, and the API webhooks guide has the full payload reference and signature details.