Looking for our Chatbot solution?Go to Expertise Live

Website Visitor Funnel Classifier and Routing

A prioritized list of recent website visitors, scored and sorted by buying intent.

Sample result

Run live demo
Prioritized list of website visitors
CompanyContactFunnel StageIntent Score
1Keystone NetworksBastian Silva, Head of OpsSales Now92
2SmileBright CentersDr. Anya Sharma, Clinical Dir.Sales Watch71
3New Horizons DentalCarla Ruiz, Practice MgrNet New65
4OrthoPartners Inc.Leo Valdez, IT ManagerNurture58
5Affinity Dental(anonymous)Support23

Example run

You ask

Show me the most interesting website visitors from the last week.

9:01 AM
Analyzing recent website activity

Found 152 visitor sessions in the last 7 days across 28 identified companies.

9:02 AM
Finding contacts for key companies

Identified potential contacts for top companies, including Bastian Silva at Keystone Networks and Dr. Anya Sharma at SmileBright Centers.

9:03 AM
Classifying and scoring visitor intent

Scored all visitors. Keystone Networks is 'Sales Now' (92) after visiting the pricing page. SmileBright Centers is 'Sales Watch' (71) due to multiple visits.

9:04 AM
You get

Recent Website Visitor Analysis

9:04 AM

Who it's for

Sales and marketing teams who need to find qualified buyers from their website traffic.

What it does

This skill analyzes recent website visitors, classifies them by funnel stage (e.g., Sales, Support), scores their buying intent, and recommends a specific next action for each lead.

What you need

Connect your website analytics platform. The skill analyzes data from the last 14 days by default, but you can specify a different time window.

What you get

A downloadable list that separates high-intent prospects from noise, so you know exactly who to contact first and why.

How it works

See the full instructions

Website Visitor Funnel Classifier

Turn recent website activity from Expertise Live into a filterable, signal-scored CSV that separates support and noise from real buyer signals. The default output is operational, not presentational.

What This Skill Does

  • classifies recent Expertise Live activity into funnel buckets
  • scores each row using a fixed signal model
  • produces a CSV by default
  • includes the best available contact and enrichment context
  • gives a plain-language recommended next step for each row
  • avoids CRM writes unless the user explicitly asks for a separate CRM-aware variant in a future run

What This Skill Does Not Do

  • do not write to CRM by default
  • do not route records externally
  • do not handle live chat responses
  • do not return a transcript-only summary when a CSV would be more useful
  • do not infer customer or pipeline status without explicit evidence

Primary Systems

Use these systems in this order:

  1. Expertise Live
    • expertise_ai.get_metrics
    • expertise_ai.list_conversations
    • expertise_ai.list_leads
    • expertise_ai.list_recent_recommended_contacts
    • expertise_ai.get_conversation only for 2 to 5 standout rows that need message inspection
  2. Expertise Enrichment only when top-priority rows still lack contact context
  3. Public web research only when the user explicitly asks for extra signal context beyond what Live provides
  4. Do not use HubSpot, Gmail, or Slack by default. Only use them if the user explicitly asks for a CRM-aware, customer-aware, or communication-aware overlay in that run.

Default Time Window

  • If the user specifies a window, use it.
  • If no window is specified, use the last 14 calendar days in the user's timezone.
  • Interpret phrases like today, yesterday, last week, and last 2 weeks in the user's timezone, then convert the start and end to UTC for tool calls.
  • If the user asks for more than 30 days and does not explicitly ask for a full export, use the most recent 30 days and say so.

Exact Operating Procedure

Step 1. Count the window

Call expertise_ai.get_metrics for the selected window with:

  • group_by="day"
  • include=["conversations","leads","unique_visitors"]

Use this for the summary counts in the chat reply.

Step 2. Pull conversation candidates

Call expertise_ai.list_conversations with:

  • begin_time=<window start in UTC>
  • end_time=<window end in UTC>
  • page_size=100
  • include_pii=true
  • include_total_count=true
  • sort_by="last_updated_desc"
  • min_messages=2

Paginate until one of these is true:

  • next_page_token is null
  • 3 pages have been pulled
  • 300 conversations have been collected

Step 3. Pull lead candidates

Call expertise_ai.list_leads with:

  • date_range=[<window start in UTC>, <window end in UTC>]
  • page_size=100
  • include_pii=true
  • include_context=true
  • include_total_count=true

Paginate until one of these is true:

  • next_page_token is null
  • 3 pages have been pulled
  • 300 leads have been collected

Step 4. Pull identified-company candidates

Call expertise_ai.list_recent_recommended_contacts with:

  • company_limit=100
  • contact_limit_per_company=3
  • include_pii=true
  • lookback_minutes=<window length in whole minutes>

