Content · Claude Code skill

Unipile Outreach skill and the Yalc Framework

The canonical Yalc skill for LinkedIn and email outreach. Wraps the Unipile API as 9 high level verbs Claude can compose without ever touching HTTP.

Yalc Fit Score
10/10
License
MIT (Yalc)
Channels
LinkedIn + email
Verbs
9 CLI ops
Last reviewed
2026-04-29
Trigger phrases

Say this to fire the Unipile Outreach skill

Any of these natural language phrases activates the skill inside Claude Code.

connect my LinkedIn
connect email
send LinkedIn message to <name>
send connection request to <profile URL>
send email to <recipient>
LinkedIn outreach for <list>
outreach to these leads
message these people on LinkedIn
LinkedIn search for <criteria>
look up LinkedIn profile <slug>
check outreach accounts
Unipile status
What it does

Unipile Outreach, plainly

The Unipile Outreach skill is a thin wrapper around our Unipile CLI at `~/bin/unipile/cli.mjs`, exposing 9 verbs to Claude Code: status, accounts, connect, send-message, send-connection, send-email, search-linkedin, profile, company. Combined, these cover every LinkedIn or email action a GTM operator runs in a day.

For Yalc workflows, this is the message layer. Where Crustdata supplies the audience and Claude drafts the copy, Unipile Outreach actually sends. The skill handles the friction (account auth, provider_id resolution, dry runs) so the operator can stay in the conversation instead of context switching to a CLI or web app.

Where it slots in

Position in the GTM operating system

Intake
Enrich
Score
Route
Draft
Send
Listen

The Unipile Outreach skill sits at the **send** node for both LinkedIn and email. It also doubles as a discovery node when you use `search-linkedin` or `profile` for last mile lookups before send.

The skill assumes upstream work is done: you have an account list, you've drafted the message, you know who to send to. The skill handles the act of sending. That's the right abstraction for a Yalc workflow because it lets Claude orchestrate the higher level decision (who, what, when) while delegating the wire to a battle tested verb.

The Yalc Framework

Running the Unipile Outreach skill end to end

Workflow position

The send and last mile discovery node. Yalc invokes this skill when it's time to actually contact a person on LinkedIn or via email. The skill returns structured JSON Yalc writes back to Notion or HubSpot.

Required inputs

  • → A connected Unipile account (LinkedIn or Gmail or Outlook). First run goes through Hosted Auth.
  • → For LinkedIn messaging, the recipient's LinkedIn provider_id (resolved from a profile URL via the `profile` verb).
  • → For email, a list of recipient emails plus subject and HTML body.
  • → For connection requests, the target's provider_id and an optional personalized note.

Outputs

  • → JSON object with send confirmation (message_id, recipient, channel, dry run flag).
  • → For search verbs, a list of profiles or companies with IDs, names, headlines, locations.
  • → For profile lookups, full LinkedIn data including the critical `provider_id` for downstream messaging.

Chaining recommendations

UpstreamCrustdata MCP (find LinkedIn slugs) → Unipile Outreach (resolve provider_id and send)
DownstreamUnipile Outreach reply or connection accept → Notion (CRM writeback) → next sequence step

Anti patterns to avoid

Don't message a recipient without first resolving their `provider_id` via the `profile` verb. LinkedIn's API rejects sends to bare URLs and Yalc skill enforces the lookup.
Don't skip `--dry-run` on the first send of any new sequence. Yalc workflows always dry run once, then send for real on confirmation.
Don't run `send-connection` to more than 30 to 40 invites per LinkedIn account per day. Behavioral fingerprinting flags clusters even when the API allows the volume.
Operator take

Pros, cons, who it's for

Pros

  • 9 high level verbs cover the full GTM messaging surface in one skill
  • LinkedIn and email in one tool. No context switch between Salesforce Sales Cloud, Sales Nav, Apollo, etc.
  • `--dry-run` flag on every send verb. Yalc workflows enforce dry first, then live.
  • Hosted Auth for account connection. The skill never sees credentials directly.
  • Battle tested across dozens of Earleads client campaigns since March 2026.

Cons

  • Requires UNIPILE_DSN env var which rotates occasionally. One env update each rotation.
  • LinkedIn behavior is governed by LinkedIn's TOS. No skill eliminates account risk.
  • First `connect` run requires the user to open a Hosted Auth URL in their browser. Not headless.
  • Single account per workspace. Multi sender campaigns require the HeyReach skill instead.

Who it's for

  • Solo Yalc operators running 1 to 4 LinkedIn or email accounts
  • Agency AMs running outreach for clients with one connected account per client
  • GTM engineers building event triggered outbound (skill wraps the message verb cleanly)
Dependencies

What this skill expects to find

Environment variables

Requires the Unipile CLI at `~/bin/unipile/cli.mjs`. The skill assumes Node 18+ and at least one connected Unipile account. First run through `status` verifies both env vars and the DSN's reachability.

Related

The Unipile Outreach ecosystem inside Yalc

Alternatives

Skills that overlap

FAQ

Frequently asked

How is this skill different from the Unipile MCP?

The skill is opinionated. It exposes 9 high level verbs (`send-message`, `send-connection`, etc.) with built in dry run, provider_id resolution, and Notion writeback hooks. The MCP exposes the raw Unipile API surface. For Yalc workflows the skill is the right abstraction; for one off scripts the MCP is fine.

Can I run this skill without setting UNIPILE_DSN?

No. The DSN is part of how the API call is signed. The CLI returns a clear error if either env var is missing. Yalc's `gtm-os` env file template includes both placeholders.

How do I add a new LinkedIn account to the skill?

Run `connect LINKEDIN`. The skill returns a Hosted Auth URL that expires in 15 minutes. Open it in a browser, authenticate, return to Claude Code. Verify with `accounts` to confirm `OK` status.

Does the skill handle replies?

The send verbs handle send. For inbox listening, pair with the planned Unipile webhook receiver skill (or the Unipile MCP `list-messages` verb). The send and listen layers are deliberately separate.

What happens if I send too fast on LinkedIn?

LinkedIn flags behavioral patterns regardless of which API you use. The skill's per account daily limits respect LinkedIn's. The risk is when you push above what a human could plausibly do (60+ invites, 100+ messages per day per account). Stay within human plausible volume.

Does the skill work for both classic LinkedIn and Sales Navigator?

Yes. The `search-linkedin` verb supports `--api classic|sales_navigator|recruiter`. If your connected account has Sales Nav, the skill can run Sales Nav searches.

Get the Unipile Outreach skill

Clone the Yalc skill set, drop in your env, run from your next Claude Code session.

gh repo clone Othmane-Khadri/YALC-the-GTM-operating-system && cp -r YALC-the-GTM-operating-system/.claude/skills/unipile-outreach ./.claude/skills/