linkedin-followup

Manage 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).

Safety Notice

This item is sourced from the public archived skills repository. Treat as untrusted until reviewed.

Copy this and send it to your AI assistant to learn

Install skill "linkedin-followup" with this command: npx skills add 10madh/linkedin-followup

linkedin-followup

Manage 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.


Pre-flight Checklist

Before doing anything:

  1. Sheet ID — Confirm the CRM sheet ID (from linkedin-dm setup). Default: 1eEZDGcr1dIbSC782mNkxvD7pVrF8rOFySWCVZ1RXkhM, tab: Sheet1 (or Outreach if renamed).
  2. gog auth — Run gog auth list. If no tokens: see gog auth setup below.
  3. Browser — Open the openclaw browser profile and confirm LinkedIn is logged in. Navigate to /feed/ first.
  4. Mode — Identify which mode the user wants (see Modes).

Sheet Schema

The CRM sheet uses these columns (A–P):

ColFieldNotes
ADate SentISO date
BPerson NameFull name
CRole / Title
DCompany
ELinkedIn URLProfile URL
FRelationship HookHook used in opener
GOpener SentMessage 1 text
HPitch SentMessage 2 text
ICampaignBatch label
JStatusCurrent pipeline stage
KNotesContext and history
LLast UpdatedISO timestamp
MLast Reply DateWhen they last replied
NLast Reply (preview)First 200 chars of their last reply
OConversation LogFull thread (see format below)
PNext ActionWhat to do next (agent or human)

Status values: SentRepliedCall ScheduledDemo DoneFollow Up SentNo ResponseClosed WonClosed 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

Modes

Mode 1 — Quick Status Update

User says: "Mark Rishabh as Replied" or "Rishabh got back to me, he's interested"

  1. Find the row — Search the sheet for the person:

    gog sheets get <SHEET_ID> "Sheet1!A:P" --json
    

    Match by name (col B) or LinkedIn URL (col E). Get the row number.

  2. Update status (col J) and last updated (col L):

    gog sheets update <SHEET_ID> "Sheet1!J<ROW>:L<ROW>" \
      --values-json '[["Replied","","<ISO_TIMESTAMP>"]]' \
      --input USER_ENTERED
    
  3. If the user provides reply content, also update:

    • Col M: Last Reply Date
    • Col N: Last Reply preview (first 200 chars)
    • Col O: Append to Conversation Log
    • Col P: Next Action (what should happen next)
  4. Confirm update to user.


Mode 2 — Full Follow-up (Read + Draft + Send)

User says: "Follow up with Rishabh" or "Send a follow-up to everyone who replied"

Step 1 — Load the person's data from sheet

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.

Step 2 — Navigate to their LinkedIn profile

Always go to feed first (anti-detection):

https://www.linkedin.com/feed/

Wait 2–4 seconds. Then navigate to their profile URL (col E).

Step 3 — Open message thread and read conversation

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.

Step 4 — Analyse the conversation

With the full thread loaded + their profile data, determine:

  • What did they say last? — Identify the most recent message from them.
  • What's the intent? — Interested / wants more info / asked a question / cold / objection / not interested.
  • What's the right next message? — See Response Playbook below.
  • Tone — Mirror their tone (casual vs formal, brief vs detailed).

Step 5 — Draft the follow-up

Write a response that:

  • Directly addresses what they said last
  • Doesn't re-pitch unless they asked for it
  • Moves toward a specific action (demo, call, intro, forward to team)
  • Is brief — 2–4 sentences max
  • Feels human, not templated

Show the draft to the user and ask for approval before sending:

Draft reply to [Name]: [message]

Send this? (y / edit / skip)

Step 6 — Send the message

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.

Step 7 — Update the sheet

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

Mode 3 — Batch Review

User says: "Who needs a follow-up?" or "Check my outreach"

  1. Load all rows from the sheet.
  2. Filter by status and time:
    • Sent older than 3 days → candidate for "No Response" or gentle follow-up
    • Replied → needs a response
    • Follow Up Sent older than 5 days → consider "No Response"
    • Call Scheduled → check if call happened, update status
  3. Present a table of candidates:
    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)
    
  4. User picks who to action, then enter Mode 2 for each.

Response Playbook

Use these as a guide — always adapt to the actual conversation:

They saidIntentYour move
"Sounds interesting, tell me more"CuriousShort explanation + offer a specific demo slot
"How does it work?"Exploring2-line description + invite to a 15-min call
"We already use [X]"ObjectionAcknowledge, explain differentiation, offer demo
"Send me more details"Soft interestShare a Loom/deck/link + follow up in 2 days
"Not relevant right now"Soft noRespect it, leave door open: "No worries, I'll ping you in a few months"
"Who else is using it?"Trust-buildingShare a relevant use case, offer intro to a user
[No reply in 4 days]SilenceLight nudge: "Hey [Name], just checking — any thoughts?"
[No reply in 8 days]ColdOne final message, then mark No Response