Step 5. Only fetch detailed transcripts for standout rows

Do not fetch every conversation thread.

Only call expertise_ai.get_conversation for 2 to 5 rows that are likely to be shown in the final summary and where the preview text is not enough to classify safely.

Step 6. Normalize entities

Use this company key logic in order:

  1. email domain when available
  2. website domain when available
  3. lowercase company name
  4. anonymous conversation rows use conversation_id

Step 7. Deduplicate with fixed precedence

If two rows collapse to the same company key, use this precedence:

  1. conversation row beats identified-company row
  2. identified-company row beats lead-only row
  3. if neither row has a conversation, keep the stronger funnel bucket
  4. if the bucket is tied, keep the higher signal score
  5. if the signal score is tied, keep the newer signal date
  6. if the signal date is tied, keep the row with more contacts

Step 8. Select one primary contact per row

Choose the primary contact in this order:

  1. contact directly linked to a conversation
  2. highest seniority title
  3. validated email present
  4. most recent signal date

Seniority Ranking For Contact Tie-Breakers

Use this exact order:

  1. founder, co-founder, owner, ceo, president
  2. c-suite, vp, head, director, partner
  3. manager, lead
  4. individual contributor or specialist
  5. unknown

If titles tie, prefer validated email, then the newest signal.

Funnel Buckets

Use only these buckets:

  • sales_now
  • sales_watch
  • customer_expansion
  • support
  • nurture
  • suppress
  • net_new_identified
  • unclear

Signal Context Layer

Each surviving row should carry signal context, not just a bucket.

Capture the strongest signal hits using these exact signal names where applicable:

  • direct_demo_intent
  • pricing_or_packaging_interest
  • support_or_access_issue
  • product_education_only
  • sensitive_or_test_data
  • repeat_company_activity
  • senior_contact_match
  • meeting_booked
  • explicit_customer_context
  • identified_company_only

For each row, keep:

  • top_signals: 1 to 3 strongest signal names joined by ;
  • signal_confidence: high, medium, or low
  • play_name
  • why_now

Use these default plays:

  • direct_demo_play
  • pricing_interest_play
  • support_cleanup_play
  • customer_revisit_play
  • identified_watchlist_play
  • suppress_noise_play
  • education_nurture_play
  • unclear_monitor_play

Deterministic Classification Rules

Classify each surviving row into exactly one bucket.

A. Conversation rows

Start from the conversation category, then use visitor text, then fallback.

1. support

Use support when either condition is true:

  • conversation category is support
  • or the visitor text contains any of:
    • login
    • account
    • password
    • billing
    • invoice
    • issue
    • error
    • support
    • help
    • migrate
    • migration
    • setup
    • chatbot environment
    • chatsimple

2. sales_now

Use sales_now when the visitor text contains any of:

  • demo
  • book a demo
  • pricing
  • quote
  • talk to sales
  • implementation
  • rollout
  • procurement
  • contract
  • enterprise plan
  • schedule a call

3. nurture

Use nurture when:

  • conversation category is product
  • or the visitor text is educational and contains any of:
    • workflow
    • how it works
    • use case
    • feature
    • case study
    • proof point
    • what is
    • difference between
  • and none of the sales_now terms are present

4. suppress

Use suppress when the visitor text contains any of:

  • confidential
  • mastercard
  • visa
  • amex
  • payment card
  • test card
  • card number

5. sales_watch

Use sales_watch when:

  • conversation category is sales
  • and sales_now did not trigger

6. unclear

Anything not captured above becomes unclear.

B. Identified-company and lead-only rows with no conversation

1. customer_expansion

Only use customer_expansion when at least one of these is true:

  • the source explicitly marks current-customer activity
  • the row carries explicit customer wording in source context
  • the user explicitly asked for a customer-aware overlay and that overlay confirms customer status

Never infer customer_expansion from company fame, brand recognition, or account familiarity alone.

2. sales_watch

Use sales_watch when at least one of these is true:

  • meeting_booked is true
  • the same company has 2 or more recommended contacts in the selected window
  • the primary contact seniority rank is 1 or 2 and the company has a non-empty company description

3. net_new_identified

Use net_new_identified when:

  • the company has identified contact context
  • there is no linked conversation
  • sales_watch did not trigger
  • customer_expansion did not trigger

4. unclear

Use unclear when:

  • the company has weak or partial data
  • there is no linked conversation
  • no contact context was found
  • and the row does not qualify for a safer bucket

C. Never promote identified-company traffic directly to sales_now

A deanonymized company visit alone is never enough for sales_now. It needs a real buying conversation, a meeting-booked signal, or another explicit high-intent trigger.

Signal Scoring Model

