Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Multi-channel drip sequence orchestrator that builds and executes outbound campaigns across email, Slack, and direct messages. Triggers when the user asks to set up an outbound campaign, drip sequence, multi-channel outreach, or creator outreach program. Coordinates Clay enrichment, Gmail drafts, Slack DMs, and scheduled follow-ups with full state tracking in Supabase. Enforces send limits, opt-out compliance, and batch confirmation before any messages go out.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | 118% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 117% | 0% |
Multi-channel drip sequence orchestrator for outbound campaigns.
Activate this skill when the user:
This skill orchestrates across five MCP servers. Always verify each server is connected before starting.
| MCP Server | Tools Used | Purpose | |------------------|----------------------------------------------------------------------------|--------------------------------| | Clay | find-and-enrich-company, find-and-enrich-contacts-at-company, add-contact-data-points | Lead enrichment and data append | | Gmail | gmail_create_draft, gmail_search_messages | Email composition and reply detection | | Slack | slack_send_message, slack_search_users | Slack DM outreach | | Scheduled Tasks | create_scheduled_task | Delayed follow-up scheduling | | Supabase | execute_sql | State tracking and analytics |
Define each stage of the sequence with these fields:
yamlstages: - id: 1 name: "Initial Outreach" channel: email # email | slack | dm timing: "Day 0" # Relative to sequence start template: "intro_email" fallback_channel: slack # If primary channel unavailable - id: 2 name: "Follow-up Nudge" channel: email timing: "Day 3" template: "follow_up_1" skip_if: replied # Skip if contact already replied - id: 3 name: "Slack Touch" channel: slack timing: "Day 5" template: "slack_casual" skip_if: replied - id: 4 name: "Final Follow-up" channel: email timing: "Day 7" template: "break_up_email" skip_if: replied
Execute these steps in order. Report progress after each step.
Pull contacts from Supabase or accept manual input.
sql-- Example: pull from an existing prospects table SELECT id, first_name, last_name, email, company, linkedin_url FROM prospects WHERE campaign_id IS NULL AND unsubscribed = false ORDER BY created_at DESC LIMIT 50;
If no Supabase table exists, accept a list of names/emails/companies from the user and create the tracking table (see State Machine below).
For each contact in the target list:
find-and-enrich-company with the company name or domainfind-and-enrich-contacts-at-company to get role, seniority, tech stackadd-contact-data-points to append social profiles, recent funding, headcountStore enrichment results back to Supabase for use in personalization.
Invoke the lead-scorer skill if available. Pass enriched contact data and receive a score + tier.
For each contact:
score = lead-scorer(contact_data)
UPDATE prospects SET score = {score}, tier = {tier} WHERE id = {contact_id};Filter out contacts with tier = "Skip" (score < 20). Flag "Hot" leads (80+) for priority sequencing.
Invoke the template-personalizer skill for each stage and each contact.
Pass:
Hot leads get L3 (hyper-personalized). Warm get L2. Cold get L1.
For all contacts, execute the first stage immediately:
gmail_create_draft with personalized subject and bodyslack_search_users to find the user, then slack_send_messageUpdate state to contacted in Supabase after each send.
For stages with timing beyond Day 0, use Scheduled Tasks MCP:
For each future stage:
create_scheduled_task({
name: "campaign_{campaign_id}_contact_{contact_id}_stage_{stage_id}",
scheduled_time: now() + stage.timing,
task: {
action: "send_message",
channel: stage.channel,
contact_id: contact_id,
template: stage.template
}
})Before scheduling, check if the contact has already replied (query Gmail or Slack). If replied, skip remaining stages.
Set up monitoring queries:
sql-- Check for replies (run daily or before each scheduled send) SELECT p.id, p.email, p.state FROM prospects p WHERE p.campaign_id = {campaign_id} AND p.state = 'contacted' AND p.last_stage_sent_at < NOW() - INTERVAL '1 day';
Use gmail_search_messages to check for replies from each contact's email. Update state to replied when found.
Each contact progresses through these states:
new --> enriched --> contacted --> replied --> converted
| |
+----> churned <---------+| State | Meaning | Transition Trigger | |-----------|--------------------------------------------------|---------------------------------------| | new | Added to campaign, not yet enriched | Contact added to target list | | enriched | Clay enrichment complete | Enrichment data returned | | contacted | At least one message sent | First stage executed | | replied | Contact responded on any channel | Reply detected via Gmail/Slack search | | converted | Contact completed desired action (meeting, signup) | Manual update by user | | churned | All stages exhausted with no reply, or opted out | Final stage sent with no response |
sqlCREATE TABLE IF NOT EXISTS campaign_contacts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), campaign_id TEXT NOT NULL, contact_email TEXT NOT NULL, first_name TEXT, last_name TEXT, company TEXT, role TEXT, state TEXT DEFAULT 'new' CHECK (state IN ('new','enriched','contacted','replied','converted','churned')), score INTEGER, tier TEXT, enrichment_data JSONB, current_stage INTEGER DEFAULT 0, last_stage_sent_at TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW(), unsubscribed BOOLEAN DEFAULT FALSE ); CREATE INDEX idx_campaign_state ON campaign_contacts(campaign_id, state);
These are non-negotiable. The skill must enforce all of them.
unsubscribed = false before every send.Target: Web3 developers and content creators for a developer ambassador program.
yamlcampaign: name: "Creator Program Q2 2026" goal: "Recruit 20 developer ambassadors" total_targets: 40 tone: "CT-style" personalization_depth: "L3 for Hot, L2 for Warm" stages: - id: 1 name: "Warm Intro" channel: email timing: "Day 0" template: | Subject: Your {{recent_achievement}} caught my eye Hey {{first_name}}, Saw your {{recent_achievement}} -- legit impressive work. We're building a creator program for devs who ship, and your background in {{tech_stack}} is exactly what we're looking for. Quick 15-min call this week? No pitch deck, just vibes. Reply STOP to opt out of future messages. - id: 2 name: "Value Add" channel: slack timing: "Day 3" template: | hey {{first_name}} -- dropped you an email earlier this week about our creator program. thought you might also find this useful: [relevant resource link]. no pressure, just sharing. - id: 3 name: "Social Proof" channel: email timing: "Day 5" template: | Subject: {{mutual_connection}} just joined -- thought of you {{first_name}}, {{mutual_connection}} from {{mutual_company}} just came on board as a creator. Given your overlap in {{tech_stack}}, figured you'd want to know. Interested? Just reply and I'll send details. Reply STOP to opt out of future messages. - id: 4 name: "Last Call" channel: email timing: "Day 7" template: | Subject: closing the loop {{first_name}} -- wanted to follow up one last time. If the timing isn't right, totally get it. If you want in on the creator program, just reply and we'll make it happen. Either way, keep shipping. Reply STOP to opt out of future messages.
After campaign execution, generate a summary:
Campaign: Creator Program Q2 2026
Total Contacts: 40
Enriched: 38 (2 failed enrichment)
Contacted: 36 (2 scored as Skip)
Replied: 12 (33% reply rate)
Converted: 8 (22% conversion rate)
Churned: 24
Top performing stage: Stage 1 (8 replies)
Best channel: Email (10 replies vs 2 Slack)
Average score of converted leads: 84Store the report in Supabase and present it as a formatted table.
Other measured skills in the registry, with their headline benchmark lift.