Skip to content
Guide

How to connect your CRM to Search Console data

Search Console can't connect to a CRM directly, because it reports searches and pages, never individual visitors. The working join is the landing page: record the page each lead first arrived on, keep it on the deal, then match won deals to that page's search clicks. A CSV export, a webhook or a form snippet carries the page.

What it doesn't do: This join can't name the search one buyer typed. It splits each deal across a page's searches by click share, and deals without a landing page stay unmatched.

Updated

Why the join is the landing page

Search Console counts searches and the clicks they send to each page. It never records who clicked. Your CRM records people and deals, but not the search they typed. The only thing both know is the page.

Search Consolesearches → clicksby page, never by visitorYour CRMlead → won deal, withthe page it landed onThe landing page/services/gutter-repairEach won deal is split across the page's searchesby their share of its clicks. Searches Google hideskeep their own line. Deals with no page stay unmatched.
The page path is from the fictional Copperline Gutters sample.

So the join runs through the landing page, and each deal is split across that page's searches by share of clicks. That rule is called click-share attribution; the exact version RankUpside uses is in how revenue is allocated.

Step 1: capture the landing page on every lead

Pick at least one way to put the page on every new lead. Most sites need the form snippet and call tracking together.

Three ways to capture the landing page
MethodWorks forSetup
Form snippetAny site whose forms are plain HTML forms on the pageOne script tag on every page. It adds hidden landing_page and lead_source fields to every form, and the CRM stores them with the lead. See the form snippet docs.
Call trackingBusinesses that get leads by phoneCallRail or WhatConverts sends the landing page with each call by webhook. See CallRail.
The CRM's own first-page fieldCRMs that record where a lead first arrivedNothing to install. Check the field is filled on new leads and included in exports.

Forms inside an iframe, such as some embedded booking widgets, don't get the hidden fields; use the widget's own landing-page capture there. More on the snippet: website forms.

Step 2: get won deals out of the CRM

By CSV

Export won deals with a date, an amount, a landing page and a status (won, open or lost). Common header names from HubSpot, Jobber and GoHighLevel exports are recognized, so most files upload without renaming columns. Re-uploading the same file updates deals instead of adding them twice. See the CSV format and CSV import.

By webhook

A CRM workflow posts each won deal to POST /api/hooks/revenue with the client's revenue key as a bearer token. One request can carry one deal or a list of up to 500. Sending a deal again with the same ID updates it, so a status change from open to won lands on the same deal.

POST /api/hooks/revenue
Authorization: Bearer rk_••••••••

{
  "id": "D-1042",
  "date": "2026-10-14",
  "landing_page": "https://copperlinegutters.example/",
  "amount": 4200,
  "status": "won",
  "source": "organic"
}
One key per client site. Send one deal or a list of up to 500. The deal above is a sample.

Field names, responses and the leads webhook: webhooks. Overview: won-deal webhook.

GoHighLevel recipe

In each client's sub-account, build one workflow triggered when an opportunity is marked won. Add a webhook action that posts to the client's revenue webhook with the bearer key, and map the opportunity's ID, close date, value and landing page to the deal fields. Make sure the landing page field is filled on the contact or opportunity first, from the form snippet or your own capture.

Trigger and action names change between GoHighLevel versions, so use the names in your own workflow builder. One workflow per sub-account. More: GoHighLevel.

HubSpot recipe

The simplest route is a CSV: filter deals to closed won, include the landing page property, and export. For deals as they close, a HubSpot workflow on a closed-won deal can post to the webhook, where your HubSpot plan includes workflow webhooks.

Check the property and action names in your own HubSpot account. More: HubSpot.

No webhook in the CRM? Use Zapier

If the CRM can't post a webhook, Zapier's webhook step can: trigger the zap on a won deal, then post the same JSON fields to the same endpoint with the bearer key. Check that your Zapier plan includes webhook steps. More: Zapier.

Step 3: match deals to searches

When a deal arrives, it goes to its landing page. Its value is then split across the searches that sent that page clicks over the last 13 weeks, by each search's share of the page's clicks. Clicks from searches Google hides keep their own line, so no named search is over-credited.

Searches behind the revenueSampleFictional Copperline Gutters deals, split the way the report splits them.
SearchClicksShare of page clicksAllocated
gutter repair fairview/services/gutter-repair318%$150
gutter guard installation/33%$121
fairview gutter repair/services/gutter-repair212%$100
gutter cleaning fairview/blog/gutter-cleaning-fairview-cost1225%$85
gutter covers installation/22%$81
gutter cleaning/blog/gutter-cleaning-fairview-cost36%$21
Other searches and searches Google hides$4,832

How to present the result to a client without overclaiming: how to prove SEO revenue to clients. The feature itself: revenue by search.

What gets left out, and why

  • Deals with no landing page, or on a page with no search clicks in the window, show as unmatched with their totals. They're never guessed.
  • Deals whose source names another channel (ads, Facebook, Yelp, the Business Profile) are excluded from search revenue.
  • A blank source is counted and flagged, so you can fix the CRM field.
  • Tag the Business Profile website link with ?utm_source=gbp so map-pack leads are labeled and kept separate.

No CRM data yet? Estimate what search is worth from the client's own lead numbers with the SEO revenue calculator.

Privacy

Phone numbers and emails are used only to link a won deal to the call or form lead it came from. They are stored as salted hashes, plus the last two digits of the phone number for display. A won deal links to a lead with the same contact within 120 days.

Full details: data and permissions.

Questions about joining a CRM to Search Console.

Can I connect my CRM to Google Search Console?
Not directly. Search Console has no visitor-level data, so there's nothing to join a contact record to. The working method is to store the landing page on every lead, send won deals back with that page, and match them to the page's search clicks.
What fields do won deals need?
A date, an amount, the landing page and a status of won, open or lost. An ID lets re-sent deals update instead of duplicating. A source helps exclude deals that came from ads or social.
How do I get the landing page into my CRM?
Add a form snippet to the website that fills a hidden landing page field on every form, or use call tracking that records the page for each call. The CRM then stores the page with the lead.
Does this work with GoHighLevel and HubSpot?
Yes, by webhook or CSV. A GoHighLevel workflow on a won opportunity, or a HubSpot workflow on a closed-won deal, posts the deal to the client's webhook. Either CRM can also export won deals as a CSV.
Why are some of my deals unmatched?
They have no landing page, or the page had no search clicks in the window. Deals whose source names another channel, such as ads or Yelp, are left out on purpose. Adding the form snippet fixes most missing pages for new leads.

Join won deals to searches for every client.

RankUpside takes won deals by CSV, webhook or form snippet and splits each one across its page's searches, with hidden searches on their own line.

What your client sees each weekSample data
Oxbow & Vane

Weekly search report · Copperline Gutters

Sep 14 – Oct 11, 2026 vs the 4 weeks before

Copperline Gutters got 27 clicks from named buyer searches in the last 4 weeks, up 23% from the 4 weeks before. Google hides the search terms behind 84% of all 289 search clicks. Rankings rose across the site: pages that steadily show up are up about 2.4 positions.

Buyer clicks23%
27from 22
All search clicks14%
289from 253