Score every surviving row on a 100-point model:

  • intent strength: 0 to 35
  • recency: 0 to 20
  • contact path: 0 to 15
  • enrichment quality: 0 to 15
  • activity density: 0 to 15

1. Intent strength

  • direct demo, pricing, procurement, quote, or contract intent: 35
  • sales category without direct high-intent wording: 20
  • product education or feature exploration: 10
  • support or access issue: 5
  • sensitive or test data: 0

2. Recency

  • 0 to 3 days old: 20
  • 4 to 7 days old: 15
  • 8 to 14 days old: 10
  • 15 to 30 days old: 5

3. Contact path

  • conversation-linked contact: 15
  • senior contact with validated email: 12
  • validated email only: 8
  • name only: 4
  • no contact: 0

4. Enrichment quality

  • company description plus title plus email plus LinkedIn: 15
  • title plus email plus one of description or LinkedIn: 12
  • name plus title plus email: 10
  • partial contact only: 5
  • none: 0

5. Activity density

  • meeting booked or conversation plus multi-contact company context: 15
  • 2 or more matched contacts in the window: 10
  • single identified contact: 5
  • none: 0

Penalties

Apply these penalties after scoring:

  • sensitive or test data: set score to 0
  • ambiguous entity match: minus 10
  • no contact on non-conversation sales_watch or net_new_identified: minus 5

Clamp the final score between 0 and 100.

Priority Rules

Priority must be explicit. Use only high, medium, or low.

  • sales_now: always high
  • customer_expansion: high if signal score is 70 or more, else medium
  • sales_watch: medium if signal score is 45 or more, else low
  • support: always medium
  • nurture: always low
  • suppress: always low
  • net_new_identified: medium if signal score is 55 or more, else low
  • unclear: always low

Enrichment Fill Rules

Only enrich when all of these are true:

  • the row is sales_now, sales_watch, or net_new_identified
  • the row has no contact_name and no contact_email
  • a company domain is available
  • the row is among the top 5 highest-priority rows still missing contact context

Use this exact enrichment pattern:

  1. call expertise_enrichment_people_search with:
    • q_organization_domains_list=[domain]
    • person_seniorities=["founder","c_suite","vp","head","director"]
    • per_page=5
  2. choose the top candidate
  3. call expertise_enrichment_people_enrich for that candidate
  4. keep the result only if it resolves a usable verified contact

Never enrich more than 5 rows in one run unless the user explicitly asks for a larger pass.

Never enrich support or suppress rows.

Signal Summary Rule

For each row, create one short summary, 24 words or fewer.

  • If a conversation exists, summarize the visitor's actual intent.
  • If no conversation exists, say what was detected, for example:
    • Identified company activity with matched contacts and no conversation.
    • Known company revisit with senior contact context and no meeting booked.

Do not invent page-level detail that the source did not provide.

Play Assignment Rule

Assign one play per row using this order:

  1. sales_now with direct demo or pricing language -> direct_demo_play
  2. sales_watch with pricing or packaging language -> pricing_interest_play
  3. support -> support_cleanup_play
  4. customer_expansion -> customer_revisit_play
  5. suppress -> suppress_noise_play
  6. nurture -> education_nurture_play
  7. net_new_identified -> identified_watchlist_play
  8. anything else -> unclear_monitor_play

Why-Now Rule

Create one why_now line, 18 words or fewer.

Examples:

  • Direct buying intent appeared in the selected window.
  • Multiple matched contacts appeared with recent company activity.
  • This row is noise and should stay out of rep queues.

CSV Contract

The default deliverable is a CSV with these columns in this exact order:

  1. window_label
  2. funnel_filter
  3. priority
  4. signal_score
  5. signal_confidence
  6. top_signals
  7. play_name
  8. why_now
  9. signal_date
  10. account_name
  11. company_domain
  12. source_type
  13. signal_summary
  14. conversation_url
  15. contact_name
  16. contact_title
  17. contact_email
  18. linkedin_url
  19. location
  20. company_description_or_fit
  21. recommended_next_step
  22. notes

Row limits

  • default export size: up to 40 rows
  • if the user explicitly asks for more, cap at 100 rows

Bucket caps for the default 40-row export

  • sales_now: 8
  • sales_watch: 10
  • customer_expansion: 6
  • support: 6
  • nurture: 4
  • suppress: 4
  • net_new_identified: 10
  • unclear: 4

If the export is still under 40 rows after applying caps, fill the remaining slots with the newest leftover rows across all buckets in this order:

  1. sales_now
  2. customer_expansion
  3. sales_watch
  4. net_new_identified
  5. support
  6. nurture
  7. suppress
  8. unclear

Recommended Next-Step Rules

