linkedin-followupManage LinkedIn outreach leads from Google Sheets — search by name, read live conversation threads, update status, and send contextual follow-up messages. Use after linkedin-dm to move leads through the pipeline (Sent → Replied → Call Scheduled → Demo Done → Closed).
Install via ClawdBot CLI:
clawdbot install 10Madh/linkedin-followupManage ongoing LinkedIn conversations from a central Google Sheet CRM. Read threads, draft context-aware replies, send messages, and keep the sheet updated — all from one skill.
Before doing anything:
linkedin-dm setup). Default: 1eEZDGcr1dIbSC782mNkxvD7pVrF8rOFySWCVZ1RXkhM, tab: Sheet1 (or Outreach if renamed).gog auth list. If no tokens: see gog auth setup below./feed/ first.The CRM sheet uses these columns (A–P):
| Col | Field | Notes |
|---|---|---|
| A | Date Sent | ISO date |
| B | Person Name | Full name |
| C | Role / Title | |
| D | Company | |
| E | LinkedIn URL | Profile URL |
| F | Relationship Hook | Hook used in opener |
| G | Opener Sent | Message 1 text |
| H | Pitch Sent | Message 2 text |
| I | Campaign | Batch label |
| J | Status | Current pipeline stage |
| K | Notes | Context and history |
| L | Last Updated | ISO timestamp |
| M | Last Reply Date | When they last replied |
| N | Last Reply (preview) | First 200 chars of their last reply |
| O | Conversation Log | Full thread (see format below) |
| P | Next Action | What to do next (agent or human) |
Status values:
Sent → Replied → Call Scheduled → Demo Done → Follow Up Sent → No Response → Closed Won → Closed Lost
Conversation Log format (column O):
[2026-02-13 17:05 SENT] Hey Rishabh, we both had stints at CRED...
[2026-02-13 17:05 SENT] I'm building an AI calling agent...
[2026-02-15 09:30 RECEIVED] Hey! Sounds interesting, tell me more.
[2026-02-15 09:45 SENT] Happy to show you a live demo — are you free Thursday?
If columns M–P don't exist yet, add them first:
gog sheets update <SHEET_ID> "Sheet1!M1:P1" \
--values-json '[["Last Reply Date","Last Reply (preview)","Conversation Log","Next Action"]]' \
--input USER_ENTERED
User says: "Mark Rishabh as Replied" or "Rishabh got back to me, he's interested"
gog sheets get <SHEET_ID> "Sheet1!A:P" --json
Match by name (col B) or LinkedIn URL (col E). Get the row number.
gog sheets update <SHEET_ID> "Sheet1!J<ROW>:L<ROW>" \
--values-json '[["Replied","","<ISO_TIMESTAMP>"]]' \
--input USER_ENTERED
User says: "Follow up with Rishabh" or "Send a follow-up to everyone who replied"
gog sheets get <SHEET_ID> "Sheet1!A:P" --json
Find their row. Load: Name, Company, Role, LinkedIn URL, Opener Sent, Pitch Sent, Status, Notes, Conversation Log, Next Action.
Always go to feed first (anti-detection):
https://www.linkedin.com/feed/
Wait 2–4 seconds. Then navigate to their profile URL (col E).
Click the Message button on their profile. Wait for the conversation bubble to load.
Scrape the full thread with JavaScript:
const events = Array.from(document.querySelectorAll('.msg-s-message-list__event'));
const messages = [];
events.forEach(el => {
const groups = el.querySelectorAll('.msg-s-event-listitem');
groups.forEach(g => {
const nameEl = g.closest('.msg-s-message-group')?.querySelector('.msg-s-message-group__profile-link');
const bodyEl = g.querySelector('.msg-s-event-listitem__body');
const timeEl = g.closest('.msg-s-message-group')?.querySelector('.msg-s-message-group__timestamp');
if (bodyEl?.textContent?.trim()) {
messages.push({
sender: nameEl?.textContent?.trim() || 'unknown',
time: timeEl?.textContent?.trim() || '',
text: bodyEl.textContent.trim()
});
}
});
});
return JSON.stringify(messages);
If the thread is empty or not loading, scroll up in the conversation bubble to load older messages.
With the full thread loaded + their profile data, determine:
Write a response that:
Show the draft to the user and ask for approval before sending:
Draft reply to [Name]:
[message]
>
Send this? (y / edit / skip)
Same JS evaluate method as linkedin-dm:
const active = document.querySelector('.msg-overlay-conversation-bubble--is-active .msg-form__contenteditable');
if (active) { active.focus(); document.execCommand('insertText', false, '<message>'); }
Then find and click Send.
After sending:
gog sheets update <SHEET_ID> "Sheet1!J<ROW>:P<ROW>" \
--values-json '[["<new_status>","<last_reply_date>","<last_reply_preview>","<updated_conversation_log>","<next_action>","<ISO_TIMESTAMP>"]]' \
--input USER_ENTERED
User says: "Who needs a follow-up?" or "Check my outreach"
Sent older than 3 days → candidate for "No Response" or gentle follow-upReplied → needs a responseFollow Up Sent older than 5 days → consider "No Response"Call Scheduled → check if call happened, update status
Name Status Last Updated Suggested Action
Rishabh Nayan Replied 2026-02-14 Reply to their message
Shorya Saini Sent 2026-02-10 Follow-up nudge (4 days)
Shantam Mohata Sent 2026-02-13 Too soon (today)
Use these as a guide — always adapt to the actual conversation:
| They said | Intent | Your move |
|---|---|---|
| "Sounds interesting, tell me more" | Curious | Short explanation + offer a specific demo slot |
| "How does it work?" | Exploring | 2-line description + invite to a 15-min call |
| "We already use [X]" | Objection | Acknowledge, explain differentiation, offer demo |
| "Send me more details" | Soft interest | Share a Loom/deck/link + follow up in 2 days |
| "Not relevant right now" | Soft no | Respect it, leave door open: "No worries, I'll ping you in a few months" |
| "Who else is using it?" | Trust-building | Share a relevant use case, offer intro to a user |
| [No reply in 4 days] | Silence | Light nudge: "Hey [Name], just checking — any thoughts?" |
| [No reply in 8 days] | Cold | One final message, then mark No Response |
Same rules as linkedin-dm:
/feed/ before navigating to a profileIf gog auth list returns empty, the user needs to set up Google OAuth credentials:
client_secret_.json
gog auth credentials set /path/to/client_secret.json
gog auth add your@gmail.com --services sheets
gog auth listFallback (no gog): All sheet reads/writes can be done manually via browser — open the sheet in the openclaw browser and update cells directly. Less automated but functional.
linkedin_followup_log.json and sync to sheet next sessionGenerated Mar 1, 2026
A sales team uses this skill to manage leads from initial LinkedIn outreach to closing deals, tracking conversation history and updating CRM statuses automatically. It helps sales reps follow up promptly based on the latest replies, ensuring no leads fall through the cracks in a fast-paced environment.
Recruiters leverage this skill to maintain ongoing conversations with potential candidates sourced via LinkedIn, updating their interest levels and scheduling interviews directly from a centralized sheet. It streamlines candidate pipeline management by automating follow-ups and logging interactions for future reference.
Founders use this skill to nurture relationships with investors, advisors, and partners after initial LinkedIn connections, keeping track of discussions and sending personalized follow-ups. It aids in moving contacts through engagement stages, from initial interest to scheduled meetings or collaborations.
Marketing professionals employ this skill to manage outreach campaigns for potential clients, analyzing responses and sending tailored follow-up messages to convert leads into sales calls. It integrates with Google Sheets to monitor campaign performance and adjust strategies based on real-time feedback.
Freelancers utilize this skill to handle inquiries from LinkedIn prospects, updating project statuses and sending follow-ups to secure contracts. It helps solo professionals stay organized by automating conversation logging and ensuring timely responses to maintain client interest.
This skill can be packaged as part of a subscription service for sales teams, offering automated LinkedIn follow-up features integrated with Google Sheets. Revenue is generated through monthly or annual fees based on user tiers, with additional charges for advanced analytics or custom integrations.
Marketing or sales agencies incorporate this skill as a premium service for clients, managing their LinkedIn outreach campaigns with automated follow-ups and reporting. Revenue comes from service fees charged per campaign or as a retainer, leveraging the skill to increase client conversion rates and efficiency.
This skill is offered in a freemium productivity app for professionals, with basic follow-up features free and advanced modes like bulk sending or AI-driven response drafting behind a paywall. Revenue is generated through in-app purchases or premium subscriptions, targeting individual users and small teams.
💬 Integration Tip
Ensure Google Sheets is properly configured with the required columns and that the gog tool is authenticated before use to avoid errors during data retrieval and updates.
Fetch and read transcripts from YouTube videos. Use when you need to summarize a video, answer questions about its content, or extract information from it.
Fetch and summarize YouTube video transcripts. Use when asked to summarize, transcribe, or extract content from YouTube videos. Handles transcript fetching via residential IP proxy to bypass YouTube's cloud IP blocks.
Browse, search, post, and moderate Reddit. Read-only works without auth; posting/moderation requires OAuth setup.
Interact with Twitter/X — read tweets, search, post, like, retweet, and manage your timeline.
LinkedIn automation via browser relay or cookies for messaging, profile viewing, and network actions.
Search YouTube videos, get channel info, fetch video details and transcripts using YouTube Data API v3 via MCP server or yt-dlp fallback.