SearchOps

SearchOps + GoHighLevel

Let HighLevel email every client the results you produced, flag accounts slipping in the Map Pack, and open the upsell when a rival moves in.

WebhooksREST API

Your clients live in HighLevel sub-accounts; their local search lives in SearchOps. Connect the two and your workflows can act on things only SearchOps knows: a confirmed Map Pack loss in part of a client's area, Google quietly editing their listing, or a week of calls and direction requests your work produced. HighLevel's Inbound Webhook trigger picks up our events, and its Scheduler can pull any SearchOps report on a timetable.

Clients see results without asking

Every Monday HighLevel emails each client their calls, website clicks and direction requests beside the work you finished that week.

At-risk accounts flagged early

When a client loses Map Pack ground beyond the normal swing, an opportunity opens in your Retention pipeline before the client notices.

Upsells that sell themselves

A confirmed loss on a keyword is the moment to pitch a wider grid, more posts or a new service page, with the evidence attached.

You spot Google's edits first

When Google changes a client's hours, category or name, the account manager hears about it first, and the client hears it from you.

AI visibility in the client's numbers

Monthly, pull how often ChatGPT names the client and drop it into their report email: a line competitors can't show.

One snapshot, every client

Build each workflow once with Custom Values, ship it in your snapshot, and point each sub-account's webhook at its own client.

Recipes

What agencies build with GoHighLevel

Monday proof-of-results email to every client

GET /locations/{id}/week

Agencies that want clients to see value every week

Scheduler
Mondays, 8am
SearchOps API
Calls, directions, work done
Email to the client
From your domain
  1. 1Trigger: Scheduler, weekly on Monday morning.
  2. 2Custom Webhook: GET https://searchops.co/api/v1/locations/{id}/week (the location id as a Custom Value), Authentication Bearer Token with your SearchOps API key, Save response ticked.
  3. 3Find Contact for the client owner, then Send Email using the saved response: this week's calls, website clicks and direction requests against last week, and the tasks you completed.
  4. 4Test the contact and saved-response steps in one sub-account first, then add the workflow to your snapshot.

Map Pack loss opens a Retention opportunity

geo_grid.moved

Account managers protecting renewals

Confirmed loss
geo_grid.moved, down
Inbound Webhook
If direction = down
Retention pipeline
Opportunity + task
  1. 1Trigger: Inbound Webhook fed geo_grid.moved for the client's locations; delete the default contact step.
  2. 2If/Else: data.direction equals down.
  3. 3Find Contact for the client owner, then Create Opportunity in a Retention pipeline: "{{data.keyword}}: lost {{data.points_lost}} grid points on {{data.engine_label}}", with {{data.keyword_url}} in the notes.
  4. 4Add Task for the account manager: "Review the grid and the rival now on top, call the client this week".

Turn a loss into an upsell proposal

geo_grid.moved

Agencies that grow accounts, not just keep them

Confirmed loss
geo_grid.moved
Geo-Grid Insights
Why the rival wins
Upsell opportunity
Evidence attached
  1. 1Same trigger and If/Else as above, in an Upsell pipeline instead.
  2. 2Custom Webhook: GET /api/v1/locations/{id}/geo-grid/insights to fetch why the top three win (distance, categories, reviews, listing gaps).
  3. 3Create Opportunity "{{data.keyword}} recovery" with the insight in the notes, so the proposal (new category, service page, review drive) writes itself.

Google edited the listing: tell the client before they find it

profile.changed

Agencies that manage profiles for clients

Profile Guard
changed_by google
If / Else
severity = high
Task + client message
Before and after
  1. 1Trigger: Inbound Webhook fed profile.changed; If/Else on data.severity equals high.
  2. 2Add Task: "Check {{data.field_label}} for {{location.business_name}}: {{data.before}} became {{data.after}} ({{data.changed_by}})".
  3. 3Once checked, the account manager messages the client: we spotted it, here's what we've done. Clients remember who caught it.

Setup

