agentleFS
creatop-gtmcreatop-gtm/apollo-operator/.claude/skills/apollo-multichannel/SKILL.md

apollo-multichannel

Skill8 starsChanged 46 days agoMITView on GitHub

Optional layer on top of email: add LinkedIn, call, and manual steps to an Apollo sequence and work the task queue they create. Apollo automates email only; the rest are human tasks. Use to run multichannel outbound on Apollo.

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Not everything belongs in a sequence.

    line 66
  2. Distinctive:

    All of these are on MCP now.

    line 94
  3. Distinctive:

    Keep it short. The tool's own guidance is 25 to 85 words and one clear ask, which matches this library's copy rules.

    line 105
  4. Distinctive:

    Forgetting these are gated: If task-function steps error, it is your Apollo plan, not your setup.

    line 115

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Apollo Multichannel (Message, optional)

Email is the automated core of this library. This skill is the optional layer on top: add LinkedIn, call, and manual steps to a sequence, and work the task queue those steps create. It is opt-in on two levels. You do not have to add multichannel steps to a sequence, and you do not have to use this skill at all. A clean email-only sequence is a complete, valid campaign.

The one thing to be honest about

Apollo automates email only. Every non-email step is a task for a human to do, not something Apollo performs. A linkedin_step_message does not send a LinkedIn message; it drops a task in the rep's queue that says "send this message." A call step queues a call task. So multichannel here means "automated email plus a structured human task queue for LinkedIn and calls." Never tell the operator Apollo will send the LinkedIn touch or place the call. It queues the work; a person does it.

This is a feature, not a limitation, and it is the safer way to run LinkedIn. Because a person executes each LinkedIn touch from their own browser and logged-in profile, the action looks like normal human activity, not an API acting on your account while you are away. Tools that fully automate LinkedIn through the API carry real account-ban risk. The tradeoff is that the safety now depends on the human pacing themselves, because Apollo does not enforce a daily limit (see below).

Note: call and LinkedIn steps require an Apollo plan with task functions, so they may return a plan error. If they do, that capability is gated on your plan, and email-only still works.

Part A: add multichannel steps to a sequence

Multichannel steps go in the same apollo_sequences_create call as the email steps (see ../apollo-sequence-builder), you just use more step types. The step types:

Step typeWhat it isNeeds content?
auto_emailAutomated email (the core)Yes (emailer_touches)
manual_emailEmail the rep reviews and sendsYes (emailer_touches)
linkedin_step_view_profileSoft touch, just view the profileNo
linkedin_step_connectSend a connection requestYes (short note)
linkedin_step_messageMessage a 1st-degree connectionYes (message body)
linkedin_step_interact_postLike or comment on a recent postNo
callCall task, with a script in note and a priorityNo touch; use note
action_itemGeneric manual to-doNo

A sensible, non-annoying default cadence (relative wait_time, so Day 0/2/3/5/8):

  1. auto_email, wait 0
  2. linkedin_step_view_profile, wait 2 (warm the name before the next email)
  3. auto_email, wait 1
  4. linkedin_step_message, wait 2 (only fires if they connected; write it like a human)
  5. call, wait 3, priority: high, note = a two-line call script

Rules that carry over: still build the sequence active: false, still let a human activate it, still keep the email copy to the Message standard. LinkedIn and call steps do not change any of that.

LinkedIn safety: you set the daily cap, Apollo does not

Apollo queues LinkedIn tasks but does not throttle them. When a batch of linkedin_step_connect tasks comes due on the same day and you clear the whole queue in one sitting, you can fire dozens of connection requests in a few minutes, and that burst is exactly the pattern LinkedIn's automated defenses flag. Unlike dedicated LinkedIn tools, Apollo has no built-in cap to stop you, so the pacing is on the human working the queue.

The rule we run by, from experience:

  • Keep connection requests under 30 per day. 20 is the safer number, and the one to default to, especially on a newer account or one that has not sent invites at volume before. A well-established account can sit near 30; a fresh one should stay well under 20 and ramp up slowly over a few weeks, the same gradual-ramp logic as email warmup.
  • Spread the work across multiple days, never clear the whole LinkedIn queue in one day. This is the opposite of how you work calls or email. A steady trickle (a handful of connects a day, most days) reads as a real person using LinkedIn. Sitting down once and firing off a week's worth of invites in an afternoon is exactly the burst pattern LinkedIn's defenses look for, even if the total is modest. Consistency over days beats volume in a session.
  • The cap is on new connection requests specifically. Profile views, post interactions, and messages to people you are already connected to are lower risk, but do not turn those into their own blast either.

Practically, this means working linkedin_step_connect tasks as a small daily habit: sort the queue, clear only up to your daily number, and leave the rest for the following days rather than pushing to zero. If the connect tasks are piling up faster than 20 to 30 a day can clear them, the sequence is enrolling LinkedIn touches faster than a human can safely execute them, so slow the enrollment, do not raise the cap or binge the backlog.

Part B: work the task queue

