LinkedIn Outreach Platform Agentic Workflow
Draft Message Reply — LinkedIn Outreach Platform Agentic Workflow
Extracts conversation context and drafts a reply using LLM, placing it in the message box
sidebutton install linkedin Operating inside an open LinkedIn messaging thread, this chain extracts the full conversation history, the other party's profile summary, and any context snippets provided by the caller. It hands that material to an LLM step, which produces a reply in the operator's voice, and then places the draft directly into LinkedIn's message box — ready for a human to review before sending.
The workflow never sends the reply automatically; it only drafts. Use it when a sales or outreach agent is triaging a heavy inbox and wants a fast first pass, while keeping the final send under human control.
Steps
- 1. Wait
- selector
- .msg-s-message-list-content
- timeout
- 5000
browser.wait - 2. browser injectCSS
- id
- sb-draft-feedback
- css
- |
browser.injectCSS - 3. browser extractAll
- selector
- li.msg-s-message-list__event
- as
- messages
- separator
- \n---\n
browser.extractAll - 4. Extract text from a selector
- selector
- .msg-entity-lockup__entity-title, .msg-overlay-conversation-bubble__title span
- as
- participant_name
browser.extract - 5. llm generate
- prompt
- |
- as
- draft
llm.generate - 6. browser injectCSS
- id
- sb-draft-feedback
- css
- |
browser.injectCSS - 7. Click an element
- selector
- .msg-form__contenteditable
browser.click - 8. Type into a field
- selector
- .msg-form__contenteditable
- text
- {{draft}}\n\n---\nSent from sidebutton.com
browser.type
Workflow definition
schema_version: 1
version: "1.2.0"
last_verified: "2026-02-27"
id: linkedin_draft_reply
title: "Draft Message Reply"
description: "Extracts conversation context and drafts a reply using LLM, placing it in the message box"
overview: |
Operating inside an open LinkedIn messaging thread, this chain extracts the full conversation history, the other party's profile summary, and any context snippets provided by the caller. It hands that material to an LLM step, which produces a reply in the operator's voice, and then places the draft directly into LinkedIn's message box — ready for a human to review before sending.
The workflow never sends the reply automatically; it only drafts. Use it when a sales or outreach agent is triaging a heavy inbox and wants a fast first pass, while keeping the final send under human control.
category:
level: task
domain: sales
reusable: true
params:
instructions: string
policies:
allowed_domains:
- "*.linkedin.com"
embed:
selector: ".msg-form__msg-content-container"
position: append
when: ".msg-s-message-list-content"
label: "Draft Reply"
prompt:
param: instructions
placeholder: "e.g. be formal and decline, suggest a call"
title: "Draft Reply"
param_map:
instructions: "{{instructions}}"
result:
action: "none"
steps:
# Wait for conversation to be loaded
- type: browser.wait
selector: ".msg-s-message-list-content"
timeout: 5000
# Visual feedback: pulsing border on compose container while AI works
- type: browser.injectCSS
id: sb-draft-feedback
css: |
@keyframes sb-pulse {
0%, 100% { box-shadow: inset 0 0 0 2px rgba(21, 195, 154, 0.3); }
50% { box-shadow: inset 0 0 0 4px rgba(21, 195, 154, 0.8); }
}
.msg-form__contenteditable {
animation: sb-pulse 1.5s ease-in-out infinite !important;
border-radius: 8px !important;
}
# Extract recent messages from conversation
- type: browser.extractAll
selector: "li.msg-s-message-list__event"
as: messages
separator: "\n---\n"
# Extract participant name
- type: browser.extract
selector: ".msg-entity-lockup__entity-title, .msg-overlay-conversation-bubble__title span"
as: participant_name
# Generate draft reply
- type: llm.generate
prompt: |
You are drafting a LinkedIn reply. Be professional, warm, and concise.
Conversation with {{participant_name}}:
{{messages}}
User instructions: {{instructions}}
Write a thoughtful reply that:
- Responds directly to the most recent message
- Keeps a professional but friendly tone
- Is concise (2-4 sentences max)
- Doesn't include greeting like "Hi [name]" if already established
- Follows any user instructions above if provided
Return ONLY the message text, no quotes or formatting.
as: draft
# Remove visual feedback
- type: browser.injectCSS
id: sb-draft-feedback
css: |
.msg-form__contenteditable {
box-shadow: none !important;
animation: none !important;
}
# Type the draft into the message box
- type: browser.click
selector: ".msg-form__contenteditable"
- type: browser.type
selector: ".msg-form__contenteditable"
text: "{{draft}}\n\n---\nSent from sidebutton.com"