Connect GoHighLevel, step by step

  1. 1

    Create the workflow in HighLevel

    In the client's sub-account, open Automation, then Workflows, and create a workflow. For event workflows choose Add New Trigger, then Inbound Webhook, and copy its URL. For scheduled reports choose the Scheduler trigger instead.

  2. 2

    Add the webhook in SearchOps

    In SearchOps, open Developers, then Webhooks, and choose Add webhook. Paste the URL from HighLevel, tick the events you want and, for a client-specific workflow, pick that client's locations. Save, and copy the signing secret somewhere safe: it is shown once.

  3. 3

    Send a test event

    Back in SearchOps, press Send test on the endpoint. The test event has the same envelope as real events but a short sample body. To map review or scan fields, wait for a real event of that type or replay one from Deliveries, then use that as your sample.

  4. 4

    Pick the sample in HighLevel

    In the Inbound Webhook trigger, choose the request under Mapping Reference and save. Its fields, such as location.business_name and data.points_lost, now appear in the Custom Value picker for every later step. Pick it again whenever you add a new event type.

  5. 5

    Remove the default contact step

    HighLevel adds a Create Update Contact action after the trigger, which needs an email or phone. SearchOps events have neither, so delete it. Where a step needs the client owner, add Find Contact for them first.

  6. 6

    Call the SearchOps API with Custom Webhook

    For reports, add a Custom Webhook action: method GET, a URL under https://searchops.co/api/v1, Authentication Bearer Token with your SearchOps API key (Developers, API & MCP Credentials), and tick Save response from this Webhook so later steps can use the numbers.

  7. 7

    Publish and add it to your snapshot

    Use Custom Values (location id, client owner, pipeline) so the same workflow works in every sub-account. Publish, add it to your snapshot, and paste each sub-account's own Inbound Webhook URL into a SearchOps webhook filtered to that client's locations.

Field reference

The fields you'll map most

From the SearchOps webhook payload. Every event also carries type, id, created_at and the location's id and business name.

FieldUse it for
typeRoute by event: geo_grid.moved, scan.completed, profile.changed, task.created, task.planned, task.completed, review.created
location.business_nameWhich client or branch it is about
data.directionup or down: a grid move beyond normal re-run swing (geo_grid.moved)
data.points_gained / data.points_lostHow many grid points entered or left the top 3 (geo_grid.moved)
data.keyword / data.engine_labelThe keyword and engine: Google Maps, Google Search or AI Mode
data.share / data.share_low / data.share_highShare of answered grid points in the top 3 (or named, for AI Mode), with its likely range
data.keyword_url / data.scan_urlOpen the keyword's grid history or the scan in SearchOps
data.field_label / data.before / data.afterWhat changed on the Business Profile (profile.changed)
data.changed_bygoogle or someone_else: who changed the profile
data.kind / data.severityverification or duplicate, and how serious the change is
data.title / data.completed_at / data.task_urlA task and when it was done: your proof of work (task.created, task.planned, task.completed)

What you need

  • SearchOps Pro, Agency or Enterprise. Webhooks and the API are included; an owner or admin sets them up.
  • HighLevel: Inbound Webhook and Custom Webhook are workflow premium features, about $0.01 per run after 100 free runs per sub-account, or a Workflow Pro bundle. The agency switches them on under Settings, Company, Workflow Premium Features.
  • One SearchOps webhook per client sub-account, filtered to that client's locations. You can have up to 100.
  • Grid moves need scheduled Geo-Grid Scans on the keywords that matter to the client.

Steps checked against the vendor's own documentation on 12 October 2026. Tools change their menus often; if a step no longer matches, the help article has the latest.

FAQ

SearchOps and GoHighLevel

Can HighLevel send clients their results automatically?

Yes. A Scheduler workflow calls the SearchOps API with a Custom Webhook, saves the response and emails the client owner their week: calls, website clicks, direction requests and the tasks you finished. Test it in one sub-account, then ship it in your snapshot.

What counts as a real Map Pack move?

SearchOps compares each scan with the last on the same grid and keyword, and only sends geo_grid.moved when the change is bigger than the normal swing between two runs. That keeps your Retention and Upsell pipelines free of noise.

Is there a SearchOps app in the HighLevel Marketplace?

Not yet. Today you connect with the Inbound Webhook trigger and the Custom Webhook action, a few minutes per sub-account. A Marketplace app that removes the copy and paste is on our list.

Does it cost anything in HighLevel?

Inbound Webhook and Custom Webhook are premium workflow features: about a cent per run after 100 free runs per sub-account, or a monthly Workflow Pro bundle. A weekly report plus a handful of grid events costs pennies a month per client.

Can I put these workflows in a snapshot?

Yes. Build them with Custom Values, add them to your snapshot, and after loading it into a sub-account paste that sub-account's own Inbound Webhook URL into SearchOps.

Start tracking your real rankings today

See where you actually rank on Google Maps, not where Google tells you. Pick the plan that fits and start tracking from day one.