Installation — Getting the Signal Flowing
Prerequisites and wiring, in order. Do this before touching the customization checklist — without the webhook connected, the skill never fires.
1. LeadShark account + plan
- Profile-view de-anonymization with webhook delivery requires the LeadShark Apex plan (listed as "Signals API + visitors webhook", ~$119/mo as of mid-2026 — verify current pricing at leadshark.io). Lower tiers include generic webhook integrations but not the profile-visitors signal.
- LeadShark must be connected to the LinkedIn account of the profile owner
being tracked — the person named in
{{PROFILE_OWNER}}. One LeadShark connection per tracked profile. - The viewer's identity quality depends on LinkedIn's own visibility rules:
viewers browsing in private mode arrive as
is_anonymous: trueand are discarded by the skill. Expect a meaningful share of views to be anonymous; this is a LinkedIn constraint, not a misconfiguration.
2. Webhook trigger in your workspace
Create a Webhook trigger (one per profile owner):
Name:
<Owner> LinkedIn Profile View — LeadSharkTrigger instructions — keep them minimal; all logic lives in the skill:
A LeadShark webhook fired. If `event` ≠ `new.profile.visit` → stop immediately. Ignore all other LeadShark event types. Otherwise, load and follow the <Handle LinkedIn Profile View Signal> skill.Copy the trigger's webhook URL. It contains a secret token — treat it like a credential (anyone with the URL can inject fake profile-view events and drive CRM writes/outreach drafts).
3. Point LeadShark at the webhook
In LeadShark's webhook/integration settings, register the trigger's webhook
URL for profile-visit events. LeadShark will deliver new.profile.visit
events (and possibly other event types — the trigger filter handles those).
4. Supporting tools the skill calls at runtime
Verify each is connected in your workspace before enabling:
- Contact enrichment (
{{ENRICHMENT_TOOL}}) — primary person→company resolver. - LinkedIn profile scraper (
{{FALLBACK_SCRAPER}}, e.g. an Apify actor) — mandatory fallback; requires its own account/credits. - CRM connection (
{{CRM}}) with write access to companies, contacts, and notes. - Slack (or your chat tool) with access to
{{NOTIFICATIONS_CHANNEL}}— create the channel first.
5. Verify end-to-end
- Have a colleague (non-anonymous, from a non-internal domain) view the tracked profile.
- Confirm the trigger fired and the skill loaded.
- Confirm the dedup memory note was created with one
visit.id | actor_id | timestampentry. - Confirm the outcome matches expectations (a colleague at your own company should stop silently at the internal check — so for a full-path test, use a friendly external contact and expect NOT ICP or SCORED).
- Have the same person view again within the cooldown window — confirm silence (session dedup working).
Known payload gotchas (from production use)
- LeadShark splits one viewing session into multiple events (same
actor_id, newvisit.ideach). The skill's Step 1.5 handles this — do not remove it. connection_statuscasing is inconsistent ("Connected"vs"connected"). Lowercase before comparing.- The payload carries a top-level
payload_versionfield (currently2). If it changes, LeadShark may have altered the schema — re-check the field mapping in webhook-payload.md. data.lead.linkedin_urlsometimes arrives in URN form; preferdata.lead.linkedin_usernamefor enrichment lookups.