Product
Week one: anonymous visitors, HubSpot sync, live location, and a new People hub
LeadLens launched a week ago. Within 48 hours, the same four questions kept landing in our inbox. So we spent the next seven days shipping. Anonymous tracking, native HubSpot sync, country-and-city location on every session, campaign-link merge tags, a redesigned People hub, and a ⌘K command palette — here's exactly what is new and how to use it.
By The LeadLens Team11 min read
We launched LeadLens one week ago. The core loop was simple: send a tracked link to a contact, they click, you watch their session by name. That loop is still the heart of the product. But within 48 hours of going live, the same four questions started landing in our inbox over and over:
- "What about the other 90% of my traffic that did not click a tracked link?"
- "Can it pull contacts straight from my CRM instead of a CSV?"
- "Where are these people actually located?"
- "I want to drop a tracked URL into a Mailchimp blast, not a 1-to-1 email."
So we spent the last seven days shipping. This release answers all four. Plus a redesigned navigation, a command palette, and a stack of smaller upgrades that make the day-to-day faster. Here is everything that went out in week one.
What's new at a glance
1. Anonymous visitor tracking (opt-in)
The number-one piece of feedback in week one: "I love that I can see my named contacts, but I also want to know when an unidentified prospect is poking around our pricing page."
You can now flip on anonymous tracking in Settings → Tracking. When it's on, LeadLens records every visitor — not just the ones who clicked a tracked link — and surfaces them under a new Anonymous tab inside the People hub. Same full session replay. Same live view. Same AI analysis if you want it (analysis is its own toggle, so you can record without spending tokens on every visit).
A few things worth knowing:
- Off by default. This is an intentional choice. The original LeadLens promise is only the people you intended to track — we don't change that for you without asking.
- Respects DNT and GPC. Visitors with Do Not Track or Global Privacy Control headers are never recorded, even with anonymous tracking on.
- Raw IPs are never stored. We derive country, region, and city at the edge and throw the IP away. Always.
- No retroactive merge. If an anonymous visitor later clicks a tracked link, their identified history starts at that click. We don't quietly stitch their previous anonymous sessions onto their identity — that's a privacy line we won't cross.
The result: you get the marketing-funnel visibility of a Hotjar or Microsoft Clarity, on the same screen as the named-contact pipeline visibility you've always had. Full walkthrough in /docs/anonymous-visitors.
2. Native HubSpot contact sync
CSV import was always meant to be the starting line, not the workflow. Now it isn't.
Head to Settings → Integrations, click Connect HubSpot, sign in once, pick the contact list you want to mirror, and you're done. We sync that list into your LeadLens workspace every hour, automatically. New contacts in HubSpot show up in your People hub without you doing anything. Reps stop asking "is this person on the list yet?" and start asking "is this person on the site right now?"
Under the hood:
- OAuth, not API keys. You authorize LeadLens via HubSpot's standard OAuth flow with scopes
crm.lists.read,crm.objects.contacts.read, andoauth. No tokens to copy-paste. - Tokens encrypted at rest. Your access and refresh tokens are encrypted in our database with a per-workspace key. We re-encrypt on rotation. If you disconnect, the keys are deleted.
- Hourly sync, configurable list. You control which HubSpot list gets mirrored. Swap it at any time without re-authorizing.
We've also queued up the next wave of CRM integrations: Salesforce, Pipedrive, Attio, Zoho, Close, and Intercom. They're visible in the Integrations tab today with a "Coming soon" badge so you can see what's on the roadmap. If yours is on the list and you want to be in the early-access cohort, reply to the welcome email and we'll prioritize it.
Full setup: /docs/integrations.
3. Live visitor location (country, region, city)
Two toggles in Settings → Tracking now let you decorate every session with a geographic location pill:
- Geolocation on identified contacts — see where your named contacts are connecting from.
- Geolocation on anonymous visitors — same, for anonymous traffic.
Locations are derived at the edge and stored as three plain text fields: country, region, city. The raw IP that produced them is never persisted. We don't keep it in a log, we don't keep it in a header, we don't keep it anywhere. The derivation happens in-memory and the IP is dropped before the event is written to our database.
Where you'll see it:
- A location pill on every row in
/liveand in session lists, so you can scan "who's visiting from where" at a glance. - A location field on the session detail and replay views.
If your prospect is in Berlin at 11pm their time refreshing your pricing page, that's a different message than if they're in Austin at 9am. The location pill makes that obvious without you having to click into anything.
Both toggles are off by default. Both are independent of anonymous tracking. Both are designed to make a GDPR conversation with your DPO a five-minute conversation, not a five-week one. More on the privacy model: /docs/visitor-location and /docs/privacy.
4. Campaign links with merge-tag identification
This is the one we're most excited about for outbound and marketing teams.
Until now, identification only worked one way: a contact clicked their unique /l/<slug> redirect link, we set a first-party token, then forwarded them to your site. Great for 1-to-1 sales emails. Awkward for a Mailchimp campaign going to 5,000 people, because nobody wants to generate 5,000 short links.
The new campaign link model fixes that. You create one campaign link per verified domain in the Links hub, then drop a merge tag into the URL when you send your email blast:
https://yourdomain.com/?utm_lead={{email}}When a recipient clicks, our script reads the utm_lead parameter the moment the page loads, resolves it to a contact in your workspace, and identifies them. No redirect. The visitor lands directly on your real page, exactly as they would from any other email link. The identification happens silently in the background.
Out of the box we support the standard merge-tag syntax for:
| Platform | Token to paste |
|---|---|
| Mailchimp | ?utm_lead=*|EMAIL|* |
| HubSpot | ?utm_lead={{contact.email}} |
| Klaviyo | ?utm_lead={{ person.email }} |
| ActiveCampaign | ?utm_lead=%EMAIL% |
| Generic / Salesforce / etc. | ?utm_lead={{your-email-merge-tag}} |
You can configure the parameter name (default utm_lead) on the script tag via data-lead-param if utm_lead collides with something else on your site. Setup guide: /docs/tracked-links.
A campaign link can also run in classic redirect mode if you'd rather keep the cookie-set-then-forward flow for a specific channel. The Links hub lets you pick per-link. Two identification paths, one workspace.
5. A redesigned People hub
What used to be /contacts (a flat list of named contacts only) is now /people — a single hub with two tabs:
- Identified. Everyone you've added by name, imported from CSV, or synced from HubSpot. Same powerful filtering as before, plus a sync status column when HubSpot is connected.
- Anonymous. Every unnamed visitor recorded while anonymous tracking is on, grouped by browser identity, with their session count, last seen, and location.
Both tabs share the same toolbar: search, bulk actions (delete, export), and instant filters. The Links hub got the same treatment under /links and is now the canonical place for both personal links and campaign links.
Nothing was removed. Old /contacts URLs still resolve. We just stopped pretending that "contacts" and "people you can see on your site" were two different things.
6. ⌘K command palette + keyboard shortcuts
If you live in your dashboard, you'll feel this one immediately.
Press ⌘K (or Ctrl+K on Windows / Linux) from anywhere in the app and you get a palette that searches across:
- Identified contacts (by name, email, company)
- Anonymous visitors (by ID and last-seen page)
- Tracked sites
- Campaign and personal links
…plus quick actions for "create contact", "create campaign link", "open settings", and so on. Hit Enter, you're there.
We also wired up classic g-then-letter nav shortcuts so you never have to reach for the mouse:
| Press | Goes to |
|---|---|
g then l | Live |
g then p | People |
g then k | Links |
g then i | Install |
g then s | Settings |
⌘K / Ctrl+K | Command palette |
? | Show all shortcuts |
The full reference lives at /docs/shortcuts.
7. Smaller upgrades worth knowing about
A grab-bag of things that didn't get their own headline but probably should have:
- AI sessions now surface "key moments" — specific timestamps in the replay where the AI flagged behavior worth watching. Click the timestamp, jump straight to that point in the recording.
- AI next-step recommendations are grounded in contact notes. If you've written "evaluating us vs. Vendor X" on a contact, the AI knows that and weaves it into the suggested follow-up. No more generic "send a calendar link" advice.
- Live view falls back to polling gracefully when a customer's network blocks WebSockets. You used to lose live status; now you keep it, with a slightly higher refresh interval.
- Settings is split into four clear tabs: General, Tracking, Integrations, Danger. Each toggle is documented inline.
- The tracking script is still ~6 KB and loads with
defer. All the new features ship without making the script heavier on your site. Performance budget held. - Multi-domain workspaces. One workspace can track as many of your domains as you like; install the same script tag everywhere.
How to roll it out
If you signed up in week one, here's the 20-minute upgrade path we'd recommend:
Reinstall is not required
The existing
track.jssnippet picks up all the new features automatically. You do not need to re-paste the script. If you want the newdata-lead-paramoption, you can update the tag at your leisure.Connect HubSpot (if you use it)
Settings → Integrations → Connect HubSpot. Pick a list. You'll see your contacts in
/peoplewithin an hour. Disconnect any time.Decide on anonymous tracking
Settings → Tracking. Flip on anonymous tracking only if you want to see unidentified visitors. Leaving it off keeps LeadLens in classic, identified-only mode.
Decide on location
Same screen. Flip on geolocation for identified contacts (almost always wanted), and separately for anonymous visitors (only matters if you turned anonymous on).
Spin up a campaign link
Links hub → New campaign link. Pick a verified domain. Copy the example for your email tool, paste it into your next blast, send. Watch identified sessions flood in from a single URL.
Learn ⌘K
Open the app, press ⌘K, search for any contact. You'll never click the sidebar again.
What's next
That's week one. The next sprint is focused on three things:
- Salesforce and Pipedrive sync. Same OAuth-and-list-picker model as HubSpot. Early access list is already forming.
- Slack alerts for high-intent sessions. When a contact's AI intent score crosses a threshold — or when a key account lands on your pricing page — we'll ping a channel of your choosing.
- Account-level rollups. Group contacts by company, see "Acme Co spent 47 minutes on your site this week across 4 people," score and prioritize at the account level.
If any of those would change how your team works, let us know. The roadmap is shaped, week by week, by the people who reply to the welcome email.