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.
In this repository39 other files it gives its agents.
- account-based-outboundSkill
- apollo-account-auditSkill
- apollo-deliverabilitySkill
- apollo-go-liveSkill
- apollo-icp-builderSkill
- apollo-list-builderSkill
- apollo-operatorSkill
- apollo-sequence-builderSkill
- apollo-signalsSkill
- business-briefSkill
- campaign-reportingSkill
- experiment-designSkill
- list-quality-scorecardSkill
- operator-contextSkill
- positive-reply-scoringSkill
- re-engagementSkill
- sending-infrastructureSkill
- sequence-reviewerSkill
- weekly-rhythmSkill
- account-based-outboundSkill
- apollo-account-auditSkill
- apollo-deliverabilitySkill
- apollo-go-liveSkill
- apollo-icp-builderSkill
- apollo-list-builderSkill
- apollo-multichannelSkill
- apollo-operatorSkill
- apollo-sequence-builderSkill
- apollo-signalsSkill
- business-briefSkill
- campaign-reportingSkill
- experiment-designSkill
- list-quality-scorecardSkill
- operator-contextSkill
- positive-reply-scoringSkill
- re-engagementSkill
- sending-infrastructureSkill
- sequence-reviewerSkill
- weekly-rhythmSkill
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
- Distinctive: line 66
Not everything belongs in a sequence.
- Distinctive: line 94
All of these are on MCP now.
- Distinctive: line 105
Keep it short. The tool's own guidance is 25 to 85 words and one clear ask, which matches this library's copy rules.
- Distinctive: line 115
Forgetting these are gated: If task-function steps error, it is your Apollo plan, not your setup.
≈ “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.
Files
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 type | What it is | Needs content? |
auto_email | Automated email (the core) | Yes (emailer_touches) |
manual_email | Email the rep reviews and sends | Yes (emailer_touches) |
linkedin_step_view_profile | Soft touch, just view the profile | No |
linkedin_step_connect | Send a connection request | Yes (short note) |
linkedin_step_message | Message a 1st-degree connection | Yes (message body) |
linkedin_step_interact_post | Like or comment on a recent post | No |
call | Call task, with a script in note and a priority | No touch; use note |
action_item | Generic manual to-do | No |
A sensible, non-annoying default cadence (relative wait_time, so Day 0/2/3/5/8):
auto_email, wait 0linkedin_step_view_profile, wait 2 (warm the name before the next email)auto_email, wait 1linkedin_step_message, wait 2 (only fires if they connected; write it like a human)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_searchwith no status filter returns open (scheduled) tasks. Sorttask_due_atascending for soonest-first. Filter bytask_type_cds(for example the fourlinkedin_step_*values for a LinkedIn block, orphone_callfor a call block), bypriority, bydate_range, or byemailer_campaign_idto work one sequence's tasks. - Clear them:
apollo_tasks_completewhen done,apollo_tasks_skipwhen skipping,apollo_tasks_updateto reschedule or re-prioritize. - Create work in bulk:
apollo_tasks_bulk_createto drop a task on a whole segment, for example acalltask on every High-priority lead who opened three times. Each task needsuser_id(the assignee),type, and at least one association (contact_id,account_id, oropportunity_id). Put call scripts innote; put LinkedIn or email content instandalone_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. Seecompliance.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 deliveryOn 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:
- 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.
- It sends from a real mailbox you choose, with the same sending rules and pacing as everything else.
- You get a delivery answer.
email_send_statusreturnscompletedorfailed, and on failure givesnot_sent_reasonandfailure_reason(bounce, quota, spam block).
Delivery is not opens: two different endpoints
These get conflated constantly, so be precise:
| Question | Call | Gives |
| Did it arrive? | apollo_emailer_messages_email_send_status | completed / 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_idis required, so the person must exist as a contact first. Enrich and create them (List) before you can email them.- You can override
recipientsto 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, oropportunity_idis 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.
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
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.

