Why some LinkedIn accept webhooks are not actioned
What this page covers
If you've recently archived a LinkedIn campaign, paused all outreach, or have campaigns sitting in a completed state, you may notice that invitation.accepted webhooks still arrive from prospects you previously invited. WarmySender records these accepts informationally but does not automatically send follow-up messages on them. This page explains exactly why that's the right behavior, what the new no_running_campaign trace label means, and how to read your dashboard's "Webhook events" tile.
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 is an "orphan accept webhook"?
An orphan accept webhook is an invitation.accepted event that arrives from LinkedIn for a prospect in a workspace that no longer has any running LinkedIn campaigns. Examples:
- Archived campaign. You ran a "Q1 Outreach" campaign in March, sent 200 invites, and archived it in April when you moved on to a new playbook. In May, one of those prospects accepts the original invite. Webhook arrives — but the Q1 Outreach campaign is archived, so there's no active workflow to advance.
- Completed campaign. You configured a single-step invite-only campaign that ran to
status='completed'on every prospect. A late accept arrives — but there's no follow-up step to fire. - All campaigns paused or stopped. You paused all your LinkedIn campaigns last week (e.g. for a vacation, account audit, or strategy rethink). An accept lands — but there's no running campaign to advance.
- Account remapped. You moved a LinkedIn account between workspaces. Pre-existing accept webhooks for the OLD workspace's prospects still arrive there briefly — those land as orphans because the new active campaigns live in the new workspace.
In all four cases, the customer authored intent was: stop outreach. Archiving a campaign is an explicit action — the user removed it from active rotation. Auto-advancing a workflow on an orphan accept would silently undo that intent and possibly send unwanted messages to prospects you'd written off.
How we handle it
When an orphan accept webhook arrives, the WarmySender LinkedIn handler:
- Resolves the receiving account. Looks up the
linkedin_account_idmatching the LinkedIn account that fired the webhook. - Checks for any running LinkedIn campaigns in the account's workspace. Counts
linkedin_campaignsrows withstatus IN ('running', 'scheduled')AND unifiedcampaignsrows withlinkedin_account_id IS NOT NULLANDchannel IN ('linkedin', 'multichannel')ANDstatus IN ('running', 'scheduled'). - If running count is 0: records a trace row with
branch_taken='no_running_campaign'on thelinkedin_eventstable. No workflow side effect, no LinkedIn API call, no message send. Returns immediately. - If running count > 0 but matcher still couldn't bridge: records a trace row with
branch_taken='bridge_miss_all_strategies'AND fires our internal alert — that case IS treated as a potential bug (the workspace has running campaigns the webhook should have bridged into).
The dashboard shows the orphan-webhook count in a "Webhook events (informational)" tile, distinct from the bug-tracking bridge_miss count. You can confidently ignore the orphan number — it just reflects the natural delay between LinkedIn invite acceptance and your decision to archive a campaign.
Why we don't auto-fire follow-ups on archived campaigns
This is the load-bearing design decision. Per CLAUDE.md's two top-priority invariants:
- "A campaign executes according to how the user set it up." No auto-shortcuts, no silent branch-skips, no "helpful" auto-progress on signals the user did not configure. If you archived a campaign, your authored intent was: "don't continue outreach to those prospects." Auto-firing a follow-up on a late accept silently rewrites that decision. The platform respects your action.
- Account safety always wins. Auto-resurrecting an archived campaign to send one follow-up creates account-safety risk — that prospect may no longer want to hear from you (you archived for a reason), and a stale-context message could trigger a Block-and-Report response that LinkedIn weights against the sending account. Better to surface the accept informationally and let you decide.
If you want to follow up with prospects who accepted post-archive, the right path is to export the late-accept list and create a NEW campaign with fresh context. The orphan webhook tile will show you the count; you can drill in for prospect names and decide.
The "Webhook events" tile
On the LinkedIn dashboard, alongside the Late accepts tile, there's a "Webhook events" panel showing:
- Total accepts received in the last 7 days. Includes in-time accepts (which advanced workflows normally), late accepts (recorded on
late_accept_observed_at), and orphan accepts (recorded informationally). - Orphan accepts. The count of
no_running_campaigntraces in the period. Click for a list of which LinkedIn account each came from and the prospect's truncated identifier. - Bridge misses (if any). If your workspace HAS running campaigns and our matcher dropped any candidates, this surfaces here as an actual issue. We page on this internally; you'll usually see it as a 0 unless something has gone wrong.
The tile auto-refreshes every minute. Hover any row for the timestamp, originating LinkedIn account, and the trace branch label.
Worked example — peter@faroverdigital
Peter (peter@faroverdigital.com) ran two LinkedIn outreach campaigns in March and April, "Spring 2026 Outreach" and "Q2 Pipeline Build." Both campaigns sent invites to a combined 280 prospects. By April 30, Peter had decided to refocus and archived both campaigns; he set status='archived' on both rows. He did not pause his LinkedIn webhook subscriptions (those are tied to the LinkedIn account, not individual campaigns).
Between May 1-6, 28 of those previously-invited prospects accepted Peter's invitations. Each acceptance fired an invitation.accepted webhook from LinkedIn to WarmySender. Pre-V13: each was recorded as bridge_miss_all_strategies, which Peter saw on his dashboard as 28 "bridge misses" — looked like a bug.
Post-V13: each accept is recorded as no_running_campaign, surfaced in Peter's "Webhook events" tile as 28 informational events. Peter sees this and now understands: those are organic accepts that arrived after he archived. He has three options:
- Accept the status quo. The accepts are recorded; Peter can export the list to verify connections happened, but no follow-up message is sent. Done.
- Re-engage some prospects. Peter exports the 28 prospects, picks 5-10 high-priority ones, and creates a new campaign "May Reactivation" with a fresh context message. Sends fresh invites to the 5-10 picks (their existing connections will receive the new campaign's first message step normally).
- Bulk follow-up. Peter creates a new campaign with the 28 prospects pre-populated as connected (they're already first-degree), starting at a Message step. The new campaign respects all caps and ramps; Peter's authored intent is now explicit and the platform follows it.
Either way, the orphan webhook visibility solves the "why am I getting these" confusion without the platform making editorial decisions on Peter's behalf.
Account safety
Orphan-webhook handling is read-only at the LinkedIn boundary. When an orphan webhook arrives, we:
- Match the LinkedIn account ID to a
linkedin_account_idrow (database read). - Run a SQL count over
linkedin_campaigns+campaignsfor active rows (database read). - If 0 active campaigns: write one
linkedin_eventstrace row withbranch_taken='no_running_campaign'(database write only — no API call, no message send, no email send).
The orphan-webhook path does not introduce ANY new automatic LinkedIn API calls. It does not stamp linkedin_accepted_at, late_accept_observed_at, linkedin_status, or any forward-mover-readable column. It is purely a labeling change in the trace stream so the dashboard distinguishes orphan webhooks from bug-tracking bridge_miss events.
If you re-activate an archived campaign (set status='running'), subsequent webhooks for prospects in THAT campaign will bridge normally per the standard handler logic — the orphan-webhook path is only taken when no running campaigns exist for the workspace. Re-activation flips the running-count check from 0 to ≥ 1, and the matcher takes the standard bridge path on the next webhook.
How this affects your campaign stats
Orphan webhooks do not count toward any campaign's acceptance rate or connected counter. Specifically:
- Acceptance rate on archived campaigns is computed from
linkedin_accepted_at IS NOT NULL OR late_accept_observed_at IS NOT NULL— but archived campaigns are typically excluded from the active-stats summary. The orphan accept does not stamp either column on those campaigns' prospects (because the matcher correctly returns 0 candidates — none of them are in('running','scheduled','paused','completed','cooldown')status). - Workspace-wide accepted count (e.g. on the LinkedIn analytics dashboard's "Connections" tile) is computed from
campaign_prospects.linkedin_accepted_at+late_accept_observed_at— also unaffected by orphan webhooks. - The "Webhook events" tile is a separate informational counter that simply counts
linkedin_eventsrows withbranch_taken='no_running_campaign'. It does not feed any rate calculation.
Bottom line: archived campaigns stay frozen in their final-state stats; the dashboard reflects that orphan accepts arrived without distorting historical numbers.
Common questions
If I archive a campaign, do I still receive accept webhooks for those prospects?
Yes — the webhook subscription is at the LinkedIn account level, not the campaign level. As long as your LinkedIn account is connected, LinkedIn will keep sending invitation.accepted events for any invite that account sent, regardless of whether the originating campaign is still running on our side. Our handler decides what to do with each event based on the current state of campaigns in your workspace.
Can I configure WarmySender to fire follow-ups on archived-campaign accepts?
No, by design. Per CLAUDE.md's "execute according to how the user set it up" invariant, we won't silently re-activate an archived campaign. If you want to follow up, the right path is to (a) export the orphan-accept list from the dashboard, (b) create a new campaign with the fresh context, and (c) enroll the prospects you want to re-engage. This keeps your authored intent explicit on the new campaign — you've decided to re-engage, configured the new context, and the platform follows.
Why does the dashboard show "28 webhook events" if my campaigns are archived?
Because LinkedIn delivery latency is non-trivial. Acceptances can arrive days, weeks, or even months after you sent the invite — and even after you've archived the originating campaign. The "Webhook events" tile is informational so you understand the platform IS receiving signals; it just isn't taking automated action because your archive said "stop."
How do I see which prospects accepted on archived campaigns?
The orphan-webhook trace rows live on linkedin_events with metadata->>'branch_taken' = 'no_running_campaign'. The dashboard's "Webhook events" tile drills down to a list view: prospect name (if we can match), LinkedIn account, originating timestamp. You can also query directly if you have read access to your workspace's events table; ask hello@warmysender.com for a CSV export if you need it for a one-off analysis.
What's the difference between an orphan webhook, a bridge miss, and a late accept?
Three distinct concepts:
- Orphan webhook (
no_running_campaign): the workspace has zero running LinkedIn campaigns. Webhook recorded informationally, no action taken. NOT a bug — by-design account-safety preservation. - Bridge miss (
bridge_miss_all_strategies): the workspace HAS running campaigns, but our matcher couldn't connect the webhook to any of them. This IS treated as a potential bug; we page on persistent occurrences and the V13 cumulative candidate-count fields help debug. - Late accept (what-is-a-late-accept): the workspace has a running campaign and the matcher found the prospect, BUT the prospect's workflow has already advanced past the wait_accept step (timed out, condition_skipped, completed). Recorded on
late_accept_observed_at; surfaced in the Late accepts tile with a manual-followup CTA.
The dashboard's "Webhook events" tile keeps these three categories visually distinct so you can read each one's actionability at a glance.
Will re-activating an archived campaign make the orphan accepts bridge retroactively?
No. The matcher only bridges accepts on incoming webhooks at the moment they arrive. Past orphan webhooks remain in the audit trail with branch_taken='no_running_campaign' — re-activating the campaign won't go back and re-process them. If you want to manually action prospects who accepted during the archive period, export the orphan-accept list and enroll them in a new campaign as described above.
Does this affect my LinkedIn account's safety profile?
No, positively. Orphan-webhook handling is read-only — zero new LinkedIn API calls, zero new sends. The branch label change is purely a dashboard signal. Your LinkedIn account's daily/weekly cap is unaffected; its ramp progress is unaffected. The only change you'll notice is the dashboard's clarity around what each webhook event represents.
Can I delete the orphan-webhook trace rows from my database?
You can, but we recommend keeping them. They're a structured audit trail showing which late-arriving accepts you've received over time, useful for retrospective analysis (e.g. "what was the actual acceptance rate of my Q1 campaign, including post-archive accepts?"). If your linkedin_events table grows large, we can talk about a retention policy — email hello@warmysender.com.
Related guides
- What is a "late accept" — Late accepts on ACTIVE campaigns: webhook arrives but workflow has advanced past wait_accept
- If you suspect a missed LinkedIn accept — In-time accepts that arrive while the workflow is still active
- Why is my campaign paused (subscription inactive)? — Different pause reasons and how to resume
- LinkedIn campaign documentation — Schedule, sending windows, ramp, acceptance lag, disconnect flow
- LinkedIn rate limits — Per-account daily and weekly limits
- Full documentation — All 90+ guides
- Support — How to get in touch
Still have questions? Email hello@warmysender.com with your workspace ID and a sample orphan-webhook timestamp — we'll trace the specific event and confirm the trace branch.