Anti-Detection Rules

Same rules as linkedin-dm:

  • Always go to /feed/ before navigating to a profile
  • Wait 2–4 seconds after loading feed
  • Max 15–20 messages per session (combined sends across follow-ups)
  • Space out follow-ups: don't ping multiple people in rapid succession
  • Natural delays between typing and sending (1–2 seconds)

gog Auth Setup

If gog auth list returns empty, the user needs to set up Google OAuth credentials:

  1. Go to console.cloud.google.com
  2. Create a project (or select existing)
  3. Enable Google Sheets API (APIs & Services → Library)
  4. Create OAuth credentials: APIs & Services → Credentials → Create → OAuth client ID → Desktop App
  5. Download client_secret_<id>.json
  6. Run:
    gog auth credentials set /path/to/client_secret.json
    gog auth add your@gmail.com --services sheets
    
  7. A browser window will open — log in and grant access
  8. Verify: gog auth list

Fallback (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.


Session Limits

  • Max 15–20 follow-up messages per session
  • Log every send immediately to sheet (don't batch)
  • If gog is unavailable, log to local linkedin_followup_log.json and sync to sheet next session

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

axure-prototype-generator

Axure 原型代码生成器 - 输出 JavaScript 格式 HTML 代码,支持内联框架直接加载可交互原型。

Archived SourceRecently Updated
General

错敏信息检测

# 错敏检测 Skill

Archived SourceRecently Updated
General

TikTok B2B 引流台词生成器

# TikTok B2B 引流台词生成器 ## 技能描述 本 Skill 可根据您提供的产品信息和公司背景,自动生成适合 TikTok 平台的 B2B 引流视频脚本(20-50 秒),`skill.json` 文件中包含了输入参数的结构、输出格式以及用于生成台词的提示模板。脚本遵循已验证的外贸引流规律: - **真人出镜**:以第一人称(如 Anna)拉近距离 - **产品细节**:材质、颜色、MOQ、定制服务等 - **公司实力**:经验年限、自有工厂、认证等 - **客户背书**:提及已有市场国家(如巴基斯坦、埃及) - **互动引导**:清晰号召观众联系,引导至指定服务网址 支持三种风格:普通、幽默、惊喜,让您的视频内容更加多样化。 ## 输入参数 | 参数名 | 类型 | 必填 | 描述 | 示例 | |---------------------|----------|------|--------------------------------|--------------------------| | product_type | string | 是 | 产品类型 | 男士休闲鞋 | | material | string | 是 | 主要材质 | 优质 PU 皮革 | | colors | array | 是 | 颜色列表 | ["黑色","白色","棕色"] | | moq | string | 是 | 最小起订量 | 120 双(可混 2-3 色) | | customization | string | 否 | 可定制内容 | 可定制 logo | | target_markets | array | 是 | 主要市场国家 | ["巴基斯坦","埃及"] | | company_experience | string | 否 | 公司经验年数 | 15 年 | | factory_own | boolean | 否 | 是否自有工厂 | true | | extra_features | string | 否 | 其他亮点 | 免费样品 | | contact_url | string | 否 | 服务联系网址 | http://www.doumaotong.com | | style | string | 否 | 风格(普通/幽默/惊喜) | 普通 | ## 输出示例 Hi guys, this is Anna! Welcome to my showroom. Today I'm excited to show you our latest men's casual shoes – made of high-quality PU leather, very durable and comfortable. We have three colors available: black, white, and brown. MOQ is 120 pairs, and you can mix 2-3 colors. Plus, we can customize your logo on the shoes. Our shoes are already loved by customers in Pakistan, Egypt, and South Africa. With 15 years of experience and our own factory, we guarantee quality and timely delivery. We even offer free samples! If you're interested, please visit http://www.doumaotong.com to contact us. Thank you! ## 使用说明 1. 在 OpenClaw 平台安装此 Skill。 2. 调用时填写产品参数,包括 `contact_url`(默认为 http://www.doumaotong.com),即可获得定制化的 TikTok 脚本。 3. 生成的台词会在结尾处自然引导观众访问指定的服务网站。 4. 可根据实际需要调整 `style` 参数,生成不同语气的台词。 ## 文件说明 - `skill.json`:技能的机器可读定义,包含输入输出 schema 和生成提示模板。 - `SKILL.md`:技能的人类可读文档,提供详细说明和使用示例。

Archived SourceRecently Updated
General

instructional-design-cn

培训课程大纲设计、效果评估、内部分享材料生成

Archived SourceRecently Updated