Use plain-language next steps only. Do not route into CRM by default.

  • sales_now: Follow up immediately. Capture identity if missing.
  • sales_watch: Review soon. Watch for repeat activity or stronger intent.
  • customer_expansion: Review for expansion or relationship follow-up.
  • support: Handle through support or onboarding, not sales.
  • nurture: Keep in nurture. Do not escalate to a rep yet.
  • suppress: Suppress from rep queues.
  • net_new_identified: Keep on a watchlist until intent strengthens.
  • unclear: Needs more evidence before action.

Sparse-Data Fallbacks

Use these exact fallbacks:

1. No conversations, no leads, no recommended contacts

  • return the counts
  • create a header-only CSV
  • say no qualifying website activity was found in the selected window

2. Only identified-company traffic exists

  • skip conversation-based examples
  • build the CSV from net_new_identified, sales_watch, suppress, and unclear only
  • say the window was company-signal heavy and conversation-light

3. Conversations exist but contact fields are missing

  • keep the row
  • leave contact fields blank
  • do not invent contact details
  • enrich only if the row meets the enrichment cap and priority rules

Deterministic Standout Row Selection

After the CSV is built, choose up to 5 standout rows for the chat summary in this exact order:

  1. highest signal-score sales_now row
  2. highest signal-score customer_expansion row
  3. highest signal-score sales_watch row
  4. highest signal-score suppress row
  5. highest signal-score net_new_identified row

If a bucket has no row, skip it.

Tie-breakers for standout rows:

  1. newer signal date
  2. higher contact seniority
  3. conversation row beats non-conversation row

Good vs Bad Decisions

Good:

  • a direct demo request becomes sales_now even if the visitor is anonymous
  • a login or migration question becomes support even if the account looks interesting
  • an identified company with founder contact context but no conversation stays net_new_identified or sales_watch
  • sensitive test data becomes suppress

Bad:

  • promoting every identified company to sales_now
  • using CRM owner or lifecycle fields when the user did not ask for CRM overlay
  • dropping a high-intent anonymous demo request just because there is no contact yet
  • guessing customer status from company fame or brand size

Sample Output Row

window_label,funnel_filter,priority,signal_score,signal_confidence,top_signals,play_name,why_now,signal_date,account_name,company_domain,source_type,signal_summary,conversation_url,contact_name,contact_title,contact_email,linkedin_url,location,company_description_or_fit,recommended_next_step,notes
last_14_days,sales_now,high,78,high,direct_demo_intent,direct_demo_play,Direct buying intent appeared in the selected window.,2026-07-13 14:28 EDT,Unidentified visitor,,live_conversation,"Direct demo request on marketplace page",https://app.expertise.ai/conversations?id=example,,,,,Highest-intent buyer signal with no captured identity,"Follow up immediately. Capture identity if missing.","Conversation row outranks identified-company-only rows."

User-Facing Response Contract

After creating the CSV, reply with:

  1. the time window used
  2. summary counts for unique visitors, conversations, and leads
  3. bucket counts for the exported rows
  4. the file link
  5. 2 to 5 standout rows chosen by the deterministic selection rule
  6. any data gaps or caveats

Keep the chat summary short. The CSV is the main deliverable.

Guardrails

  • do not write to CRM by default
  • do not use HubSpot by default
  • do not pretend every enriched company is pipeline
  • do not send support traffic to sales just to make the output look exciting
  • do not overclaim identity confidence
  • do not confuse contact enrichment with sales readiness
  • do not present a deanonymized company visit as pipeline without stronger buying evidence
  • do not fabricate contact or company fields
  • do not enrich more than 5 rows in one run unless the user explicitly asks for a larger pass

More in Target Account Signals

  • Sample result
    ExpertiseApp9:15 AM
    Target account engagement on LinkedIn
    Account:Sable Networks
    Contact:Elodie Bianchi
    Title:Head of Pre-construction
    Signal:Liked post on reducing project overruns
    Source:LinkedIn

    An alert when a contact from a target account engages with you on LinkedIn.

  • Sample result
    New account brief and contacts
    NameTitleEmail
    Milo RennerPractice Ownermilo.renner@foxglovetechvet.com
    Dr. Anya SharmaHead Veterinariananya.sharma@foxglovetechvet.com
    Leo VanceOffice Managerleo.vance@foxglovetechvet.com

    An account brief and contact list for a new target account.

  • Sample result
    ExpertiseApp9:15 AM
    High-intent visit from target account
    Account:Glint Labs
    Tier:Tier 1
    Signal:Visited pricing & integration pages
    Time on Page:3 mins (Enterprise Plans)
    Contact:Malik Vasquez, Director of Ops

    An alert identifying which target account just visited your site and what pages they viewed.