What is a "late accept"

What this page covers

A late accept is when a prospect accepts your LinkedIn connection invite after your campaign's workflow has already advanced past the wait_accept step (timed out), routed to a condition's false-branch (the prospect's linkedin_status is condition_skipped), or the campaign itself has completed. This page explains exactly what counts as a late accept, why our system records it without automatically firing the next step, and how to manually send a follow-up via the new "Late accepts" tile on your campaign detail page.

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.

Definition — when is an accept "late"?

An accept is "late" when ANY of these conditions is true at the moment the accept webhook arrives:

If the accept arrives while the prospect is still pending, scheduled, or in_progress — which is the vast majority of cases — it is processed normally and the workflow advances per your campaign's configuration. That's documented in If you suspect a missed LinkedIn accept. This page covers the rarer "after-the-fact" pattern only.

Why we don't auto-fire the follow-up step

This is the most important part of the design. 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 configured wait_accept = 10 days and the prospect accepted on day 11, your authored intent was: "if they don't accept within 10 days, treat them as non-acceptors." We respect that intent. Auto-firing the follow-up after a late accept would silently rewrite your campaign logic and override an explicit timeout you configured.
  2. Account safety always wins. Late accepts disproportionately come from prospects whose campaign has already routed to condition_skipped or terminal states. Those states are downstream-coupled to forward-movers (post-acceptance enqueue, 6h polling, helper-side guards). Re-arming them by stamping linkedin_accepted_at on a condition_skipped row would re-introduce the cannot_message_non_connection retry storm those safeguards were specifically built to prevent. The fix is read-only at the LinkedIn boundary: zero new LinkedIn API calls, zero touches to forward-mover-readable columns.

So instead of auto-advancing, we record the late accept on a separate, dedicated column (late_accept_observed_at) that no forward-mover reads. The user-visible result: the dashboard shows "Late accept on {date}" on the prospect's detail page, the new "Late accepts" tile aggregates the count across the campaign, and a manual-followup CTA lets you decide whether to act.

The new "Late accepts" tile

Open your campaign's detail page. If any prospects have hit the late-accept state in the last 7 days, you'll see a new tile labeled "Late accepts (last 7 days): N" on the right-hand side of the page. The tile is hidden when N=0 (clean campaigns won't see it).

Click the tile to expand a list of every late accept, with:

You can also bulk-action: "Mark all as reviewed" hides the late accepts from the tile (they remain visible on prospect detail pages and in audit logs); "Send follow-up to all" fires the manual-followup template to every late accept in the list, respecting per-account daily caps and per-prospect spacing. Hitting the cap mid-batch defers remaining sends to the next valid sending window.

Worked example

Selva (reputeddgroup@gmail.com) has the Zeko Anisha campaign with a 10-day wait_accept step before the first follow-up message. He sent invites on April 17. Vishwanath (one of his prospects) hadn't accepted by April 27 (day 10), so:

On April 28 (day 11), Vishwanath accepted the invite. Pre-V12, the accept webhook would have been silently dropped: the matcher excluded prospects whose cp.status wasn't in ('pending','scheduled','in_progress'). Selva would have noticed only when our manual heal script caught it days later.

Post-V12, Vishwanath's late accept is recorded with late_accept_observed_at = April 28. Selva's campaign dashboard shows "Late accepts (last 7 days): 1" with Vishwanath's row visible. Selva can:

Either way, the workflow is respected. Selva's wait_accept=10 timeout is not silently overridden, his condition-skipped sentinel is preserved, and no cannot_message_non_connection retry storm fires from re-arming a forward-mover. He gets the visibility he needs without the platform making an editorial decision on his behalf.

Account safety

The late-accept path is read-only at the LinkedIn boundary. When the webhook arrives, we:

The manual "Send follow-up" CTA, when clicked, fires one LinkedIn message-send call — gated by the same per-account daily/weekly cap and the campaign's per-action cap split (the message goes to the send_message bucket, not send_invite or send_inmail). If you bulk-action "Send follow-up to all" on 50 late accepts and your daily message cap is 80, the engine sends as many as the cap allows for today and defers the rest to tomorrow's first slot — no burst, no cap breach.

The late-accept tolerance does not introduce ANY new automatic LinkedIn API calls. Every API call is gated behind an explicit user click. The path preserves a load-bearing invariant: linkedin_status='condition_skipped' is a sentinel — we never overwrite it from the late-accept path.

How this affects your campaign stats

Acceptance rate displays as (in-time accepts + late accepts) / invited — both denominators are visible separately on the campaign detail page so you can see the split:

If your "Late accepted" count is consistently higher than 5% of your invited count, consider lengthening your wait_accept step from (e.g.) 7 days to 10 days. LinkedIn invites take a non-trivial percentage of accepts past the 7-day mark; if your campaign is ratchety on the wait_accept window, you'll see late accepts pile up and miss follow-up opportunities. The campaign editor's wait_accept slider has a tooltip cross-referencing this page.

Common questions

Why doesn't the system just send the follow-up automatically when a late accept arrives?

Two reasons. (1) Your campaign's wait_accept timeout is an explicit configuration: "if they don't accept within N days, treat them as non-acceptors and stop." Auto-firing a follow-up on day N+1 silently overrides that — we'd be deciding for you that "their day-late accept counts as in-time." Per CLAUDE.md "execute according to how user set it up," the platform respects your configured intent rather than guessing what you'd prefer. (2) Late accepts often coincide with prospects in condition_skipped or terminal states. Auto-advancing those re-arms downstream forward-movers that read linkedin_accepted_at, which (per LL#265 + LL#266 + LL#271) re-introduces the cannot_message_non_connection retry storm those rules were built to prevent. The safe design is to record the late accept on a separate column that no forward-mover reads, and surface it to you with a manual CTA.

My campaign is single-step invite-only. Why does the dashboard still show late accepts?

For accuracy. Talha's Workshop #3 single-step campaign sent invites and intentionally has no follow-up step — the campaign's job ends after the invite fires. Pre-V12, late accepts on his campaign were dropped silently and his dashboard showed acceptance count = 0 even though prospects HAD accepted. Post-V12, the late accepts are recorded so his dashboard shows the truthful number (e.g., 4 of 9 invited accepted late). There's no follow-up step to manually fire (his campaign doesn't have one), but the accept counter reflects reality. If he wants to start a follow-up campaign for those late acceptors, he can export the list and re-import to a new campaign.

Will sending a manual follow-up affect my LinkedIn account safety?

The manual follow-up uses one slot from your daily message cap (the send_message bucket per the cap split — see How invite, message, and InMail caps work together). It does NOT use an invite slot. If your message cap is 80/day and you've sent 30 today, the manual follow-up consumes one of the remaining 50 slots. If your message cap is exhausted, the send is deferred to the next valid sending window. The same per-account ramp ceiling applies — manual sends respect every safety check that automated sends do.

How long are late accepts visible on the dashboard?

The "Late accepts" tile shows the last 7 days by default. Older late accepts are still recorded in the database (late_accept_observed_at on the prospect row) and visible on the prospect detail page indefinitely. If you want the full history, export your campaign's prospects with the late_accept_observed_at column included. The 7-day rolling window on the tile is for triage focus — old late accepts are typically not actionable anymore.

Does the late-accept stamp affect my reply rate?

Reply rate is computed against accepted prospects (the denominator). With the V12 change, both in-time and late accepts count toward the denominator, so your reply rate may shift slightly as historical late accepts get recorded. The replies side of the calculation (numerator) is unchanged. If your reply rate dropped a small amount post-V12, it's because the denominator now reflects truth (more accepts = more chances to reply) — not because anything got worse.

Can I configure the campaign to auto-fire the follow-up on late accepts?

No, by design. The platform invariant is "execute according to how the user set it up." If you want late accepts to auto-fire follow-ups, the right design is to lengthen your wait_accept step (e.g., from 7 days to 14 days) so more accepts fall inside the window and run through the normal workflow. The late-accept tile catches anything that still falls outside the longest reasonable wait_accept window.

What's the difference between a late accept and a missed accept?

A missed accept is one where the webhook drops or arrives delayed but the prospect IS still in an active workflow state (pending/scheduled/in_progress) when it does arrive — the workflow advances normally as soon as it lands. A late accept is one where the webhook arrives but the prospect's workflow has ALREADY moved on (timed out, condition_skipped, completed, stopped). Missed accepts heal automatically; late accepts surface to the dashboard for your manual decision.

Does the manual "Send follow-up" CTA respect my campaign's sending window?

Yes. The send is queued for the next valid sending slot in your campaign's window — if you click "Send follow-up" outside the campaign's configured 9-17 IST window, the send queues for the next 9:00 IST slot. This preserves your sending-window configuration even on manual sends. Per-prospect minute jitter applies, so two manual sends fired at the same time hit LinkedIn a few minutes apart, not simultaneously.

Still have questions? Email hello@warmysender.com with the campaign name and a sample late-accept row — we'll dig into the specific case and confirm the timestamps line up with your wait_accept config.