Send permit leads to GoHighLevel
Every new permit that matches your filters can land in your GoHighLevel sub-account as a workflow trigger — within about a minute of it appearing in our data. No custom code, no polling, no Zapier tax. The same recipe works for Make, n8n, and Webhooks by Zapier.
What you can pipe in
- New-permit alerts — a signed JSON POST for every new permit matching your city, state, ZIP, category, keyword, or contractor filter. See the webhook reference.
- Competitor tracking — set
contractor_nameon a webhook and you get a POST within minutes of a named company pulling a permit anywhere in our coverage. - PermitStack Leads — if you own a ZIP territory, your metered lead drops can be delivered to a CRM webhook as well as email/CSV.
Step 1 — Create an inbound webhook trigger in GoHighLevel
- In your sub-account, go to Automation → Workflows → Create Workflow.
- Choose the Inbound Webhook trigger (availability depends on your GoHighLevel plan).
- Copy the generated webhook URL — it looks like
https://services.leadconnectorhq.com/hooks/....
Step 2 — Register the URL with PermitStack
One API call. Filter as narrowly as you like — this example feeds a roofing pipeline for Tampa:
curl -X POST "https://api.permit-stack.com/v1/webhooks" \
-H "X-API-Key: pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://services.leadconnectorhq.com/hooks/YOUR-HOOK-ID",
"city": "Tampa",
"state": "FL",
"category": "ROOFING"
}'
Or track a competitor instead of a territory — every permit they pull, in any covered market:
curl -X POST "https://api.permit-stack.com/v1/webhooks" \
-H "X-API-Key: pk_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://services.leadconnectorhq.com/hooks/YOUR-HOOK-ID",
"contractor_name": "ABC Roofing"
}'
Send yourself a sample event any time with POST /v1/webhooks/{id}/test, which is also the easiest way to get GHL's field-mapping screen to see the payload shape.
Step 3 — Map the payload to GHL fields
Every delivery is a JSON POST shaped like this:
{
"event": "permit.created",
"delivered_at": "2026-07-20T14:02:11Z",
"data": {
"permit_number": "2026-040187",
"category": "ROOFING",
"status": "ISSUED",
"address": { "street": "812 W Bay St", "city": "Tampa", "state": "FL", "zip": "33606" },
"description": "Tear off and re-roof, shingle to shingle",
"estimated_value": 18400,
"date_filed": "2026-07-19",
"date_issued": null,
"jurisdiction": "Tampa",
"contractor": "SUNCOAST ROOFING LLC"
}
}
Useful mappings in the GHL workflow builder:
| GHL field | JSON path |
|---|---|
| Contact / opportunity name | data.address.street |
| Address | data.address.street, data.address.city, data.address.state, data.address.zip |
| Opportunity value | data.estimated_value |
| Tag / pipeline stage | data.category |
| Note body | data.description |
| Custom field: permit number | data.permit_number |
| Custom field: contractor of record | data.contractor |
From there it's standard GHL: create an opportunity in a "New permits" pipeline stage, fire a task for your canvasser, or kick off a mail sequence.
Zapier, Make, and n8n
No marketplace app needed — the generic webhook receivers work as-is:
- Zapier — trigger: Webhooks by Zapier → Catch Hook. Paste the hook URL into the PermitStack call in Step 2.
- Make — module: Webhooks → Custom webhook. Make auto-detects the payload structure from the test event.
- n8n — node: Webhook. Use the production URL, not the test URL, in your PermitStack registration.
FAQ
Put permits in your pipeline this afternoon
Self-serve API key, no sales call. Webhooks are on Developer ($49/mo); exclusive ZIP lead territories from $79/mo.
See pricing Browse ZIP territories