agentsclimarketplace

Gtm outreach

Skill vivekkhimani/gtm-tools-template/.agents/skills/gtm-outreach

Agent-first GTM operating manual template: positioning, lead pipeline, outreach, playbooks, investor materials + 22 agent skills

Install
npx -y skills add vivekkhimani/gtm-tools-template --skill gtm-outreach

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Execute LinkedIn outreach — send connection requests and personalized messages/InMails to a contact list via PhantomBuster, one profile at a time on a timed loop. Use after people-enrichment when contacts are ready for outreach. Also triggers on "linkedin outreach", "send connection requests", "connect with leads on linkedin", "send linkedin messages", "send inmails", "start outreach", "launch outreach campaign", "put contacts on outreach".

SKILL.md

4.5 KB, as published. Nobody here has run it

LinkedIn Outreach

Execute LinkedIn connection requests and personalized messages/InMails via PhantomBuster agents.

Read these files before executing:

  • .agents/skills/_shared/conventions.md
  • .agents/skills/_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

InputRequiredSource
Contacts CSVYesPeople enrichment output or user-provided
linkedin_profile_url columnYesMust be present
linkedinMessage columnFor messagingPre-generated by n8n message_agent or manually written
inmailSubject columnFor InMailPre-generated or user-provided

If linkedinMessage / inmailSubject are missing, ask the user whether to generate them or use a single shared template message.


Agents

PhasePhantom ScriptLocal Config Key
1 — Connection requestLinkedIn Auto ConnectPB_AGENT_CONNECT
2 — Message / InMailSales Navigator Message SenderPB_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_url present and not empty
  • linkedinMessage and inmailSubject present 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 requests
  • pb_message.py — messages / InMails

State files (auto-created alongside scripts):

  • pb_connect_state.json
  • pb_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 "<path>/pb_connect.py"
python3 "<path>/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 "<path>/pb_connect.py"

  Phase 2 (message) — run after connections are accepted (typically 1–3 days):
  /loop 20m python3 "<path>/pb_message.py"

Or run either script again immediately:
  python3 "<path>/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

AgentSafe RateNotes
LinkedIn Auto Connect1 per run, max ~14/day100/week LinkedIn hard limit. Pacing: every 20–30 min
Sales Navigator Message Sender1–3 per runInMail 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

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.