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:

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:

  1. Resolves the receiving account. Looks up the linkedin_account_id matching the LinkedIn account that fired the webhook.
  2. Checks for any running LinkedIn campaigns in the account's workspace. Counts linkedin_campaigns rows with status IN ('running', 'scheduled') AND unified campaigns rows with linkedin_account_id IS NOT NULL AND channel IN ('linkedin', 'multichannel') AND status IN ('running', 'scheduled').
  3. If running count is 0: records a trace row with branch_taken='no_running_campaign' on the linkedin_events table. No workflow side effect, no LinkedIn API call, no message send. Returns immediately.
  4. 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:

  1. "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.
  2. 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:

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:

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:

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:

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:

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.

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.