The steps above (and any standalone tasks) create tasks a person clears each day. The tools:

  • See what is due: apollo_tasks_search with no status filter returns open (scheduled) tasks. Sort task_due_at ascending for soonest-first. Filter by task_type_cds (for example the four linkedin_step_* values for a LinkedIn block, or phone_call for a call block), by priority, by date_range, or by emailer_campaign_id to work one sequence's tasks.
  • Clear them: apollo_tasks_complete when done, apollo_tasks_skip when skipping, apollo_tasks_update to reschedule or re-prioritize.
  • Create work in bulk: apollo_tasks_bulk_create to drop a task on a whole segment, for example a call task on every High-priority lead who opened three times. Each task needs user_id (the assignee), type, and at least one association (contact_id, account_id, or opportunity_id). Put call scripts in note; put LinkedIn or email content in standalone_outreach_task_message. Before a call task is worked, check the number is not on a do-not-call registry: Apollo's DNC screening blocks flagged numbers in its own dialer, but a number called from a personal phone is not blocked. See compliance.md.

A good habit: batch by channel so you are not context-switching per lead, which is what makes multichannel feel like a slog. One caveat, and it matters: calls and manual emails are fine to work in a single focused sitting, but LinkedIn connection requests are not. Pace those across days per the cap above, never clear the whole LinkedIn queue in one session. So batch calls, but trickle LinkedIn. This slots into ../weekly-rhythm.

Part C: one-off emails (sending to a single person)

Not everything belongs in a sequence. A referral introduction, a reply to someone who reached out, a single high-value prospect worth a hand-written note, a follow-up after a call: these are one email to one person, and Apollo sends them properly.

apollo_emailer_messages_create   → drafts it (contact_id, subject, body_html)
apollo_emailer_messages_send_now → sends it (needs the sender mailbox)
apollo_emailer_messages_email_send_status → confirms delivery

On the CLI: apollo emails draft, apollo emails send (sends a real email), and apollo emails status.

Three reasons to send it through Apollo rather than from your own inbox:

  1. It is logged against the contact. The email becomes part of that person's record instead of disappearing into a personal sent folder, so the next person to touch the account can see it.
  2. It sends from a real mailbox you choose, with the same sending rules and pacing as everything else.
  3. You get a delivery answer. email_send_status returns completed or failed, and on failure gives not_sent_reason and failure_reason (bounce, quota, spam block).

Delivery is not opens: two different endpoints

These get conflated constantly, so be precise:

QuestionCallGives
Did it arrive?apollo_emailer_messages_email_send_statuscompleted / failed, plus not_sent_reason and failure_reason on failure
Did they open, click, or reply?apollo_emailer_messages_search with message ids (MCP), or apollo emails search --stats opened replied (CLI)Per-message opened, num_opens, clicked, replied, bounced, plus an event timeline
How is a whole sequence doing?apollo_emailer_messages_search with emailer_campaign_id and display_mode: "metadata_mode"The status counts the UI shows: sent, delivered, opened, clicked, replied, bounced, spam blocked
What have we sent them?apollo_emailer_messages_get_content (MCP)Subject and body of your own sent emails. Customer replies are not included, on any lane
What happened to this contact in a sequence?apollo_emailer_campaigns_activity_feed (MCP)Enrolled, paused, resumed, replied, finished, in order

All of these are on MCP now. Earlier versions of this table said opens and sent history were REST only; that changed.

And open tracking has a cost this library normally refuses to pay. It works by embedding a tracking pixel, which hurts deliverability and is increasingly stripped or pre-fetched by mail providers anyway, which makes the number unreliable as well as expensive. That is why cold campaigns here run with open_tracking: false.

So: delivery confirmation always, open tracking only when you deliberately accept the trade. For a warm one-off to someone expecting to hear from you, that trade is far more defensible than for a cold campaign. Never turn pixels on for cold just to get a nicer dashboard.

Practical notes:

  • contact_id is required, so the person must exist as a contact first. Enrich and create them (List) before you can email them.
  • You can override recipients to add cc, bcc, or send to a non-contact address, while the message stays attached to the contact record. Useful for looping in a colleague on an intro.
  • The draft-then-send split exists so a human can approve. If the operator has already confirmed recipient, subject, and body, run both calls back to back; from their side it is one action.
  • Keep it short. The tool's own guidance is 25 to 85 words and one clear ask, which matches this library's copy rules.

This still sends a real email. Same rule as everything else: show recipient, subject, and body, and wait for an explicit yes.

Common mistakes

  • Saying Apollo "sends" the LinkedIn message or "makes" the call. It queues a task. A human acts.
  • Turning every lead into a five-channel gauntlet. Reserve calls and LinkedIn for High-priority leads (from List scoring or a signal match). Blanket multichannel is just more noise, faster.
  • Clearing the LinkedIn queue in one sitting. Apollo does not cap invites, so you have to. Keep new connection requests under 30 a day, 20 to be safe, and trickle them across days. A week's invites fired off in one afternoon is the exact burst LinkedIn flags.
  • A task with no association. contact_id, account_id, or opportunity_id is required, or the create fails.
  • Forgetting these are gated. If task-function steps error, it is your Apollo plan, not your setup. Fall back to email-only.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.