instantly-core-workflow-b
Automates the management of Instantly.ai email warmup processes and retrieves analytics for campaign performance monitoring.
Install
mkdir -p .claude/skills/instantly-core-workflow-b && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8159" && unzip -o skill.zip -d .claude/skills/instantly-core-workflow-b && rm skill.zipInstalls to .claude/skills/instantly-core-workflow-b
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Manage Instantly.ai email account warmup, analytics, and deliverability.Key capabilities
- →Enable and configure email account warmup
- →Monitor warmup health and inbox rates
- →Pull aggregate campaign analytics
- →Test SMTP, IMAP, and DNS account vitals
How it works
Manages the email account warmup lifecycle by triggering background jobs and provides endpoints to aggregate performance data across campaigns and accounts.
Inputs & outputs
When to use instantly-core-workflow-b
- →Enabling warmup for new email accounts
- →Pulling campaign performance analytics
- →Monitoring sender reputation and health
- →Tracking daily email sending volumes
About this skill
Instantly Core Workflow B: Warmup & Analytics Pipeline
Overview
Manage the email account warmup lifecycle and campaign analytics. Warmup builds sender reputation through controlled email exchanges across Instantly's 4.2M+ account network before you start cold outreach. This workflow covers enabling warmup, monitoring warmup health, pulling campaign analytics, and daily send tracking.
Prerequisites
- Completed
instantly-install-authsetup - Email accounts connected in Instantly (IMAP/SMTP or Google/Microsoft OAuth)
- API key with
accounts:updateandcampaigns:readscopes
Instructions
Step 1: Enable Warmup on Email Accounts
import { instantly } from "./src/instantly";
// Enable warmup — triggers a background job
async function enableWarmup(emails: string[]) {
const job = await instantly<{ id: string; status: string }>(
"/accounts/warmup/enable",
{
method: "POST",
body: JSON.stringify({ emails }),
}
);
console.log(`Warmup enable job started: ${job.id} (status: ${job.status})`);
// Poll background job until complete
let result = job;
while (result.status !== "completed" && result.status !== "failed") {
await new Promise((r) => setTimeout(r, 2000));
result = await instantly<{ id: string; status: string }>(
`/background-jobs/${job.id}`
);
}
console.log(`Warmup job ${result.status}`);
return result;
}
// Enable for specific accounts
await enableWarmup(["[email protected]", "[email protected]"]);
// Or enable for ALL accounts at once
await instantly("/accounts/warmup/enable", {
method: "POST",
body: JSON.stringify({ include_all_emails: true }),
});
Step 2: Configure Warmup Settings
// PATCH account to tune warmup parameters
async function configureWarmup(email: string) {
await instantly(`/accounts/${encodeURIComponent(email)}`, {
method: "PATCH",
body: JSON.stringify({
warmup: {
limit: 40, // max warmup emails per day
increment: "2", // daily limit increment (0-4 or "disabled")
advanced: {
open_rate: 0.95, // target open rate for warmup
reply_rate: 0.1, // target reply rate
spam_save_rate: 0.02, // rate of rescuing from spam
read_emulation: true, // simulate reading behavior
weekday_only: true, // warmup only on weekdays
warm_ctd: false, // custom tracking domain warmup
},
},
daily_limit: 50, // max campaign emails per day
enable_slow_ramp: true,
}),
});
console.log(`Warmup configured for ${email}`);
}
Step 3: Monitor Warmup Health
interface WarmupAnalytics {
email: string;
warmup_emails_sent: number;
warmup_emails_received: number;
warmup_emails_landed_inbox: number;
warmup_emails_landed_spam: number;
warmup_emails_saved_from_spam: number;
warmup_health_score: number;
}
async function checkWarmupHealth(emails: string[]) {
const analytics = await instantly<WarmupAnalytics[]>(
"/accounts/warmup-analytics",
{
method: "POST",
body: JSON.stringify({ emails }),
}
);
console.log("\nWarmup Health Report:");
for (const a of analytics) {
const inboxRate = a.warmup_emails_landed_inbox /
(a.warmup_emails_sent || 1) * 100;
console.log(`${a.email}`);
console.log(` Sent: ${a.warmup_emails_sent} | Inbox: ${a.warmup_emails_landed_inbox} | Spam: ${a.warmup_emails_landed_spam}`);
console.log(` Inbox Rate: ${inboxRate.toFixed(1)}% | Health: ${a.warmup_health_score}`);
}
return analytics;
}
Step 4: Pull Campaign Analytics
// Aggregate analytics for one or more campaigns
async function getCampaignAnalytics(campaignIds: string[]) {
const params = campaignIds.map((id) => `ids=${id}`).join("&");
const data = await instantly<Array<{
campaign_id: string;
campaign_name: string;
total_leads: number;
leads_contacted: number;
emails_sent: number;
emails_opened: number;
emails_replied: number;
emails_bounced: number;
}>>(`/campaigns/analytics?${params}`);
for (const c of data) {
const openRate = ((c.emails_opened / c.emails_sent) * 100).toFixed(1);
const replyRate = ((c.emails_replied / c.emails_sent) * 100).toFixed(1);
const bounceRate = ((c.emails_bounced / c.emails_sent) * 100).toFixed(1);
console.log(`\n${c.campaign_name}`);
console.log(` Leads: ${c.total_leads} total, ${c.leads_contacted} contacted`);
console.log(` Open: ${openRate}% | Reply: ${replyRate}% | Bounce: ${bounceRate}%`);
}
}
// Daily breakdown
async function getDailyAnalytics(campaignId: string) {
const daily = await instantly<Array<{
date: string; emails_sent: number; emails_opened: number; emails_replied: number;
}>>(`/campaigns/analytics/daily?campaign_id=${campaignId}&start_date=2026-03-01&end_date=2026-03-31`);
for (const day of daily) {
console.log(` ${day.date}: sent=${day.emails_sent} opened=${day.emails_opened} replied=${day.emails_replied}`);
}
}
// Step-level analytics — which sequence step performs best
async function getStepAnalytics(campaignId: string) {
const steps = await instantly<Array<{
step_number: number; emails_sent: number; emails_opened: number; emails_replied: number;
}>>(`/campaigns/analytics/steps?campaign_id=${campaignId}`);
for (const s of steps) {
console.log(` Step ${s.step_number}: sent=${s.emails_sent} opened=${s.emails_opened} replied=${s.emails_replied}`);
}
}
Step 5: Test Account Vitals
async function testAccountVitals(emails: string[]) {
const vitals = await instantly<Array<{
email: string; smtp_status: string; imap_status: string; dns_status: string;
}>>("/accounts/test/vitals", {
method: "POST",
body: JSON.stringify({ accounts: emails }),
});
for (const v of vitals) {
const ok = v.smtp_status === "ok" && v.imap_status === "ok";
console.log(`${v.email}: SMTP=${v.smtp_status} IMAP=${v.imap_status} DNS=${v.dns_status} ${ok ? "HEALTHY" : "FIX NEEDED"}`);
}
}
Key API Endpoints Used
| Method | Path | Purpose |
|---|---|---|
POST | /accounts/warmup/enable | Start warmup (background job) |
POST | /accounts/warmup/disable | Stop warmup |
POST | /accounts/warmup-analytics | Warmup metrics per account |
POST | /accounts/test/vitals | Test SMTP/IMAP/DNS health |
PATCH | /accounts/{email} | Configure warmup settings |
GET | /accounts/analytics/daily | Daily send counts per account |
GET | /campaigns/analytics | Aggregate campaign metrics |
GET | /campaigns/analytics/daily | Daily campaign breakdown |
GET | /campaigns/analytics/steps | Per-step performance |
GET | /background-jobs/{id} | Poll async job status |
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Warmup not starting | SMTP/IMAP credentials invalid | Run vitals test, fix credentials |
| Low inbox rate (<80%) | Sender reputation damaged | Pause campaigns, extend warmup |
422 on warmup enable | Account already warming | Check state with GET /accounts/{email} |
| Missing analytics data | Campaign too new (<24h) | Wait for data to populate |
Background job failed | Invalid email in batch | Retry failed emails individually |
Resources
- Instantly Email Warmup
- Account Endpoints
- Analytics Endpoints
Next Steps
For lead management and list operations, see instantly-data-handling.
When not to use it
- →Running campaigns without warmup
- →Ignoring low inbox rates
Prerequisites
Limitations
- →Warmup analytics require time to populate
- →Background jobs may fail if email addresses are invalid
How it compares
Automates the warmup lifecycle and health monitoring instead of manually checking account status in the dashboard.
Compared to similar skills
instantly-core-workflow-b side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| instantly-core-workflow-b (this skill) | 0 | 27d | Review | Intermediate |
| mcporter | 7 | 2mo | No flags | Intermediate |
| calcom-api | 2 | 4mo | No flags | Intermediate |
| developing-genkit-tooling | 2 | 6mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
mcporter
openclaw
Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
calcom-api
calcom
Interact with the Cal.com API v2 to manage scheduling, bookings, event types, availability, and calendars. Use this skill when building integrations that need to create or manage bookings, check availability, configure event types, or sync calendars with Cal.com's scheduling infrastructure.
developing-genkit-tooling
firebase
Best practices for authoring Genkit tooling, including CLI commands and MCP server tools. Covers naming conventions, architectural patterns, and consistency guidelines.
vercel-sdk-patterns
jeremylongshore
Execute apply production-ready Vercel SDK patterns for TypeScript and Python. Use when implementing Vercel integrations, refactoring SDK usage, or establishing team coding standards for Vercel. Trigger with phrases like "vercel SDK patterns", "vercel best practices", "vercel code patterns", "idiomatic vercel".
deepgram-webhooks-events
jeremylongshore
Implement Deepgram callback and webhook handling for async transcription. Use when implementing callback URLs, processing async transcription results, or handling Deepgram event notifications. Trigger with phrases like "deepgram callback", "deepgram webhook", "async transcription deepgram", "deepgram events", "deepgram notifications".
replit-webhooks-events
jeremylongshore
Implement Replit webhook signature validation and event handling. Use when setting up webhook endpoints, implementing signature verification, or handling Replit event notifications securely. Trigger with phrases like "replit webhook", "replit events", "replit webhook signature", "handle replit events", "replit notifications".