Loading...
Per-row state pill + attention badge + click-to-expand inline actions. Continue the workflow from any row — send invites and confirm accepts without leaving the campaign.
The Recipients tab inside a campaign isn't a flat list of slugs — it's a working surface that mirrors the dashboard's reminder cards, scoped to one campaign.
For every prospect in the campaign, the row carries:
queued (zinc) — ready to inviteinvited (blue) — invite sent, waiting for acceptaccepted (emerald) — accepted, conversation seededin conversation (purple) — at least one outbound message exchangedcompleted (green) — outcome reached, conversation closedunresponsive (red) — 3+ unanswered messagesexcluded (zinc faded) — skipped or withdrawnaccepted / in conversation / completed (deep-links to the right thread)queued — click-to-expand (see below)invited — click-to-expand (see below)excluded / unresponsive)Queued and invited rows are click-to-expand. The chevron next to Send invite / Check for accept rotates when the row is open. Before this, the Recipients tab was read-only and you had to bounce back to the dashboard's Pending Accepts card or the Send Queue tab to act on a specific prospect — that gap is closed.
Queued rows expand into the same send-invite flow as the Send Queue tab:
Invited rows expand into the same accept-confirmation flow as the dashboard's Pending Accepts card:
accepted and seeds a conversation; Withdraw moves it to excluded; Still waiting leaves the row open in case you want to immediately withdraw on second thought.Both flows respect the team-sharing safety gate — if you're acting on a campaign that uses a team-shared LinkedIn account you don't own, the Open in LinkedIn button is locked until you tick the "I'm logged into LinkedIn as the shared account" checkbox.
Five filter pills above the list, each with a live count from the server:
Click any pill to filter the list. Default sort puts needs-attention rows at the top, then most-recent activity descending — so what you most need to act on rises naturally.
If any recipient in the campaign isn't in your CRM yet, an amber banner appears above the filter pills: "N of M recipients are not in CRM" with a one-click Add N to CRM bulk action. Common case: campaigns created via Manual Entry without the CRM-sync toggle on, or campaigns from before the toggle existed.
Per-row + CRM chips do the same thing for one prospect at a time. Both share the same backend (/api/crm/contacts/bulk-create-from-linkedin) — duplicates auto-skipped, no double-creates.
The dashboard cards (Check for accepts, Sent recently, Check for replies, Time to follow up) are global views — every running campaign in your org. The Recipients tab is the same idea scoped to one campaign so you can plan + execute within a single outreach motion. Same thresholds, same trust model, same deep-link CTAs.
The endpoint joins recipients ↔ conversations ↔ CRM contacts on the server in one round-trip. Lazy-fetched on first open of the Recipients tab + on campaign mount (to populate the Send queue (N) tab badge). Updates optimistically when you confirm activities elsewhere; auto-refreshes on tab focus when you come back from another window.
Tags
Add recipients to a campaign
Three tabs — Manual Entry, Upload CSV (with column detection), CRM Contacts. Optional auto-sync creates CRM contacts for any prospect not already there.
Launch a campaign and send invites
Launch flips status to running. The Send Queue is a scrollable list; pick a prospect, copy the note, open LinkedIn, paste, send, confirm via one of five buttons.
Check who accepted your invites
24h+ invites surface for confirmation on the dashboard. Same flow available inline on Recipients tab rows. Yes accepted, Still waiting, or Withdraw — all user-confirmed.
Pause, resume, edit, or delete a campaign
Pause / Resume on running campaigns. Edit on draft/scheduled/paused. Hard-delete only on draft or cancelled.