Why was my prospect skipped — no LinkedIn URL
What this page covers
If a prospect on your LinkedIn campaign shows up as skipped — no LinkedIn URL in the new "Skipped prospects" panel on the campaign page, this guide explains exactly what happened, why we can't auto-resolve some Sales Navigator URLs to a public LinkedIn member ID, what URL formats we accept, and how to fix an affected prospect in under 30 seconds via the prospect editor.
WarmySender is a 4-pillar outreach platform — Cold Emailing, Email Warmup, LinkedIn Outreach, and Multichannel sequences. This page is part of the LinkedIn Outreach pillar.
What happened (plain language)
Your campaign's first LinkedIn step (a connection invite, a message, or a profile view) needs an actual LinkedIn member ID — the unique identifier LinkedIn uses to route the action to the right person. Without that ID, there is nobody to send the action to.
For each prospect, we try to extract that member ID from the LinkedIn URL you imported. If the URL is a clean public profile URL (the form https://www.linkedin.com/in/handle), the extraction is direct: the handle is right there in the URL and we map it to the member ID on the next API call. If the URL is a Sales Navigator URL (the form https://www.linkedin.com/sales/lead/encoded-id,...), the extraction is harder — Sales Navigator IDs are not the same as public LinkedIn member IDs, and not every Sales Navigator lead has an accessible public profile we can resolve to.
When the URL cannot be resolved to a public LinkedIn member ID at enrollment time, we now terminate the enrollment cleanly with status failed and reason unresolved_url, and surface the prospect in the Skipped prospects panel with a one-click "Edit URL" CTA. Before this V11 fix, the engine silently advanced to the next step on phantom data — which is the bug we shipped on May 6, 2026.
The URL looks right but the prospect is still skipped — what happened?
This is the most common case behind an "Unresolvable URL" chip when your URL clearly looks like a public profile (the form linkedin.com/in/<handle>). Our URL parser successfully extracted the handle from the URL — you can see exactly which handle we tried in the Skipped prospects panel beneath each row ("We tried handle: jane-doe-12345abc"). LinkedIn then returned no public-profile match for that handle. Three causes account for almost all of these:
- Profile owner changed their custom URL (most common). LinkedIn lets users edit their public profile URL at any time. Your CSV export captured the URL as-of export day; if the owner changed it since, our resolver lookup misses. The fix is a 30-second copy/paste: open the profile on LinkedIn, copy the URL from your browser's address bar (it shows the current handle), click Edit URL in the panel and paste.
- Profile is private or restricted from your connected account. If the prospect set their profile to private, or you're not in their network, your connected LinkedIn account cannot resolve them. Switch to an account that can see the profile (e.g. a Sales Navigator-tier account if you have one), OR click Exclude to remove them from this campaign.
- Profile was deleted. If the LinkedIn account was closed since your CSV export, no resolution is possible. Click Exclude on the row.
We deliberately do NOT auto-retry these. Per our account-safety policy, every LinkedIn resolution attempt shares the same safety-budget with your active campaign sends — a runaway auto-retry loop on hundreds of unresolvable rows could trip our temporary safety mode and pause all your LinkedIn sending for 5 minutes. The 30-second manual fix (Edit URL or Exclude) is the safe, predictable path.
URL formats we accept
Public profile URL (always works)
The format https://www.linkedin.com/in/handle — the URL you'd see when you visit someone's profile on LinkedIn directly. The handle portion is the customizable username they picked (or the default LinkedIn-generated identifier of the form firstname-lastname-12345abc). Examples:
https://www.linkedin.com/in/satyanadellahttps://www.linkedin.com/in/jane-doe-12345abchttps://www.linkedin.com/in/alex-engineer-cto/(trailing slash is fine)linkedin.com/in/some-handle(no protocol — we addhttps://)
Sales Navigator URL (sometimes works)
The format https://www.linkedin.com/sales/lead/encoded-id,... — the URL you'd see when you click a lead inside Sales Navigator. The encoded-id portion is a Sales-Navigator-specific identifier, not the public LinkedIn member ID. We try to convert it on enrollment; sometimes it succeeds (the lead has a public profile we can resolve to), sometimes it doesn't (the lead is restricted, recently deleted, or hits a known resolver gap on certain query suffixes). Examples:
https://www.linkedin.com/sales/lead/ACwAAA...,NAME_SEARCH,...(typical full URL — extra parameters present)https://www.linkedin.com/sales/people/ACwAAA...(alternate Sales Navigator path)
If the Sales Navigator URL cannot be resolved, the prospect is marked failed/unresolved_url. The fix is to convert the URL to its public-profile equivalent and re-enroll.
How to fix an affected prospect (30 seconds)
Open your campaign page. The Skipped prospects panel lists every prospect that hit this state with their original URL and an "Edit URL" CTA. For each one you want to keep targeting:
- Click "Edit URL". The prospect editor opens with the original Sales Navigator URL pre-populated.
- Get the public profile URL from LinkedIn. Open the lead in Sales Navigator. There's a "View on LinkedIn" link below the name (sometimes labeled with an external-link icon) — that takes you to the public profile. Copy the URL from your browser's address bar. It should be in the form
https://www.linkedin.com/in/handle. - Paste the new URL into the prospect editor and save. The prospect's status flips back to
pendingand re-enrolls in the campaign on the next sending window — respecting your account's per-day cap and ramp schedule, with the per-prospect minute-jitter randomization applied as usual. - If the lead has no public profile (rare — restricted profile, recently deleted, etc.), click "Exclude" instead. The prospect is removed from the campaign. You can also bulk-exclude from the panel.
The Skipped prospects panel updates live — once you fix a row, it disappears from the list and the count at the top decrements.
Worked example
Talha imported a CSV with 16 Sales Navigator URLs. Before the V11 fix, all 16 enrolled in the campaign and silently advanced past step 1 (the connection invite) — but with no real LinkedIn member ID, every downstream send failed with cannot_message_non_connection and the campaign appeared stuck.
Post-V11, the same 16 land cleanly in the Skipped prospects panel:
- Original URL:
https://www.linkedin.com/sales/lead/ACwAAA-restricted-id,NAME_SEARCH,abc123 - Reason shown:
unresolved_url - Action: Click "Edit URL", paste
https://www.linkedin.com/in/jane-doe-12345abc, save. - Result: The prospect re-enrolls within 5 minutes. Step 1 fires the invite at the next valid sending slot in the campaign window.
For the 4 of 16 leads with no accessible public profile (typical: ~25% of restricted Sales Nav URLs), Talha clicks "Exclude" and they're done.
Account safety — why we don't auto-verify URLs at enrollment
We never make "verification" LinkedIn API calls during enrollment to resolve Sales Navigator URLs. When an enrollment batch contains many unresolvable URLs (which is the common case for poorly-cleaned CSV imports), firing one profile-lookup per row would burst-call LinkedIn at 100+ requests/second and trip LinkedIn's automation-detection systems. The cost of that burst is unrecoverable account restriction across every account in the affected workspace.
Instead, we extract the public-profile member ID from the URL string itself (no API call) and only proceed when the extraction succeeds locally. URLs that don't match the public-profile regex are surfaced to you for manual fix. This is asymmetric on purpose — the cost of asking you to paste a working URL is a 30-second copy/paste; the cost of an account ban is unrecoverable.
Account safety always wins over throughput — our enrollment path is read-only at the LinkedIn boundary. Zero LinkedIn API calls fire during enrollment URL resolution. See LinkedIn rate limits for the documented thresholds we sit conservatively under.
Prevent this on future imports
For a clean CSV import:
- Prefer public profile URLs. If you have access to both the Sales Nav URL and the public profile URL for a lead, use the public profile URL. It's a faster import and a higher acceptance rate (because we successfully resolve at step 1, not at step N).
- Use a Sales Nav export tool that includes the public profile URL. Several Chrome extensions (PhantomBuster, Linked Helper, Evaboot) export Sales Nav leads with both URLs. Import the public-profile column.
- Watch the soft-warning banner at upload. The CSV import flow shows a soft amber warning at upload time when more than 10% of rows look like Sales Navigator URLs. If you see it, consider re-exporting with public profile URLs before launching the campaign.
- Spot-check 5 random URLs in your CSV. If any are
linkedin.com/sales/lead/..., expect a portion of your import to land in the Skipped prospects panel. Plan for the manual fix-up time.
Using custom variables (CSV columns) in LinkedIn templates
When you import a CSV that contains columns beyond the standard fields (first name, last name, company, email, etc.) — for example a hook column with a personalised opener per row — those columns become custom variables available inside any LinkedIn step template (connection invite, message, InMail subject + body, comment text for engage-post steps).
How to insert a custom variable
- Open the step editor on step 2 of the LinkedIn campaign wizard (Sequence Steps).
- Click into the message field you want to personalise.
- Click the {{ }} Insert variable button beneath the field. A search-friendly popover opens with grouped categories: Contact, Company, Sender, LinkedIn, and Custom Fields.
- Scroll to or search the Custom Fields group. Every column that appears in your imported CSV is listed there. Click a row to insert the token at your caret. The inserted token looks like
{{custom.hook}}— that's the canonical form.
Both syntaxes work
The runtime template engine accepts BOTH forms — pick whichever reads better in your template:
{{custom.hook}}— explicit "this is a custom field" form. Recommended for clarity when reading the template back later.{{hook}}— bare form. Works identically, no prefix required.
If you type {{hook}} directly into the editor (rather than clicking the picker) and hook is a column in your imported data, no warning appears. If you type a name that does NOT exist in your data (e.g. {{notAColumn}}), the editor surfaces an "Unknown variable" yellow warning so you can catch the typo before launch.
Case sensitivity (one gotcha)
The runtime renderer is case-SENSITIVE for custom field names. If your CSV column header is Hook (capital H) but your template references {{custom.hook}} (lowercase), the variable will not resolve. The editor's Insert button always uses the EXACT casing of your imported column, so prefer the picker over hand-typing for non-obvious names.
Pre-launch validator
When you click Start campaign, we run a pre-flight check that scans every step's template for variable references, then joins against your enrolled prospects' actual custom fields. If a referenced variable is missing on any prospect, you'll see a hard-block error naming the missing column and how many prospects are affected — fix the template (or re-import the CSV with the missing column) before the campaign launches. This catches the LL#258 (Apr 30 2026) class of bugs where missing custom fields silently failed sends.
Common questions
Why didn't the engine just look up the Sales Nav URL on LinkedIn and resolve it?
Account safety. Firing a profile-lookup during enrollment for every row in a CSV means a 1,000-row import would burst-call LinkedIn at the rate of imports — and a single mis-cleaned CSV could fire 1,000 lookups in seconds. LinkedIn's automation-detection systems treat that pattern as automation and respond with account restriction. A banned LinkedIn account is unrecoverable. The cost asymmetry — 30 seconds of your time vs an unrecoverable ban — makes it not worth the burst risk. Our temporary-safety-mode circuit breaker locks down profile-lookups entirely during a burst event and cools down for hours afterward; running enrollment through that path would amplify any single-bad-CSV moment into a platform-wide outage.
My CSV is from Sales Navigator. Are all the URLs going to fail?
No. The majority of Sales Navigator leads have an accessible public profile, and our string-only extraction succeeds for most of them. Typically 60-90% of a Sales Nav export resolves cleanly; the remaining 10-40% land in the Skipped prospects panel for manual fix-up. The exact rate depends on how recent your Sales Nav export is (older exports have higher rates of deleted/restricted leads) and your subscription tier (Sales Nav Advanced and Recruiter give better filter access).
Can I just exclude all the skipped prospects in bulk?
Yes. The Skipped prospects panel has a "Select all" checkbox and a bulk Exclude button. Useful if your campaign is volume-focused and you don't want to manually fix every URL. The excluded prospects are removed from the campaign; their original CSV rows are still in your prospect database for use on a future import or campaign.
Will fixing a URL re-charge me a ramp-cap slot?
No. The fixed prospect re-enrolls and consumes one slot at step 1 on the next sending window — same as any other newly-enrolled prospect. It does not double-count toward the day's cap or ramp budget. If your day is already full, the fix-up will fire on tomorrow's first slot.
Does this affect imports from non-Sales-Nav sources?
Public-profile URL imports (the form linkedin.com/in/handle) are unaffected — they resolve cleanly without a network call. CSV imports from sources like Apollo, ZoomInfo, or Hubspot that include LinkedIn URLs typically include the public-profile form, not Sales Navigator URLs. Imports from a Sales Navigator export are the primary case where this applies.
What about the Sales Nav URLs that DID resolve before V11 — were those phantom data?
The pre-V11 silent-skip pattern affected enrollments where step 1 needed a verified member ID and the URL extractor returned an empty result. The silent-advance bug then moved the prospect to step 2 with no member ID, where every send failed downstream. Most "successful" pre-V11 Sales Nav resolves were genuine — the URL did contain a recoverable member ID, the extractor caught it, and the campaign sent normally. The terminate-not-skip change only affects the URLs that the extractor cannot parse; everything else continues as before.
How can I tell from the URL whether it'll resolve?
Public profile URLs (linkedin.com/in/handle) always resolve. Sales Navigator URLs (linkedin.com/sales/lead/... or linkedin.com/sales/people/...) may or may not — there's no way to predict from the URL string alone whether the underlying lead has an accessible public profile. The Skipped prospects panel surfaces failures after the fact. If you want a cleaner import upfront, convert all Sales Nav URLs to public profile URLs before importing (most Sales Nav export tools include both columns).
Where do I find the new Skipped prospects panel?
Open your LinkedIn campaign's detail page. If any of your prospects have hit the unresolved_url state, a new collapsible panel appears at the top of the prospect list labeled "Skipped prospects (N)" — click to expand. Each row shows the prospect's name, original URL, and the Edit URL / Exclude actions. The panel is hidden when there are zero affected prospects, so a clean campaign won't show it.
Related guides
- LinkedIn rate limits — Per-account daily and weekly limits, and why our enrollment path is read-only at the LinkedIn boundary
- If you suspect a missed LinkedIn accept — Webhook + polling fallback, and how the dashboard accept counter stays in sync
- Why isn't my LinkedIn campaign sending? — Seven common patterns and their fixes (counter drift, reconciler, phantom-accept, follow-up template syntax, reconnect, future-NSA, webhook reconnect, last-activity tile)
- Why is my LinkedIn campaign stuck or showing wrong numbers? — Six common stuck shapes and their fixes
- How invite, message, and InMail caps work together — The cap split semantics
- LinkedIn campaign documentation — Schedule, sending windows, ramp, acceptance lag, disconnect flow
- Full documentation — All 90+ guides
- Support — How to get in touch
Still have questions? Email hello@warmysender.com with your campaign name and a sample affected URL, and we'll dig into the specific row.