Install
$ agentstack add skill-keinsaasforever-gtm-pipeline-skills-gtm-outreach ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
LinkedIn Outreach
Execute LinkedIn connection requests and personalized messages/InMails via PhantomBuster agents.
Read these files before executing:
~/.claude/skills/gtm-pipeline/_shared/conventions.md~/.claude/skills/gtm-pipeline/_shared/phantombuster.md
When to Use
- Contacts are enriched and ready for LinkedIn outreach
- You want to send connection requests and/or InMails from a CSV
- You want to put outreach on a paced loop (every N minutes)
Inputs
| Input | Required | Source | |-------|----------|--------| | Contacts CSV | Yes | People enrichment output or user-provided | | linkedin_profile_url column | Yes | Must be present | | linkedinMessage column | For messaging | Pre-generated by n8n message_agent or manually written | | inmailSubject column | For InMail | Pre-generated or user-provided |
If linkedinMessage / inmailSubject are missing, ask the user whether to generate them or use a single shared template message.
Agents
| Phase | Phantom Script | Local Config Key | |-------|---------------|-----------------| | 1 — Connection request | LinkedIn Auto Connect | PB_AGENT_CONNECT | | 2 — Message / InMail | Sales Navigator Message Sender | PB_AGENT_MESSAGE |
Agent IDs are account-specific. Resolve via _shared/local.md (preferred) or PhantomBuster MCP (PHANTOMBUSTER_GET_AGENTS_FETCH_ALL → match by script name). See _shared/phantombuster.md.
Execution
Step 1: Inspect the CSV
Read 3–5 rows. Confirm:
linkedin_profile_urlpresent and not emptylinkedinMessageandinmailSubjectpresent if Phase 2 is needed- Total row count
- Ask the user: run Phase 1 (connect), Phase 2 (message), or both?
Step 2: Generate scripts
Generate one Python script per phase, saved in the same directory as the CSV. Follow the script template in _shared/phantombuster.md exactly.
Script names:
pb_connect.py— connection requestspb_message.py— messages / InMails
State files (auto-created alongside scripts):
pb_connect_state.jsonpb_message_state.json
Use the argument templates from _shared/phantombuster.md. Do not save to the agent config permanently — always use the one-off argument override in the launch body.
Step 3: Test run each script
python3 "/pb_connect.py"
python3 "/pb_message.py"
Show full agent output. Look for:
✅ Connected successfully as [Your LinkedIn Name]— auth working- Profile name in output — correct profile targeted
✅ 1 profile has been processed— success
If the output shows a type error (numberOfAddsPerLaunch => is the wrong type), the argument JSON has string values where booleans/ints are needed. Fix by ensuring json.dumps() is used on the argument dict.
Step 4: Suggest loop commands
After successful test runs, show the user:
✅ Both scripts tested successfully.
To process one profile every 20 minutes (10am–6pm Berlin time):
Phase 1 (connect):
/loop 20m python3 "/pb_connect.py"
Phase 2 (message) — run after connections are accepted (typically 1–3 days):
/loop 20m python3 "/pb_message.py"
Or run either script again immediately:
python3 "/pb_connect.py"
State is tracked in pb_connect_state.json and pb_message_state.json —
each script picks up where it left off. Scripts exit cleanly when all profiles are done.
Rate Limit Guidance
| Agent | Safe Rate | Notes | |-------|-----------|-------| | LinkedIn Auto Connect | 1 per run, max ~14/day | 100/week LinkedIn hard limit. Pacing: every 20–30 min | | Sales Navigator Message Sender | 1–3 per run | InMail credits apply for 3rd-degree / non-connections |
Example throughput: 43 contacts × 1/run × 20 min interval = ~24 runs/day (10am–6pm) → all connected in ~2 days.
Output
Append to run_log.md per conventions:
## Run Summary — outreach — {timestamp}
- Phase: {connect | message | both}
- Records in CSV: {total}
- Already processed: {done_count}
- Remaining: {total - done_count}
- Scripts: {paths}
- Loop commands: shown above
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: keinsaasforever
- Source: keinsaasforever/gtm-pipeline-skills
- License: MIT
- Homepage: https://www.keinsaas.com/de/research-agent
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.