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.
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
Method
Works for
Setup
Form snippet
Any site whose forms are plain HTML forms on the page
One 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 tracking
Businesses that get leads by phone
CallRail or WhatConverts sends the landing page with each call by webhook. See CallRail.
The CRM's own first-page field
CRMs that record where a lead first arrived
Nothing 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.
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.
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.
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.
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.