A lead scoring model is a set of rules that turns what you know about a lead into a number, so the sales team calls the best prospects first. Most B2B teams already hold both halves of one. The behaviour sits in Google Analytics 4. The contact records sit in Salesforce. Nobody has joined the two, so the rep starts at the top of the list and works down.
Reply speed decides more deals than scoring does. Research published in Harvard Business Review on the short life of online sales leads found that firms responding within an hour were nearly seven times more likely to qualify a lead. The earlier Lead Response Management study put the gap between a five-minute and a 30-minute reply at 21 times for qualification and 100 times for contact. A model exists to tell the rep which lead deserves that first five minutes.
Salesforce's own guide to lead scoring names three inputs: past behaviour, engagement level and fit. Only behaviour changes daily, which makes it the part worth automating first. In our experience the model that survives contact with a sales floor is always the small one, with six signals and one weekly refresh.
A lead scoring model earns its place when a rep can see the score, the reason behind it, and the action it triggers.
What a lead scoring model needs to work
Every model answers two questions, and mixing them is where most first attempts fail. Fit asks whether the company looks like the ones you already win. Behaviour asks whether they are moving toward a purchase this week. A lead can pass one test and fail the other, so a count of email opens on its own tells you almost nothing.
Fit signals come from forms, enrichment and the CRM. Behaviour signals come from your site, your email platform and your product. The problem is that the behaviour record is anonymous by default. GA4 keeps a session against a client ID, and that client ID means nothing inside Salesforce.
Getting past that needs one thing from the visitor, a form submission that carries an identifier. Once the email address arrives, the session history behind it can be attached to the record. Every step below depends on that join being reliable, so check it before you build the rules. If half your form fills arrive through a channel that strips parameters, the model will look broken when the join is what is broken.
Step 1: Set your lead scoring criteria from closed-won deals
Start from the deals you won, not from a template
Take the last two quarters of closed-won deals and write down what each buyer did in the four weeks before signing.
Pricing page visits and demo requests show up in almost every won account. Careers pages, free-tool downloads and single-session visits show up in the ones that never closed. That comparison gives you weights grounded in your own pipeline:
| Signal | What it says | Weight |
|---|---|---|
| Pricing page visit | Comparing options now | +20 |
| Demo request or webinar attended | Active evaluation | +25 |
| Case study or technical doc download | Building an internal case | +10 each |
| Three or more sessions in a week | Returning with intent | +15 |
| Referral or partner introduction | Pre-qualified by someone else | +20 |
| Careers or jobs page | Looking for work | −10 |
| Student, competitor or personal domain | Outside the buying audience | −25 |
Salesforce ships a similar starting point inside Account Engagement. Its default rules award 5 points for a form submission, 10 for a pricing page view and minus 10 for a jobs page view. The catch is that you can only edit those point values. Salesforce's documentation is explicit that there are no options to add or modify the rules outside the point values, and that the name and criteria cannot be changed. That limit is the reason most teams build their own model beside it.
Six signals is enough to start. Each extra rule is another place for the model to drift, and a rep who cannot explain a score stops trusting it inside a month. The lead qualification agent guide covers how these same signals feed an automated qualification step.
Step 2: Get GA4 behaviour data next to each lead
Pull the behaviour out of Analytics
Three routes exist. Explorations for a manual first pass, the Data API for a weekly job, BigQuery export for volume.
Two naming changes in GA4 matter before you touch anything. The actions you care about are now called key events, and conversions is kept for the actions you bid on in Google Ads. Google's documentation on conversions versus key events describes the rename as a way of making Analytics and Google Ads count the same action the same way. Mark pricing page views, demo requests and document downloads as key events, because those are the defaults your scoring rules will read.
For a manual pass, build a free-form Exploration with page path, session source or medium and date as dimensions, then engaged sessions, key events and user engagement time as metrics. Filter to the date range you care about and export the CSV.
For a weekly pipeline, the GA4 Data API returns the same data as JSON from a runReport call. Add a user-scoped custom dimension holding the lead ID, then request that dimension beside your metrics so each row arrives with a key you can match in Salesforce.
At any real volume, BigQuery export is the sturdier option. Google runs a full export once a day and streams events through the day as well, and a standard property carries a daily export limit of one million events. The export exposes user_pseudo_id and user_id on every event, which is the cleanest path back to a named Salesforce record.
The honest caveat is identity. GA4 only follows a person across devices once you send it a user ID. Visitors who never submit a form stay anonymous, and client ID stitching across a phone and a laptop fails quietly. Treat a missing session history as unknown, and let the fit score carry the decision until behaviour data arrives. That single rule prevents the model from punishing leads for a tracking gap.
Step 3: Turn the criteria into a score
Apply the rubric with an AI prompt you can audit
Feed the export to Claude or ChatGPT with a rubric and a fixed output shape, so the scores can be loaded without reformatting.
This is the prompt we use with mid-market teams. It asks the model to declare what is missing, so a gap scores zero and stays visible. That is the difference between a score a rep can defend and one they cannot:
You are scoring B2B leads for [company]. Score each lead from 0 to 100 using the rubric below. Use only the data provided. If a signal is missing, score it 0 and list it under missing_signals. Rubric - Pricing page visit: +20 - Demo request or webinar attended: +25 - Case study or technical doc download: +10 each - Three or more sessions in a week: +15 - Referral or partner introduction: +20 - Careers or jobs page: -10 - Student, competitor or personal email domain: -25 Return one JSON object per lead with these keys: lead_id, score (integer 0-100), band (High/Medium/Low), top_signal, reason (max 20 words), missing_signals (array). Data: [paste the CSV export here]
Run it against 20 leads whose outcome the team already knows. If a lead your reps called cold lands above 70, the rubric is wrong. Change one weight at a time and rerun, because moving four weights at once tells you nothing about which one moved the score.
Keep the reason string. In Salesforce the rep sees "pricing page three times, no demo request" and can decide in two seconds whether to call. A number on its own gets ignored after the second week.
Step 4: Write the score back to Salesforce
Three fields, one write-back loop
Create AI_Score__c as a number, AI_Score_Reason__c as text and AI_Score_Updated__c as a date and time.
Leave the standard Lead Score field alone. Einstein Lead Scoring writes to it when it is switched on, and two models writing one field produce numbers nobody can explain. A custom field sits beside it and keeps both readings available.
Then pick the transport. A scheduled Flow works when the scored data already reaches a Salesforce object or a platform event. n8n or Zapier works when the data comes from BigQuery or a sheet and you want retry logic handled outside the CRM. The loop is the same either way:
- Read the week's scored output
- Match each row to a Salesforce lead by email or lead ID
- Write AI_Score__c, AI_Score_Reason__c and AI_Score_Updated__c
- Log the run somewhere a failed week is visible
For the band that reps filter and report on, a formula field does the job:
IF(AI_Score__c >= 70, "High", IF(AI_Score__c >= 30, "Medium", "Low"))
Formula fields recalculate on read, so the band can never drift away from the number beside it. They also cannot see history, which is why the score itself stays in a number field that the workflow writes.
Step 5: Route on the threshold
Give each band an action, not just a label
A band with no behaviour attached to it becomes another field reps scroll past.
- High, 70 and above: assign to an inside rep with a first-contact target inside the hour, which is the window the Harvard research punishes you for missing.
- Medium, 30 to 69: hold in a nurture sequence and let further behaviour move the score.
- Low, below 30: keep the record, suppress outbound, and re-score monthly.
Salesforce lead assignment rules were designed around leads arriving. They evaluate when a lead is created or edited, which covers new inbound and gets clumsy for records that already exist and get rescored. A record-triggered Flow on AI_Score__c is the cleaner route for the rescore case, because it fires on the field change and can create a task or post to Slack in the same step. The MQL to SQL handoff guide covers the equivalent routing on the Pipedrive and Zapier side, including the alert that tells a rep a lead has gone cold.
Salesforce native scoring compared with a GA4 model
Salesforce offers two scoring systems before you build anything, and each one solves a different problem. Knowing which is which saves a quarter of wasted work.
| Option | What it reads | Where it lives | Use it when |
|---|---|---|---|
| Account Engagement scoring | Emails, forms and landing pages inside Account Engagement | Account Engagement Settings, then Automation Settings, then Scoring | Marketing already runs in Account Engagement and you want rules working today |
| Einstein Lead Scoring | Your own converted and unconverted lead history | Setup, then Einstein Lead Scoring | You have years of closed leads for the model to learn from |
| GA4 model with AI scoring | Any behaviour on your public website | BigQuery or the Data API, then the Salesforce API | Most buying signal happens on the site, or you run Sales Cloud without Account Engagement |
Einstein needs volume to work. Setup lets you choose the fields it reads, with a cap of 100 field filters, and address, date, datetime, text area, multipicklist and reference fields cannot be used as filters. Scores can take up to 24 hours to appear after you enable it. None of that is a problem for a team with a decade of CRM history, and all of it is a problem for a team whose Salesforce went live last year.
The GA4 route covers the case the native tools miss. A company running Sales Cloud without Account Engagement has no scoring engine reading the website at all, and the website is where an anonymous buyer does most of their research. Salesforce's own Einstein setup guide and the Account Engagement scoring baseline are worth reading before you decide, because both come with behaviour you may not expect from a marketing page.
What the weekly list looks like once scoring runs
Before the model, the list was chronological and the hottest lead sat wherever it landed. After it, the list is a queue: score descending, reason beside it, first contact logged. The scoring runs on a schedule nobody has to remember.
Watch two numbers in the first month. The conversion rate of the High band tells you whether the rubric separates good leads from bad. Time to first touch inside the High band tells you whether sales is using the queue at all. If the High band converts no better than the old list did, the rubric is the problem, and the fix is usually deleting two signals.
A model nobody revises is a model nobody checks. We review weights quarterly and thresholds monthly, so the threshold tracks how the team is actually working through the queue. If you want the score to survive a CRM migration or a territory change, clean the lead data first, which the CRM data hygiene workflow covers. The guide to keeping scored prospects warm picks up where this one stops, once the score exists and the nurture logic has to respect it.
Frequently asked questions
What is a lead scoring model?
A lead scoring model is a rule set that turns fit and behaviour signals into a number for each lead, so the sales team works the highest scores first. Salesforce's lead scoring guide names past behaviour, engagement level and fit as the three inputs that decide a score.
How do I set up lead scoring in Salesforce without Einstein?
Create a custom number field on the Lead object, such as AI_Score__c, then write scores into it from a Flow, n8n or Zapier. Einstein Lead Scoring writes to the standard Lead Score field, so a custom field lets both approaches run side by side without overwriting each other.
What lead scoring criteria should we start with?
Pricing page visits, demo requests, webinar attendance, case study downloads, repeat sessions in a week and referral introductions. Add negative weights for careers pages and non-business email domains. Salesforce's Account Engagement defaults are 5 points for a form submission, 10 for a pricing page view and minus 10 for a jobs page view.
Can I use Google Analytics 4 data for Salesforce lead scoring?
Yes. Export behaviour through GA4 Explorations, the Data API or BigQuery export, match each row to a lead by email or lead ID, then write the score into Salesforce. The join needs an identifier from a form submission, because GA4 sessions are anonymous by default.
What is a good lead score threshold?
On a 0 to 100 scale, 70 and above goes to a rep with a first-contact target inside the hour, 30 to 69 goes into nurture, and below 30 stays in the database for monthly re-scoring. Review the threshold monthly against how the High band actually converts.
How often should lead scores update?
Weekly suits most B2B teams. A daily refresh only pays off with high inbound volume, and Einstein Lead Scoring can take up to 24 hours to produce scores after it is enabled.
Does this work with HubSpot or Pipedrive?
Yes. The same model works in any CRM with an API. HubSpot has a score property and a lead scoring app, and Pipedrive accepts a custom field written through Zapier or n8n. The GA4 export and the scoring prompt stay identical.