Integrations · GoHighLevel

Storm leads in your GoHighLevel pipeline

Minutes after NOAA radar confirms hail in your territory, a new record appears in your GoHighLevel pipeline — hail size, county, and a link to every affected property. Automatically. Set it up once, no code, about 15 minutes.

RADAR VERIFIES A STORM → SWATH POSTS TO YOUR WEBHOOK → YOUR GHL WORKFLOW FILES THE LEAD
1

Get a free Swath key

Sign up at swathapi.com/signup — one email field, no credit card. Your key (it starts with sk_) comes back instantly and is shown once, so paste it somewhere safe. The free plan includes 100 credits a month; storm webhooks themselves cost nothing.

2

In GoHighLevel: create a workflow and copy its webhook URL

  1. Open your sub-account, then click Automation in the left menu (some accounts label it Workflows)
  2. Click Create WorkflowStart from Scratch
  3. Click Add New Trigger and pick Inbound Webhook — search the trigger list if you don't spot it
  4. GHL generates a unique webhook URL for this workflow — click Copy and keep this tab open

That URL is your workflow's mailbox: anything POSTed to it starts the workflow. In the next step you'll hand it to Swath.

Inbound Webhook is one of GHL's "premium" workflow triggers. Most current plans include premium triggers, but agency white-label setups vary — if the trigger isn't in your list, ask whoever manages your GHL account to enable premium triggers & actions.

3

Tell Swath to watch your territory

Path A · Ask your AI — no code, recommended

Connect Swath to Claude or ChatGPT first (a 2-minute paste-one-URL setup — steps here), then say:

Create a Swath storm monitor covering [YOUR COUNTY OR CITY] for hail 1 inch and up.
Use this webhook URL: [PASTE THE GHL WEBHOOK URL]. Name it "[TERRITORY NAME]".

The AI draws the box around your territory, creates the monitor, and confirms. Ask it to save the webhook_secret it gets back.

Path B · Or paste this in any terminal

curl -X POST https://swathapi.com/v1/monitors \
  -H "Authorization: Bearer sk_YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "My territory",
    "bbox": [-97.5, 32.5, -96.4, 33.3],
    "hail_min_in": 1.0,
    "webhook_url": "PASTE_THE_GHL_WEBHOOK_URL"
  }'

Swap in your sk_ key and the GHL webhook URL. The bbox is the [west, south, east, north] corners of a box around your territory — the example roughly covers Dallas–Fort Worth. The response includes a webhook_secret, shown once — save it.

4

Send a test storm so GHL learns the fields

GHL maps fields from a request it has actually seen — and you can't make it hail on demand. So send a realistic sample to your webhook URL. Either ask your AI ("Send a test POST to [the GHL webhook URL] with this exact JSON: …") or paste this in any terminal:

curl -X POST "PASTE_THE_GHL_WEBHOOK_URL" \
  -H "content-type: application/json" \
  -d '{
  "event": "storm.verified",
  "storm_id": "sw_db69f3ae",
  "monitor_id": "mon_1a2b3c4d",
  "type": "hail",
  "mesh_in": 1.75,
  "wind_mph": null,
  "verified_at": "2026-07-24T19:42:00Z",
  "county": "Dallas, TX",
  "swath_geometry_url": "/v1/swaths/sw_db69f3ae/geometry",
  "report_url": "/v1/swaths/sw_db69f3ae/properties",
  "parcels_in_swath_est": null
}'

Back in the trigger settings, GHL now lists the incoming fields — check them and click Save Trigger. Every field Swath sends, and what it means:

FieldWhat it is
eventAlways storm.verified — the only event Swath sends today
storm_idThe storm's permanent ID, e.g. sw_db69f3ae
monitor_idWhich of your territories it hit, e.g. mon_1a2b3c4d
typehail or wind
mesh_inLargest radar-measured hail in the swath, in inches (null on wind events)
wind_mphPeak measured wind, mph (null on hail events)
verified_atWhen radar confirmed it, UTC — e.g. 2026-07-24T19:42:00Z
countyCounty the swath centers on — e.g. Dallas, TX (null only offshore / outside the US)
swath_geometry_urlPath to the storm's shape on a map: /v1/swaths/{storm_id}/geometry
report_urlPath to the affected-property list: /v1/swaths/{storm_id}/properties
parcels_in_swath_estReserved for a future estimate — currently always null
5

Build the rest of the workflow — this is the fun part

Everything after the trigger is standard GHL. The mapped webhook fields are available to later steps, so a typical storm-response workflow adds:

  • Create Contact — name it from county + verified_at (e.g. "Storm — Dallas, TX — Jul 24")
  • Create Opportunity — drop it in your storm pipeline with mesh_in in the title so reps see "1.75″ hail" at a glance
  • Notify the team — internal SMS/email/Slack the moment the record lands

HONEST NOTE: the webhook is the storm, not a homeowner list — you get one new record per verified storm, with hail size and county. The leads live behind report_url: the Swath Report lists every affected property with the hail size measured at that address (billed per property — ask for a quote first). Easiest pull: ask your AI "Pull the Swath Report for storm sw_… and give me a CSV."

The fine print (plain English)

One storm, one POST. Each verified storm that crosses a monitor produces exactly one webhook to that monitor — no duplicates. If your endpoint is down, Swath retries with increasing delays.

Every POST is signed. Swath adds an X-Swath-Signature header (t=<unix>,v1=<HMAC-SHA256>, keyed by the webhook_secret you got when the monitor was created) plus X-Swath-Event: storm.verified. GoHighLevel doesn't check signatures on inbound webhooks — that's normal for this kind of setup; the long, unguessable webhook URL is the gate.

Turning it off. Delete the monitor any time — ask your AI ("delete my Swath monitor") or call DELETE /v1/monitors/{id}.

GoHighLevel steps verified against HighLevel's help center — Workflow Trigger — Inbound Webhook and How to use the Inbound Webhook Workflow Premium Trigger — as of July 24, 2026. GHL renames menus now and then; if a label here doesn't match your screen, look for the Inbound Webhook trigger — naming varies by plan and white-label. Webhook payload fields on this page are copied verbatim from the Swath dispatcher and stay current with the docs.